@getontime/cli 4.4.0 → 4.4.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 (377) hide show
  1. package/client/assets/{Backstage-ScLTYJAt.js → Backstage-BdrcXNr9.js} +2 -2
  2. package/client/assets/Backstage-BdrcXNr9.js.br +0 -0
  3. package/client/assets/Backstage-BdrcXNr9.js.gz +0 -0
  4. package/client/assets/{Backstage-ScLTYJAt.js.map → Backstage-BdrcXNr9.js.map} +1 -1
  5. package/client/assets/{Countdown-DA_Lph2k.js → Countdown-DQM2ppPg.js} +2 -2
  6. package/client/assets/Countdown-DQM2ppPg.js.br +0 -0
  7. package/client/assets/Countdown-DQM2ppPg.js.gz +0 -0
  8. package/client/assets/{Countdown-DA_Lph2k.js.map → Countdown-DQM2ppPg.js.map} +1 -1
  9. package/client/assets/{CuesheetTable-C7hP6tMi.js → CuesheetTable-B5LQVh5m.js} +2 -2
  10. package/client/assets/CuesheetTable-B5LQVh5m.js.br +0 -0
  11. package/client/assets/CuesheetTable-B5LQVh5m.js.gz +0 -0
  12. package/client/assets/{CuesheetTable-C7hP6tMi.js.map → CuesheetTable-B5LQVh5m.js.map} +1 -1
  13. package/client/assets/CustomTranslationModal-CML7Vsot.js +2 -0
  14. package/client/assets/CustomTranslationModal-CML7Vsot.js.br +0 -0
  15. package/client/assets/CustomTranslationModal-CML7Vsot.js.gz +0 -0
  16. package/client/assets/{CustomTranslationModal-0ROtCxPC.js.map → CustomTranslationModal-CML7Vsot.js.map} +1 -1
  17. package/client/assets/DelayIndicator-DKS6mZdB.js +2 -0
  18. package/client/assets/DelayIndicator-DKS6mZdB.js.br +0 -0
  19. package/client/assets/DelayIndicator-DKS6mZdB.js.gz +0 -0
  20. package/client/assets/DelayIndicator-DKS6mZdB.js.map +1 -0
  21. package/client/assets/{EditorFeatureWrapper-B_KH_YqU.js → EditorFeatureWrapper-C1vLQxiy.js} +2 -2
  22. package/client/assets/EditorFeatureWrapper-C1vLQxiy.js.br +0 -0
  23. package/client/assets/EditorFeatureWrapper-C1vLQxiy.js.gz +0 -0
  24. package/client/assets/{EditorFeatureWrapper-B_KH_YqU.js.map → EditorFeatureWrapper-C1vLQxiy.js.map} +1 -1
  25. package/client/assets/{EditorUtils-BxN0w0-D.js → EditorUtils-BLcTuWz1.js} +2 -2
  26. package/client/assets/EditorUtils-BLcTuWz1.js.br +0 -0
  27. package/client/assets/EditorUtils-BLcTuWz1.js.gz +0 -0
  28. package/client/assets/{EditorUtils-BxN0w0-D.js.map → EditorUtils-BLcTuWz1.js.map} +1 -1
  29. package/client/assets/{EmptyPage-CcO33dlE.js → EmptyPage-CYVrjOvI.js} +2 -2
  30. package/client/assets/EmptyPage-CYVrjOvI.js.br +0 -0
  31. package/client/assets/EmptyPage-CYVrjOvI.js.gz +0 -0
  32. package/client/assets/{EmptyPage-CcO33dlE.js.map → EmptyPage-CYVrjOvI.js.map} +1 -1
  33. package/client/assets/{FollowButton-DJCtYYXt.js → FollowButton-DcSbb4R_.js} +2 -2
  34. package/client/assets/FollowButton-DcSbb4R_.js.br +0 -0
  35. package/client/assets/FollowButton-DcSbb4R_.js.gz +0 -0
  36. package/client/assets/{FollowButton-DJCtYYXt.js.map → FollowButton-DcSbb4R_.js.map} +1 -1
  37. package/client/assets/{MessageControlExport-DGo2ZNMw.js → MessageControlExport-BgT9JaXk.js} +3 -3
  38. package/client/assets/MessageControlExport-BgT9JaXk.js.br +0 -0
  39. package/client/assets/MessageControlExport-BgT9JaXk.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-DGo2ZNMw.js.map → MessageControlExport-BgT9JaXk.js.map} +1 -1
  41. package/client/assets/{MultiPartProgressBar-IIU35-x9.js → MultiPartProgressBar-W2a-JWPY.js} +2 -2
  42. package/client/assets/MultiPartProgressBar-W2a-JWPY.js.br +0 -0
  43. package/client/assets/MultiPartProgressBar-W2a-JWPY.js.gz +0 -0
  44. package/client/assets/{MultiPartProgressBar-IIU35-x9.js.map → MultiPartProgressBar-W2a-JWPY.js.map} +1 -1
  45. package/client/assets/{OperatorExport-C-KafSVE.js → OperatorExport-CbWojpp6.js} +2 -2
  46. package/client/assets/OperatorExport-CbWojpp6.js.br +0 -0
  47. package/client/assets/OperatorExport-CbWojpp6.js.gz +0 -0
  48. package/client/assets/{OperatorExport-C-KafSVE.js.map → OperatorExport-CbWojpp6.js.map} +1 -1
  49. package/client/assets/{OverviewWrapper-B6AeBRb6.js → OverviewWrapper-B2i8d3rt.js} +2 -2
  50. package/client/assets/OverviewWrapper-B2i8d3rt.js.br +0 -0
  51. package/client/assets/OverviewWrapper-B2i8d3rt.js.gz +0 -0
  52. package/client/assets/{OverviewWrapper-B6AeBRb6.js.map → OverviewWrapper-B2i8d3rt.js.map} +1 -1
  53. package/client/assets/{PipHost-BueqKsmJ.js → PipHost-Dz2oy7XG.js} +2 -2
  54. package/client/assets/PipHost-Dz2oy7XG.js.br +0 -0
  55. package/client/assets/PipHost-Dz2oy7XG.js.gz +0 -0
  56. package/client/assets/{PipHost-BueqKsmJ.js.map → PipHost-Dz2oy7XG.js.map} +1 -1
  57. package/client/assets/{ProjectInfo-DiD9lzzx.js → ProjectInfo-BR_7Hp5u.js} +2 -2
  58. package/client/assets/ProjectInfo-BR_7Hp5u.js.br +0 -0
  59. package/client/assets/ProjectInfo-BR_7Hp5u.js.gz +0 -0
  60. package/client/assets/{ProjectInfo-DiD9lzzx.js.map → ProjectInfo-BR_7Hp5u.js.map} +1 -1
  61. package/client/assets/{ProtectRoute-CcDK6JVA.js → ProtectRoute-Bxq6q7ba.js} +2 -2
  62. package/client/assets/ProtectRoute-Bxq6q7ba.js.br +0 -0
  63. package/client/assets/ProtectRoute-Bxq6q7ba.js.gz +0 -0
  64. package/client/assets/{ProtectRoute-CcDK6JVA.js.map → ProtectRoute-Bxq6q7ba.js.map} +1 -1
  65. package/client/assets/ProtectedCuesheet-C7AqD2dy.js +2 -0
  66. package/client/assets/ProtectedCuesheet-C7AqD2dy.js.br +0 -0
  67. package/client/assets/ProtectedCuesheet-C7AqD2dy.js.gz +0 -0
  68. package/client/assets/{ProtectedCuesheet-D19INqhI.js.map → ProtectedCuesheet-C7AqD2dy.js.map} +1 -1
  69. package/client/assets/ProtectedEditor-CsfvVyOU.js +3 -0
  70. package/client/assets/ProtectedEditor-CsfvVyOU.js.br +0 -0
  71. package/client/assets/ProtectedEditor-CsfvVyOU.js.gz +0 -0
  72. package/client/assets/ProtectedEditor-CsfvVyOU.js.map +1 -0
  73. package/client/assets/RundownExport-25orDQIW.js +2 -0
  74. package/client/assets/RundownExport-25orDQIW.js.br +0 -0
  75. package/client/assets/RundownExport-25orDQIW.js.gz +0 -0
  76. package/client/assets/RundownExport-25orDQIW.js.map +1 -0
  77. package/client/assets/RundownExport-CzaSrbaj.css +1 -0
  78. package/client/assets/RundownExport-CzaSrbaj.css.br +0 -0
  79. package/client/assets/RundownExport-CzaSrbaj.css.gz +0 -0
  80. package/client/assets/Select-BnGTAeXJ.js +2 -0
  81. package/client/assets/Select-BnGTAeXJ.js.br +0 -0
  82. package/client/assets/Select-BnGTAeXJ.js.gz +0 -0
  83. package/client/assets/{Select-B3zdv0Ng.js.map → Select-BnGTAeXJ.js.map} +1 -1
  84. package/client/assets/{Studio-DS_uXtgn.js → Studio-BK2Klo_K.js} +2 -2
  85. package/client/assets/Studio-BK2Klo_K.js.br +0 -0
  86. package/client/assets/Studio-BK2Klo_K.js.gz +0 -0
  87. package/client/assets/{Studio-DS_uXtgn.js.map → Studio-BK2Klo_K.js.map} +1 -1
  88. package/client/assets/StyleEditor-DIHQ1PUV.js +2 -0
  89. package/client/assets/StyleEditor-DIHQ1PUV.js.br +0 -0
  90. package/client/assets/StyleEditor-DIHQ1PUV.js.gz +0 -0
  91. package/client/assets/{StyleEditor-DcyJgmAF.js.map → StyleEditor-DIHQ1PUV.js.map} +1 -1
  92. package/client/assets/{SuperscriptPeriod-DswX2aei.js → SuperscriptPeriod-EEedc9rG.js} +2 -2
  93. package/client/assets/SuperscriptPeriod-EEedc9rG.js.br +0 -0
  94. package/client/assets/SuperscriptPeriod-EEedc9rG.js.gz +0 -0
  95. package/client/assets/{SuperscriptPeriod-DswX2aei.js.map → SuperscriptPeriod-EEedc9rG.js.map} +1 -1
  96. package/client/assets/{SuperscriptTime-COS4JWHJ.js → SuperscriptTime-BVanhNvd.js} +2 -2
  97. package/client/assets/SuperscriptTime-BVanhNvd.js.br +0 -0
  98. package/client/assets/SuperscriptTime-BVanhNvd.js.gz +0 -0
  99. package/client/assets/{SuperscriptTime-COS4JWHJ.js.map → SuperscriptTime-BVanhNvd.js.map} +1 -1
  100. package/client/assets/SwatchPicker-Ckpchvjo.js +2 -0
  101. package/client/assets/SwatchPicker-Ckpchvjo.js.br +0 -0
  102. package/client/assets/SwatchPicker-Ckpchvjo.js.gz +0 -0
  103. package/client/assets/{SwatchPicker-DPyJv7aS.js.map → SwatchPicker-Ckpchvjo.js.map} +1 -1
  104. package/client/assets/TimeElements-CYIgGk0T.js +2 -0
  105. package/client/assets/TimeElements-CYIgGk0T.js.br +0 -0
  106. package/client/assets/TimeElements-CYIgGk0T.js.gz +0 -0
  107. package/client/assets/{TimeElements-8rNLGU60.js.map → TimeElements-CYIgGk0T.js.map} +1 -1
  108. package/client/assets/{TimeInput-OX4LMRQl.js → TimeInput-Cwl9vLWA.js} +2 -2
  109. package/client/assets/TimeInput-Cwl9vLWA.js.br +0 -0
  110. package/client/assets/TimeInput-Cwl9vLWA.js.gz +0 -0
  111. package/client/assets/{TimeInput-OX4LMRQl.js.map → TimeInput-Cwl9vLWA.js.map} +1 -1
  112. package/client/assets/{TimelinePage-7kRpUl6P.js → TimelinePage-D4QNdk-Z.js} +2 -2
  113. package/client/assets/TimelinePage-D4QNdk-Z.js.br +0 -0
  114. package/client/assets/TimelinePage-D4QNdk-Z.js.gz +0 -0
  115. package/client/assets/{TimelinePage-7kRpUl6P.js.map → TimelinePage-D4QNdk-Z.js.map} +1 -1
  116. package/client/assets/{Timer-Bg9pVhup.js → Timer-BJQKNHfo.js} +2 -2
  117. package/client/assets/Timer-BJQKNHfo.js.br +0 -0
  118. package/client/assets/Timer-BJQKNHfo.js.gz +0 -0
  119. package/client/assets/{Timer-Bg9pVhup.js.map → Timer-BJQKNHfo.js.map} +1 -1
  120. package/client/assets/TimerControlExport-Ba1vifNg.js +2 -0
  121. package/client/assets/TimerControlExport-Ba1vifNg.js.br +0 -0
  122. package/client/assets/TimerControlExport-Ba1vifNg.js.gz +0 -0
  123. package/client/assets/{TimerControlExport-BNfZ99Im.js.map → TimerControlExport-Ba1vifNg.js.map} +1 -1
  124. package/client/assets/TimerDisplay-tVcUk9j3.js +2 -0
  125. package/client/assets/TimerDisplay-tVcUk9j3.js.br +0 -0
  126. package/client/assets/TimerDisplay-tVcUk9j3.js.gz +0 -0
  127. package/client/assets/{TimerDisplay-DQQ7sMDc.js.map → TimerDisplay-tVcUk9j3.js.map} +1 -1
  128. package/client/assets/{TitleCard-De0WhlN2.js → TitleCard-BNjv58eq.js} +2 -2
  129. package/client/assets/TitleCard-BNjv58eq.js.br +0 -0
  130. package/client/assets/TitleCard-BNjv58eq.js.gz +0 -0
  131. package/client/assets/{TitleCard-De0WhlN2.js.map → TitleCard-BNjv58eq.js.map} +1 -1
  132. package/client/assets/Tooltip-DZJ7u9gm.js +2 -0
  133. package/client/assets/Tooltip-DZJ7u9gm.js.br +4 -0
  134. package/client/assets/Tooltip-DZJ7u9gm.js.gz +0 -0
  135. package/client/assets/{Tooltip-B4PEP32j.js.map → Tooltip-DZJ7u9gm.js.map} +1 -1
  136. package/client/assets/{ViewLogo-CHqiH4C0.js → ViewLogo-2I7w5Yms.js} +2 -2
  137. package/client/assets/ViewLogo-2I7w5Yms.js.br +0 -0
  138. package/client/assets/ViewLogo-2I7w5Yms.js.gz +0 -0
  139. package/client/assets/{ViewLogo-CHqiH4C0.js.map → ViewLogo-2I7w5Yms.js.map} +1 -1
  140. package/client/assets/{ViewParamsEditor-BHIK3qtx.js → ViewParamsEditor-BX2RM8sx.js} +2 -2
  141. package/client/assets/ViewParamsEditor-BX2RM8sx.js.br +0 -0
  142. package/client/assets/ViewParamsEditor-BX2RM8sx.js.gz +0 -0
  143. package/client/assets/{ViewParamsEditor-BHIK3qtx.js.map → ViewParamsEditor-BX2RM8sx.js.map} +1 -1
  144. package/client/assets/{editorSettings-VcitNPq1.js → editorSettings-_x6YKRfR.js} +2 -2
  145. package/client/assets/editorSettings-_x6YKRfR.js.br +6 -0
  146. package/client/assets/editorSettings-_x6YKRfR.js.gz +0 -0
  147. package/client/assets/{editorSettings-VcitNPq1.js.map → editorSettings-_x6YKRfR.js.map} +1 -1
  148. package/client/assets/{getProgress-mRMYlU96.js → getProgress-ZUTmCn_v.js} +2 -2
  149. package/client/assets/getProgress-ZUTmCn_v.js.br +0 -0
  150. package/client/assets/getProgress-ZUTmCn_v.js.gz +0 -0
  151. package/client/assets/{getProgress-mRMYlU96.js.map → getProgress-ZUTmCn_v.js.map} +1 -1
  152. package/client/assets/index-Dm-4OTmY.js +3 -0
  153. package/client/assets/index-Dm-4OTmY.js.br +0 -0
  154. package/client/assets/index-Dm-4OTmY.js.gz +0 -0
  155. package/client/assets/index-Dm-4OTmY.js.map +1 -0
  156. package/client/assets/{offset-Bs6CY1IK.js → offset-VthsmtrO.js} +2 -2
  157. package/client/assets/offset-VthsmtrO.js.br +0 -0
  158. package/client/assets/offset-VthsmtrO.js.gz +0 -0
  159. package/client/assets/{offset-Bs6CY1IK.js.map → offset-VthsmtrO.js.map} +1 -1
  160. package/client/assets/{parseUserTime-CI7s8pYc.js → parseUserTime-sZbEBi61.js} +2 -2
  161. package/client/assets/parseUserTime-sZbEBi61.js.br +0 -0
  162. package/client/assets/parseUserTime-sZbEBi61.js.gz +0 -0
  163. package/client/assets/{parseUserTime-CI7s8pYc.js.map → parseUserTime-sZbEBi61.js.map} +1 -1
  164. package/client/assets/{playbackstate-DisgQbHM.js → playbackstate-Dl_ZJABT.js} +2 -2
  165. package/client/assets/playbackstate-Dl_ZJABT.js.br +0 -0
  166. package/client/assets/playbackstate-Dl_ZJABT.js.gz +0 -0
  167. package/client/assets/{playbackstate-DisgQbHM.js.map → playbackstate-Dl_ZJABT.js.map} +1 -1
  168. package/client/assets/{presentation.utils-Bv3PuMWv.js → presentation.utils-Z61KykAH.js} +2 -2
  169. package/client/assets/presentation.utils-Z61KykAH.js.br +0 -0
  170. package/client/assets/presentation.utils-Z61KykAH.js.gz +0 -0
  171. package/client/assets/{presentation.utils-Bv3PuMWv.js.map → presentation.utils-Z61KykAH.js.map} +1 -1
  172. package/client/assets/rundownUtils-CXZRD6yP.js +2 -0
  173. package/client/assets/rundownUtils-CXZRD6yP.js.br +0 -0
  174. package/client/assets/rundownUtils-CXZRD6yP.js.gz +0 -0
  175. package/client/assets/rundownUtils-CXZRD6yP.js.map +1 -0
  176. package/client/assets/timer.utils-B4bvsns3.js +2 -0
  177. package/client/assets/timer.utils-B4bvsns3.js.br +0 -0
  178. package/client/assets/timer.utils-B4bvsns3.js.gz +0 -0
  179. package/client/assets/{timer.utils-P25ngopd.js.map → timer.utils-B4bvsns3.js.map} +1 -1
  180. package/client/assets/useCustomFields-BBE4LBBr.js +2 -0
  181. package/client/assets/useCustomFields-BBE4LBBr.js.br +0 -0
  182. package/client/assets/useCustomFields-BBE4LBBr.js.gz +0 -0
  183. package/client/assets/useCustomFields-BBE4LBBr.js.map +1 -0
  184. package/client/assets/useEventSelection-Bpbu89c7.js +2 -0
  185. package/client/assets/useEventSelection-Bpbu89c7.js.br +0 -0
  186. package/client/assets/useEventSelection-Bpbu89c7.js.gz +0 -0
  187. package/client/assets/useEventSelection-Bpbu89c7.js.map +1 -0
  188. package/client/assets/useProjectData-C110zIXC.js +2 -0
  189. package/client/assets/useProjectData-C110zIXC.js.br +0 -0
  190. package/client/assets/useProjectData-C110zIXC.js.gz +0 -0
  191. package/client/assets/useProjectData-C110zIXC.js.map +1 -0
  192. package/client/assets/useReport-DqSBq4MG.js +2 -0
  193. package/client/assets/useReport-DqSBq4MG.js.br +0 -0
  194. package/client/assets/useReport-DqSBq4MG.js.gz +0 -0
  195. package/client/assets/useReport-DqSBq4MG.js.map +1 -0
  196. package/client/assets/useRundown-DAo6huE4.js +2 -0
  197. package/client/assets/useRundown-DAo6huE4.js.br +0 -0
  198. package/client/assets/useRundown-DAo6huE4.js.gz +0 -0
  199. package/client/assets/useRundown-DAo6huE4.js.map +1 -0
  200. package/client/assets/{useSelectAndRevealEntry-CzSIOtzH.js → useSelectAndRevealEntry-DTg0hmxA.js} +2 -2
  201. package/client/assets/useSelectAndRevealEntry-DTg0hmxA.js.br +0 -0
  202. package/client/assets/useSelectAndRevealEntry-DTg0hmxA.js.gz +0 -0
  203. package/client/assets/{useSelectAndRevealEntry-CzSIOtzH.js.map → useSelectAndRevealEntry-DTg0hmxA.js.map} +1 -1
  204. package/client/assets/{useWindowTitle-Cl1AVD9_.js → useWindowTitle-DM8dIp8L.js} +2 -2
  205. package/client/assets/useWindowTitle-DM8dIp8L.js.br +0 -0
  206. package/client/assets/useWindowTitle-DM8dIp8L.js.gz +0 -0
  207. package/client/assets/{useWindowTitle-Cl1AVD9_.js.map → useWindowTitle-DM8dIp8L.js.map} +1 -1
  208. package/client/assets/validateEvent-GnPt-e9-.js +2 -0
  209. package/client/assets/validateEvent-GnPt-e9-.js.br +0 -0
  210. package/client/assets/validateEvent-GnPt-e9-.js.gz +0 -0
  211. package/client/assets/{validateEvent-DhFtLvz_.js.map → validateEvent-GnPt-e9-.js.map} +1 -1
  212. package/client/assets/{vendor-dQa48psh.js → vendor-BKUJ0_Du.js} +12 -12
  213. package/client/assets/vendor-BKUJ0_Du.js.br +0 -0
  214. package/client/assets/vendor-BKUJ0_Du.js.gz +0 -0
  215. package/client/assets/{vendor-dQa48psh.js.map → vendor-BKUJ0_Du.js.map} +1 -1
  216. package/client/assets/{viewLoader.utils-ndDejZHN.js → viewLoader.utils-4lL4PiNI.js} +2 -2
  217. package/client/assets/viewLoader.utils-4lL4PiNI.js.br +0 -0
  218. package/client/assets/viewLoader.utils-4lL4PiNI.js.gz +0 -0
  219. package/client/assets/{viewLoader.utils-ndDejZHN.js.map → viewLoader.utils-4lL4PiNI.js.map} +1 -1
  220. package/client/assets/{viewUtils-rcOl1-o8.js → viewUtils-29a3Mmiu.js} +2 -2
  221. package/client/assets/viewUtils-29a3Mmiu.js.br +0 -0
  222. package/client/assets/viewUtils-29a3Mmiu.js.gz +0 -0
  223. package/client/assets/{viewUtils-rcOl1-o8.js.map → viewUtils-29a3Mmiu.js.map} +1 -1
  224. package/client/index.html +2 -2
  225. package/package.json +1 -1
  226. package/server/index.cjs +87 -87
  227. package/client/assets/Backstage-ScLTYJAt.js.br +0 -0
  228. package/client/assets/Backstage-ScLTYJAt.js.gz +0 -0
  229. package/client/assets/Countdown-DA_Lph2k.js.br +0 -0
  230. package/client/assets/Countdown-DA_Lph2k.js.gz +0 -0
  231. package/client/assets/CuesheetTable-C7hP6tMi.js.br +0 -0
  232. package/client/assets/CuesheetTable-C7hP6tMi.js.gz +0 -0
  233. package/client/assets/CustomTranslationModal-0ROtCxPC.js +0 -2
  234. package/client/assets/CustomTranslationModal-0ROtCxPC.js.br +0 -0
  235. package/client/assets/CustomTranslationModal-0ROtCxPC.js.gz +0 -0
  236. package/client/assets/DelayIndicator-OEjcqoIx.js +0 -2
  237. package/client/assets/DelayIndicator-OEjcqoIx.js.br +0 -0
  238. package/client/assets/DelayIndicator-OEjcqoIx.js.gz +0 -0
  239. package/client/assets/DelayIndicator-OEjcqoIx.js.map +0 -1
  240. package/client/assets/EditorFeatureWrapper-B_KH_YqU.js.br +0 -0
  241. package/client/assets/EditorFeatureWrapper-B_KH_YqU.js.gz +0 -0
  242. package/client/assets/EditorUtils-BxN0w0-D.js.br +0 -0
  243. package/client/assets/EditorUtils-BxN0w0-D.js.gz +0 -0
  244. package/client/assets/EmptyPage-CcO33dlE.js.br +0 -0
  245. package/client/assets/EmptyPage-CcO33dlE.js.gz +0 -0
  246. package/client/assets/FollowButton-DJCtYYXt.js.br +0 -0
  247. package/client/assets/FollowButton-DJCtYYXt.js.gz +0 -0
  248. package/client/assets/MessageControlExport-DGo2ZNMw.js.br +0 -0
  249. package/client/assets/MessageControlExport-DGo2ZNMw.js.gz +0 -0
  250. package/client/assets/MultiPartProgressBar-IIU35-x9.js.br +0 -0
  251. package/client/assets/MultiPartProgressBar-IIU35-x9.js.gz +0 -0
  252. package/client/assets/OperatorExport-C-KafSVE.js.br +0 -0
  253. package/client/assets/OperatorExport-C-KafSVE.js.gz +0 -0
  254. package/client/assets/OverviewWrapper-B6AeBRb6.js.br +0 -0
  255. package/client/assets/OverviewWrapper-B6AeBRb6.js.gz +0 -0
  256. package/client/assets/PipHost-BueqKsmJ.js.br +0 -0
  257. package/client/assets/PipHost-BueqKsmJ.js.gz +0 -0
  258. package/client/assets/ProjectInfo-DiD9lzzx.js.br +0 -0
  259. package/client/assets/ProjectInfo-DiD9lzzx.js.gz +0 -0
  260. package/client/assets/ProtectRoute-CcDK6JVA.js.br +0 -0
  261. package/client/assets/ProtectRoute-CcDK6JVA.js.gz +0 -0
  262. package/client/assets/ProtectedCuesheet-D19INqhI.js +0 -2
  263. package/client/assets/ProtectedCuesheet-D19INqhI.js.br +0 -0
  264. package/client/assets/ProtectedCuesheet-D19INqhI.js.gz +0 -0
  265. package/client/assets/ProtectedEditor-BVabJfIz.js +0 -3
  266. package/client/assets/ProtectedEditor-BVabJfIz.js.br +0 -0
  267. package/client/assets/ProtectedEditor-BVabJfIz.js.gz +0 -0
  268. package/client/assets/ProtectedEditor-BVabJfIz.js.map +0 -1
  269. package/client/assets/RundownEntry-C5kdIHbb.js +0 -2
  270. package/client/assets/RundownEntry-C5kdIHbb.js.br +0 -0
  271. package/client/assets/RundownEntry-C5kdIHbb.js.gz +0 -0
  272. package/client/assets/RundownEntry-C5kdIHbb.js.map +0 -1
  273. package/client/assets/RundownEntry-jE09YkV2.css +0 -1
  274. package/client/assets/RundownEntry-jE09YkV2.css.br +0 -0
  275. package/client/assets/RundownEntry-jE09YkV2.css.gz +0 -0
  276. package/client/assets/RundownExport-BFn7H24P.css +0 -1
  277. package/client/assets/RundownExport-BFn7H24P.css.br +0 -0
  278. package/client/assets/RundownExport-BFn7H24P.css.gz +0 -0
  279. package/client/assets/RundownExport-DhzzqPCD.js +0 -3
  280. package/client/assets/RundownExport-DhzzqPCD.js.br +0 -0
  281. package/client/assets/RundownExport-DhzzqPCD.js.gz +0 -0
  282. package/client/assets/RundownExport-DhzzqPCD.js.map +0 -1
  283. package/client/assets/Select-B3zdv0Ng.js +0 -2
  284. package/client/assets/Select-B3zdv0Ng.js.br +0 -0
  285. package/client/assets/Select-B3zdv0Ng.js.gz +0 -0
  286. package/client/assets/Studio-DS_uXtgn.js.br +0 -0
  287. package/client/assets/Studio-DS_uXtgn.js.gz +0 -0
  288. package/client/assets/StyleEditor-DcyJgmAF.js +0 -2
  289. package/client/assets/StyleEditor-DcyJgmAF.js.br +0 -0
  290. package/client/assets/StyleEditor-DcyJgmAF.js.gz +0 -0
  291. package/client/assets/SuperscriptPeriod-DswX2aei.js.br +0 -0
  292. package/client/assets/SuperscriptPeriod-DswX2aei.js.gz +0 -0
  293. package/client/assets/SuperscriptTime-COS4JWHJ.js.br +0 -0
  294. package/client/assets/SuperscriptTime-COS4JWHJ.js.gz +0 -0
  295. package/client/assets/SwatchPicker-DPyJv7aS.js +0 -2
  296. package/client/assets/SwatchPicker-DPyJv7aS.js.br +0 -0
  297. package/client/assets/SwatchPicker-DPyJv7aS.js.gz +0 -0
  298. package/client/assets/TimeElements-8rNLGU60.js +0 -2
  299. package/client/assets/TimeElements-8rNLGU60.js.br +0 -0
  300. package/client/assets/TimeElements-8rNLGU60.js.gz +0 -0
  301. package/client/assets/TimeInput-OX4LMRQl.js.br +0 -0
  302. package/client/assets/TimeInput-OX4LMRQl.js.gz +0 -0
  303. package/client/assets/TimelinePage-7kRpUl6P.js.br +0 -0
  304. package/client/assets/TimelinePage-7kRpUl6P.js.gz +0 -0
  305. package/client/assets/Timer-Bg9pVhup.js.br +0 -0
  306. package/client/assets/Timer-Bg9pVhup.js.gz +0 -0
  307. package/client/assets/TimerControlExport-BNfZ99Im.js +0 -2
  308. package/client/assets/TimerControlExport-BNfZ99Im.js.br +0 -0
  309. package/client/assets/TimerControlExport-BNfZ99Im.js.gz +0 -0
  310. package/client/assets/TimerDisplay-DQQ7sMDc.js +0 -2
  311. package/client/assets/TimerDisplay-DQQ7sMDc.js.br +0 -0
  312. package/client/assets/TimerDisplay-DQQ7sMDc.js.gz +0 -0
  313. package/client/assets/TitleCard-De0WhlN2.js.br +0 -0
  314. package/client/assets/TitleCard-De0WhlN2.js.gz +0 -0
  315. package/client/assets/Tooltip-B4PEP32j.js +0 -2
  316. package/client/assets/Tooltip-B4PEP32j.js.br +0 -0
  317. package/client/assets/Tooltip-B4PEP32j.js.gz +0 -0
  318. package/client/assets/ViewLogo-CHqiH4C0.js.br +0 -0
  319. package/client/assets/ViewLogo-CHqiH4C0.js.gz +0 -0
  320. package/client/assets/ViewParamsEditor-BHIK3qtx.js.br +0 -0
  321. package/client/assets/ViewParamsEditor-BHIK3qtx.js.gz +0 -0
  322. package/client/assets/editorSettings-VcitNPq1.js.br +0 -0
  323. package/client/assets/editorSettings-VcitNPq1.js.gz +0 -0
  324. package/client/assets/getProgress-mRMYlU96.js.br +0 -0
  325. package/client/assets/getProgress-mRMYlU96.js.gz +0 -0
  326. package/client/assets/index-DYkg-xOk.js +0 -3
  327. package/client/assets/index-DYkg-xOk.js.br +0 -0
  328. package/client/assets/index-DYkg-xOk.js.gz +0 -0
  329. package/client/assets/index-DYkg-xOk.js.map +0 -1
  330. package/client/assets/offset-Bs6CY1IK.js.br +0 -3
  331. package/client/assets/offset-Bs6CY1IK.js.gz +0 -0
  332. package/client/assets/parseUserTime-CI7s8pYc.js.br +0 -0
  333. package/client/assets/parseUserTime-CI7s8pYc.js.gz +0 -0
  334. package/client/assets/playbackstate-DisgQbHM.js.br +0 -0
  335. package/client/assets/playbackstate-DisgQbHM.js.gz +0 -0
  336. package/client/assets/presentation.utils-Bv3PuMWv.js.br +0 -0
  337. package/client/assets/presentation.utils-Bv3PuMWv.js.gz +0 -0
  338. package/client/assets/rundownUtils-CJxEqFha.js +0 -2
  339. package/client/assets/rundownUtils-CJxEqFha.js.br +0 -0
  340. package/client/assets/rundownUtils-CJxEqFha.js.gz +0 -0
  341. package/client/assets/rundownUtils-CJxEqFha.js.map +0 -1
  342. package/client/assets/timer.utils-P25ngopd.js +0 -2
  343. package/client/assets/timer.utils-P25ngopd.js.br +0 -0
  344. package/client/assets/timer.utils-P25ngopd.js.gz +0 -0
  345. package/client/assets/useCustomFields-DUYgd-E7.js +0 -2
  346. package/client/assets/useCustomFields-DUYgd-E7.js.br +0 -0
  347. package/client/assets/useCustomFields-DUYgd-E7.js.gz +0 -0
  348. package/client/assets/useCustomFields-DUYgd-E7.js.map +0 -1
  349. package/client/assets/useEventSelection-R7JdgAzy.js +0 -2
  350. package/client/assets/useEventSelection-R7JdgAzy.js.br +0 -0
  351. package/client/assets/useEventSelection-R7JdgAzy.js.gz +0 -0
  352. package/client/assets/useEventSelection-R7JdgAzy.js.map +0 -1
  353. package/client/assets/useProjectData-DdITd09M.js +0 -2
  354. package/client/assets/useProjectData-DdITd09M.js.br +0 -0
  355. package/client/assets/useProjectData-DdITd09M.js.gz +0 -0
  356. package/client/assets/useProjectData-DdITd09M.js.map +0 -1
  357. package/client/assets/useReport-CR0k0b85.js +0 -2
  358. package/client/assets/useReport-CR0k0b85.js.br +0 -0
  359. package/client/assets/useReport-CR0k0b85.js.gz +0 -0
  360. package/client/assets/useReport-CR0k0b85.js.map +0 -1
  361. package/client/assets/useRundown-CR9Ah1Fa.js +0 -2
  362. package/client/assets/useRundown-CR9Ah1Fa.js.br +0 -0
  363. package/client/assets/useRundown-CR9Ah1Fa.js.gz +0 -0
  364. package/client/assets/useRundown-CR9Ah1Fa.js.map +0 -1
  365. package/client/assets/useSelectAndRevealEntry-CzSIOtzH.js.br +0 -0
  366. package/client/assets/useSelectAndRevealEntry-CzSIOtzH.js.gz +0 -0
  367. package/client/assets/useWindowTitle-Cl1AVD9_.js.br +0 -0
  368. package/client/assets/useWindowTitle-Cl1AVD9_.js.gz +0 -0
  369. package/client/assets/validateEvent-DhFtLvz_.js +0 -2
  370. package/client/assets/validateEvent-DhFtLvz_.js.br +0 -0
  371. package/client/assets/validateEvent-DhFtLvz_.js.gz +0 -0
  372. package/client/assets/vendor-dQa48psh.js.br +0 -0
  373. package/client/assets/vendor-dQa48psh.js.gz +0 -0
  374. package/client/assets/viewLoader.utils-ndDejZHN.js.br +0 -0
  375. package/client/assets/viewLoader.utils-ndDejZHN.js.gz +0 -0
  376. package/client/assets/viewUtils-rcOl1-o8.js.br +0 -0
  377. package/client/assets/viewUtils-rcOl1-o8.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["InputRow","props","label","placeholder","text","visible","changeHandler","children","value","setValue","useState","inputRef","useRef","cursorPositionRef","useEffect","current","document","activeElement","selectionStart","selectionEnd","handleInputChange","event","target","jsx","cx","style","active","jsxs","inputItems","Input","isPipSupported","window","PipTimerHost","lazy","__vitePreload","memo","PipRoot","Suspense","secondarySourceLabels","aux1","aux2","aux3","secondary","TimerPreview","blink","blackout","countToEnd","phase","secondarySource","showTimerMessage","timerType","useMessagePreview","data","useViewSettings","main","TimerType","None","timerPlaceholder","TimerPhase","Pending","Overtime","Clock","overrideColour","Warning","warningColor","Danger","dangerColor","normalColor","showColourOverride","contentClasses","preview","CornerWithPip","handleLinks","mainContent","secondaryContent","eventStatus","Tooltip","statusIcon","CountDown","IoArrowDown","CountUp","IoArrowUp","IoTime","IoBan","LuArrowDownToLine","TimerControlsPreview","useTimerViewControl","previewContainer","options","SecondarySourceControl","Editor.Separator","Button","setMessage","timerBlink","timerBlackout","toggleSecondary","timerSecondarySource","Fragment","Select","MessageControl","TimerMessageInput","SecondaryInput","useTimerMessageInput","newValue","timerText","IconButton","timerVisible","IoEye","IoEyeOffOutline","useSecondaryMessageInput","secondaryMessage","MessageControlExport","isExtracted","location","pathname","includes","ProtectRoute","Editor.Panel","growPanel","Editor.CornerExtract","ViewNavigationMenu","getIsNavigationLocked","contentLayout","ErrorBoundary"],"ignoreList":[],"sources":["../../src/features/control/message/InputRow.tsx","../../src/views/editor/pip-timer/pip.utils.ts","../../src/views/editor/pip-timer/PipRoot.tsx","../../src/features/control/message/TimerPreview.tsx","../../src/features/control/message/TimerViewControl.tsx","../../src/features/control/message/MessageControl.tsx","../../src/features/control/message/MessageControlExport.tsx"],"sourcesContent":["import { PropsWithChildren, useEffect, useRef, useState } from 'react';\n\nimport Input from '../../../common/components/input/input/Input';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './InputRow.module.scss';\n\ninterface InputRowProps {\n label: string;\n placeholder: string;\n text: string;\n visible: boolean;\n changeHandler: (newValue: string) => void;\n}\n\nexport default function InputRow(props: PropsWithChildren<InputRowProps>) {\n const { label, placeholder, text, visible, changeHandler, children } = props;\n\n const [value, setValue] = useState(text);\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef(0);\n\n // sync cursor position with text\n useEffect(() => {\n if (inputRef.current && inputRef.current !== document.activeElement) {\n inputRef.current.selectionStart = cursorPositionRef.current;\n inputRef.current.selectionEnd = cursorPositionRef.current;\n }\n }, [text]);\n\n // synchronise external text\n useEffect(() => {\n if (inputRef.current !== document.activeElement) {\n setValue(text);\n }\n }, [text]);\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n cursorPositionRef.current = event.target.selectionStart ?? 0;\n setValue(event.target.value);\n changeHandler(event.target.value);\n };\n\n return (\n <div>\n <label className={cx([style.label, visible ?? style.active])} htmlFor={label}>\n {label}\n </label>\n <div className={style.inputItems}>\n <Input id={label} ref={inputRef} value={value} onChange={handleInputChange} placeholder={placeholder} />\n {children}\n </div>\n </div>\n );\n}\n","export const isPipSupported = 'documentPictureInPicture' in window;\n","import { lazy, memo, Suspense } from 'react';\n\nimport { isPipSupported } from './pip.utils';\n\nconst PipTimerHost = lazy(() => import('./PipHost'));\n\nexport default memo(PipRoot);\nfunction PipRoot() {\n if (!isPipSupported) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <PipTimerHost />\n </Suspense>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoBan, IoTime } from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { TimerPhase, TimerType } from 'ontime-types';\n\nimport { CornerWithPip } from '../../../common/components/editor-utils/EditorUtils';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useMessagePreview } from '../../../common/hooks/useSocket';\nimport useViewSettings from '../../../common/hooks-query/useViewSettings';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { cx, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport PipRoot from '../../../views/editor/pip-timer/PipRoot';\n\nimport style from './TimerPreview.module.scss';\n\nconst secondarySourceLabels: Record<string, string> = {\n aux1: 'Aux 1',\n aux2: 'Aux 2',\n aux3: 'Aux 3',\n secondary: 'Secondary message',\n};\n\nexport default function TimerPreview() {\n const { blink, blackout, countToEnd, phase, secondarySource, showTimerMessage, timerType } = useMessagePreview();\n const { data } = useViewSettings();\n\n const main = (() => {\n if (showTimerMessage) return 'Message';\n if (timerType === TimerType.None) return timerPlaceholder;\n if (phase === TimerPhase.Pending) return 'Standby to start';\n if (phase === TimerPhase.Overtime) return 'Timer Overtime';\n if (timerType === TimerType.Clock) return 'Clock';\n if (countToEnd) return 'Count to End';\n return 'Timer';\n })();\n\n const secondary = (() => {\n // message is a fullscreen overlay or secondary is not active\n if (showTimerMessage || !secondarySource) return null;\n\n // we need to check aux first since it takes priority\n return secondarySourceLabels[secondarySource];\n })();\n\n const overrideColour = (() => {\n // override fallback colours from starter project\n if (phase === TimerPhase.Warning) return data.warningColor ?? '#ffa528';\n if (phase === TimerPhase.Danger) return data.dangerColor ?? '#ff7300';\n return data.normalColor ?? '#FFFC';\n })();\n\n const showColourOverride = main == 'Timer';\n const contentClasses = cx([blink && style.blink, blackout && style.blackout]);\n\n return (\n <div className={style.preview}>\n <CornerWithPip onExtractClick={(event) => handleLinks('timer', event)} pipElement={<PipRoot />} />\n <div className={contentClasses}>\n <div\n className={style.mainContent}\n data-phase={showColourOverride && phase}\n style={showColourOverride ? { '--override-colour': overrideColour } : {}}\n >\n {main}\n </div>\n {secondary !== null && <div className={style.secondaryContent}>{secondary}</div>}\n </div>\n <div className={style.eventStatus}>\n <Tooltip\n text='Time type: Count down'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountDown}\n >\n <IoArrowDown />\n </Tooltip>\n <Tooltip\n text='Time type: Count up'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountUp}\n >\n <IoArrowUp />\n </Tooltip>\n <Tooltip\n text='Time type: Clock'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.Clock}\n >\n <IoTime />\n </Tooltip>\n <Tooltip\n text='Time type: None'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.None}\n >\n <IoBan />\n </Tooltip>\n <Tooltip\n text={countToEnd ? 'Count to end' : 'Count duration'}\n render={<span />}\n className={style.statusIcon}\n data-active={countToEnd}\n >\n <LuArrowDownToLine />\n </Tooltip>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { SecondarySource } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport Select from '../../../common/components/select/Select';\nimport { setMessage, useTimerViewControl } from '../../../common/hooks/useSocket';\n\nimport TimerPreview from './TimerPreview';\n\nimport style from './TimerViewControl.module.scss';\n\nexport default function TimerControlsPreview() {\n const { blackout, blink } = useTimerViewControl();\n\n return (\n <div className={style.previewContainer}>\n <TimerPreview />\n <div className={style.options}>\n <SecondarySourceControl />\n\n <Editor.Separator orientation='horizontal' />\n\n <Button\n variant={blink ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlink(!blink)}\n data-testid='toggle timer blink'\n >\n Blink\n </Button>\n <Button\n variant={blackout ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlackout(!blackout)}\n data-testid='toggle timer blackout'\n >\n Blackout screen\n </Button>\n </div>\n </div>\n );\n}\n\nfunction SecondarySourceControl() {\n const { secondarySource } = useTimerViewControl();\n const [value, setValue] = useState<SecondarySource>('aux1');\n\n // sync secondary source with external changes\n useEffect(() => {\n if (secondarySource !== null) {\n setValue(secondarySource);\n }\n }, [secondarySource]);\n\n const toggleSecondary = () => {\n if (secondarySource === value) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource(value);\n }\n };\n\n return (\n <>\n <Select\n value={value}\n options={[\n { value: 'aux1', label: 'Aux 1' },\n { value: 'aux2', label: 'Aux 2' },\n { value: 'aux3', label: 'Aux 3' },\n { value: 'secondary', label: 'Secondary message' },\n ]}\n onValueChange={(value: SecondarySource | null) => {\n if (value === null) return;\n // we can only update the remote if it is enabled\n if (secondarySource !== null) {\n setMessage.timerSecondarySource(value);\n }\n setValue(value);\n }}\n />\n <Button\n variant={secondarySource !== null ? 'primary' : 'subtle'}\n fluid\n onClick={toggleSecondary}\n data-testid='toggle secondary'\n >\n Show secondary\n </Button>\n </>\n );\n}\n","import { IoEye, IoEyeOffOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport {\n setMessage,\n useExternalMessageInput as useSecondaryMessageInput,\n useTimerMessageInput,\n} from '../../../common/hooks/useSocket';\n\nimport InputRow from './InputRow';\nimport TimerControlsPreview from './TimerViewControl';\n\nexport default function MessageControl() {\n return (\n <>\n <TimerControlsPreview />\n <TimerMessageInput />\n <SecondaryInput />\n </>\n );\n}\n\nfunction TimerMessageInput() {\n const { text, visible } = useTimerMessageInput();\n\n return (\n <InputRow\n label='Timer Message'\n placeholder='Message shown fullscreen in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.timerText(newValue)}\n >\n <IconButton\n aria-label='Toggle timer message visibility'\n onClick={() => setMessage.timerVisible(!visible)}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n\nfunction SecondaryInput() {\n const { text, visible } = useSecondaryMessageInput();\n\n const toggleSecondary = () => {\n if (visible) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource('secondary');\n }\n };\n\n return (\n <InputRow\n label='Secondary Message'\n placeholder='Message shown as secondary text in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.secondaryMessage(newValue)}\n >\n <IconButton\n aria-label='Toggle secondary message visibility'\n onClick={toggleSecondary}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n","import { memo } from 'react';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { getIsNavigationLocked } from '../../../externals';\n\nimport MessageControl from './MessageControl';\n\nimport style from './MessageControlExport.module.scss';\n\nexport default memo(MessageControlExport);\nfunction MessageControlExport() {\n const isExtracted = window.location.pathname.includes('/messagecontrol');\n\n return (\n <ProtectRoute permission='editor'>\n <Editor.Panel className={style.growPanel} data-testid='panel-messages-control'>\n {!isExtracted && <Editor.CornerExtract onClick={(event) => handleLinks('messagecontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings isNavigationLocked={getIsNavigationLocked()} />}\n\n <div className={style.contentLayout}>\n <ErrorBoundary>\n <MessageControl />\n </ErrorBoundary>\n </div>\n </Editor.Panel>\n </ProtectRoute>\n );\n}\n"],"file":"assets/MessageControlExport-DGo2ZNMw.js"}
1
+ {"version":3,"mappings":"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","names":["InputRow","props","label","placeholder","text","visible","changeHandler","children","value","setValue","useState","inputRef","useRef","cursorPositionRef","useEffect","current","document","activeElement","selectionStart","selectionEnd","handleInputChange","event","target","jsx","cx","style","active","jsxs","inputItems","Input","isPipSupported","window","PipTimerHost","lazy","__vitePreload","memo","PipRoot","Suspense","secondarySourceLabels","aux1","aux2","aux3","secondary","TimerPreview","blink","blackout","countToEnd","phase","secondarySource","showTimerMessage","timerType","useMessagePreview","data","useViewSettings","main","TimerType","None","timerPlaceholder","TimerPhase","Pending","Overtime","Clock","overrideColour","Warning","warningColor","Danger","dangerColor","normalColor","showColourOverride","contentClasses","preview","CornerWithPip","handleLinks","mainContent","secondaryContent","eventStatus","Tooltip","statusIcon","CountDown","IoArrowDown","CountUp","IoArrowUp","IoTime","IoBan","LuArrowDownToLine","TimerControlsPreview","useTimerViewControl","previewContainer","options","SecondarySourceControl","Editor.Separator","Button","setMessage","timerBlink","timerBlackout","toggleSecondary","timerSecondarySource","Fragment","Select","MessageControl","TimerMessageInput","SecondaryInput","useTimerMessageInput","newValue","timerText","IconButton","timerVisible","IoEye","IoEyeOffOutline","useSecondaryMessageInput","secondaryMessage","MessageControlExport","isExtracted","location","pathname","includes","ProtectRoute","Editor.Panel","growPanel","Editor.CornerExtract","ViewNavigationMenu","getIsNavigationLocked","contentLayout","ErrorBoundary"],"ignoreList":[],"sources":["../../src/features/control/message/InputRow.tsx","../../src/views/editor/pip-timer/pip.utils.ts","../../src/views/editor/pip-timer/PipRoot.tsx","../../src/features/control/message/TimerPreview.tsx","../../src/features/control/message/TimerViewControl.tsx","../../src/features/control/message/MessageControl.tsx","../../src/features/control/message/MessageControlExport.tsx"],"sourcesContent":["import { PropsWithChildren, useEffect, useRef, useState } from 'react';\n\nimport Input from '../../../common/components/input/input/Input';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './InputRow.module.scss';\n\ninterface InputRowProps {\n label: string;\n placeholder: string;\n text: string;\n visible: boolean;\n changeHandler: (newValue: string) => void;\n}\n\nexport default function InputRow(props: PropsWithChildren<InputRowProps>) {\n const { label, placeholder, text, visible, changeHandler, children } = props;\n\n const [value, setValue] = useState(text);\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef(0);\n\n // sync cursor position with text\n useEffect(() => {\n if (inputRef.current && inputRef.current !== document.activeElement) {\n inputRef.current.selectionStart = cursorPositionRef.current;\n inputRef.current.selectionEnd = cursorPositionRef.current;\n }\n }, [text]);\n\n // synchronise external text\n useEffect(() => {\n if (inputRef.current !== document.activeElement) {\n setValue(text);\n }\n }, [text]);\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n cursorPositionRef.current = event.target.selectionStart ?? 0;\n setValue(event.target.value);\n changeHandler(event.target.value);\n };\n\n return (\n <div>\n <label className={cx([style.label, visible ?? style.active])} htmlFor={label}>\n {label}\n </label>\n <div className={style.inputItems}>\n <Input id={label} ref={inputRef} value={value} onChange={handleInputChange} placeholder={placeholder} />\n {children}\n </div>\n </div>\n );\n}\n","export const isPipSupported = 'documentPictureInPicture' in window;\n","import { lazy, memo, Suspense } from 'react';\n\nimport { isPipSupported } from './pip.utils';\n\nconst PipTimerHost = lazy(() => import('./PipHost'));\n\nexport default memo(PipRoot);\nfunction PipRoot() {\n if (!isPipSupported) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <PipTimerHost />\n </Suspense>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoBan, IoTime } from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { TimerPhase, TimerType } from 'ontime-types';\n\nimport { CornerWithPip } from '../../../common/components/editor-utils/EditorUtils';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useMessagePreview } from '../../../common/hooks/useSocket';\nimport useViewSettings from '../../../common/hooks-query/useViewSettings';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { cx, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport PipRoot from '../../../views/editor/pip-timer/PipRoot';\n\nimport style from './TimerPreview.module.scss';\n\nconst secondarySourceLabels: Record<string, string> = {\n aux1: 'Aux 1',\n aux2: 'Aux 2',\n aux3: 'Aux 3',\n secondary: 'Secondary message',\n};\n\nexport default function TimerPreview() {\n const { blink, blackout, countToEnd, phase, secondarySource, showTimerMessage, timerType } = useMessagePreview();\n const { data } = useViewSettings();\n\n const main = (() => {\n if (showTimerMessage) return 'Message';\n if (timerType === TimerType.None) return timerPlaceholder;\n if (phase === TimerPhase.Pending) return 'Standby to start';\n if (phase === TimerPhase.Overtime) return 'Timer Overtime';\n if (timerType === TimerType.Clock) return 'Clock';\n if (countToEnd) return 'Count to End';\n return 'Timer';\n })();\n\n const secondary = (() => {\n // message is a fullscreen overlay or secondary is not active\n if (showTimerMessage || !secondarySource) return null;\n\n // we need to check aux first since it takes priority\n return secondarySourceLabels[secondarySource];\n })();\n\n const overrideColour = (() => {\n // override fallback colours from starter project\n if (phase === TimerPhase.Warning) return data.warningColor ?? '#ffa528';\n if (phase === TimerPhase.Danger) return data.dangerColor ?? '#ff7300';\n return data.normalColor ?? '#FFFC';\n })();\n\n const showColourOverride = main == 'Timer';\n const contentClasses = cx([blink && style.blink, blackout && style.blackout]);\n\n return (\n <div className={style.preview}>\n <CornerWithPip onExtractClick={(event) => handleLinks('timer', event)} pipElement={<PipRoot />} />\n <div className={contentClasses}>\n <div\n className={style.mainContent}\n data-phase={showColourOverride && phase}\n style={showColourOverride ? { '--override-colour': overrideColour } : {}}\n >\n {main}\n </div>\n {secondary !== null && <div className={style.secondaryContent}>{secondary}</div>}\n </div>\n <div className={style.eventStatus}>\n <Tooltip\n text='Time type: Count down'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountDown}\n >\n <IoArrowDown />\n </Tooltip>\n <Tooltip\n text='Time type: Count up'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountUp}\n >\n <IoArrowUp />\n </Tooltip>\n <Tooltip\n text='Time type: Clock'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.Clock}\n >\n <IoTime />\n </Tooltip>\n <Tooltip\n text='Time type: None'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.None}\n >\n <IoBan />\n </Tooltip>\n <Tooltip\n text={countToEnd ? 'Count to end' : 'Count duration'}\n render={<span />}\n className={style.statusIcon}\n data-active={countToEnd}\n >\n <LuArrowDownToLine />\n </Tooltip>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { SecondarySource } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport Select from '../../../common/components/select/Select';\nimport { setMessage, useTimerViewControl } from '../../../common/hooks/useSocket';\n\nimport TimerPreview from './TimerPreview';\n\nimport style from './TimerViewControl.module.scss';\n\nexport default function TimerControlsPreview() {\n const { blackout, blink } = useTimerViewControl();\n\n return (\n <div className={style.previewContainer}>\n <TimerPreview />\n <div className={style.options}>\n <SecondarySourceControl />\n\n <Editor.Separator orientation='horizontal' />\n\n <Button\n variant={blink ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlink(!blink)}\n data-testid='toggle timer blink'\n >\n Blink\n </Button>\n <Button\n variant={blackout ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlackout(!blackout)}\n data-testid='toggle timer blackout'\n >\n Blackout screen\n </Button>\n </div>\n </div>\n );\n}\n\nfunction SecondarySourceControl() {\n const { secondarySource } = useTimerViewControl();\n const [value, setValue] = useState<SecondarySource>('aux1');\n\n // sync secondary source with external changes\n useEffect(() => {\n if (secondarySource !== null) {\n setValue(secondarySource);\n }\n }, [secondarySource]);\n\n const toggleSecondary = () => {\n if (secondarySource === value) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource(value);\n }\n };\n\n return (\n <>\n <Select\n value={value}\n options={[\n { value: 'aux1', label: 'Aux 1' },\n { value: 'aux2', label: 'Aux 2' },\n { value: 'aux3', label: 'Aux 3' },\n { value: 'secondary', label: 'Secondary message' },\n ]}\n onValueChange={(value: SecondarySource | null) => {\n if (value === null) return;\n // we can only update the remote if it is enabled\n if (secondarySource !== null) {\n setMessage.timerSecondarySource(value);\n }\n setValue(value);\n }}\n />\n <Button\n variant={secondarySource !== null ? 'primary' : 'subtle'}\n fluid\n onClick={toggleSecondary}\n data-testid='toggle secondary'\n >\n Show secondary\n </Button>\n </>\n );\n}\n","import { IoEye, IoEyeOffOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport {\n setMessage,\n useExternalMessageInput as useSecondaryMessageInput,\n useTimerMessageInput,\n} from '../../../common/hooks/useSocket';\n\nimport InputRow from './InputRow';\nimport TimerControlsPreview from './TimerViewControl';\n\nexport default function MessageControl() {\n return (\n <>\n <TimerControlsPreview />\n <TimerMessageInput />\n <SecondaryInput />\n </>\n );\n}\n\nfunction TimerMessageInput() {\n const { text, visible } = useTimerMessageInput();\n\n return (\n <InputRow\n label='Timer Message'\n placeholder='Message shown fullscreen in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.timerText(newValue)}\n >\n <IconButton\n aria-label='Toggle timer message visibility'\n onClick={() => setMessage.timerVisible(!visible)}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n\nfunction SecondaryInput() {\n const { text, visible } = useSecondaryMessageInput();\n\n const toggleSecondary = () => {\n if (visible) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource('secondary');\n }\n };\n\n return (\n <InputRow\n label='Secondary Message'\n placeholder='Message shown as secondary text in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.secondaryMessage(newValue)}\n >\n <IconButton\n aria-label='Toggle secondary message visibility'\n onClick={toggleSecondary}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n","import { memo } from 'react';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { getIsNavigationLocked } from '../../../externals';\n\nimport MessageControl from './MessageControl';\n\nimport style from './MessageControlExport.module.scss';\n\nexport default memo(MessageControlExport);\nfunction MessageControlExport() {\n const isExtracted = window.location.pathname.includes('/messagecontrol');\n\n return (\n <ProtectRoute permission='editor'>\n <Editor.Panel className={style.growPanel} data-testid='panel-messages-control'>\n {!isExtracted && <Editor.CornerExtract onClick={(event) => handleLinks('messagecontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings isNavigationLocked={getIsNavigationLocked()} />}\n\n <div className={style.contentLayout}>\n <ErrorBoundary>\n <MessageControl />\n </ErrorBoundary>\n </div>\n </Editor.Panel>\n </ProtectRoute>\n );\n}\n"],"file":"assets/MessageControlExport-BgT9JaXk.js"}
@@ -1,2 +1,2 @@
1
- import{j as r}from"./vendor-dQa48psh.js";import{g as a}from"./getProgress-mRMYlU96.js";import{e as l}from"./index-DYkg-xOk.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="b6a510aa-980d-46cf-8eca-62faf0652c7b",e._sentryDebugIdIdentifier="sentry-dbid-b6a510aa-980d-46cf-8eca-62faf0652c7b")}catch{}})();function j(e){const{now:s,complete:i,normalColor:g,warning:o,warningColor:c,danger:n,dangerColor:m,hidden:b,hideOvertime:u,ignoreCssOverride:f,className:p=""}=e,_=100-a(s,i),t=n?100-a(n,i):0,h=o?100-t-a(o,i):0,d=s!==null&&s<0&&!u;return r.jsx("div",{className:l(["multiprogress-bar",b&&"multiprogress-bar--hidden",f&&"multiprogress-bar--ignore-css-override",p]),children:s!==null&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"multiprogress-bar__bg",children:[r.jsx("div",{className:"multiprogress-bar__bg-normal",style:{backgroundColor:g}}),r.jsx("div",{className:"multiprogress-bar__bg-warning",style:{width:`${h}%`,backgroundColor:c}}),r.jsx("div",{className:l(["multiprogress-bar__bg-danger",d&&"multiprogress-bar__bg-danger--overtime"]),style:{width:`${t}%`,backgroundColor:d?void 0:m}})]}),r.jsx("div",{className:"multiprogress-bar__indicator",children:r.jsx("div",{className:"multiprogress-bar__indicator-bar",style:{width:`${_}%`}})})]})})}export{j as M};
2
- //# sourceMappingURL=MultiPartProgressBar-IIU35-x9.js.map
1
+ import{j as r}from"./vendor-BKUJ0_Du.js";import{g as a}from"./getProgress-ZUTmCn_v.js";import{e as l}from"./index-Dm-4OTmY.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="b6a510aa-980d-46cf-8eca-62faf0652c7b",e._sentryDebugIdIdentifier="sentry-dbid-b6a510aa-980d-46cf-8eca-62faf0652c7b")}catch{}})();function j(e){const{now:s,complete:i,normalColor:g,warning:o,warningColor:c,danger:n,dangerColor:m,hidden:b,hideOvertime:u,ignoreCssOverride:f,className:p=""}=e,_=100-a(s,i),t=n?100-a(n,i):0,h=o?100-t-a(o,i):0,d=s!==null&&s<0&&!u;return r.jsx("div",{className:l(["multiprogress-bar",b&&"multiprogress-bar--hidden",f&&"multiprogress-bar--ignore-css-override",p]),children:s!==null&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"multiprogress-bar__bg",children:[r.jsx("div",{className:"multiprogress-bar__bg-normal",style:{backgroundColor:g}}),r.jsx("div",{className:"multiprogress-bar__bg-warning",style:{width:`${h}%`,backgroundColor:c}}),r.jsx("div",{className:l(["multiprogress-bar__bg-danger",d&&"multiprogress-bar__bg-danger--overtime"]),style:{width:`${t}%`,backgroundColor:d?void 0:m}})]}),r.jsx("div",{className:"multiprogress-bar__indicator",children:r.jsx("div",{className:"multiprogress-bar__indicator-bar",style:{width:`${_}%`}})})]})})}export{j as M};
2
+ //# sourceMappingURL=MultiPartProgressBar-W2a-JWPY.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultiPartProgressBar-IIU35-x9.js","sources":["../../src/common/components/multi-part-progress-bar/MultiPartProgressBar.tsx"],"sourcesContent":["import { MaybeNumber } from 'ontime-types';\n\nimport { getProgress } from '../../utils/getProgress';\nimport { cx } from '../../utils/styleUtils';\n\nimport './MultiPartProgressBar.scss';\n\ninterface MultiPartProgressBar {\n now: MaybeNumber;\n complete: MaybeNumber;\n normalColor: string;\n warning?: MaybeNumber;\n warningColor: string;\n danger?: MaybeNumber;\n dangerColor: string;\n hidden?: boolean;\n hideOvertime?: boolean;\n ignoreCssOverride?: boolean;\n className?: string;\n}\n\nexport default function MultiPartProgressBar(props: MultiPartProgressBar) {\n const {\n now,\n complete,\n normalColor,\n warning,\n warningColor,\n danger,\n dangerColor,\n hidden,\n hideOvertime,\n ignoreCssOverride,\n className = '',\n } = props;\n\n const percentRemaining = 100 - getProgress(now, complete);\n const dangerWidth = danger ? 100 - getProgress(danger, complete) : 0;\n const warningWidth = warning ? 100 - dangerWidth - getProgress(warning, complete) : 0;\n const isOvertime = now !== null && now < 0;\n const showOvertime = isOvertime && !hideOvertime;\n\n return (\n <div\n className={cx([\n 'multiprogress-bar',\n hidden && 'multiprogress-bar--hidden',\n ignoreCssOverride && 'multiprogress-bar--ignore-css-override',\n className,\n ])}\n >\n {now !== null && (\n <>\n <div className='multiprogress-bar__bg'>\n <div className='multiprogress-bar__bg-normal' style={{ backgroundColor: normalColor }} />\n <div\n className='multiprogress-bar__bg-warning'\n style={{ width: `${warningWidth}%`, backgroundColor: warningColor }}\n />\n <div\n className={cx(['multiprogress-bar__bg-danger', showOvertime && 'multiprogress-bar__bg-danger--overtime'])}\n style={{ width: `${dangerWidth}%`, backgroundColor: showOvertime ? undefined : dangerColor }}\n />\n </div>\n <div className='multiprogress-bar__indicator'>\n <div className='multiprogress-bar__indicator-bar' style={{ width: `${percentRemaining}%` }} />\n </div>\n </>\n )}\n </div>\n );\n}\n"],"names":["MultiPartProgressBar","props","now","complete","normalColor","warning","warningColor","danger","dangerColor","hidden","hideOvertime","ignoreCssOverride","className","percentRemaining","getProgress","dangerWidth","warningWidth","showOvertime","jsx","cx","jsxs","Fragment","backgroundColor","width","undefined"],"mappings":"ydAqBA,SAAwBA,EAAqBC,EAA6B,CAClE,KAAA,CACJC,IAAAA,EACAC,SAAAA,EACAC,YAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,OAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,aAAAA,EACAC,kBAAAA,EACAC,UAAAA,EAAY,EAAA,EACVX,EAEEY,EAAmB,IAAMC,EAAYZ,EAAKC,CAAQ,EAClDY,EAAcR,EAAS,IAAMO,EAAYP,EAAQJ,CAAQ,EAAI,EAC7Da,EAAeX,EAAU,IAAMU,EAAcD,EAAYT,EAASF,CAAQ,EAAI,EAE9Ec,EADaf,IAAQ,MAAQA,EAAM,GACN,CAACQ,EAEpC,OACGQ,EAAA,IAAA,MAAA,CACC,UAAWC,EAAG,CACZ,oBACAV,GAAU,4BACVE,GAAqB,yCACrBC,CAAS,CACV,EAEAV,SAAAA,IAAQ,MAELkB,EAAA,KAAAC,WAAA,CAAA,SAAA,CAACD,EAAAA,KAAA,MAAA,CAAI,UAAU,wBACb,SAAA,CAACF,EAAAA,IAAA,MAAA,CAAI,UAAU,+BAA+B,MAAO,CAAEI,gBAAiBlB,CAAAA,EAAc,EACrFc,EAAAA,IAAA,MAAA,CACC,UAAU,gCACV,MAAO,CAAEK,MAAO,GAAGP,CAAY,IAAKM,gBAAiBhB,CAAAA,EAAe,EAEtEY,MAAC,MACC,CAAA,UAAWC,EAAG,CAAC,+BAAgCF,GAAgB,wCAAwC,CAAC,EACxG,MAAO,CAAEM,MAAO,GAAGR,CAAW,IAAKO,gBAAiBL,EAAeO,OAAYhB,CAAAA,CAAc,CAAA,CAAA,EAEjG,EACAU,EAAAA,IAAC,OAAI,UAAU,+BACb,eAAC,MAAI,CAAA,UAAU,mCAAmC,MAAO,CAAEK,MAAO,GAAGV,CAAgB,KAAM,CAC7F,CAAA,CAAA,CAAA,CACF,CAEJ,CAAA,CAEJ"}
1
+ {"version":3,"file":"MultiPartProgressBar-W2a-JWPY.js","sources":["../../src/common/components/multi-part-progress-bar/MultiPartProgressBar.tsx"],"sourcesContent":["import { MaybeNumber } from 'ontime-types';\n\nimport { getProgress } from '../../utils/getProgress';\nimport { cx } from '../../utils/styleUtils';\n\nimport './MultiPartProgressBar.scss';\n\ninterface MultiPartProgressBar {\n now: MaybeNumber;\n complete: MaybeNumber;\n normalColor: string;\n warning?: MaybeNumber;\n warningColor: string;\n danger?: MaybeNumber;\n dangerColor: string;\n hidden?: boolean;\n hideOvertime?: boolean;\n ignoreCssOverride?: boolean;\n className?: string;\n}\n\nexport default function MultiPartProgressBar(props: MultiPartProgressBar) {\n const {\n now,\n complete,\n normalColor,\n warning,\n warningColor,\n danger,\n dangerColor,\n hidden,\n hideOvertime,\n ignoreCssOverride,\n className = '',\n } = props;\n\n const percentRemaining = 100 - getProgress(now, complete);\n const dangerWidth = danger ? 100 - getProgress(danger, complete) : 0;\n const warningWidth = warning ? 100 - dangerWidth - getProgress(warning, complete) : 0;\n const isOvertime = now !== null && now < 0;\n const showOvertime = isOvertime && !hideOvertime;\n\n return (\n <div\n className={cx([\n 'multiprogress-bar',\n hidden && 'multiprogress-bar--hidden',\n ignoreCssOverride && 'multiprogress-bar--ignore-css-override',\n className,\n ])}\n >\n {now !== null && (\n <>\n <div className='multiprogress-bar__bg'>\n <div className='multiprogress-bar__bg-normal' style={{ backgroundColor: normalColor }} />\n <div\n className='multiprogress-bar__bg-warning'\n style={{ width: `${warningWidth}%`, backgroundColor: warningColor }}\n />\n <div\n className={cx(['multiprogress-bar__bg-danger', showOvertime && 'multiprogress-bar__bg-danger--overtime'])}\n style={{ width: `${dangerWidth}%`, backgroundColor: showOvertime ? undefined : dangerColor }}\n />\n </div>\n <div className='multiprogress-bar__indicator'>\n <div className='multiprogress-bar__indicator-bar' style={{ width: `${percentRemaining}%` }} />\n </div>\n </>\n )}\n </div>\n );\n}\n"],"names":["MultiPartProgressBar","props","now","complete","normalColor","warning","warningColor","danger","dangerColor","hidden","hideOvertime","ignoreCssOverride","className","percentRemaining","getProgress","dangerWidth","warningWidth","showOvertime","jsx","cx","jsxs","Fragment","backgroundColor","width","undefined"],"mappings":"ydAqBA,SAAwBA,EAAqBC,EAA6B,CAClE,KAAA,CACJC,IAAAA,EACAC,SAAAA,EACAC,YAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,OAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,aAAAA,EACAC,kBAAAA,EACAC,UAAAA,EAAY,EAAA,EACVX,EAEEY,EAAmB,IAAMC,EAAYZ,EAAKC,CAAQ,EAClDY,EAAcR,EAAS,IAAMO,EAAYP,EAAQJ,CAAQ,EAAI,EAC7Da,EAAeX,EAAU,IAAMU,EAAcD,EAAYT,EAASF,CAAQ,EAAI,EAE9Ec,EADaf,IAAQ,MAAQA,EAAM,GACN,CAACQ,EAEpC,OACGQ,EAAA,IAAA,MAAA,CACC,UAAWC,EAAG,CACZ,oBACAV,GAAU,4BACVE,GAAqB,yCACrBC,CAAS,CACV,EAEAV,SAAAA,IAAQ,MAELkB,EAAA,KAAAC,WAAA,CAAA,SAAA,CAACD,EAAAA,KAAA,MAAA,CAAI,UAAU,wBACb,SAAA,CAACF,EAAAA,IAAA,MAAA,CAAI,UAAU,+BAA+B,MAAO,CAAEI,gBAAiBlB,CAAAA,EAAc,EACrFc,EAAAA,IAAA,MAAA,CACC,UAAU,gCACV,MAAO,CAAEK,MAAO,GAAGP,CAAY,IAAKM,gBAAiBhB,CAAAA,EAAe,EAEtEY,MAAC,MACC,CAAA,UAAWC,EAAG,CAAC,+BAAgCF,GAAgB,wCAAwC,CAAC,EACxG,MAAO,CAAEM,MAAO,GAAGR,CAAW,IAAKO,gBAAiBL,EAAeO,OAAYhB,CAAAA,CAAc,CAAA,CAAA,EAEjG,EACAU,EAAAA,IAAC,OAAI,UAAU,+BACb,eAAC,MAAI,CAAA,UAAU,mCAAmC,MAAO,CAAEK,MAAO,GAAGV,CAAgB,KAAM,CAC7F,CAAA,CAAA,CAAA,CACF,CAEJ,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{h as c,j as e,D as ae,q as le,t as ce,v as ue,l as de}from"./vendor-dQa48psh.js";import{P as me}from"./ProtectRoute-CcDK6JVA.js";import{ak as pe,B as z,t as te,r as fe,bf as he,aC as ge,e as T,f as _e,b6 as ve,k as be,M as ye,b7 as xe,ba as je,a as Se,P as Ee,b as we,L as Oe,o as Ce,g as Te,O as Pe,bg as Ne}from"./index-DYkg-xOk.js";import{t as Fe,i as q,j as De}from"./useRundown-CR9Ah1Fa.js";import{E as Le}from"./EmptyPage-CcO33dlE.js";import{m as Me,b as ke,O as $,V as Re}from"./ViewParamsEditor-BHIK3qtx.js";import{u as Ie,F as Ue}from"./FollowButton-DJCtYYXt.js";import{u as Be}from"./useWindowTitle-Cl1AVD9_.js";import{T as Ae}from"./editorSettings-VcitNPq1.js";import{u as We,D as Ve}from"./DelayIndicator-OEjcqoIx.js";import{f as $e,T as Ge,C as He}from"./TimeElements-8rNLGU60.js";import{S as Ze}from"./SuperscriptPeriod-DswX2aei.js";import{M as ze}from"./MultiPartProgressBar-IIU35-x9.js";import{g as qe,a as Qe}from"./viewLoader.utils-ndDejZHN.js";import{i as G,b as Q}from"./viewUtils-rcOl1-o8.js";import{u as Je}from"./useCustomFields-DUYgd-E7.js";import"./SwatchPicker-DPyJv7aS.js";import"./Select-B3zdv0Ng.js";import"./validateEvent-DhFtLvz_.js";import"./parseUserTime-CI7s8pYc.js";import"./rundownUtils-CJxEqFha.js";import"./Tooltip-B4PEP32j.js";import"./offset-Bs6CY1IK.js";import"./playbackstate-DisgQbHM.js";/* empty css */import"./getProgress-mRMYlU96.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="1987c7b4-62eb-4168-ac88-f4c04dcb7e26",t._sentryDebugIdIdentifier="sentry-dbid-1987c7b4-62eb-4168-ac88-f4c04dcb7e26")}catch{}})();const Ke="_editModal_1k6b9_17",Xe="_title_1k6b9_31",Ye="_body_1k6b9_39",et="_label_1k6b9_48",tt="_footer_1k6b9_54",C={editModal:Ke,title:Xe,body:Ye,label:et,footer:tt};function st(t){const{event:s,onClose:o}=t,{updateEntry:r}=We(),[n,i]=c.useState(!1),d=c.useRef(new Array),g=async()=>{if(!d.current)return;i(!0);const a={id:s.id};d.current.forEach(l=>{l.dataset.field&&l.defaultValue!=l.value&&(a.custom?a.custom[l.dataset.field]=l.value:Object.assign(a,{custom:{[l.dataset.field]:l.value}}))}),a.custom&&await r(a),i(!1),o()};return e.jsx(ae,{open:!0,onOpenChange:a=>{a||o()},children:e.jsx(le,{children:e.jsxs(ce,{className:C.editModal,children:[e.jsxs("div",{className:C.title,children:[`Editing fields in cue ${s.cue}`,e.jsx(pe,{variant:"subtle-white",onClick:o,disabled:n,children:e.jsx(ue,{})})]}),e.jsx("div",{className:C.body,children:s.subscriptions.map(a=>e.jsxs(c.Fragment,{children:[e.jsx("label",{htmlFor:a.id,className:C.label,style:{"--user-bg":a.colour},children:a.label}),e.jsx(Ae,{name:a.id,ref:l=>{l&&d.current.push(l)},placeholder:`Add value for ${a.label} field`,defaultValue:a.value,"data-field":a.id,disabled:n,rows:5})]},a.id))}),e.jsxs("div",{className:C.footer,children:[e.jsx(z,{variant:"subtle",size:"large",onClick:o,disabled:n,children:"Cancel"}),e.jsx(z,{variant:"primary",size:"large",onClick:g,disabled:n,children:"Save"})]})]})})})}function ot(t,s={}){const{threshold:o=700,onStart:r,onFinish:n,onCancel:i}=s,d=c.useRef(!1),g=c.useRef(!1),a=c.useRef(-1);return c.useEffect(()=>()=>window.clearTimeout(a.current),[]),c.useMemo(()=>{if(typeof t!="function")return{};const l=m=>{!K(m)&&!J(m)||(r&&r(m),g.current=!0,a.current=window.setTimeout(()=>{t(m),d.current=!0},o))},h=m=>{!K(m)&&!J(m)||(d.current?n==null||n(m):g.current&&(i==null||i(m)),d.current=!1,g.current=!1,a.current&&window.clearTimeout(a.current))};return{onMouseDown:l,onMouseUp:h,onMouseLeave:h,onTouchStart:l,onTouchEnd:h,onTouchMove:te(h,150)}},[t,o,i,n,r])}function J(t){return window.TouchEvent?t.nativeEvent instanceof TouchEvent:"touches"in t.nativeEvent}function K(t){return t.nativeEvent instanceof MouseEvent}function nt(t){const{value:s,hideSeconds:o,hideLeadingZero:r,className:n}=t;let i=$e(s,o||r?2:3);return r&&(i=fe(i)),o&&(i=he(i)),e.jsx("div",{className:n,children:i})}const rt="_event_9py1c_21",it="_running_9py1c_38",at="_past_9py1c_42",lt="_binder_9py1c_47",ct="_cue_9py1c_57",ut="_mainField_9py1c_67",dt="_secondaryField_9py1c_76",mt="_plannedStart_9py1c_83",pt="_timeUntil_9py1c_84",ft="_runningTime_9py1c_85",ht="_fields_9py1c_114",gt="_field_9py1c_114",_t="_noColour_9py1c_123",vt="_value_9py1c_129",bt="_fieldsWithContent_9py1c_136",p={event:rt,running:it,past:at,binder:lt,cue:ct,mainField:ut,secondaryField:dt,plannedStart:mt,timeUntil:pt,runningTime:ft,fields:ht,field:gt,noColour:_t,value:vt,fieldsWithContent:bt},X=c.memo(yt);function yt({id:t,colour:s,cue:o,main:r,secondary:n,timeStart:i,duration:d,delay:g,dayOffset:a,isLinkedToLoaded:l,isSelected:h,isPast:m,selectedRef:N,showStart:F,subscribed:x,totalGap:j,onLongPress:D}){const v=f=>{f&&f.cancelable&&f.preventDefault(),x&&D({id:t,cue:o,subscriptions:x})},b=ot(v),R=s&&ge(s),E=T([p.event,h&&p.running,m&&p.past]),I=x.some(f=>f.value),U=x.length?Math.min(x.length,4):0,B=U>0?{gridTemplateColumns:`repeat(${U}, minmax(12rem, 1fr))`}:void 0;return e.jsxs("div",{className:E,"data-testid":o,ref:N,onContextMenu:v,...b,children:[e.jsx("div",{className:p.binder,style:{...R},children:e.jsx("span",{className:p.cue,children:o})}),e.jsxs("span",{className:p.mainField,children:[F&&e.jsx(Ze,{className:p.plannedStart,time:_e(i)}),r]}),e.jsx("span",{className:p.secondaryField,children:n}),e.jsx(xt,{timeStart:i,isPast:m,isSelected:h,delay:g,dayOffset:a,totalGap:j,isLinkedToLoaded:l}),e.jsxs("span",{className:p.runningTime,children:[e.jsx(Ve,{delayValue:g}),e.jsx(nt,{className:T([h&&p.muted]),value:d,hideLeadingZero:!0})]}),e.jsx("div",{className:T([p.fields,I&&p.fieldsWithContent]),style:B,children:x.map(f=>f.value?e.jsxs("div",{children:[e.jsx("span",{className:T([p.field,!f.colour&&p.noColour]),style:{backgroundColor:f.colour},children:f.label}),e.jsx("span",{className:p.value,style:{color:f.colour},children:f.value})]},f.id):e.jsx("div",{},f.id))})]})}function xt({timeStart:t,isPast:s,isSelected:o,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:d}){return s?e.jsx("span",{className:p.timeUntil,children:"DONE"}):o?e.jsx("span",{className:p.timeUntil,children:"LIVE"}):e.jsx(jt,{timeStart:t,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:d})}function jt({timeStart:t,delay:s,dayOffset:o,totalGap:r,isLinkedToLoaded:n}){const i=ve({timeStart:t,delay:s,dayOffset:o},{totalGap:r,isLinkedToLoaded:n}),g=i<xe?"DUE":`${be(Math.abs(i),i>2*ye)}`;return e.jsx("span",{className:p.timeUntil,"data-testid":"time-until",children:g})}const St="_group_c6uj3_17",Et={group:St},wt=c.memo(Ot);function Ot({title:t}){return e.jsx("div",{className:Et.group,children:t})}const Ct="_statusBar_1va40_17",Tt="_timers_1va40_25",Pt="_runningTimer_1va40_33",Nt="_timeNow_1va40_42",Ft="_progressOverride_1va40_51",P={statusBar:Ct,timers:Tt,runningTimer:Pt,timeNow:Nt,progressOverride:Ft};function Dt({viewSettings:t}){const{current:s,duration:o,timeWarning:r,timeDanger:n}=je();return e.jsx(ze,{now:s,complete:o,normalColor:t.normalColor,warning:r,warningColor:t.warningColor,danger:n,dangerColor:t.dangerColor,className:P.progressOverride,ignoreCssOverride:!0})}function Lt(){return e.jsxs("div",{className:P.timers,children:[e.jsx(Ge,{className:P.runningTimer}),e.jsx(He,{className:P.timeNow,shouldFormat:!0})]})}function Mt(){const{data:t}=Se();return e.jsxs("div",{className:P.statusBar,children:[e.jsx(Lt,{}),t&&e.jsx(Dt,{viewSettings:t})]})}const kt=(t,s)=>{const o=Me(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),r=ke(t);return[{title:$.ClockOptions,collapsible:!0,options:[qe(s)]},{title:$.DataSources,collapsible:!0,options:[{id:"main",title:"Main data field",description:"Field to be shown in the first line of text",type:"option",values:o,defaultValue:"title"},{id:"secondary-src",title:"Secondary data field",description:"Field to be shown in the second line of text",type:"option",values:o,defaultValue:"none"},{id:"subscribe",title:"Highlight Fields",description:"Choose custom fields to highlight",type:"multi-option",values:r},{id:"shouldEdit",title:"Edit custom field",description:"Allows editing an highlighted custom field by long pressing",type:"boolean",defaultValue:!1}]},{title:$.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1},{id:"showStart",title:"Show planned start",description:"Whether to prepend the planned start to the items",type:"boolean",defaultValue:!1}]}]};function Rt(t,s){const o=n=>(s==null?void 0:s.get(n))??t.get(n),r=n=>s!=null&&s.has(n)?s.getAll(n):t.getAll(n);return{mainSource:o("main"),secondarySource:o("secondary-src"),subscribe:r("subscribe"),shouldEdit:G(o("shouldEdit")),hidePast:G(o("hidePast")),showStart:G(o("showStart"))}}function It(){const[t]=de(),s=c.use(Ee);return c.useMemo(()=>{const r=s?new URLSearchParams(s.search):void 0;return Rt(t,r)},[s,t])}function Y(t,s,o,r,n){const i=s?Q(t,s)??"":t.title,d=Q(t,o)??"",a=r.filter(l=>Object.hasOwn(n,l)).reduce((l,h)=>{const m=n[h];return m&&l.push({id:h,label:m.label,colour:m.colour,value:t.custom[h]}),l},[]);return{mainField:i,secondaryField:d,subscribedData:a}}function Ut(){const{data:t,rundownMetadata:s,status:o}=Fe(),{data:r,status:n}=Je(),{data:i,status:d}=we();return{data:{rundown:t,rundownMetadata:s,customFields:r,settings:i},status:Qe([o,n,d])}}const Bt="_operatorContainer_1o5o0_17",At="_operatorEvents_1o5o0_24",Wt="_editPrompt_1o5o0_35",Vt="_show_1o5o0_49",k={operatorContainer:Bt,operatorEvents:At,editPrompt:Wt,show:Vt},ee=50;function $t(){const{data:t,status:s}=Ut();return Be("Operator"),s==="pending"?e.jsx(Oe,{}):s==="error"?e.jsx(Le,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Gt,{...t})}function Gt({rundown:t,rundownMetadata:s,customFields:o,settings:r}){const n=Ce(),{subscribe:i,mainSource:d,secondarySource:g,shouldEdit:a,hidePast:l,showStart:h}=It(),[m,N]=c.useState(!1),[F,x]=c.useState(null),[j,D]=c.useState(!1),v=c.useRef(null),b=c.useRef(null),R=Ie({followRef:v,scrollRef:b,doFollow:!j,topOffset:ee,followTrigger:n}),E=c.useRef(null);c.useEffect(()=>{var y;n||j||(y=b.current)==null||y.scrollTo(0,0)},[n,j,b]);const I=()=>{n&&R(),D(!1)},B=te(()=>{if(v!=null&&v.current&&(b!=null&&b.current)){const y=v.current.getBoundingClientRect(),u=b.current.getBoundingClientRect();if(y&&u){const w=y.top-u.top,S=w<-8||w>ee;D(S)}}},1e3),f=()=>{E.current&&clearTimeout(E.current),E.current=setTimeout(()=>{N(!1)},700),N(!0),B()},H=c.useCallback(y=>{x({...y})},[]),Z=Te(r==null?void 0:r.timeFormat),se=c.useMemo(()=>kt(o,Z),[o,Z]),A=a&&i.length;return e.jsxs("div",{className:k.operatorContainer,"data-testid":"operator-view",children:[e.jsx(Re,{target:Pe.Operator,viewOptions:se}),F&&e.jsx(st,{event:F,onClose:()=>x(null)}),e.jsx(Mt,{}),A&&e.jsx("div",{className:T([k.editPrompt,m&&k.show]),children:Ne?"Press and hold to edit user field":"Right click to edit user field"}),e.jsx("div",{className:k.operatorEvents,onWheel:f,onTouchMove:f,ref:b,children:t.order.map(y=>{var w;const u=t.entries[y];if(q(u)){const{isPast:S,isLinkedToLoaded:W,isLoaded:O,totalGap:_}=s[y];if(l&&S||u.skip)return null;const{mainField:L,secondaryField:M,subscribedData:V}=Y(u,d,g,i,o);return e.jsx(X,{id:u.id,colour:u.colour,cue:u.cue,main:L,secondary:M,timeStart:u.timeStart,duration:u.duration,delay:u.delay,dayOffset:u.dayOffset,isLinkedToLoaded:W,isSelected:O,isPast:S,selectedRef:O?v:void 0,showStart:h,subscribed:V,totalGap:_,onLongPress:A?H:()=>{}},u.id)}if(De(u)){const{isPast:S}=s[u.id],W=n?((w=s[n])==null?void 0:w.groupId)===u.id:!1;return l&&S&&!W?null:e.jsxs(c.Fragment,{children:[e.jsx(wt,{title:u.title},u.id),u.entries.map(O=>{const _=t.entries[O];if(!q(_))return null;const{isPast:L,isLoaded:M,isLinkedToLoaded:V,totalGap:oe}=s[O];if(l&&L||_.skip)return null;const{mainField:ne,secondaryField:re,subscribedData:ie}=Y(_,d,g,i,o);return e.jsx(X,{id:_.id,colour:_.colour,cue:_.cue,main:ne,secondary:re,timeStart:_.timeStart,duration:_.duration,delay:_.delay,dayOffset:_.dayOffset,isLinkedToLoaded:V,isSelected:M,isPast:L,selectedRef:M?v:void 0,showStart:h,subscribed:ie,totalGap:oe,onLongPress:A?H:()=>{}},_.id)})]},u.id)}return null})}),e.jsx(Ue,{isVisible:j,onClickHandler:I})]})}function _s(){return e.jsx(me,{permission:"operator",children:e.jsx($t,{})})}export{_s as default};
2
- //# sourceMappingURL=OperatorExport-C-KafSVE.js.map
1
+ import{h as c,j as e,D as ae,q as le,t as ce,v as ue,l as de}from"./vendor-BKUJ0_Du.js";import{P as me}from"./ProtectRoute-Bxq6q7ba.js";import{ak as pe,B as z,t as te,r as fe,bg as he,aD as ge,e as T,f as _e,b7 as ve,k as be,M as ye,b8 as xe,bb as je,a as Se,P as Ee,b as we,L as Oe,o as Ce,g as Te,O as Pe,bh as Ne}from"./index-Dm-4OTmY.js";import{t as Fe,i as q,j as De}from"./useRundown-DAo6huE4.js";import{E as Le}from"./EmptyPage-CYVrjOvI.js";import{m as Me,b as ke,O as $,V as Re}from"./ViewParamsEditor-BX2RM8sx.js";import{u as Ie,F as Ue}from"./FollowButton-DcSbb4R_.js";import{u as Be}from"./useWindowTitle-DM8dIp8L.js";import{T as Ae}from"./editorSettings-_x6YKRfR.js";import{u as We,D as Ve}from"./DelayIndicator-DKS6mZdB.js";import{f as $e,T as Ge,C as He}from"./TimeElements-CYIgGk0T.js";import{S as Ze}from"./SuperscriptPeriod-EEedc9rG.js";import{M as ze}from"./MultiPartProgressBar-W2a-JWPY.js";import{g as qe,a as Qe}from"./viewLoader.utils-4lL4PiNI.js";import{i as G,b as Q}from"./viewUtils-29a3Mmiu.js";import{u as Je}from"./useCustomFields-BBE4LBBr.js";import"./SwatchPicker-Ckpchvjo.js";import"./Select-BnGTAeXJ.js";import"./validateEvent-GnPt-e9-.js";import"./rundownUtils-CXZRD6yP.js";import"./parseUserTime-sZbEBi61.js";import"./Tooltip-DZJ7u9gm.js";import"./offset-VthsmtrO.js";import"./playbackstate-Dl_ZJABT.js";/* empty css */import"./getProgress-ZUTmCn_v.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="b951b061-89ec-4279-a14f-f9be79b19f0c",t._sentryDebugIdIdentifier="sentry-dbid-b951b061-89ec-4279-a14f-f9be79b19f0c")}catch{}})();const Ke="_editModal_1k6b9_17",Xe="_title_1k6b9_31",Ye="_body_1k6b9_39",et="_label_1k6b9_48",tt="_footer_1k6b9_54",C={editModal:Ke,title:Xe,body:Ye,label:et,footer:tt};function st(t){const{event:s,onClose:o}=t,{updateEntry:r}=We(),[n,i]=c.useState(!1),d=c.useRef(new Array),g=async()=>{if(!d.current)return;i(!0);const a={id:s.id};d.current.forEach(l=>{l.dataset.field&&l.defaultValue!=l.value&&(a.custom?a.custom[l.dataset.field]=l.value:Object.assign(a,{custom:{[l.dataset.field]:l.value}}))}),a.custom&&await r(a),i(!1),o()};return e.jsx(ae,{open:!0,onOpenChange:a=>{a||o()},children:e.jsx(le,{children:e.jsxs(ce,{className:C.editModal,children:[e.jsxs("div",{className:C.title,children:[`Editing fields in cue ${s.cue}`,e.jsx(pe,{variant:"subtle-white",onClick:o,disabled:n,children:e.jsx(ue,{})})]}),e.jsx("div",{className:C.body,children:s.subscriptions.map(a=>e.jsxs(c.Fragment,{children:[e.jsx("label",{htmlFor:a.id,className:C.label,style:{"--user-bg":a.colour},children:a.label}),e.jsx(Ae,{name:a.id,ref:l=>{l&&d.current.push(l)},placeholder:`Add value for ${a.label} field`,defaultValue:a.value,"data-field":a.id,disabled:n,rows:5})]},a.id))}),e.jsxs("div",{className:C.footer,children:[e.jsx(z,{variant:"subtle",size:"large",onClick:o,disabled:n,children:"Cancel"}),e.jsx(z,{variant:"primary",size:"large",onClick:g,disabled:n,children:"Save"})]})]})})})}function ot(t,s={}){const{threshold:o=700,onStart:r,onFinish:n,onCancel:i}=s,d=c.useRef(!1),g=c.useRef(!1),a=c.useRef(-1);return c.useEffect(()=>()=>window.clearTimeout(a.current),[]),c.useMemo(()=>{if(typeof t!="function")return{};const l=m=>{!K(m)&&!J(m)||(r&&r(m),g.current=!0,a.current=window.setTimeout(()=>{t(m),d.current=!0},o))},h=m=>{!K(m)&&!J(m)||(d.current?n==null||n(m):g.current&&(i==null||i(m)),d.current=!1,g.current=!1,a.current&&window.clearTimeout(a.current))};return{onMouseDown:l,onMouseUp:h,onMouseLeave:h,onTouchStart:l,onTouchEnd:h,onTouchMove:te(h,150)}},[t,o,i,n,r])}function J(t){return window.TouchEvent?t.nativeEvent instanceof TouchEvent:"touches"in t.nativeEvent}function K(t){return t.nativeEvent instanceof MouseEvent}function nt(t){const{value:s,hideSeconds:o,hideLeadingZero:r,className:n}=t;let i=$e(s,o||r?2:3);return r&&(i=fe(i)),o&&(i=he(i)),e.jsx("div",{className:n,children:i})}const rt="_event_9py1c_21",it="_running_9py1c_38",at="_past_9py1c_42",lt="_binder_9py1c_47",ct="_cue_9py1c_57",ut="_mainField_9py1c_67",dt="_secondaryField_9py1c_76",mt="_plannedStart_9py1c_83",pt="_timeUntil_9py1c_84",ft="_runningTime_9py1c_85",ht="_fields_9py1c_114",gt="_field_9py1c_114",_t="_noColour_9py1c_123",vt="_value_9py1c_129",bt="_fieldsWithContent_9py1c_136",p={event:rt,running:it,past:at,binder:lt,cue:ct,mainField:ut,secondaryField:dt,plannedStart:mt,timeUntil:pt,runningTime:ft,fields:ht,field:gt,noColour:_t,value:vt,fieldsWithContent:bt},X=c.memo(yt);function yt({id:t,colour:s,cue:o,main:r,secondary:n,timeStart:i,duration:d,delay:g,dayOffset:a,isLinkedToLoaded:l,isSelected:h,isPast:m,selectedRef:N,showStart:F,subscribed:x,totalGap:j,onLongPress:D}){const v=f=>{f&&f.cancelable&&f.preventDefault(),x&&D({id:t,cue:o,subscriptions:x})},b=ot(v),R=s&&ge(s),E=T([p.event,h&&p.running,m&&p.past]),I=x.some(f=>f.value),U=x.length?Math.min(x.length,4):0,B=U>0?{gridTemplateColumns:`repeat(${U}, minmax(12rem, 1fr))`}:void 0;return e.jsxs("div",{className:E,"data-testid":o,ref:N,onContextMenu:v,...b,children:[e.jsx("div",{className:p.binder,style:{...R},children:e.jsx("span",{className:p.cue,children:o})}),e.jsxs("span",{className:p.mainField,children:[F&&e.jsx(Ze,{className:p.plannedStart,time:_e(i)}),r]}),e.jsx("span",{className:p.secondaryField,children:n}),e.jsx(xt,{timeStart:i,isPast:m,isSelected:h,delay:g,dayOffset:a,totalGap:j,isLinkedToLoaded:l}),e.jsxs("span",{className:p.runningTime,children:[e.jsx(Ve,{delayValue:g}),e.jsx(nt,{className:T([h&&p.muted]),value:d,hideLeadingZero:!0})]}),e.jsx("div",{className:T([p.fields,I&&p.fieldsWithContent]),style:B,children:x.map(f=>f.value?e.jsxs("div",{children:[e.jsx("span",{className:T([p.field,!f.colour&&p.noColour]),style:{backgroundColor:f.colour},children:f.label}),e.jsx("span",{className:p.value,style:{color:f.colour},children:f.value})]},f.id):e.jsx("div",{},f.id))})]})}function xt({timeStart:t,isPast:s,isSelected:o,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:d}){return s?e.jsx("span",{className:p.timeUntil,children:"DONE"}):o?e.jsx("span",{className:p.timeUntil,children:"LIVE"}):e.jsx(jt,{timeStart:t,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:d})}function jt({timeStart:t,delay:s,dayOffset:o,totalGap:r,isLinkedToLoaded:n}){const i=ve({timeStart:t,delay:s,dayOffset:o},{totalGap:r,isLinkedToLoaded:n}),g=i<xe?"DUE":`${be(Math.abs(i),i>2*ye)}`;return e.jsx("span",{className:p.timeUntil,"data-testid":"time-until",children:g})}const St="_group_c6uj3_17",Et={group:St},wt=c.memo(Ot);function Ot({title:t}){return e.jsx("div",{className:Et.group,children:t})}const Ct="_statusBar_1va40_17",Tt="_timers_1va40_25",Pt="_runningTimer_1va40_33",Nt="_timeNow_1va40_42",Ft="_progressOverride_1va40_51",P={statusBar:Ct,timers:Tt,runningTimer:Pt,timeNow:Nt,progressOverride:Ft};function Dt({viewSettings:t}){const{current:s,duration:o,timeWarning:r,timeDanger:n}=je();return e.jsx(ze,{now:s,complete:o,normalColor:t.normalColor,warning:r,warningColor:t.warningColor,danger:n,dangerColor:t.dangerColor,className:P.progressOverride,ignoreCssOverride:!0})}function Lt(){return e.jsxs("div",{className:P.timers,children:[e.jsx(Ge,{className:P.runningTimer}),e.jsx(He,{className:P.timeNow,shouldFormat:!0})]})}function Mt(){const{data:t}=Se();return e.jsxs("div",{className:P.statusBar,children:[e.jsx(Lt,{}),t&&e.jsx(Dt,{viewSettings:t})]})}const kt=(t,s)=>{const o=Me(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),r=ke(t);return[{title:$.ClockOptions,collapsible:!0,options:[qe(s)]},{title:$.DataSources,collapsible:!0,options:[{id:"main",title:"Main data field",description:"Field to be shown in the first line of text",type:"option",values:o,defaultValue:"title"},{id:"secondary-src",title:"Secondary data field",description:"Field to be shown in the second line of text",type:"option",values:o,defaultValue:"none"},{id:"subscribe",title:"Highlight Fields",description:"Choose custom fields to highlight",type:"multi-option",values:r},{id:"shouldEdit",title:"Edit custom field",description:"Allows editing an highlighted custom field by long pressing",type:"boolean",defaultValue:!1}]},{title:$.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1},{id:"showStart",title:"Show planned start",description:"Whether to prepend the planned start to the items",type:"boolean",defaultValue:!1}]}]};function Rt(t,s){const o=n=>(s==null?void 0:s.get(n))??t.get(n),r=n=>s!=null&&s.has(n)?s.getAll(n):t.getAll(n);return{mainSource:o("main"),secondarySource:o("secondary-src"),subscribe:r("subscribe"),shouldEdit:G(o("shouldEdit")),hidePast:G(o("hidePast")),showStart:G(o("showStart"))}}function It(){const[t]=de(),s=c.use(Ee);return c.useMemo(()=>{const r=s?new URLSearchParams(s.search):void 0;return Rt(t,r)},[s,t])}function Y(t,s,o,r,n){const i=s?Q(t,s)??"":t.title,d=Q(t,o)??"",a=r.filter(l=>Object.hasOwn(n,l)).reduce((l,h)=>{const m=n[h];return m&&l.push({id:h,label:m.label,colour:m.colour,value:t.custom[h]}),l},[]);return{mainField:i,secondaryField:d,subscribedData:a}}function Ut(){const{data:t,rundownMetadata:s,status:o}=Fe(),{data:r,status:n}=Je(),{data:i,status:d}=we();return{data:{rundown:t,rundownMetadata:s,customFields:r,settings:i},status:Qe([o,n,d])}}const Bt="_operatorContainer_1o5o0_17",At="_operatorEvents_1o5o0_24",Wt="_editPrompt_1o5o0_35",Vt="_show_1o5o0_49",k={operatorContainer:Bt,operatorEvents:At,editPrompt:Wt,show:Vt},ee=50;function $t(){const{data:t,status:s}=Ut();return Be("Operator"),s==="pending"?e.jsx(Oe,{}):s==="error"?e.jsx(Le,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Gt,{...t})}function Gt({rundown:t,rundownMetadata:s,customFields:o,settings:r}){const n=Ce(),{subscribe:i,mainSource:d,secondarySource:g,shouldEdit:a,hidePast:l,showStart:h}=It(),[m,N]=c.useState(!1),[F,x]=c.useState(null),[j,D]=c.useState(!1),v=c.useRef(null),b=c.useRef(null),R=Ie({followRef:v,scrollRef:b,doFollow:!j,topOffset:ee,followTrigger:n}),E=c.useRef(null);c.useEffect(()=>{var y;n||j||(y=b.current)==null||y.scrollTo(0,0)},[n,j,b]);const I=()=>{n&&R(),D(!1)},B=te(()=>{if(v!=null&&v.current&&(b!=null&&b.current)){const y=v.current.getBoundingClientRect(),u=b.current.getBoundingClientRect();if(y&&u){const w=y.top-u.top,S=w<-8||w>ee;D(S)}}},1e3),f=()=>{E.current&&clearTimeout(E.current),E.current=setTimeout(()=>{N(!1)},700),N(!0),B()},H=c.useCallback(y=>{x({...y})},[]),Z=Te(r==null?void 0:r.timeFormat),se=c.useMemo(()=>kt(o,Z),[o,Z]),A=a&&i.length;return e.jsxs("div",{className:k.operatorContainer,"data-testid":"operator-view",children:[e.jsx(Re,{target:Pe.Operator,viewOptions:se}),F&&e.jsx(st,{event:F,onClose:()=>x(null)}),e.jsx(Mt,{}),A&&e.jsx("div",{className:T([k.editPrompt,m&&k.show]),children:Ne?"Press and hold to edit user field":"Right click to edit user field"}),e.jsx("div",{className:k.operatorEvents,onWheel:f,onTouchMove:f,ref:b,children:t.order.map(y=>{var w;const u=t.entries[y];if(q(u)){const{isPast:S,isLinkedToLoaded:W,isLoaded:O,totalGap:_}=s[y];if(l&&S||u.skip)return null;const{mainField:L,secondaryField:M,subscribedData:V}=Y(u,d,g,i,o);return e.jsx(X,{id:u.id,colour:u.colour,cue:u.cue,main:L,secondary:M,timeStart:u.timeStart,duration:u.duration,delay:u.delay,dayOffset:u.dayOffset,isLinkedToLoaded:W,isSelected:O,isPast:S,selectedRef:O?v:void 0,showStart:h,subscribed:V,totalGap:_,onLongPress:A?H:()=>{}},u.id)}if(De(u)){const{isPast:S}=s[u.id],W=n?((w=s[n])==null?void 0:w.groupId)===u.id:!1;return l&&S&&!W?null:e.jsxs(c.Fragment,{children:[e.jsx(wt,{title:u.title},u.id),u.entries.map(O=>{const _=t.entries[O];if(!q(_))return null;const{isPast:L,isLoaded:M,isLinkedToLoaded:V,totalGap:oe}=s[O];if(l&&L||_.skip)return null;const{mainField:ne,secondaryField:re,subscribedData:ie}=Y(_,d,g,i,o);return e.jsx(X,{id:_.id,colour:_.colour,cue:_.cue,main:ne,secondary:re,timeStart:_.timeStart,duration:_.duration,delay:_.delay,dayOffset:_.dayOffset,isLinkedToLoaded:V,isSelected:M,isPast:L,selectedRef:M?v:void 0,showStart:h,subscribed:ie,totalGap:oe,onLongPress:A?H:()=>{}},_.id)})]},u.id)}return null})}),e.jsx(Ue,{isVisible:j,onClickHandler:I})]})}function _s(){return e.jsx(me,{permission:"operator",children:e.jsx($t,{})})}export{_s as default};
2
+ //# sourceMappingURL=OperatorExport-CbWojpp6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OperatorExport-C-KafSVE.js","sources":["../../src/features/operator/custom-field-edit-modal/CustomFieldEditModal.tsx","../../src/common/hooks/useLongPress.ts","../../src/views/common/running-time/RunningTime.tsx","../../src/features/operator/operator-event/OperatorEvent.tsx","../../src/features/operator/operator-group/OperatorGroup.tsx","../../src/features/operator/status-bar/StatusBarProgress.tsx","../../src/features/operator/status-bar/StatusBarTimers.tsx","../../src/features/operator/status-bar/StatusBar.tsx","../../src/features/operator/operator.options.tsx","../../src/features/operator/operator.utils.ts","../../src/features/operator/useOperatorData.ts","../../src/features/operator/Operator.tsx","../../src/features/operator/OperatorExport.tsx"],"sourcesContent":["import { Fragment, useRef, useState } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog } from '@base-ui/react/dialog';\nimport { OntimeEvent } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport Textarea from '../../../common/components/input/textarea/Textarea';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { EditEvent } from '../operator.types';\n\nimport style from './CustomFieldEditModal.module.scss';\n\ninterface CustomFieldEditModalProps {\n event: EditEvent;\n onClose: () => void;\n}\n\nexport default function CustomFieldEditModal(props: CustomFieldEditModalProps) {\n const { event, onClose } = props;\n\n const { updateEntry } = useEntryActions();\n const [loading, setLoading] = useState(false);\n const inputRef = useRef<HTMLTextAreaElement[]>(new Array<HTMLTextAreaElement>());\n\n const handleSave = async () => {\n if (!inputRef.current) return;\n setLoading(true);\n\n const patchObject: Partial<OntimeEvent> = { id: event.id };\n\n inputRef.current.forEach((element) => {\n if (element.dataset.field && element.defaultValue != element.value) {\n if (patchObject.custom) {\n patchObject.custom[element.dataset.field] = element.value;\n } else {\n Object.assign(patchObject, { custom: { [element.dataset.field]: element.value } });\n }\n }\n });\n\n if (patchObject.custom) {\n await updateEntry(patchObject);\n }\n\n setLoading(false);\n onClose();\n };\n\n return (\n <Dialog.Root\n open\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n >\n <Dialog.Portal>\n <Dialog.Popup className={style.editModal}>\n <div className={style.title}>\n {`Editing fields in cue ${event.cue}`}\n <IconButton variant='subtle-white' onClick={onClose} disabled={loading}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {event.subscriptions.map((field) => {\n return (\n <Fragment key={field.id}>\n <label htmlFor={field.id} className={style.label} style={{ '--user-bg': field.colour }}>\n {field.label}\n </label>\n <Textarea\n name={field.id}\n ref={(element) => {\n if (element) inputRef.current.push(element);\n }}\n placeholder={`Add value for ${field.label} field`}\n defaultValue={field.value}\n data-field={field.id}\n disabled={loading}\n rows={5}\n />\n </Fragment>\n );\n })}\n </div>\n\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n <Button variant='primary' size='large' onClick={handleSave} disabled={loading}>\n Save\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import React, { useEffect, useMemo, useRef } from 'react';\n\nimport { throttle } from '../utils/throttle';\n\nexport interface UseLongPressOptions {\n /** Time in milliseconds to trigger the long press, default is 400ms */\n threshold?: number;\n\n /** Callback triggered when the long press starts */\n onStart?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press finishes */\n onFinish?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press is canceled */\n onCancel?: (event: React.MouseEvent | React.TouchEvent) => void;\n}\n\nexport interface UseLongPressReturnValue {\n onMouseDown: (event: React.MouseEvent) => void;\n onMouseUp: (event: React.MouseEvent) => void;\n onMouseLeave: (event: React.MouseEvent) => void;\n onTouchStart: (event: React.TouchEvent) => void;\n onTouchEnd: (event: React.TouchEvent) => void;\n}\n\nexport function useLongPress(\n onLongPress: (event: React.MouseEvent | React.TouchEvent) => void,\n options: UseLongPressOptions = {},\n): UseLongPressReturnValue {\n const { threshold = 700, onStart, onFinish, onCancel } = options;\n const isLongPressActive = useRef(false);\n const isPressed = useRef(false);\n const timeout = useRef<number>(-1);\n\n useEffect(() => () => window.clearTimeout(timeout.current), []);\n\n return useMemo(() => {\n if (typeof onLongPress !== 'function') {\n return {} as UseLongPressReturnValue;\n }\n\n const start = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (onStart) {\n onStart(event);\n }\n\n isPressed.current = true;\n timeout.current = window.setTimeout(() => {\n onLongPress(event);\n isLongPressActive.current = true;\n }, threshold);\n };\n\n const cancel = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (isLongPressActive.current) {\n onFinish?.(event);\n } else if (isPressed.current) {\n onCancel?.(event);\n }\n\n isLongPressActive.current = false;\n isPressed.current = false;\n\n if (timeout.current) {\n window.clearTimeout(timeout.current);\n }\n };\n\n return {\n onMouseDown: start,\n onMouseUp: cancel,\n onMouseLeave: cancel,\n onTouchStart: start,\n onTouchEnd: cancel,\n onTouchMove: throttle(cancel, 150),\n };\n }, [onLongPress, threshold, onCancel, onFinish, onStart]);\n}\n\nfunction isTouchEvent(event: React.MouseEvent | React.TouchEvent): event is React.TouchEvent {\n return window.TouchEvent ? event.nativeEvent instanceof TouchEvent : 'touches' in event.nativeEvent;\n}\n\nfunction isMouseEvent(event: React.MouseEvent | React.TouchEvent): event is React.MouseEvent {\n return event.nativeEvent instanceof MouseEvent;\n}\n","/**\n * encapsulate logic related to showing a running timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\nimport { removeLeadingZero, removeSeconds } from 'ontime-utils';\n\nimport { formattedTime } from '../../../features/overview/overview.utils';\n\ninterface RunningTimeProps {\n value: MaybeNumber;\n hideSeconds?: boolean;\n hideLeadingZero?: boolean;\n className?: string;\n}\n\nexport default function RunningTime(props: RunningTimeProps) {\n const { value, hideSeconds, hideLeadingZero, className } = props;\n let display = formattedTime(value, hideSeconds || hideLeadingZero ? 2 : 3);\n\n if (hideLeadingZero) {\n display = removeLeadingZero(display);\n }\n\n if (hideSeconds) {\n display = removeSeconds(display);\n }\n\n return <div className={className}>{display}</div>;\n}\n","import { CSSProperties, memo, RefObject, SyntheticEvent } from 'react';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND } from 'ontime-utils';\n\nimport DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator';\nimport { useLongPress } from '../../../common/hooks/useLongPress';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, formatTime, useTimeUntilExpectedStart } from '../../../common/utils/time';\nimport RunningTime from '../../../views/common/running-time/RunningTime';\nimport SuperscriptPeriod from '../../../views/common/superscript-time/SuperscriptPeriod';\nimport type { EditEvent, Subscribed } from '../operator.types';\n\nimport style from './OperatorEvent.module.scss';\n\ninterface OperatorEventProps {\n id: string;\n colour: string;\n cue: string;\n main: string;\n secondary: string;\n timeStart: number;\n duration: number;\n delay: number;\n dayOffset: number;\n isLinkedToLoaded: boolean;\n isSelected: boolean;\n isPast: boolean;\n selectedRef?: RefObject<HTMLDivElement | null>;\n showStart: boolean;\n subscribed: Subscribed;\n totalGap: number;\n onLongPress: (event: EditEvent) => void;\n}\n\nexport default memo(OperatorEvent);\nfunction OperatorEvent({\n id,\n colour,\n cue,\n main,\n secondary,\n timeStart,\n duration,\n delay,\n dayOffset,\n isLinkedToLoaded,\n isSelected,\n isPast,\n selectedRef,\n showStart,\n subscribed,\n totalGap,\n onLongPress,\n}: OperatorEventProps) {\n /**\n * gather behaviour for long press and context menu\n */\n const handleLongPress = (event?: SyntheticEvent) => {\n // prevent default if the event is cancelable to avoid browser intervention warnings\n if (event && event.cancelable) {\n event.preventDefault();\n }\n if (subscribed) {\n onLongPress({ id, cue, subscriptions: subscribed });\n }\n };\n\n const mouseHandlers = useLongPress(handleLongPress);\n const cueColours = colour && getAccessibleColour(colour);\n\n const operatorClasses = cx([style.event, isSelected && style.running, isPast && style.past]);\n\n const hasFields = subscribed.some((field) => field.value);\n const columnCount = subscribed.length ? Math.min(subscribed.length, 4) : 0;\n const fieldGridStyle =\n columnCount > 0\n ? ({\n gridTemplateColumns: `repeat(${columnCount}, minmax(12rem, 1fr))`,\n } satisfies CSSProperties)\n : undefined;\n\n return (\n <div\n className={operatorClasses}\n data-testid={cue}\n ref={selectedRef}\n onContextMenu={handleLongPress}\n {...mouseHandlers}\n >\n <div className={style.binder} style={{ ...cueColours }}>\n <span className={style.cue}>{cue}</span>\n </div>\n\n <span className={style.mainField}>\n {showStart && <SuperscriptPeriod className={style.plannedStart} time={formatTime(timeStart)} />}\n {main}\n </span>\n <span className={style.secondaryField}>{secondary}</span>\n <OperatorEventSchedule\n timeStart={timeStart}\n isPast={isPast}\n isSelected={isSelected}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n <span className={style.runningTime}>\n <DelayIndicator delayValue={delay} />\n <RunningTime className={cx([isSelected && style.muted])} value={duration} hideLeadingZero />\n </span>\n\n <div className={cx([style.fields, hasFields && style.fieldsWithContent])} style={fieldGridStyle}>\n {subscribed.map((field) => {\n if (!field.value) {\n return <div key={field.id} />;\n }\n return (\n <div key={field.id}>\n <span\n className={cx([style.field, !field.colour && style.noColour])}\n style={{ backgroundColor: field.colour }}\n >\n {field.label}\n </span>\n <span className={style.value} style={{ color: field.colour }}>\n {field.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface OperatorEventScheduleProps {\n timeStart: number;\n isPast: boolean;\n isSelected: boolean;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction OperatorEventSchedule({\n timeStart,\n isPast,\n isSelected,\n delay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n}: OperatorEventScheduleProps) {\n if (isPast) {\n return <span className={style.timeUntil}>DONE</span>;\n }\n\n if (isSelected) {\n return <span className={style.timeUntil}>LIVE</span>;\n }\n\n return (\n <TimeUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n );\n}\n\ninterface TimeUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction TimeUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: TimeUntilProps) {\n // we isolate this to avoid unnecessary re-renders\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n\n const isDue = timeUntil < MILLIS_PER_SECOND;\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return (\n <span className={style.timeUntil} data-testid='time-until'>\n {timeUntilString}\n </span>\n );\n}\n","import { memo } from 'react';\n\nimport style from './OperatorGroup.module.scss';\n\ninterface OperatorGroup {\n title: string;\n}\n\nexport default memo(OperatorGroup);\nfunction OperatorGroup({ title }: OperatorGroup) {\n return <div className={style.group}>{title}</div>;\n}\n","import { ViewSettings } from 'ontime-types';\n\nimport MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport { useProgressData } from '../../../common/hooks/useSocket';\n\nimport styles from './StatusBar.module.scss';\n\ninterface StatusBarProgressProps {\n viewSettings: ViewSettings;\n}\n\nexport default function StatusBarProgress({ viewSettings }: StatusBarProgressProps) {\n const { current, duration, timeWarning, timeDanger } = useProgressData();\n\n return (\n <MultiPartProgressBar\n now={current}\n complete={duration}\n normalColor={viewSettings.normalColor}\n warning={timeWarning}\n warningColor={viewSettings.warningColor}\n danger={timeDanger}\n dangerColor={viewSettings.dangerColor}\n className={styles.progressOverride}\n ignoreCssOverride\n />\n );\n}\n","import { ClockOverview, TimerOverview } from '../../overview/composite/TimeElements';\n\nimport style from './StatusBar.module.scss';\n\nexport default function StatusBarTimers() {\n return (\n <div className={style.timers}>\n <TimerOverview className={style.runningTimer} />\n <ClockOverview className={style.timeNow} shouldFormat />\n </div>\n );\n}\n","import useViewSettings from '../../../common/hooks-query/useViewSettings';\n\nimport StatusBarProgress from './StatusBarProgress';\nimport StatusBarTimers from './StatusBarTimers';\n\nimport styles from './StatusBar.module.scss';\n\nexport default function StatusBar() {\n const { data } = useViewSettings();\n\n return (\n <div className={styles.statusBar}>\n <StatusBarTimers />\n {data && <StatusBarProgress viewSettings={data} />}\n </div>\n );\n}\n","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 {\n makeCustomFieldSelectOptions,\n makeOptionsFromCustomFields,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../views/common/viewUtils';\n\nexport const getOperatorOptions = (customFields: CustomFields, timeFormat: string): ViewOption[] => {\n const fieldOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const customFieldSelect = makeCustomFieldSelectOptions(customFields);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main data field',\n description: 'Field to be shown in the first line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary data field',\n description: 'Field to be shown in the second line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'subscribe',\n title: 'Highlight Fields',\n description: 'Choose custom fields to highlight',\n type: 'multi-option',\n values: customFieldSelect,\n },\n {\n id: 'shouldEdit',\n title: 'Edit custom field',\n description: 'Allows editing an highlighted custom field by long pressing',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hidePast',\n title: 'Hide Past Events',\n description: 'Whether to hide events that have passed',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'showStart',\n title: 'Show planned start',\n description: 'Whether to prepend the planned start to the items',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n ];\n};\n\ntype OperatorOptions = {\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n subscribe: string[];\n shouldEdit: boolean;\n hidePast: boolean;\n showStart: 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): OperatorOptions {\n // Helper to get 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 // we manually make an object that matches the key above\n return {\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n subscribe: getArrayValues('subscribe'),\n shouldEdit: isStringBoolean(getValue('shouldEdit')),\n hidePast: isStringBoolean(getValue('hidePast')),\n showStart: isStringBoolean(getValue('showStart')),\n };\n}\n\n/**\n * Hook exposes the operator view options\n */\nexport function useOperatorOptions(): OperatorOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { CustomFields, MaybeString, OntimeEvent } from 'ontime-types';\r\n\r\nimport { getPropertyValue } from '../../views/common/viewUtils';\r\n\r\nimport type { Subscribed } from './operator.types';\r\n\r\nexport function getEventData(\r\n event: OntimeEvent,\r\n main: MaybeString,\r\n secondary: MaybeString,\r\n subscriptions: string[],\r\n customFields: CustomFields,\r\n) {\r\n const mainField = main ? getPropertyValue(event, main) ?? '' : event.title;\r\n const secondaryField = getPropertyValue(event, secondary) ?? '';\r\n\r\n // remove subscriptions that are not in customFields\r\n const sanitisedSubscriptions = subscriptions.filter((field) => Object.hasOwn(customFields, field));\r\n const subscribedData = sanitisedSubscriptions.reduce<Subscribed>((acc, id) => {\r\n const field = customFields[id];\r\n if (field) {\r\n acc.push({\r\n id,\r\n label: field.label,\r\n colour: field.colour,\r\n value: event.custom[id],\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return { mainField, secondaryField, subscribedData };\r\n}\r\n","import { CustomFields, Rundown, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport { useRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { RundownMetadataObject } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../../views/utils/viewLoader.utils';\n\nexport interface OperatorData {\n rundown: Rundown;\n rundownMetadata: RundownMetadataObject;\n customFields: CustomFields;\n settings: Settings;\n}\n\nexport function useOperatorData(): ViewData<OperatorData> {\n const { data: rundown, rundownMetadata, status: rundownStatus } = useRundownWithMetadata();\n const { data: customFields, status: customFieldStatus } = useCustomFields();\n const { data: settings, status: settingsStatus } = useSettings();\n\n return {\n data: {\n rundown,\n rundownMetadata,\n customFields,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, customFieldStatus, settingsStatus]),\n };\n}\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isOntimeEvent, isOntimeGroup, OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useSelectedEventId } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport { getDefaultFormat } from '../../common/utils/time';\nimport { isTouchDevice } from '../../externals';\nimport Loader from '../../views/common/loader/Loader';\n\nimport CustomFieldEditModal from './custom-field-edit-modal/CustomFieldEditModal';\nimport FollowButton from './follow-button/FollowButton';\nimport OperatorEvent from './operator-event/OperatorEvent';\nimport OperatorGroup from './operator-group/OperatorGroup';\nimport StatusBar from './status-bar/StatusBar';\nimport { getOperatorOptions, useOperatorOptions } from './operator.options';\nimport type { EditEvent } from './operator.types';\nimport { getEventData } from './operator.utils';\nimport { OperatorData, useOperatorData } from './useOperatorData';\n\nimport style from './Operator.module.scss';\n\nconst selectedOffset = 50;\n\nexport default function OperatorLoader() {\n const { data, status } = useOperatorData();\n\n useWindowTitle('Operator');\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 <Operator {...data} />;\n}\n\nfunction Operator({ rundown, rundownMetadata, customFields, settings }: OperatorData) {\n const selectedEventId = useSelectedEventId();\n const { subscribe, mainSource, secondarySource, shouldEdit, hidePast, showStart } = useOperatorOptions();\n\n const [showEditPrompt, setShowEditPrompt] = useState(false);\n const [editEvent, setEditEvent] = useState<EditEvent | null>(null);\n\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: selectedOffset,\n followTrigger: selectedEventId,\n });\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\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 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 > selectedOffset;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n timeoutId.current = setTimeout(() => {\n setShowEditPrompt(false);\n }, 700);\n\n setShowEditPrompt(true);\n\n throttledHandleScroll();\n };\n\n const handleEdit = useCallback((event: EditEvent) => {\n setEditEvent({ ...event });\n }, []);\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const operatorOptions = useMemo(() => getOperatorOptions(customFields, defaultFormat), [customFields, defaultFormat]);\n\n const canEdit = shouldEdit && subscribe.length;\n\n return (\n <div className={style.operatorContainer} data-testid='operator-view'>\n <ViewParamsEditor target={OntimeView.Operator} viewOptions={operatorOptions} />\n {editEvent && <CustomFieldEditModal event={editEvent} onClose={() => setEditEvent(null)} />}\n\n <StatusBar />\n\n {canEdit && (\n <div className={cx([style.editPrompt, showEditPrompt && style.show])}>\n {isTouchDevice ? 'Press and hold to edit user field' : 'Right click to edit user field'}\n </div>\n )}\n\n <div className={style.operatorEvents} onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {rundown.order.map((entryId) => {\n const entry = rundown.entries[entryId];\n if (isOntimeEvent(entry)) {\n const { isPast, isLinkedToLoaded, isLoaded, totalGap } = rundownMetadata[entryId];\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || entry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n entry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={entry.id}\n id={entry.id}\n colour={entry.colour}\n cue={entry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={entry.timeStart}\n duration={entry.duration}\n delay={entry.delay}\n dayOffset={entry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n }\n\n if (isOntimeGroup(entry)) {\n const { isPast } = rundownMetadata[entry.id];\n\n const isCurrentParent = selectedEventId ? rundownMetadata[selectedEventId]?.groupId === entry.id : false;\n\n if (hidePast && isPast && !isCurrentParent) {\n return null;\n }\n\n return (\n <Fragment key={entry.id}>\n <OperatorGroup key={entry.id} title={entry.title} />\n {entry.entries.map((nestedEntryId) => {\n const nestedEntry = rundown.entries[nestedEntryId];\n if (!isOntimeEvent(nestedEntry)) {\n return null;\n }\n\n const { isPast, isLoaded, isLinkedToLoaded, totalGap } = rundownMetadata[nestedEntryId];\n\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || nestedEntry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n nestedEntry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={nestedEntry.id}\n id={nestedEntry.id}\n colour={nestedEntry.colour}\n cue={nestedEntry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={nestedEntry.timeStart}\n duration={nestedEntry.duration}\n delay={nestedEntry.delay}\n dayOffset={nestedEntry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n })}\n </Fragment>\n );\n }\n return null;\n })}\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n","import ProtectRoute from '../../common/components/protect-route/ProtectRoute';\n\nimport Operator from './Operator';\n\nexport default function OperatorExport() {\n return (\n <ProtectRoute permission='operator'>\n <Operator />\n </ProtectRoute>\n );\n}\n"],"names":["CustomFieldEditModal","props","event","onClose","updateEntry","useEntryActions","loading","setLoading","useState","inputRef","useRef","Array","handleSave","current","patchObject","id","forEach","element","dataset","field","defaultValue","value","custom","Object","assign","Dialog.Root","isOpen","jsx","Dialog.Portal","jsxs","Dialog.Popup","style","editModal","title","cue","IconButton","IoClose","body","subscriptions","map","Fragment","label","colour","Textarea","push","footer","Button","useLongPress","onLongPress","options","threshold","onStart","onFinish","onCancel","isLongPressActive","isPressed","timeout","useEffect","window","clearTimeout","useMemo","start","isMouseEvent","isTouchEvent","setTimeout","cancel","onMouseDown","onMouseUp","onMouseLeave","onTouchStart","onTouchEnd","onTouchMove","throttle","TouchEvent","nativeEvent","MouseEvent","RunningTime","hideSeconds","hideLeadingZero","className","display","formattedTime","removeLeadingZero","removeSeconds","memo","OperatorEvent","main","secondary","timeStart","duration","delay","dayOffset","isLinkedToLoaded","isSelected","isPast","selectedRef","showStart","subscribed","totalGap","handleLongPress","cancelable","preventDefault","mouseHandlers","cueColours","getAccessibleColour","operatorClasses","cx","running","past","hasFields","some","columnCount","length","Math","min","fieldGridStyle","gridTemplateColumns","undefined","binder","mainField","SuperscriptPeriod","plannedStart","formatTime","secondaryField","OperatorEventSchedule","runningTime","DelayIndicator","muted","fields","fieldsWithContent","noColour","backgroundColor","color","timeUntil","TimeUntil","useTimeUntilExpectedStart","timeUntilString","MILLIS_PER_SECOND","formatDuration","abs","MILLIS_PER_MINUTE","OperatorGroup","group","StatusBarProgress","viewSettings","timeWarning","timeDanger","useProgressData","MultiPartProgressBar","normalColor","warningColor","dangerColor","styles","progressOverride","StatusBarTimers","timers","TimerOverview","runningTimer","ClockOverview","timeNow","StatusBar","data","useViewSettings","statusBar","getOperatorOptions","customFields","timeFormat","fieldOptions","makeOptionsFromCustomFields","customFieldSelect","makeCustomFieldSelectOptions","OptionTitle","ClockOptions","collapsible","getTimeOption","DataSources","description","type","values","ElementVisibility","getOptionsFromParams","searchParams","defaultValues","getValue","key","get","getArrayValues","has","getAll","mainSource","secondarySource","subscribe","shouldEdit","isStringBoolean","hidePast","useOperatorOptions","useSearchParams","maybePreset","use","PresetContext","URLSearchParams","search","getEventData","getPropertyValue","subscribedData","filter","hasOwn","reduce","acc","useOperatorData","rundown","rundownMetadata","status","rundownStatus","useRundownWithMetadata","customFieldStatus","useCustomFields","settings","settingsStatus","useSettings","aggregateQueryStatus","selectedOffset","OperatorLoader","useWindowTitle","Loader","EmptyPage","Operator","selectedEventId","useSelectedEventId","showEditPrompt","setShowEditPrompt","editEvent","setEditEvent","lockAutoScroll","setLockAutoScroll","scrollRef","scrollToComponent","useFollowComponent","followRef","doFollow","topOffset","followTrigger","timeoutId","scrollTo","handleOffset","throttledHandleScroll","handleUserScroll","selectedRect","getBoundingClientRect","scrollerRect","distanceFromTop","top","hasScrolledOutOfThreshold","handleScroll","handleEdit","useCallback","defaultFormat","getDefaultFormat","operatorOptions","canEdit","operatorContainer","ViewParamsEditor","OntimeView","editPrompt","show","isTouchDevice","operatorEvents","order","entryId","entry","entries","isOntimeEvent","isLoaded","skip","isOntimeGroup","isCurrentParent","groupId","nestedEntryId","nestedEntry","FollowButton","OperatorExport","ProtectRoute"],"mappings":"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"}
1
+ {"version":3,"file":"OperatorExport-CbWojpp6.js","sources":["../../src/features/operator/custom-field-edit-modal/CustomFieldEditModal.tsx","../../src/common/hooks/useLongPress.ts","../../src/views/common/running-time/RunningTime.tsx","../../src/features/operator/operator-event/OperatorEvent.tsx","../../src/features/operator/operator-group/OperatorGroup.tsx","../../src/features/operator/status-bar/StatusBarProgress.tsx","../../src/features/operator/status-bar/StatusBarTimers.tsx","../../src/features/operator/status-bar/StatusBar.tsx","../../src/features/operator/operator.options.tsx","../../src/features/operator/operator.utils.ts","../../src/features/operator/useOperatorData.ts","../../src/features/operator/Operator.tsx","../../src/features/operator/OperatorExport.tsx"],"sourcesContent":["import { Fragment, useRef, useState } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog } from '@base-ui/react/dialog';\nimport { OntimeEvent } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport Textarea from '../../../common/components/input/textarea/Textarea';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { EditEvent } from '../operator.types';\n\nimport style from './CustomFieldEditModal.module.scss';\n\ninterface CustomFieldEditModalProps {\n event: EditEvent;\n onClose: () => void;\n}\n\nexport default function CustomFieldEditModal(props: CustomFieldEditModalProps) {\n const { event, onClose } = props;\n\n const { updateEntry } = useEntryActions();\n const [loading, setLoading] = useState(false);\n const inputRef = useRef<HTMLTextAreaElement[]>(new Array<HTMLTextAreaElement>());\n\n const handleSave = async () => {\n if (!inputRef.current) return;\n setLoading(true);\n\n const patchObject: Partial<OntimeEvent> = { id: event.id };\n\n inputRef.current.forEach((element) => {\n if (element.dataset.field && element.defaultValue != element.value) {\n if (patchObject.custom) {\n patchObject.custom[element.dataset.field] = element.value;\n } else {\n Object.assign(patchObject, { custom: { [element.dataset.field]: element.value } });\n }\n }\n });\n\n if (patchObject.custom) {\n await updateEntry(patchObject);\n }\n\n setLoading(false);\n onClose();\n };\n\n return (\n <Dialog.Root\n open\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n >\n <Dialog.Portal>\n <Dialog.Popup className={style.editModal}>\n <div className={style.title}>\n {`Editing fields in cue ${event.cue}`}\n <IconButton variant='subtle-white' onClick={onClose} disabled={loading}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {event.subscriptions.map((field) => {\n return (\n <Fragment key={field.id}>\n <label htmlFor={field.id} className={style.label} style={{ '--user-bg': field.colour }}>\n {field.label}\n </label>\n <Textarea\n name={field.id}\n ref={(element) => {\n if (element) inputRef.current.push(element);\n }}\n placeholder={`Add value for ${field.label} field`}\n defaultValue={field.value}\n data-field={field.id}\n disabled={loading}\n rows={5}\n />\n </Fragment>\n );\n })}\n </div>\n\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n <Button variant='primary' size='large' onClick={handleSave} disabled={loading}>\n Save\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import React, { useEffect, useMemo, useRef } from 'react';\n\nimport { throttle } from '../utils/throttle';\n\nexport interface UseLongPressOptions {\n /** Time in milliseconds to trigger the long press, default is 400ms */\n threshold?: number;\n\n /** Callback triggered when the long press starts */\n onStart?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press finishes */\n onFinish?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press is canceled */\n onCancel?: (event: React.MouseEvent | React.TouchEvent) => void;\n}\n\nexport interface UseLongPressReturnValue {\n onMouseDown: (event: React.MouseEvent) => void;\n onMouseUp: (event: React.MouseEvent) => void;\n onMouseLeave: (event: React.MouseEvent) => void;\n onTouchStart: (event: React.TouchEvent) => void;\n onTouchEnd: (event: React.TouchEvent) => void;\n}\n\nexport function useLongPress(\n onLongPress: (event: React.MouseEvent | React.TouchEvent) => void,\n options: UseLongPressOptions = {},\n): UseLongPressReturnValue {\n const { threshold = 700, onStart, onFinish, onCancel } = options;\n const isLongPressActive = useRef(false);\n const isPressed = useRef(false);\n const timeout = useRef<number>(-1);\n\n useEffect(() => () => window.clearTimeout(timeout.current), []);\n\n return useMemo(() => {\n if (typeof onLongPress !== 'function') {\n return {} as UseLongPressReturnValue;\n }\n\n const start = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (onStart) {\n onStart(event);\n }\n\n isPressed.current = true;\n timeout.current = window.setTimeout(() => {\n onLongPress(event);\n isLongPressActive.current = true;\n }, threshold);\n };\n\n const cancel = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (isLongPressActive.current) {\n onFinish?.(event);\n } else if (isPressed.current) {\n onCancel?.(event);\n }\n\n isLongPressActive.current = false;\n isPressed.current = false;\n\n if (timeout.current) {\n window.clearTimeout(timeout.current);\n }\n };\n\n return {\n onMouseDown: start,\n onMouseUp: cancel,\n onMouseLeave: cancel,\n onTouchStart: start,\n onTouchEnd: cancel,\n onTouchMove: throttle(cancel, 150),\n };\n }, [onLongPress, threshold, onCancel, onFinish, onStart]);\n}\n\nfunction isTouchEvent(event: React.MouseEvent | React.TouchEvent): event is React.TouchEvent {\n return window.TouchEvent ? event.nativeEvent instanceof TouchEvent : 'touches' in event.nativeEvent;\n}\n\nfunction isMouseEvent(event: React.MouseEvent | React.TouchEvent): event is React.MouseEvent {\n return event.nativeEvent instanceof MouseEvent;\n}\n","/**\n * encapsulate logic related to showing a running timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\nimport { removeLeadingZero, removeSeconds } from 'ontime-utils';\n\nimport { formattedTime } from '../../../features/overview/overview.utils';\n\ninterface RunningTimeProps {\n value: MaybeNumber;\n hideSeconds?: boolean;\n hideLeadingZero?: boolean;\n className?: string;\n}\n\nexport default function RunningTime(props: RunningTimeProps) {\n const { value, hideSeconds, hideLeadingZero, className } = props;\n let display = formattedTime(value, hideSeconds || hideLeadingZero ? 2 : 3);\n\n if (hideLeadingZero) {\n display = removeLeadingZero(display);\n }\n\n if (hideSeconds) {\n display = removeSeconds(display);\n }\n\n return <div className={className}>{display}</div>;\n}\n","import { CSSProperties, memo, RefObject, SyntheticEvent } from 'react';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND } from 'ontime-utils';\n\nimport DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator';\nimport { useLongPress } from '../../../common/hooks/useLongPress';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, formatTime, useTimeUntilExpectedStart } from '../../../common/utils/time';\nimport RunningTime from '../../../views/common/running-time/RunningTime';\nimport SuperscriptPeriod from '../../../views/common/superscript-time/SuperscriptPeriod';\nimport type { EditEvent, Subscribed } from '../operator.types';\n\nimport style from './OperatorEvent.module.scss';\n\ninterface OperatorEventProps {\n id: string;\n colour: string;\n cue: string;\n main: string;\n secondary: string;\n timeStart: number;\n duration: number;\n delay: number;\n dayOffset: number;\n isLinkedToLoaded: boolean;\n isSelected: boolean;\n isPast: boolean;\n selectedRef?: RefObject<HTMLDivElement | null>;\n showStart: boolean;\n subscribed: Subscribed;\n totalGap: number;\n onLongPress: (event: EditEvent) => void;\n}\n\nexport default memo(OperatorEvent);\nfunction OperatorEvent({\n id,\n colour,\n cue,\n main,\n secondary,\n timeStart,\n duration,\n delay,\n dayOffset,\n isLinkedToLoaded,\n isSelected,\n isPast,\n selectedRef,\n showStart,\n subscribed,\n totalGap,\n onLongPress,\n}: OperatorEventProps) {\n /**\n * gather behaviour for long press and context menu\n */\n const handleLongPress = (event?: SyntheticEvent) => {\n // prevent default if the event is cancelable to avoid browser intervention warnings\n if (event && event.cancelable) {\n event.preventDefault();\n }\n if (subscribed) {\n onLongPress({ id, cue, subscriptions: subscribed });\n }\n };\n\n const mouseHandlers = useLongPress(handleLongPress);\n const cueColours = colour && getAccessibleColour(colour);\n\n const operatorClasses = cx([style.event, isSelected && style.running, isPast && style.past]);\n\n const hasFields = subscribed.some((field) => field.value);\n const columnCount = subscribed.length ? Math.min(subscribed.length, 4) : 0;\n const fieldGridStyle =\n columnCount > 0\n ? ({\n gridTemplateColumns: `repeat(${columnCount}, minmax(12rem, 1fr))`,\n } satisfies CSSProperties)\n : undefined;\n\n return (\n <div\n className={operatorClasses}\n data-testid={cue}\n ref={selectedRef}\n onContextMenu={handleLongPress}\n {...mouseHandlers}\n >\n <div className={style.binder} style={{ ...cueColours }}>\n <span className={style.cue}>{cue}</span>\n </div>\n\n <span className={style.mainField}>\n {showStart && <SuperscriptPeriod className={style.plannedStart} time={formatTime(timeStart)} />}\n {main}\n </span>\n <span className={style.secondaryField}>{secondary}</span>\n <OperatorEventSchedule\n timeStart={timeStart}\n isPast={isPast}\n isSelected={isSelected}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n <span className={style.runningTime}>\n <DelayIndicator delayValue={delay} />\n <RunningTime className={cx([isSelected && style.muted])} value={duration} hideLeadingZero />\n </span>\n\n <div className={cx([style.fields, hasFields && style.fieldsWithContent])} style={fieldGridStyle}>\n {subscribed.map((field) => {\n if (!field.value) {\n return <div key={field.id} />;\n }\n return (\n <div key={field.id}>\n <span\n className={cx([style.field, !field.colour && style.noColour])}\n style={{ backgroundColor: field.colour }}\n >\n {field.label}\n </span>\n <span className={style.value} style={{ color: field.colour }}>\n {field.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface OperatorEventScheduleProps {\n timeStart: number;\n isPast: boolean;\n isSelected: boolean;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction OperatorEventSchedule({\n timeStart,\n isPast,\n isSelected,\n delay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n}: OperatorEventScheduleProps) {\n if (isPast) {\n return <span className={style.timeUntil}>DONE</span>;\n }\n\n if (isSelected) {\n return <span className={style.timeUntil}>LIVE</span>;\n }\n\n return (\n <TimeUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n );\n}\n\ninterface TimeUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction TimeUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: TimeUntilProps) {\n // we isolate this to avoid unnecessary re-renders\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n\n const isDue = timeUntil < MILLIS_PER_SECOND;\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return (\n <span className={style.timeUntil} data-testid='time-until'>\n {timeUntilString}\n </span>\n );\n}\n","import { memo } from 'react';\n\nimport style from './OperatorGroup.module.scss';\n\ninterface OperatorGroup {\n title: string;\n}\n\nexport default memo(OperatorGroup);\nfunction OperatorGroup({ title }: OperatorGroup) {\n return <div className={style.group}>{title}</div>;\n}\n","import { ViewSettings } from 'ontime-types';\n\nimport MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport { useProgressData } from '../../../common/hooks/useSocket';\n\nimport styles from './StatusBar.module.scss';\n\ninterface StatusBarProgressProps {\n viewSettings: ViewSettings;\n}\n\nexport default function StatusBarProgress({ viewSettings }: StatusBarProgressProps) {\n const { current, duration, timeWarning, timeDanger } = useProgressData();\n\n return (\n <MultiPartProgressBar\n now={current}\n complete={duration}\n normalColor={viewSettings.normalColor}\n warning={timeWarning}\n warningColor={viewSettings.warningColor}\n danger={timeDanger}\n dangerColor={viewSettings.dangerColor}\n className={styles.progressOverride}\n ignoreCssOverride\n />\n );\n}\n","import { ClockOverview, TimerOverview } from '../../overview/composite/TimeElements';\n\nimport style from './StatusBar.module.scss';\n\nexport default function StatusBarTimers() {\n return (\n <div className={style.timers}>\n <TimerOverview className={style.runningTimer} />\n <ClockOverview className={style.timeNow} shouldFormat />\n </div>\n );\n}\n","import useViewSettings from '../../../common/hooks-query/useViewSettings';\n\nimport StatusBarProgress from './StatusBarProgress';\nimport StatusBarTimers from './StatusBarTimers';\n\nimport styles from './StatusBar.module.scss';\n\nexport default function StatusBar() {\n const { data } = useViewSettings();\n\n return (\n <div className={styles.statusBar}>\n <StatusBarTimers />\n {data && <StatusBarProgress viewSettings={data} />}\n </div>\n );\n}\n","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 {\n makeCustomFieldSelectOptions,\n makeOptionsFromCustomFields,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../views/common/viewUtils';\n\nexport const getOperatorOptions = (customFields: CustomFields, timeFormat: string): ViewOption[] => {\n const fieldOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const customFieldSelect = makeCustomFieldSelectOptions(customFields);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main data field',\n description: 'Field to be shown in the first line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary data field',\n description: 'Field to be shown in the second line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'subscribe',\n title: 'Highlight Fields',\n description: 'Choose custom fields to highlight',\n type: 'multi-option',\n values: customFieldSelect,\n },\n {\n id: 'shouldEdit',\n title: 'Edit custom field',\n description: 'Allows editing an highlighted custom field by long pressing',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hidePast',\n title: 'Hide Past Events',\n description: 'Whether to hide events that have passed',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'showStart',\n title: 'Show planned start',\n description: 'Whether to prepend the planned start to the items',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n ];\n};\n\ntype OperatorOptions = {\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n subscribe: string[];\n shouldEdit: boolean;\n hidePast: boolean;\n showStart: 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): OperatorOptions {\n // Helper to get 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 // we manually make an object that matches the key above\n return {\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n subscribe: getArrayValues('subscribe'),\n shouldEdit: isStringBoolean(getValue('shouldEdit')),\n hidePast: isStringBoolean(getValue('hidePast')),\n showStart: isStringBoolean(getValue('showStart')),\n };\n}\n\n/**\n * Hook exposes the operator view options\n */\nexport function useOperatorOptions(): OperatorOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { CustomFields, MaybeString, OntimeEvent } from 'ontime-types';\r\n\r\nimport { getPropertyValue } from '../../views/common/viewUtils';\r\n\r\nimport type { Subscribed } from './operator.types';\r\n\r\nexport function getEventData(\r\n event: OntimeEvent,\r\n main: MaybeString,\r\n secondary: MaybeString,\r\n subscriptions: string[],\r\n customFields: CustomFields,\r\n) {\r\n const mainField = main ? getPropertyValue(event, main) ?? '' : event.title;\r\n const secondaryField = getPropertyValue(event, secondary) ?? '';\r\n\r\n // remove subscriptions that are not in customFields\r\n const sanitisedSubscriptions = subscriptions.filter((field) => Object.hasOwn(customFields, field));\r\n const subscribedData = sanitisedSubscriptions.reduce<Subscribed>((acc, id) => {\r\n const field = customFields[id];\r\n if (field) {\r\n acc.push({\r\n id,\r\n label: field.label,\r\n colour: field.colour,\r\n value: event.custom[id],\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return { mainField, secondaryField, subscribedData };\r\n}\r\n","import { CustomFields, Rundown, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport { useRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { RundownMetadataObject } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../../views/utils/viewLoader.utils';\n\nexport interface OperatorData {\n rundown: Rundown;\n rundownMetadata: RundownMetadataObject;\n customFields: CustomFields;\n settings: Settings;\n}\n\nexport function useOperatorData(): ViewData<OperatorData> {\n const { data: rundown, rundownMetadata, status: rundownStatus } = useRundownWithMetadata();\n const { data: customFields, status: customFieldStatus } = useCustomFields();\n const { data: settings, status: settingsStatus } = useSettings();\n\n return {\n data: {\n rundown,\n rundownMetadata,\n customFields,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, customFieldStatus, settingsStatus]),\n };\n}\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isOntimeEvent, isOntimeGroup, OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useSelectedEventId } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport { getDefaultFormat } from '../../common/utils/time';\nimport { isTouchDevice } from '../../externals';\nimport Loader from '../../views/common/loader/Loader';\n\nimport CustomFieldEditModal from './custom-field-edit-modal/CustomFieldEditModal';\nimport FollowButton from './follow-button/FollowButton';\nimport OperatorEvent from './operator-event/OperatorEvent';\nimport OperatorGroup from './operator-group/OperatorGroup';\nimport StatusBar from './status-bar/StatusBar';\nimport { getOperatorOptions, useOperatorOptions } from './operator.options';\nimport type { EditEvent } from './operator.types';\nimport { getEventData } from './operator.utils';\nimport { OperatorData, useOperatorData } from './useOperatorData';\n\nimport style from './Operator.module.scss';\n\nconst selectedOffset = 50;\n\nexport default function OperatorLoader() {\n const { data, status } = useOperatorData();\n\n useWindowTitle('Operator');\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 <Operator {...data} />;\n}\n\nfunction Operator({ rundown, rundownMetadata, customFields, settings }: OperatorData) {\n const selectedEventId = useSelectedEventId();\n const { subscribe, mainSource, secondarySource, shouldEdit, hidePast, showStart } = useOperatorOptions();\n\n const [showEditPrompt, setShowEditPrompt] = useState(false);\n const [editEvent, setEditEvent] = useState<EditEvent | null>(null);\n\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: selectedOffset,\n followTrigger: selectedEventId,\n });\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\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 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 > selectedOffset;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n timeoutId.current = setTimeout(() => {\n setShowEditPrompt(false);\n }, 700);\n\n setShowEditPrompt(true);\n\n throttledHandleScroll();\n };\n\n const handleEdit = useCallback((event: EditEvent) => {\n setEditEvent({ ...event });\n }, []);\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const operatorOptions = useMemo(() => getOperatorOptions(customFields, defaultFormat), [customFields, defaultFormat]);\n\n const canEdit = shouldEdit && subscribe.length;\n\n return (\n <div className={style.operatorContainer} data-testid='operator-view'>\n <ViewParamsEditor target={OntimeView.Operator} viewOptions={operatorOptions} />\n {editEvent && <CustomFieldEditModal event={editEvent} onClose={() => setEditEvent(null)} />}\n\n <StatusBar />\n\n {canEdit && (\n <div className={cx([style.editPrompt, showEditPrompt && style.show])}>\n {isTouchDevice ? 'Press and hold to edit user field' : 'Right click to edit user field'}\n </div>\n )}\n\n <div className={style.operatorEvents} onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {rundown.order.map((entryId) => {\n const entry = rundown.entries[entryId];\n if (isOntimeEvent(entry)) {\n const { isPast, isLinkedToLoaded, isLoaded, totalGap } = rundownMetadata[entryId];\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || entry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n entry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={entry.id}\n id={entry.id}\n colour={entry.colour}\n cue={entry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={entry.timeStart}\n duration={entry.duration}\n delay={entry.delay}\n dayOffset={entry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n }\n\n if (isOntimeGroup(entry)) {\n const { isPast } = rundownMetadata[entry.id];\n\n const isCurrentParent = selectedEventId ? rundownMetadata[selectedEventId]?.groupId === entry.id : false;\n\n if (hidePast && isPast && !isCurrentParent) {\n return null;\n }\n\n return (\n <Fragment key={entry.id}>\n <OperatorGroup key={entry.id} title={entry.title} />\n {entry.entries.map((nestedEntryId) => {\n const nestedEntry = rundown.entries[nestedEntryId];\n if (!isOntimeEvent(nestedEntry)) {\n return null;\n }\n\n const { isPast, isLoaded, isLinkedToLoaded, totalGap } = rundownMetadata[nestedEntryId];\n\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || nestedEntry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n nestedEntry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={nestedEntry.id}\n id={nestedEntry.id}\n colour={nestedEntry.colour}\n cue={nestedEntry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={nestedEntry.timeStart}\n duration={nestedEntry.duration}\n delay={nestedEntry.delay}\n dayOffset={nestedEntry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n })}\n </Fragment>\n );\n }\n return null;\n })}\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n","import ProtectRoute from '../../common/components/protect-route/ProtectRoute';\n\nimport Operator from './Operator';\n\nexport default function OperatorExport() {\n return (\n <ProtectRoute permission='operator'>\n <Operator />\n </ProtectRoute>\n );\n}\n"],"names":["CustomFieldEditModal","props","event","onClose","updateEntry","useEntryActions","loading","setLoading","useState","inputRef","useRef","Array","handleSave","current","patchObject","id","forEach","element","dataset","field","defaultValue","value","custom","Object","assign","Dialog.Root","isOpen","jsx","Dialog.Portal","jsxs","Dialog.Popup","style","editModal","title","cue","IconButton","IoClose","body","subscriptions","map","Fragment","label","colour","Textarea","push","footer","Button","useLongPress","onLongPress","options","threshold","onStart","onFinish","onCancel","isLongPressActive","isPressed","timeout","useEffect","window","clearTimeout","useMemo","start","isMouseEvent","isTouchEvent","setTimeout","cancel","onMouseDown","onMouseUp","onMouseLeave","onTouchStart","onTouchEnd","onTouchMove","throttle","TouchEvent","nativeEvent","MouseEvent","RunningTime","hideSeconds","hideLeadingZero","className","display","formattedTime","removeLeadingZero","removeSeconds","memo","OperatorEvent","main","secondary","timeStart","duration","delay","dayOffset","isLinkedToLoaded","isSelected","isPast","selectedRef","showStart","subscribed","totalGap","handleLongPress","cancelable","preventDefault","mouseHandlers","cueColours","getAccessibleColour","operatorClasses","cx","running","past","hasFields","some","columnCount","length","Math","min","fieldGridStyle","gridTemplateColumns","undefined","binder","mainField","SuperscriptPeriod","plannedStart","formatTime","secondaryField","OperatorEventSchedule","runningTime","DelayIndicator","muted","fields","fieldsWithContent","noColour","backgroundColor","color","timeUntil","TimeUntil","useTimeUntilExpectedStart","timeUntilString","MILLIS_PER_SECOND","formatDuration","abs","MILLIS_PER_MINUTE","OperatorGroup","group","StatusBarProgress","viewSettings","timeWarning","timeDanger","useProgressData","MultiPartProgressBar","normalColor","warningColor","dangerColor","styles","progressOverride","StatusBarTimers","timers","TimerOverview","runningTimer","ClockOverview","timeNow","StatusBar","data","useViewSettings","statusBar","getOperatorOptions","customFields","timeFormat","fieldOptions","makeOptionsFromCustomFields","customFieldSelect","makeCustomFieldSelectOptions","OptionTitle","ClockOptions","collapsible","getTimeOption","DataSources","description","type","values","ElementVisibility","getOptionsFromParams","searchParams","defaultValues","getValue","key","get","getArrayValues","has","getAll","mainSource","secondarySource","subscribe","shouldEdit","isStringBoolean","hidePast","useOperatorOptions","useSearchParams","maybePreset","use","PresetContext","URLSearchParams","search","getEventData","getPropertyValue","subscribedData","filter","hasOwn","reduce","acc","useOperatorData","rundown","rundownMetadata","status","rundownStatus","useRundownWithMetadata","customFieldStatus","useCustomFields","settings","settingsStatus","useSettings","aggregateQueryStatus","selectedOffset","OperatorLoader","useWindowTitle","Loader","EmptyPage","Operator","selectedEventId","useSelectedEventId","showEditPrompt","setShowEditPrompt","editEvent","setEditEvent","lockAutoScroll","setLockAutoScroll","scrollRef","scrollToComponent","useFollowComponent","followRef","doFollow","topOffset","followTrigger","timeoutId","scrollTo","handleOffset","throttledHandleScroll","handleUserScroll","selectedRect","getBoundingClientRect","scrollerRect","distanceFromTop","top","hasScrolledOutOfThreshold","handleScroll","handleEdit","useCallback","defaultFormat","getDefaultFormat","operatorOptions","canEdit","operatorContainer","ViewParamsEditor","OntimeView","editPrompt","show","isTouchDevice","operatorEvents","order","entryId","entry","entries","isOntimeEvent","isLoaded","skip","isOntimeGroup","isCurrentParent","groupId","nestedEntryId","nestedEntry","FollowButton","OperatorExport","ProtectRoute"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as s,aH as f,aI as u,aJ as v,aK as m,aL as y,ax as p}from"./vendor-dQa48psh.js";import{u as b}from"./useProjectData-DdITd09M.js";import{e as r,be as h}from"./index-DYkg-xOk.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f33c6980-17e7-425e-9a66-0ce9c5790cf7",e._sentryDebugIdIdentifier="sentry-dbid-f33c6980-17e7-425e-9a66-0ce9c5790cf7")}catch{}})();const x="_title_1kaxc_17",w="_description_1kaxc_27",a={title:x,description:w};function $(){const{data:e}=b();return!e.title&&!e.description?null:s.jsxs("div",{children:[s.jsx("div",{className:a.title,children:e.title}),s.jsx("div",{className:a.description,children:e.description})]})}const j="_root_1kuaa_17",S="_viewport_1kuaa_22",N="_scrollbar_1kuaa_28",O="_thumb_1kuaa_51",i={root:j,viewport:S,scrollbar:N,thumb:O};function g({className:e,viewportClassName:n,contentClassName:t,contentStyle:l,children:c,ref:d,orientation:_="vertical"}){return s.jsxs(f,{className:r([i.root,e]),children:[s.jsx(u,{ref:d,className:r([i.viewport,n]),children:s.jsx(v,{className:t,style:l,children:c})}),s.jsx(m,{className:i.scrollbar,orientation:_,children:s.jsx(y,{className:i.thumb})})]})}const k="_overview_12a2y_17",I="_isOffline_12a2y_24",A="_info_12a2y_24",D="_nav_12a2y_39",T="_infoScroll_12a2y_54",E="_inline_12a2y_60",o={overview:k,isOffline:I,info:A,nav:D,infoScroll:T,inline:E};function z({navElements:e,children:n}){const t=h();return s.jsx("div",{className:r([o.overview,!t&&o.isOffline]),children:s.jsxs(p,{children:[s.jsx("div",{className:o.nav,children:e}),s.jsx(g,{className:o.infoScroll,contentClassName:o.info,contentStyle:{minWidth:"100%"},orientation:"horizontal",children:n})]})})}export{z as O,g as S,$ as T,o as s};
2
- //# sourceMappingURL=OverviewWrapper-B6AeBRb6.js.map
1
+ import{j as s,aH as f,aI as u,aJ as v,aK as b,aL as m,ax as y}from"./vendor-BKUJ0_Du.js";import{u as p}from"./useProjectData-C110zIXC.js";import{e as a,bf as h}from"./index-Dm-4OTmY.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ac3fd58d-2005-46a3-b40b-d3590d914106",e._sentryDebugIdIdentifier="sentry-dbid-ac3fd58d-2005-46a3-b40b-d3590d914106")}catch{}})();const x="_title_1kaxc_17",w="_description_1kaxc_27",r={title:x,description:w};function $(){const{data:e}=p();return!e.title&&!e.description?null:s.jsxs("div",{children:[s.jsx("div",{className:r.title,children:e.title}),s.jsx("div",{className:r.description,children:e.description})]})}const j="_root_1kuaa_17",S="_viewport_1kuaa_22",N="_scrollbar_1kuaa_28",O="_thumb_1kuaa_51",i={root:j,viewport:S,scrollbar:N,thumb:O};function g({className:e,viewportClassName:n,contentClassName:t,contentStyle:l,children:c,ref:d,orientation:_="vertical"}){return s.jsxs(f,{className:a([i.root,e]),children:[s.jsx(u,{ref:d,className:a([i.viewport,n]),children:s.jsx(v,{className:t,style:l,children:c})}),s.jsx(b,{className:i.scrollbar,orientation:_,children:s.jsx(m,{className:i.thumb})})]})}const k="_overview_12a2y_17",I="_isOffline_12a2y_24",A="_info_12a2y_24",D="_nav_12a2y_39",T="_infoScroll_12a2y_54",E="_inline_12a2y_60",o={overview:k,isOffline:I,info:A,nav:D,infoScroll:T,inline:E};function z({navElements:e,children:n}){const t=h();return s.jsx("div",{className:a([o.overview,!t&&o.isOffline]),children:s.jsxs(y,{children:[s.jsx("div",{className:o.nav,children:e}),s.jsx(g,{className:o.infoScroll,contentClassName:o.info,contentStyle:{minWidth:"100%"},orientation:"horizontal",children:n})]})})}export{z as O,g as S,$ as T,o as s};
2
+ //# sourceMappingURL=OverviewWrapper-B2i8d3rt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OverviewWrapper-B6AeBRb6.js","sources":["../../src/features/overview/composite/TitleOverview.tsx","../../src/common/components/scroll-area/ScrollArea.tsx","../../src/features/overview/OverviewWrapper.tsx"],"sourcesContent":["import useProjectData from '../../../common/hooks-query/useProjectData';\n\nimport style from './TitleOverview.module.scss';\n\nexport default function TitleOverview() {\n const { data } = useProjectData();\n\n if (!data.title && !data.description) {\n return null;\n }\n\n return (\n <div>\n <div className={style.title}>{data.title}</div>\n <div className={style.description}>{data.description}</div>\n </div>\n );\n}\n","import { CSSProperties, PropsWithChildren, Ref } from 'react';\nimport { ScrollArea } from '@base-ui/react/scroll-area';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './ScrollArea.module.scss';\n\ninterface ScrollAreaProps {\n className?: string;\n viewportClassName?: string;\n contentClassName?: string;\n contentStyle?: CSSProperties;\n ref?: Ref<HTMLDivElement>;\n orientation?: 'vertical' | 'horizontal';\n}\n\nexport default function StyledScrollArea({\n className,\n viewportClassName,\n contentClassName,\n contentStyle,\n children,\n ref,\n orientation = 'vertical',\n}: PropsWithChildren<ScrollAreaProps>) {\n return (\n <ScrollArea.Root className={cx([style.root, className])}>\n <ScrollArea.Viewport ref={ref} className={cx([style.viewport, viewportClassName])}>\n <ScrollArea.Content className={contentClassName} style={contentStyle}>\n {children}\n </ScrollArea.Content>\n </ScrollArea.Viewport>\n <ScrollArea.Scrollbar className={style.scrollbar} orientation={orientation}>\n <ScrollArea.Thumb className={style.thumb} />\n </ScrollArea.Scrollbar>\n </ScrollArea.Root>\n );\n}\n","import { PropsWithChildren, ReactNode } from 'react';\nimport { ErrorBoundary } from '@sentry/react';\n\nimport ScrollArea from '../../common/components/scroll-area/ScrollArea';\nimport { useIsOnline } from '../../common/hooks/useSocket';\nimport { cx } from '../../common/utils/styleUtils';\n\nimport style from './Overview.module.scss';\n\ninterface OverviewWrapperProps {\n navElements: ReactNode;\n}\n\nexport function OverviewWrapper({ navElements, children }: PropsWithChildren<OverviewWrapperProps>) {\n const isOnline = useIsOnline();\n\n return (\n <div className={cx([style.overview, !isOnline && style.isOffline])}>\n <ErrorBoundary>\n <div className={style.nav}>{navElements}</div>\n <ScrollArea\n className={style.infoScroll}\n contentClassName={style.info}\n contentStyle={{ minWidth: '100%' }}\n orientation='horizontal'\n >\n {children}\n </ScrollArea>\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["TitleOverview","data","useProjectData","title","description","jsx","style","StyledScrollArea","className","viewportClassName","contentClassName","contentStyle","children","ref","orientation","jsxs","ScrollArea.Root","cx","root","ScrollArea.Viewport","viewport","ScrollArea.Content","ScrollArea.Scrollbar","scrollbar","ScrollArea.Thumb","thumb","OverviewWrapper","navElements","isOnline","useIsOnline","overview","isOffline","ErrorBoundary","nav","ScrollArea","infoScroll","info","minWidth"],"mappings":"kmBAIA,SAAwBA,GAAgB,CAChC,KAAA,CAAEC,KAAAA,GAASC,EAAe,EAEhC,MAAI,CAACD,EAAKE,OAAS,CAACF,EAAKG,YAChB,YAIN,MACC,CAAA,SAAA,CAAAC,MAAC,MAAI,CAAA,UAAWC,EAAMH,MAAQF,WAAKE,MAAM,QACxC,MAAI,CAAA,UAAWG,EAAMF,YAAcH,WAAKG,WAAY,CAAA,CAAA,EACvD,CAEJ,uICDA,SAAwBG,EAAiB,CACvCC,UAAAA,EACAC,kBAAAA,EACAC,iBAAAA,EACAC,aAAAA,EACAC,SAAAA,EACAC,IAAAA,EACAC,YAAAA,EAAc,UACoB,EAAG,CAEnC,OAAAC,OAACC,EAAA,CAAgB,UAAWC,EAAG,CAACX,EAAMY,KAAMV,CAAS,CAAC,EACpD,SAAA,CAACH,MAAAc,EAAA,CAAoB,IAAAN,EAAU,UAAWI,EAAG,CAACX,EAAMc,SAAUX,CAAiB,CAAC,EAC9E,SAAAJ,EAAA,IAACgB,EAAA,CAAmB,UAAWX,EAAkB,MAAOC,EACrDC,SAAAA,CACH,CAAA,EACF,EACCP,EAAAA,IAAAiB,EAAA,CAAqB,UAAWhB,EAAMiB,UAAW,YAAAT,EAChD,SAAAT,EAAA,IAACmB,EAAA,CAAiB,UAAWlB,EAAMmB,KAAM,CAAA,CAC3C,CAAA,CAAA,EACF,CAEJ,uMCxBO,SAASC,EAAgB,CAAEC,YAAAA,EAAaf,SAAAA,CAAkD,EAAG,CAClG,MAAMgB,EAAWC,EAAY,EAE7B,OACGxB,EAAAA,IAAA,MAAA,CAAI,UAAWY,EAAG,CAACX,EAAMwB,SAAU,CAACF,GAAYtB,EAAMyB,SAAS,CAAC,EAC/D,gBAACC,EACC,CAAA,SAAA,CAAA3B,EAAA,IAAC,MAAI,CAAA,UAAWC,EAAM2B,IAAMN,SAAYA,EAAA,EACxCtB,MAAC6B,GACC,UAAW5B,EAAM6B,WACjB,iBAAkB7B,EAAM8B,KACxB,aAAc,CAAEC,SAAU,MAAA,EAC1B,YAAY,aAEXzB,SAAAA,CACH,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ"}
1
+ {"version":3,"file":"OverviewWrapper-B2i8d3rt.js","sources":["../../src/features/overview/composite/TitleOverview.tsx","../../src/common/components/scroll-area/ScrollArea.tsx","../../src/features/overview/OverviewWrapper.tsx"],"sourcesContent":["import useProjectData from '../../../common/hooks-query/useProjectData';\n\nimport style from './TitleOverview.module.scss';\n\nexport default function TitleOverview() {\n const { data } = useProjectData();\n\n if (!data.title && !data.description) {\n return null;\n }\n\n return (\n <div>\n <div className={style.title}>{data.title}</div>\n <div className={style.description}>{data.description}</div>\n </div>\n );\n}\n","import { CSSProperties, PropsWithChildren, Ref } from 'react';\nimport { ScrollArea } from '@base-ui/react/scroll-area';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './ScrollArea.module.scss';\n\ninterface ScrollAreaProps {\n className?: string;\n viewportClassName?: string;\n contentClassName?: string;\n contentStyle?: CSSProperties;\n ref?: Ref<HTMLDivElement>;\n orientation?: 'vertical' | 'horizontal';\n}\n\nexport default function StyledScrollArea({\n className,\n viewportClassName,\n contentClassName,\n contentStyle,\n children,\n ref,\n orientation = 'vertical',\n}: PropsWithChildren<ScrollAreaProps>) {\n return (\n <ScrollArea.Root className={cx([style.root, className])}>\n <ScrollArea.Viewport ref={ref} className={cx([style.viewport, viewportClassName])}>\n <ScrollArea.Content className={contentClassName} style={contentStyle}>\n {children}\n </ScrollArea.Content>\n </ScrollArea.Viewport>\n <ScrollArea.Scrollbar className={style.scrollbar} orientation={orientation}>\n <ScrollArea.Thumb className={style.thumb} />\n </ScrollArea.Scrollbar>\n </ScrollArea.Root>\n );\n}\n","import { PropsWithChildren, ReactNode } from 'react';\nimport { ErrorBoundary } from '@sentry/react';\n\nimport ScrollArea from '../../common/components/scroll-area/ScrollArea';\nimport { useIsOnline } from '../../common/hooks/useSocket';\nimport { cx } from '../../common/utils/styleUtils';\n\nimport style from './Overview.module.scss';\n\ninterface OverviewWrapperProps {\n navElements: ReactNode;\n}\n\nexport function OverviewWrapper({ navElements, children }: PropsWithChildren<OverviewWrapperProps>) {\n const isOnline = useIsOnline();\n\n return (\n <div className={cx([style.overview, !isOnline && style.isOffline])}>\n <ErrorBoundary>\n <div className={style.nav}>{navElements}</div>\n <ScrollArea\n className={style.infoScroll}\n contentClassName={style.info}\n contentStyle={{ minWidth: '100%' }}\n orientation='horizontal'\n >\n {children}\n </ScrollArea>\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["TitleOverview","data","useProjectData","title","description","jsx","style","StyledScrollArea","className","viewportClassName","contentClassName","contentStyle","children","ref","orientation","jsxs","ScrollArea.Root","cx","root","ScrollArea.Viewport","viewport","ScrollArea.Content","ScrollArea.Scrollbar","scrollbar","ScrollArea.Thumb","thumb","OverviewWrapper","navElements","isOnline","useIsOnline","overview","isOffline","ErrorBoundary","nav","ScrollArea","infoScroll","info","minWidth"],"mappings":"kmBAIA,SAAwBA,GAAgB,CAChC,KAAA,CAAEC,KAAAA,GAASC,EAAe,EAEhC,MAAI,CAACD,EAAKE,OAAS,CAACF,EAAKG,YAChB,YAIN,MACC,CAAA,SAAA,CAAAC,MAAC,MAAI,CAAA,UAAWC,EAAMH,MAAQF,WAAKE,MAAM,QACxC,MAAI,CAAA,UAAWG,EAAMF,YAAcH,WAAKG,WAAY,CAAA,CAAA,EACvD,CAEJ,uICDA,SAAwBG,EAAiB,CACvCC,UAAAA,EACAC,kBAAAA,EACAC,iBAAAA,EACAC,aAAAA,EACAC,SAAAA,EACAC,IAAAA,EACAC,YAAAA,EAAc,UACoB,EAAG,CAEnC,OAAAC,OAACC,EAAA,CAAgB,UAAWC,EAAG,CAACX,EAAMY,KAAMV,CAAS,CAAC,EACpD,SAAA,CAACH,MAAAc,EAAA,CAAoB,IAAAN,EAAU,UAAWI,EAAG,CAACX,EAAMc,SAAUX,CAAiB,CAAC,EAC9E,SAAAJ,EAAA,IAACgB,EAAA,CAAmB,UAAWX,EAAkB,MAAOC,EACrDC,SAAAA,CACH,CAAA,EACF,EACCP,EAAAA,IAAAiB,EAAA,CAAqB,UAAWhB,EAAMiB,UAAW,YAAAT,EAChD,SAAAT,EAAA,IAACmB,EAAA,CAAiB,UAAWlB,EAAMmB,KAAM,CAAA,CAC3C,CAAA,CAAA,EACF,CAEJ,uMCxBO,SAASC,EAAgB,CAAEC,YAAAA,EAAaf,SAAAA,CAAkD,EAAG,CAClG,MAAMgB,EAAWC,EAAY,EAE7B,OACGxB,EAAAA,IAAA,MAAA,CAAI,UAAWY,EAAG,CAACX,EAAMwB,SAAU,CAACF,GAAYtB,EAAMyB,SAAS,CAAC,EAC/D,gBAACC,EACC,CAAA,SAAA,CAAA3B,EAAA,IAAC,MAAI,CAAA,UAAWC,EAAM2B,IAAMN,SAAYA,EAAA,EACxCtB,MAAC6B,GACC,UAAW5B,EAAM6B,WACjB,iBAAkB7B,EAAM8B,KACxB,aAAc,CAAEC,SAAU,MAAA,EAC1B,YAAY,aAEXzB,SAAAA,CACH,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as n,a7 as E,ax as j}from"./vendor-dQa48psh.js";import{b as S}from"./EditorUtils-BxN0w0-D.js";import{c as I,e as c,a as k}from"./index-DYkg-xOk.js";import{g as D,a as B,b as F,d as _,f as N,h as R,i as M,F as h}from"./timer.utils-P25ngopd.js";import{M as W}from"./MultiPartProgressBar-IIU35-x9.js";import{g as z,a as A}from"./viewUtils-rcOl1-o8.js";import{g as L}from"./presentation.utils-Bv3PuMWv.js";import"./playbackstate-DisgQbHM.js";import"./getProgress-mRMYlU96.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="9127ad70-3931-4feb-8f99-b7bc6e63b7c2",t._sentryDebugIdIdentifier="sentry-dbid-9127ad70-3931-4feb-8f99-b7bc6e63b7c2")}catch{}})();function O({viewSettings:t}){const{eventNow:s,message:i,time:e,clock:d,timerTypeNow:a,countToEndNow:o,auxTimer:r}=I(),l=D(i.timer),{showFinished:m,showWarning:y,showDanger:x}=B(a,o,e.phase,!1,"",!1),p=F(e.playback),b=_(a),w=N(e.duration,e.addedTime),T=z(!1,a,d,e,a),f=A(T,a,"min",{removeSeconds:!1,removeLeadingZero:!1}),v=i.timer.secondarySource==="aux1"?r.aux1:i.timer.secondarySource==="aux2"?r.aux2:i.timer.secondarySource==="aux3"?r.aux3:null,u=R(i,v,"min",!1,!0,!1),g=L(t,void 0,y,x),P=M(f,u),C={...g&&{"--timer-colour":g}};return n.jsxs("div",{className:c(["pip-timer",m&&"pip-timer--finished"]),style:C,children:[n.jsx("div",{className:c(["message-overlay",l&&"message-overlay--active"]),children:n.jsx(h,{mode:"multi",min:12,max:256,className:c(["message",i.timer.blink&&"blink"]),children:i.timer.text})}),n.jsxs("div",{className:"timer-container",children:[n.jsx("div",{className:c(["timer",!p&&"timer--paused",m&&"timer--finished"]),style:{fontSize:`${P}vw`},"data-phase":e.phase,children:f}),n.jsx("div",{className:c(["secondary",!u&&"secondary--hidden"]),children:n.jsx(h,{mode:"multi",min:12,max:256,children:u})})]}),b&&n.jsx(W,{className:c(["progress-container",!p&&"progress-container--paused"]),now:e.current,complete:w,normalColor:t.normalColor,warning:s==null?void 0:s.timeWarning,warningColor:t.warningColor,danger:s==null?void 0:s.timeDanger,dangerColor:t.dangerColor,hideOvertime:!m})]})}function Q(){const{data:t,status:s}=k(),i=async()=>{if(window.documentPictureInPicture.window)return;let e;try{e=await window.documentPictureInPicture.requestWindow()}catch(o){console.error("Failed to open Picture-in-Picture:",o);return}[...document.styleSheets].forEach(o=>{try{if(o.href){const r=e.document.createElement("link");r.rel="stylesheet",r.href=o.href,e.document.head.appendChild(r)}else if(o.cssRules){const r=e.document.createElement("style");r.textContent=[...o.cssRules].map(l=>l.cssText).join(""),e.document.head.appendChild(r)}}catch(r){console.warn("Stylesheet copy blocked:",r)}});const d=e.document.createElement("div");d.setAttribute("id","pip-root"),d.style.height="100vh",e.document.body.append(d);const a=E.createRoot(e.document.getElementById("pip-root"),{onCaughtError:(o,r)=>console.error(o),onUncaughtError:(o,r)=>console.error(o),onRecoverableError:(o,r)=>console.error(o)});e.addEventListener("pagehide",()=>{a.unmount()}),a.render(n.jsx(j,{children:n.jsx(O,{viewSettings:t})}))};return n.jsx(S,{onClick:s==="success"?i:void 0})}export{Q as default};
2
- //# sourceMappingURL=PipHost-BueqKsmJ.js.map
1
+ import{j as n,a7 as E,ax as j}from"./vendor-BKUJ0_Du.js";import{b as S}from"./EditorUtils-BLcTuWz1.js";import{c as I,e as c,a as k}from"./index-Dm-4OTmY.js";import{g as D,a as B,b as F,d as _,f as N,h as R,i as M,F as h}from"./timer.utils-B4bvsns3.js";import{M as W}from"./MultiPartProgressBar-W2a-JWPY.js";import{g as z,a as A}from"./viewUtils-29a3Mmiu.js";import{g as L}from"./presentation.utils-Z61KykAH.js";import"./playbackstate-Dl_ZJABT.js";import"./getProgress-ZUTmCn_v.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="9127ad70-3931-4feb-8f99-b7bc6e63b7c2",t._sentryDebugIdIdentifier="sentry-dbid-9127ad70-3931-4feb-8f99-b7bc6e63b7c2")}catch{}})();function O({viewSettings:t}){const{eventNow:s,message:i,time:e,clock:d,timerTypeNow:a,countToEndNow:o,auxTimer:r}=I(),l=D(i.timer),{showFinished:m,showWarning:y,showDanger:x}=B(a,o,e.phase,!1,"",!1),p=F(e.playback),b=_(a),w=N(e.duration,e.addedTime),T=z(!1,a,d,e,a),f=A(T,a,"min",{removeSeconds:!1,removeLeadingZero:!1}),v=i.timer.secondarySource==="aux1"?r.aux1:i.timer.secondarySource==="aux2"?r.aux2:i.timer.secondarySource==="aux3"?r.aux3:null,u=R(i,v,"min",!1,!0,!1),g=L(t,void 0,y,x),P=M(f,u),C={...g&&{"--timer-colour":g}};return n.jsxs("div",{className:c(["pip-timer",m&&"pip-timer--finished"]),style:C,children:[n.jsx("div",{className:c(["message-overlay",l&&"message-overlay--active"]),children:n.jsx(h,{mode:"multi",min:12,max:256,className:c(["message",i.timer.blink&&"blink"]),children:i.timer.text})}),n.jsxs("div",{className:"timer-container",children:[n.jsx("div",{className:c(["timer",!p&&"timer--paused",m&&"timer--finished"]),style:{fontSize:`${P}vw`},"data-phase":e.phase,children:f}),n.jsx("div",{className:c(["secondary",!u&&"secondary--hidden"]),children:n.jsx(h,{mode:"multi",min:12,max:256,children:u})})]}),b&&n.jsx(W,{className:c(["progress-container",!p&&"progress-container--paused"]),now:e.current,complete:w,normalColor:t.normalColor,warning:s==null?void 0:s.timeWarning,warningColor:t.warningColor,danger:s==null?void 0:s.timeDanger,dangerColor:t.dangerColor,hideOvertime:!m})]})}function Q(){const{data:t,status:s}=k(),i=async()=>{if(window.documentPictureInPicture.window)return;let e;try{e=await window.documentPictureInPicture.requestWindow()}catch(o){console.error("Failed to open Picture-in-Picture:",o);return}[...document.styleSheets].forEach(o=>{try{if(o.href){const r=e.document.createElement("link");r.rel="stylesheet",r.href=o.href,e.document.head.appendChild(r)}else if(o.cssRules){const r=e.document.createElement("style");r.textContent=[...o.cssRules].map(l=>l.cssText).join(""),e.document.head.appendChild(r)}}catch(r){console.warn("Stylesheet copy blocked:",r)}});const d=e.document.createElement("div");d.setAttribute("id","pip-root"),d.style.height="100vh",e.document.body.append(d);const a=E.createRoot(e.document.getElementById("pip-root"),{onCaughtError:(o,r)=>console.error(o),onUncaughtError:(o,r)=>console.error(o),onRecoverableError:(o,r)=>console.error(o)});e.addEventListener("pagehide",()=>{a.unmount()}),a.render(n.jsx(j,{children:n.jsx(O,{viewSettings:t})}))};return n.jsx(S,{onClick:s==="success"?i:void 0})}export{Q as default};
2
+ //# sourceMappingURL=PipHost-Dz2oy7XG.js.map