@getontime/cli 4.2.1 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/client/assets/Backstage-CDH53Q_N.js +2 -0
  2. package/client/assets/Backstage-CDH53Q_N.js.br +0 -0
  3. package/client/assets/Backstage-CDH53Q_N.js.gz +0 -0
  4. package/client/assets/Backstage-CDH53Q_N.js.map +1 -0
  5. package/client/assets/Countdown-B-MuMf1C.js +2 -0
  6. package/client/assets/Countdown-B-MuMf1C.js.br +0 -0
  7. package/client/assets/Countdown-B-MuMf1C.js.gz +0 -0
  8. package/client/assets/Countdown-B-MuMf1C.js.map +1 -0
  9. package/client/assets/CustomTranslationModal-DiQbmcgD.js +2 -0
  10. package/client/assets/CustomTranslationModal-DiQbmcgD.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-DiQbmcgD.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-CtBvokyt.js.map → CustomTranslationModal-DiQbmcgD.js.map} +1 -1
  13. package/client/assets/DelayIndicator-D--91EO3.js +2 -0
  14. package/client/assets/DelayIndicator-D--91EO3.js.br +0 -0
  15. package/client/assets/DelayIndicator-D--91EO3.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-BFZFpsY5.js.map → DelayIndicator-D--91EO3.js.map} +1 -1
  17. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js +2 -0
  18. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-DaMxgBMP.js.map → EditorFeatureWrapper-DwXUAV4k.js.map} +1 -1
  21. package/client/assets/EditorUtils-DuKjlUkF.js +2 -0
  22. package/client/assets/EditorUtils-DuKjlUkF.js.br +0 -0
  23. package/client/assets/EditorUtils-DuKjlUkF.js.gz +0 -0
  24. package/client/assets/{EditorUtils-DoaSwWiz.js.map → EditorUtils-DuKjlUkF.js.map} +1 -1
  25. package/client/assets/EditorUtils-L4Sg72o_.css +1 -0
  26. package/client/assets/EditorUtils-L4Sg72o_.css.br +0 -0
  27. package/client/assets/EditorUtils-L4Sg72o_.css.gz +0 -0
  28. package/client/assets/{Empty-D1UteOYj.js → Empty-CJbZxh45.js} +2 -2
  29. package/client/assets/Empty-CJbZxh45.js.br +0 -0
  30. package/client/assets/Empty-CJbZxh45.js.gz +0 -0
  31. package/client/assets/{Empty-D1UteOYj.js.map → Empty-CJbZxh45.js.map} +1 -1
  32. package/client/assets/{EmptyPage-DeRjpRKZ.js → EmptyPage-Bc358YpE.js} +2 -2
  33. package/client/assets/EmptyPage-Bc358YpE.js.br +5 -0
  34. package/client/assets/EmptyPage-Bc358YpE.js.gz +0 -0
  35. package/client/assets/{EmptyPage-DeRjpRKZ.js.map → EmptyPage-Bc358YpE.js.map} +1 -1
  36. package/client/assets/{FollowButton-FodezDem.js → FollowButton-C6Fvaqh0.js} +2 -2
  37. package/client/assets/FollowButton-C6Fvaqh0.js.br +0 -0
  38. package/client/assets/FollowButton-C6Fvaqh0.js.gz +0 -0
  39. package/client/assets/{FollowButton-FodezDem.js.map → FollowButton-C6Fvaqh0.js.map} +1 -1
  40. package/client/assets/MessageControlExport-D_pNX6Vj.css +1 -0
  41. package/client/assets/MessageControlExport-D_pNX6Vj.css.br +0 -0
  42. package/client/assets/MessageControlExport-D_pNX6Vj.css.gz +0 -0
  43. package/client/assets/MessageControlExport-GmOrvUik.js +3 -0
  44. package/client/assets/MessageControlExport-GmOrvUik.js.br +0 -0
  45. package/client/assets/MessageControlExport-GmOrvUik.js.gz +0 -0
  46. package/client/assets/MessageControlExport-GmOrvUik.js.map +1 -0
  47. package/client/assets/MilestoneEditor-BA0PVIQh.js +2 -0
  48. package/client/assets/MilestoneEditor-BA0PVIQh.js.br +0 -0
  49. package/client/assets/MilestoneEditor-BA0PVIQh.js.gz +0 -0
  50. package/client/assets/MilestoneEditor-BA0PVIQh.js.map +1 -0
  51. package/client/assets/Modal-BKx0PDGT.js +2 -0
  52. package/client/assets/Modal-BKx0PDGT.js.br +0 -0
  53. package/client/assets/Modal-BKx0PDGT.js.gz +0 -0
  54. package/client/assets/Modal-BKx0PDGT.js.map +1 -0
  55. package/client/assets/{MultiPartProgressBar-BKHk19Hb.js → MultiPartProgressBar-BXdLxJpy.js} +2 -2
  56. package/client/assets/MultiPartProgressBar-BXdLxJpy.js.br +0 -0
  57. package/client/assets/MultiPartProgressBar-BXdLxJpy.js.gz +0 -0
  58. package/client/assets/{MultiPartProgressBar-BKHk19Hb.js.map → MultiPartProgressBar-BXdLxJpy.js.map} +1 -1
  59. package/client/assets/OperatorExport-CA5WcIt5.css +1 -0
  60. package/client/assets/OperatorExport-CA5WcIt5.css.br +0 -0
  61. package/client/assets/OperatorExport-CA5WcIt5.css.gz +0 -0
  62. package/client/assets/OperatorExport-X7-qi2jv.js +2 -0
  63. package/client/assets/OperatorExport-X7-qi2jv.js.br +0 -0
  64. package/client/assets/OperatorExport-X7-qi2jv.js.gz +0 -0
  65. package/client/assets/OperatorExport-X7-qi2jv.js.map +1 -0
  66. package/client/assets/OverviewWrapper-BQb2xl_N.js +2 -0
  67. package/client/assets/OverviewWrapper-BQb2xl_N.js.br +0 -0
  68. package/client/assets/OverviewWrapper-BQb2xl_N.js.gz +0 -0
  69. package/client/assets/OverviewWrapper-BQb2xl_N.js.map +1 -0
  70. package/client/assets/{PipHost-B9-cZ8Lm.js → PipHost-CvtlZIn7.js} +2 -2
  71. package/client/assets/PipHost-CvtlZIn7.js.br +0 -0
  72. package/client/assets/PipHost-CvtlZIn7.js.gz +0 -0
  73. package/client/assets/PipHost-CvtlZIn7.js.map +1 -0
  74. package/client/assets/ProjectInfo-1tw48NHZ.js +2 -0
  75. package/client/assets/ProjectInfo-1tw48NHZ.js.br +0 -0
  76. package/client/assets/ProjectInfo-1tw48NHZ.js.gz +0 -0
  77. package/client/assets/{ProjectInfo-Dp1TZyBd.js.map → ProjectInfo-1tw48NHZ.js.map} +1 -1
  78. package/client/assets/{ProtectRoute-EejQ5o_H.js → ProtectRoute-BH-QvsU0.js} +2 -2
  79. package/client/assets/ProtectRoute-BH-QvsU0.js.br +0 -0
  80. package/client/assets/ProtectRoute-BH-QvsU0.js.gz +0 -0
  81. package/client/assets/{ProtectRoute-EejQ5o_H.js.map → ProtectRoute-BH-QvsU0.js.map} +1 -1
  82. package/client/assets/ProtectedCuesheet-CYBIcg1c.js +2 -0
  83. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.br +0 -0
  84. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.gz +0 -0
  85. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.map +1 -0
  86. package/client/assets/ProtectedCuesheet-DPO7xYMb.css +1 -0
  87. package/client/assets/ProtectedCuesheet-DPO7xYMb.css.br +0 -0
  88. package/client/assets/ProtectedCuesheet-DPO7xYMb.css.gz +0 -0
  89. package/client/assets/{ProtectedEditor-Dw0pWw0J.css → ProtectedEditor-BtSuTFlT.css} +1 -1
  90. package/client/assets/ProtectedEditor-BtSuTFlT.css.br +0 -0
  91. package/client/assets/{ProtectedEditor-Dw0pWw0J.css.gz → ProtectedEditor-BtSuTFlT.css.gz} +0 -0
  92. package/client/assets/ProtectedEditor-D_A75byA.js +3 -0
  93. package/client/assets/ProtectedEditor-D_A75byA.js.br +0 -0
  94. package/client/assets/ProtectedEditor-D_A75byA.js.gz +0 -0
  95. package/client/assets/ProtectedEditor-D_A75byA.js.map +1 -0
  96. package/client/assets/RundownEntry-bkqwx57t.js +2 -0
  97. package/client/assets/RundownEntry-bkqwx57t.js.br +0 -0
  98. package/client/assets/RundownEntry-bkqwx57t.js.gz +0 -0
  99. package/client/assets/RundownEntry-bkqwx57t.js.map +1 -0
  100. package/client/assets/{RundownExport-DtSvAfBG.css → RundownExport-Bgtg_idR.css} +1 -1
  101. package/client/assets/RundownExport-Bgtg_idR.css.br +0 -0
  102. package/client/assets/RundownExport-Bgtg_idR.css.gz +0 -0
  103. package/client/assets/RundownExport-EorsanA0.js +3 -0
  104. package/client/assets/RundownExport-EorsanA0.js.br +0 -0
  105. package/client/assets/RundownExport-EorsanA0.js.gz +0 -0
  106. package/client/assets/RundownExport-EorsanA0.js.map +1 -0
  107. package/client/assets/{Select-cHK8JrMG.js → Select-BGGVCKqU.js} +2 -2
  108. package/client/assets/Select-BGGVCKqU.js.br +0 -0
  109. package/client/assets/Select-BGGVCKqU.js.gz +0 -0
  110. package/client/assets/Select-BGGVCKqU.js.map +1 -0
  111. package/client/assets/Studio-BjNZ4l-W.js +2 -0
  112. package/client/assets/Studio-BjNZ4l-W.js.br +0 -0
  113. package/client/assets/Studio-BjNZ4l-W.js.gz +0 -0
  114. package/client/assets/Studio-BjNZ4l-W.js.map +1 -0
  115. package/client/assets/{StyleEditor-RZvkKHdf.js → StyleEditor-CpciRLYh.js} +2 -2
  116. package/client/assets/StyleEditor-CpciRLYh.js.br +0 -0
  117. package/client/assets/StyleEditor-CpciRLYh.js.gz +0 -0
  118. package/client/assets/{StyleEditor-RZvkKHdf.js.map → StyleEditor-CpciRLYh.js.map} +1 -1
  119. package/client/assets/{SuperscriptPeriod-DaZq1rr6.js → SuperscriptPeriod-DsPdWN_s.js} +2 -2
  120. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.br +0 -0
  121. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.gz +0 -0
  122. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.map +1 -0
  123. package/client/assets/SuperscriptTime-CA6S2R55.js +2 -0
  124. package/client/assets/SuperscriptTime-CA6S2R55.js.br +0 -0
  125. package/client/assets/SuperscriptTime-CA6S2R55.js.gz +0 -0
  126. package/client/assets/SuperscriptTime-CA6S2R55.js.map +1 -0
  127. package/client/assets/SwatchPicker-Cm5Eicvv.js +2 -0
  128. package/client/assets/SwatchPicker-Cm5Eicvv.js.br +0 -0
  129. package/client/assets/SwatchPicker-Cm5Eicvv.js.gz +0 -0
  130. package/client/assets/SwatchPicker-Cm5Eicvv.js.map +1 -0
  131. package/client/assets/{TimeElements-dIvFHgcd.js → TimeElements-DbclWDbU.js} +2 -2
  132. package/client/assets/TimeElements-DbclWDbU.js.br +0 -0
  133. package/client/assets/TimeElements-DbclWDbU.js.gz +0 -0
  134. package/client/assets/TimeElements-DbclWDbU.js.map +1 -0
  135. package/client/assets/TimeInput-C8DQoFXv.js +2 -0
  136. package/client/assets/TimeInput-C8DQoFXv.js.br +0 -0
  137. package/client/assets/TimeInput-C8DQoFXv.js.gz +0 -0
  138. package/client/assets/{TimeInput-Duzx40TC.js.map → TimeInput-C8DQoFXv.js.map} +1 -1
  139. package/client/assets/TimelinePage-Cgtl1qNp.js +2 -0
  140. package/client/assets/TimelinePage-Cgtl1qNp.js.br +0 -0
  141. package/client/assets/TimelinePage-Cgtl1qNp.js.gz +0 -0
  142. package/client/assets/TimelinePage-Cgtl1qNp.js.map +1 -0
  143. package/client/assets/Timer-BbixOGdj.js +2 -0
  144. package/client/assets/Timer-BbixOGdj.js.br +0 -0
  145. package/client/assets/Timer-BbixOGdj.js.gz +0 -0
  146. package/client/assets/Timer-BbixOGdj.js.map +1 -0
  147. package/client/assets/TimerControlExport-Dx3SSGNG.js +2 -0
  148. package/client/assets/TimerControlExport-Dx3SSGNG.js.br +0 -0
  149. package/client/assets/TimerControlExport-Dx3SSGNG.js.gz +0 -0
  150. package/client/assets/{TimerControlExport-GJn4WWdH.js.map → TimerControlExport-Dx3SSGNG.js.map} +1 -1
  151. package/client/assets/{TimerControlExport-DavNxY9p.css → TimerControlExport-cJRa5GUp.css} +1 -1
  152. package/client/assets/TimerControlExport-cJRa5GUp.css.br +0 -0
  153. package/client/assets/{TimerControlExport-DavNxY9p.css.gz → TimerControlExport-cJRa5GUp.css.gz} +0 -0
  154. package/client/assets/{TitleCard-BqbrUnHO.js → TitleCard-Xdr7xwzU.js} +2 -2
  155. package/client/assets/TitleCard-Xdr7xwzU.js.br +0 -0
  156. package/client/assets/TitleCard-Xdr7xwzU.js.gz +0 -0
  157. package/client/assets/{TitleCard-BqbrUnHO.js.map → TitleCard-Xdr7xwzU.js.map} +1 -1
  158. package/client/assets/{Tooltip-BQBvaIZx.js → Tooltip-B5vsLcFu.js} +2 -2
  159. package/client/assets/Tooltip-B5vsLcFu.js.br +0 -0
  160. package/client/assets/Tooltip-B5vsLcFu.js.gz +0 -0
  161. package/client/assets/Tooltip-B5vsLcFu.js.map +1 -0
  162. package/client/assets/{ViewLogo-BdL1hUV1.js → ViewLogo-G7EosFIr.js} +2 -2
  163. package/client/assets/ViewLogo-G7EosFIr.js.br +0 -0
  164. package/client/assets/ViewLogo-G7EosFIr.js.gz +0 -0
  165. package/client/assets/{ViewLogo-BdL1hUV1.js.map → ViewLogo-G7EosFIr.js.map} +1 -1
  166. package/client/assets/ViewParamsEditor-C2-TRP6e.js +2 -0
  167. package/client/assets/ViewParamsEditor-C2-TRP6e.js.br +0 -0
  168. package/client/assets/ViewParamsEditor-C2-TRP6e.js.gz +0 -0
  169. package/client/assets/ViewParamsEditor-C2-TRP6e.js.map +1 -0
  170. package/client/assets/{dateConfig-BU1RZfIK.js → dateConfig-D7xim1t4.js} +2 -2
  171. package/client/assets/dateConfig-D7xim1t4.js.br +0 -0
  172. package/client/assets/dateConfig-D7xim1t4.js.gz +0 -0
  173. package/client/assets/{dateConfig-BU1RZfIK.js.map → dateConfig-D7xim1t4.js.map} +1 -1
  174. package/client/assets/{editorSettings-BMt-7s8I.js → editorSettings-D2f7e1a6.js} +2 -2
  175. package/client/assets/editorSettings-D2f7e1a6.js.br +0 -0
  176. package/client/assets/editorSettings-D2f7e1a6.js.gz +0 -0
  177. package/client/assets/{editorSettings-BMt-7s8I.js.map → editorSettings-D2f7e1a6.js.map} +1 -1
  178. package/client/assets/{getProgress-sdxPEEPi.js → getProgress-cLuBFPjh.js} +2 -2
  179. package/client/assets/getProgress-cLuBFPjh.js.br +0 -0
  180. package/client/assets/getProgress-cLuBFPjh.js.gz +0 -0
  181. package/client/assets/{getProgress-sdxPEEPi.js.map → getProgress-cLuBFPjh.js.map} +1 -1
  182. package/client/assets/index-B81u4hxi.js +3 -0
  183. package/client/assets/index-B81u4hxi.js.br +0 -0
  184. package/client/assets/index-B81u4hxi.js.gz +0 -0
  185. package/client/assets/index-B81u4hxi.js.map +1 -0
  186. package/client/assets/{index-BuJoGGff.css → index-D6S93MXv.css} +1 -1
  187. package/client/assets/index-D6S93MXv.css.br +0 -0
  188. package/client/assets/index-D6S93MXv.css.gz +0 -0
  189. package/client/assets/{offset-BS90Rks2.js → offset-R98EXhWK.js} +2 -2
  190. package/client/assets/offset-R98EXhWK.js.br +0 -0
  191. package/client/assets/offset-R98EXhWK.js.gz +0 -0
  192. package/client/assets/{offset-BS90Rks2.js.map → offset-R98EXhWK.js.map} +1 -1
  193. package/client/assets/{parseUserTime-DZJMcfuJ.js → parseUserTime-YeFR8t3F.js} +2 -2
  194. package/client/assets/parseUserTime-YeFR8t3F.js.br +0 -0
  195. package/client/assets/parseUserTime-YeFR8t3F.js.gz +0 -0
  196. package/client/assets/{parseUserTime-DZJMcfuJ.js.map → parseUserTime-YeFR8t3F.js.map} +1 -1
  197. package/client/assets/{playbackstate-CWexoP3a.js → playbackstate-CPQdnF-k.js} +2 -2
  198. package/client/assets/playbackstate-CPQdnF-k.js.br +0 -0
  199. package/client/assets/playbackstate-CPQdnF-k.js.gz +0 -0
  200. package/client/assets/{playbackstate-CWexoP3a.js.map → playbackstate-CPQdnF-k.js.map} +1 -1
  201. package/client/assets/{presentation.utils-Zo5hNQje.js → presentation.utils-Cl-L3pHN.js} +2 -2
  202. package/client/assets/presentation.utils-Cl-L3pHN.js.br +0 -0
  203. package/client/assets/presentation.utils-Cl-L3pHN.js.gz +0 -0
  204. package/client/assets/{presentation.utils-Zo5hNQje.js.map → presentation.utils-Cl-L3pHN.js.map} +1 -1
  205. package/client/assets/rundownUtils-CtVGQDQn.js +2 -0
  206. package/client/assets/rundownUtils-CtVGQDQn.js.br +0 -0
  207. package/client/assets/rundownUtils-CtVGQDQn.js.gz +0 -0
  208. package/client/assets/{rundownUtils-Dl1x6NDv.js.map → rundownUtils-CtVGQDQn.js.map} +1 -1
  209. package/client/assets/{timer.utils-BnMyVO6Z.js → timer.utils-rGyI9NYa.js} +2 -2
  210. package/client/assets/timer.utils-rGyI9NYa.js.br +0 -0
  211. package/client/assets/timer.utils-rGyI9NYa.js.gz +0 -0
  212. package/client/assets/timer.utils-rGyI9NYa.js.map +1 -0
  213. package/client/assets/{useCustomFields-CcTb-GQM.js → useCustomFields-k4piRt9n.js} +2 -2
  214. package/client/assets/useCustomFields-k4piRt9n.js.br +0 -0
  215. package/client/assets/useCustomFields-k4piRt9n.js.gz +0 -0
  216. package/client/assets/{useCustomFields-CcTb-GQM.js.map → useCustomFields-k4piRt9n.js.map} +1 -1
  217. package/client/assets/{useFollowComponent-BjhV6Uv8.js → useFollowComponent-B7vvPzG2.js} +2 -2
  218. package/client/assets/useFollowComponent-B7vvPzG2.js.br +0 -0
  219. package/client/assets/useFollowComponent-B7vvPzG2.js.gz +0 -0
  220. package/client/assets/{useFollowComponent-BjhV6Uv8.js.map → useFollowComponent-B7vvPzG2.js.map} +1 -1
  221. package/client/assets/useProjectData-DdgKoYzk.js +2 -0
  222. package/client/assets/useProjectData-DdgKoYzk.js.br +0 -0
  223. package/client/assets/useProjectData-DdgKoYzk.js.gz +0 -0
  224. package/client/assets/useProjectData-DdgKoYzk.js.map +1 -0
  225. package/client/assets/{useReport-zMbyWwpn.js → useReport-DSuFnUb9.js} +2 -2
  226. package/client/assets/useReport-DSuFnUb9.js.br +0 -0
  227. package/client/assets/useReport-DSuFnUb9.js.gz +0 -0
  228. package/client/assets/{useReport-zMbyWwpn.js.map → useReport-DSuFnUb9.js.map} +1 -1
  229. package/client/assets/useRundown-Bn6ZPsz0.js +2 -0
  230. package/client/assets/useRundown-Bn6ZPsz0.js.br +0 -0
  231. package/client/assets/useRundown-Bn6ZPsz0.js.gz +0 -0
  232. package/client/assets/useRundown-Bn6ZPsz0.js.map +1 -0
  233. package/client/assets/{useWindowTitle-mLKt65i7.js → useWindowTitle-Bpmo_HzW.js} +2 -2
  234. package/client/assets/useWindowTitle-Bpmo_HzW.js.br +0 -0
  235. package/client/assets/useWindowTitle-Bpmo_HzW.js.gz +0 -0
  236. package/client/assets/useWindowTitle-Bpmo_HzW.js.map +1 -0
  237. package/client/assets/{validateEvent-CUmvjN95.js → validateEvent-Do8yE_DJ.js} +2 -2
  238. package/client/assets/validateEvent-Do8yE_DJ.js.br +3 -0
  239. package/client/assets/validateEvent-Do8yE_DJ.js.gz +0 -0
  240. package/client/assets/{validateEvent-CUmvjN95.js.map → validateEvent-Do8yE_DJ.js.map} +1 -1
  241. package/client/assets/vendor-q6fv0YT2.js +74 -0
  242. package/client/assets/vendor-q6fv0YT2.js.br +0 -0
  243. package/client/assets/vendor-q6fv0YT2.js.gz +0 -0
  244. package/client/assets/{vendor-Cdwxo8bP.js.map → vendor-q6fv0YT2.js.map} +1 -1
  245. package/client/assets/{viewLoader.utils-DuXjY5zb.js → viewLoader.utils-b42scp-I.js} +2 -2
  246. package/client/assets/viewLoader.utils-b42scp-I.js.br +0 -0
  247. package/client/assets/viewLoader.utils-b42scp-I.js.gz +0 -0
  248. package/client/assets/{viewLoader.utils-DuXjY5zb.js.map → viewLoader.utils-b42scp-I.js.map} +1 -1
  249. package/client/assets/{viewUtils-dKRKkb_F.js → viewUtils-B8Dr4GHH.js} +2 -2
  250. package/client/assets/viewUtils-B8Dr4GHH.js.br +0 -0
  251. package/client/assets/viewUtils-B8Dr4GHH.js.gz +0 -0
  252. package/client/assets/viewUtils-B8Dr4GHH.js.map +1 -0
  253. package/client/index.html +3 -3
  254. package/package.json +1 -1
  255. package/server/index.cjs +100 -100
  256. package/client/assets/Backstage-WSlbFC9X.js +0 -2
  257. package/client/assets/Backstage-WSlbFC9X.js.br +0 -0
  258. package/client/assets/Backstage-WSlbFC9X.js.gz +0 -0
  259. package/client/assets/Backstage-WSlbFC9X.js.map +0 -1
  260. package/client/assets/Countdown-B32qlxYT.js +0 -2
  261. package/client/assets/Countdown-B32qlxYT.js.br +0 -0
  262. package/client/assets/Countdown-B32qlxYT.js.gz +0 -0
  263. package/client/assets/Countdown-B32qlxYT.js.map +0 -1
  264. package/client/assets/CustomTranslationModal-CtBvokyt.js +0 -2
  265. package/client/assets/CustomTranslationModal-CtBvokyt.js.br +0 -0
  266. package/client/assets/CustomTranslationModal-CtBvokyt.js.gz +0 -0
  267. package/client/assets/DelayIndicator-BFZFpsY5.js +0 -2
  268. package/client/assets/DelayIndicator-BFZFpsY5.js.br +0 -0
  269. package/client/assets/DelayIndicator-BFZFpsY5.js.gz +0 -0
  270. package/client/assets/Editor-B_NlyOLw.css +0 -1
  271. package/client/assets/Editor-B_NlyOLw.css.br +0 -0
  272. package/client/assets/Editor-B_NlyOLw.css.gz +0 -0
  273. package/client/assets/Editor.module-DvV2efYs.js +0 -2
  274. package/client/assets/Editor.module-DvV2efYs.js.br +0 -0
  275. package/client/assets/Editor.module-DvV2efYs.js.gz +0 -0
  276. package/client/assets/Editor.module-DvV2efYs.js.map +0 -1
  277. package/client/assets/EditorFeatureWrapper-DaMxgBMP.js +0 -2
  278. package/client/assets/EditorFeatureWrapper-DaMxgBMP.js.br +0 -0
  279. package/client/assets/EditorFeatureWrapper-DaMxgBMP.js.gz +0 -0
  280. package/client/assets/EditorUtils-CgF7UfHP.css +0 -1
  281. package/client/assets/EditorUtils-CgF7UfHP.css.br +0 -0
  282. package/client/assets/EditorUtils-CgF7UfHP.css.gz +0 -0
  283. package/client/assets/EditorUtils-DoaSwWiz.js +0 -2
  284. package/client/assets/EditorUtils-DoaSwWiz.js.br +0 -0
  285. package/client/assets/EditorUtils-DoaSwWiz.js.gz +0 -0
  286. package/client/assets/Empty-D1UteOYj.js.br +0 -0
  287. package/client/assets/Empty-D1UteOYj.js.gz +0 -0
  288. package/client/assets/EmptyPage-DeRjpRKZ.js.br +0 -0
  289. package/client/assets/EmptyPage-DeRjpRKZ.js.gz +0 -0
  290. package/client/assets/FollowButton-FodezDem.js.br +0 -0
  291. package/client/assets/FollowButton-FodezDem.js.gz +0 -0
  292. package/client/assets/MessageControlExport-CFGgiwk_.js +0 -3
  293. package/client/assets/MessageControlExport-CFGgiwk_.js.br +0 -0
  294. package/client/assets/MessageControlExport-CFGgiwk_.js.gz +0 -0
  295. package/client/assets/MessageControlExport-CFGgiwk_.js.map +0 -1
  296. package/client/assets/MessageControlExport-DjoUioWA.css +0 -1
  297. package/client/assets/MessageControlExport-DjoUioWA.css.br +0 -0
  298. package/client/assets/MessageControlExport-DjoUioWA.css.gz +0 -0
  299. package/client/assets/MilestoneEditor-B5BdJ5ju.js +0 -2
  300. package/client/assets/MilestoneEditor-B5BdJ5ju.js.br +0 -0
  301. package/client/assets/MilestoneEditor-B5BdJ5ju.js.gz +0 -0
  302. package/client/assets/MilestoneEditor-B5BdJ5ju.js.map +0 -1
  303. package/client/assets/Modal-B8ZZbVMg.js +0 -2
  304. package/client/assets/Modal-B8ZZbVMg.js.br +0 -0
  305. package/client/assets/Modal-B8ZZbVMg.js.gz +0 -0
  306. package/client/assets/Modal-B8ZZbVMg.js.map +0 -1
  307. package/client/assets/MultiPartProgressBar-BKHk19Hb.js.br +0 -0
  308. package/client/assets/MultiPartProgressBar-BKHk19Hb.js.gz +0 -0
  309. package/client/assets/OperatorExport-BiBcgVKc.css +0 -1
  310. package/client/assets/OperatorExport-BiBcgVKc.css.br +0 -0
  311. package/client/assets/OperatorExport-BiBcgVKc.css.gz +0 -0
  312. package/client/assets/OperatorExport-DQM14DsN.js +0 -2
  313. package/client/assets/OperatorExport-DQM14DsN.js.br +0 -0
  314. package/client/assets/OperatorExport-DQM14DsN.js.gz +0 -0
  315. package/client/assets/OperatorExport-DQM14DsN.js.map +0 -1
  316. package/client/assets/OverviewWrapper-D1hUkrRi.js +0 -2
  317. package/client/assets/OverviewWrapper-D1hUkrRi.js.br +0 -0
  318. package/client/assets/OverviewWrapper-D1hUkrRi.js.gz +0 -0
  319. package/client/assets/OverviewWrapper-D1hUkrRi.js.map +0 -1
  320. package/client/assets/PipHost-B9-cZ8Lm.js.br +0 -0
  321. package/client/assets/PipHost-B9-cZ8Lm.js.gz +0 -0
  322. package/client/assets/PipHost-B9-cZ8Lm.js.map +0 -1
  323. package/client/assets/ProjectInfo-Dp1TZyBd.js +0 -2
  324. package/client/assets/ProjectInfo-Dp1TZyBd.js.br +0 -0
  325. package/client/assets/ProjectInfo-Dp1TZyBd.js.gz +0 -0
  326. package/client/assets/ProtectRoute-EejQ5o_H.js.br +0 -0
  327. package/client/assets/ProtectRoute-EejQ5o_H.js.gz +0 -0
  328. package/client/assets/ProtectedCuesheet-C_tKodwo.css +0 -1
  329. package/client/assets/ProtectedCuesheet-C_tKodwo.css.br +0 -0
  330. package/client/assets/ProtectedCuesheet-C_tKodwo.css.gz +0 -0
  331. package/client/assets/ProtectedCuesheet-DvYSgueA.js +0 -2
  332. package/client/assets/ProtectedCuesheet-DvYSgueA.js.br +0 -0
  333. package/client/assets/ProtectedCuesheet-DvYSgueA.js.gz +0 -0
  334. package/client/assets/ProtectedCuesheet-DvYSgueA.js.map +0 -1
  335. package/client/assets/ProtectedEditor-B0l0X3QP.js +0 -3
  336. package/client/assets/ProtectedEditor-B0l0X3QP.js.br +0 -0
  337. package/client/assets/ProtectedEditor-B0l0X3QP.js.gz +0 -0
  338. package/client/assets/ProtectedEditor-B0l0X3QP.js.map +0 -1
  339. package/client/assets/ProtectedEditor-Dw0pWw0J.css.br +0 -0
  340. package/client/assets/RundownEntry-CwiStTnR.js +0 -2
  341. package/client/assets/RundownEntry-CwiStTnR.js.br +0 -0
  342. package/client/assets/RundownEntry-CwiStTnR.js.gz +0 -0
  343. package/client/assets/RundownEntry-CwiStTnR.js.map +0 -1
  344. package/client/assets/RundownExport-CCaOfHIr.js +0 -3
  345. package/client/assets/RundownExport-CCaOfHIr.js.br +0 -0
  346. package/client/assets/RundownExport-CCaOfHIr.js.gz +0 -0
  347. package/client/assets/RundownExport-CCaOfHIr.js.map +0 -1
  348. package/client/assets/RundownExport-DtSvAfBG.css.br +0 -0
  349. package/client/assets/RundownExport-DtSvAfBG.css.gz +0 -0
  350. package/client/assets/Select-cHK8JrMG.js.br +0 -0
  351. package/client/assets/Select-cHK8JrMG.js.gz +0 -0
  352. package/client/assets/Select-cHK8JrMG.js.map +0 -1
  353. package/client/assets/Studio-BzwFDYzk.js +0 -2
  354. package/client/assets/Studio-BzwFDYzk.js.br +0 -0
  355. package/client/assets/Studio-BzwFDYzk.js.gz +0 -0
  356. package/client/assets/Studio-BzwFDYzk.js.map +0 -1
  357. package/client/assets/StyleEditor-RZvkKHdf.js.br +0 -0
  358. package/client/assets/StyleEditor-RZvkKHdf.js.gz +0 -0
  359. package/client/assets/SuperscriptPeriod-DaZq1rr6.js.br +0 -0
  360. package/client/assets/SuperscriptPeriod-DaZq1rr6.js.gz +0 -0
  361. package/client/assets/SuperscriptPeriod-DaZq1rr6.js.map +0 -1
  362. package/client/assets/SuperscriptTime-Mc0ZGBMo.js +0 -2
  363. package/client/assets/SuperscriptTime-Mc0ZGBMo.js.br +0 -0
  364. package/client/assets/SuperscriptTime-Mc0ZGBMo.js.gz +0 -0
  365. package/client/assets/SuperscriptTime-Mc0ZGBMo.js.map +0 -1
  366. package/client/assets/TimeElements-dIvFHgcd.js.br +0 -0
  367. package/client/assets/TimeElements-dIvFHgcd.js.gz +0 -0
  368. package/client/assets/TimeElements-dIvFHgcd.js.map +0 -1
  369. package/client/assets/TimeInput-Duzx40TC.js +0 -2
  370. package/client/assets/TimeInput-Duzx40TC.js.br +0 -0
  371. package/client/assets/TimeInput-Duzx40TC.js.gz +0 -0
  372. package/client/assets/TimelinePage-C-OHrCR8.js +0 -2
  373. package/client/assets/TimelinePage-C-OHrCR8.js.br +0 -0
  374. package/client/assets/TimelinePage-C-OHrCR8.js.gz +0 -0
  375. package/client/assets/TimelinePage-C-OHrCR8.js.map +0 -1
  376. package/client/assets/Timer-CGqVtVEC.js +0 -2
  377. package/client/assets/Timer-CGqVtVEC.js.br +0 -0
  378. package/client/assets/Timer-CGqVtVEC.js.gz +0 -0
  379. package/client/assets/Timer-CGqVtVEC.js.map +0 -1
  380. package/client/assets/TimerControlExport-DavNxY9p.css.br +0 -0
  381. package/client/assets/TimerControlExport-GJn4WWdH.js +0 -2
  382. package/client/assets/TimerControlExport-GJn4WWdH.js.br +0 -0
  383. package/client/assets/TimerControlExport-GJn4WWdH.js.gz +0 -0
  384. package/client/assets/TitleCard-BqbrUnHO.js.br +0 -0
  385. package/client/assets/TitleCard-BqbrUnHO.js.gz +0 -0
  386. package/client/assets/Tooltip-BQBvaIZx.js.br +0 -0
  387. package/client/assets/Tooltip-BQBvaIZx.js.gz +0 -0
  388. package/client/assets/Tooltip-BQBvaIZx.js.map +0 -1
  389. package/client/assets/ViewLogo-BdL1hUV1.js.br +0 -0
  390. package/client/assets/ViewLogo-BdL1hUV1.js.gz +0 -0
  391. package/client/assets/ViewParamsEditor-CFedpp6w.js +0 -2
  392. package/client/assets/ViewParamsEditor-CFedpp6w.js.br +0 -0
  393. package/client/assets/ViewParamsEditor-CFedpp6w.js.gz +0 -0
  394. package/client/assets/ViewParamsEditor-CFedpp6w.js.map +0 -1
  395. package/client/assets/dateConfig-BU1RZfIK.js.br +0 -0
  396. package/client/assets/dateConfig-BU1RZfIK.js.gz +0 -0
  397. package/client/assets/editorSettings-BMt-7s8I.js.br +0 -0
  398. package/client/assets/editorSettings-BMt-7s8I.js.gz +0 -0
  399. package/client/assets/getProgress-sdxPEEPi.js.br +0 -0
  400. package/client/assets/getProgress-sdxPEEPi.js.gz +0 -0
  401. package/client/assets/index-BuJoGGff.css.br +0 -0
  402. package/client/assets/index-BuJoGGff.css.gz +0 -0
  403. package/client/assets/index-CoGiopcb.js +0 -3
  404. package/client/assets/index-CoGiopcb.js.br +0 -0
  405. package/client/assets/index-CoGiopcb.js.gz +0 -0
  406. package/client/assets/index-CoGiopcb.js.map +0 -1
  407. package/client/assets/offset-BS90Rks2.js.br +0 -0
  408. package/client/assets/offset-BS90Rks2.js.gz +0 -0
  409. package/client/assets/parseUserTime-DZJMcfuJ.js.br +0 -0
  410. package/client/assets/parseUserTime-DZJMcfuJ.js.gz +0 -0
  411. package/client/assets/playbackstate-CWexoP3a.js.br +0 -0
  412. package/client/assets/playbackstate-CWexoP3a.js.gz +0 -0
  413. package/client/assets/presentation.utils-Zo5hNQje.js.br +0 -0
  414. package/client/assets/presentation.utils-Zo5hNQje.js.gz +0 -0
  415. package/client/assets/rundownUtils-Dl1x6NDv.js +0 -2
  416. package/client/assets/rundownUtils-Dl1x6NDv.js.br +0 -0
  417. package/client/assets/rundownUtils-Dl1x6NDv.js.gz +0 -0
  418. package/client/assets/timer.utils-BnMyVO6Z.js.br +0 -0
  419. package/client/assets/timer.utils-BnMyVO6Z.js.gz +0 -0
  420. package/client/assets/timer.utils-BnMyVO6Z.js.map +0 -1
  421. package/client/assets/useCustomFields-CcTb-GQM.js.br +0 -0
  422. package/client/assets/useCustomFields-CcTb-GQM.js.gz +0 -0
  423. package/client/assets/useFollowComponent-BjhV6Uv8.js.br +0 -0
  424. package/client/assets/useFollowComponent-BjhV6Uv8.js.gz +0 -0
  425. package/client/assets/useProjectData-B5mjXsMj.js +0 -2
  426. package/client/assets/useProjectData-B5mjXsMj.js.br +0 -0
  427. package/client/assets/useProjectData-B5mjXsMj.js.gz +0 -0
  428. package/client/assets/useProjectData-B5mjXsMj.js.map +0 -1
  429. package/client/assets/useReport-zMbyWwpn.js.br +0 -0
  430. package/client/assets/useReport-zMbyWwpn.js.gz +0 -0
  431. package/client/assets/useRundown-CHsh5rnl.js +0 -2
  432. package/client/assets/useRundown-CHsh5rnl.js.br +0 -0
  433. package/client/assets/useRundown-CHsh5rnl.js.gz +0 -0
  434. package/client/assets/useRundown-CHsh5rnl.js.map +0 -1
  435. package/client/assets/useWindowTitle-mLKt65i7.js.br +0 -0
  436. package/client/assets/useWindowTitle-mLKt65i7.js.gz +0 -0
  437. package/client/assets/useWindowTitle-mLKt65i7.js.map +0 -1
  438. package/client/assets/validateEvent-CUmvjN95.js.br +0 -0
  439. package/client/assets/validateEvent-CUmvjN95.js.gz +0 -0
  440. package/client/assets/vendor-Cdwxo8bP.js +0 -75
  441. package/client/assets/vendor-Cdwxo8bP.js.br +0 -0
  442. package/client/assets/vendor-Cdwxo8bP.js.gz +0 -0
  443. package/client/assets/viewLoader.utils-DuXjY5zb.js.br +0 -0
  444. package/client/assets/viewLoader.utils-DuXjY5zb.js.gz +0 -0
  445. package/client/assets/viewUtils-dKRKkb_F.js.br +0 -0
  446. package/client/assets/viewUtils-dKRKkb_F.js.gz +0 -0
  447. package/client/assets/viewUtils-dKRKkb_F.js.map +0 -1
  448. /package/client/assets/{useProjectData-Cw1aXCwD.css → SwatchPicker-Cw1aXCwD.css} +0 -0
  449. /package/client/assets/{useProjectData-Cw1aXCwD.css.br → SwatchPicker-Cw1aXCwD.css.br} +0 -0
  450. /package/client/assets/{useProjectData-Cw1aXCwD.css.gz → SwatchPicker-Cw1aXCwD.css.gz} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"FollowButton-FodezDem.js","sources":["../../src/features/operator/follow-button/FollowButton.tsx"],"sourcesContent":["import { IoLocate } from 'react-icons/io5';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './FollowButton.module.scss';\n\ninterface FollowButtonProps {\n isVisible: boolean;\n onClickHandler: () => void;\n}\n\nexport default function FollowButton(props: FollowButtonProps) {\n const { isVisible, onClickHandler } = props;\n\n const classes = cx([style.followButton, !isVisible && style.hidden]);\n\n return (\n <button className={classes} onClick={onClickHandler} type='button'>\n <IoLocate />\n Follow\n </button>\n );\n}\n"],"names":["FollowButton","props","isVisible","onClickHandler","classes","cx","style","followButton","hidden","jsx","IoLocate"],"mappings":"qgBAWA,SAAwBA,EAAaC,EAA0B,CACvD,KAAA,CAAEC,UAAAA,EAAWC,eAAAA,CAAAA,EAAmBF,EAEhCG,EAAUC,EAAG,CAACC,EAAMC,aAAc,CAACL,GAAaI,EAAME,MAAM,CAAC,EAEnE,cACG,SAAO,CAAA,UAAWJ,EAAS,QAASD,EAAgB,KAAK,SACxD,SAAA,CAAAM,EAAA,IAACC,EAAQ,EAAA,EAAA,QAAA,EAEX,CAEJ"}
1
+ {"version":3,"file":"FollowButton-C6Fvaqh0.js","sources":["../../src/features/operator/follow-button/FollowButton.tsx"],"sourcesContent":["import { IoLocate } from 'react-icons/io5';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './FollowButton.module.scss';\n\ninterface FollowButtonProps {\n isVisible: boolean;\n onClickHandler: () => void;\n}\n\nexport default function FollowButton(props: FollowButtonProps) {\n const { isVisible, onClickHandler } = props;\n\n const classes = cx([style.followButton, !isVisible && style.hidden]);\n\n return (\n <button className={classes} onClick={onClickHandler} type='button'>\n <IoLocate />\n Follow\n </button>\n );\n}\n"],"names":["FollowButton","props","isVisible","onClickHandler","classes","cx","style","followButton","hidden","jsx","IoLocate"],"mappings":"qgBAWA,SAAwBA,EAAaC,EAA0B,CACvD,KAAA,CAAEC,UAAAA,EAAWC,eAAAA,CAAAA,EAAmBF,EAEhCG,EAAUC,EAAG,CAACC,EAAMC,aAAc,CAACL,GAAaI,EAAME,MAAM,CAAC,EAEnE,cACG,SAAO,CAAA,UAAWJ,EAAS,QAASD,EAAgB,KAAK,SACxD,SAAA,CAAAM,EAAA,IAACC,EAAQ,EAAA,EAAA,QAAA,EAEX,CAEJ"}
@@ -0,0 +1 @@
1
+ ._blink_13jx0_1{animation:_blink_13jx0_1 1s step-start infinite}@keyframes _blink_13jx0_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_13jx0_13{transform:rotate(45deg)}._inputItems_13jx0_17{display:grid;grid-template-columns:1fr auto;gap:.5rem;margin-top:.25rem}._label_13jx0_24{font-size:calc(1rem - 2px);color:#8a8a8a}._label_13jx0_24._active_13jx0_28{color:#779be7}._blink_k96dq_1{animation:_blink_k96dq_1 1s step-start infinite}@keyframes _blink_k96dq_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_k96dq_13{transform:rotate(45deg)}._preview_k96dq_17{background-color:#101010;display:grid;place-content:center;text-align:center;position:relative}._mainContent_k96dq_25{font-size:1rem;font-weight:600;width:100%;color:var(--override-colour, #f6f6f6)}._mainContent_k96dq_25[data-phase=pending]{color:#22a0e9}._mainContent_k96dq_25[data-phase=overtime]{color:#fa5656}._mainContent_k96dq_25[data-phase=none]{opacity:.4}._secondaryContent_k96dq_41{border-top:1px solid rgba(255,255,255,.07)}._blackout_k96dq_45{display:none}._eventStatus_k96dq_49{position:absolute;left:0;margin:.5rem .25rem;display:flex;flex-direction:column;gap:.25rem}._statusIcon_k96dq_58{color:#404040}._statusIcon_k96dq_58[data-active=true]{color:#77c785}._blink_ytrng_1{animation:_blink_ytrng_1 1s step-start infinite}@keyframes _blink_ytrng_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_ytrng_13{transform:rotate(45deg)}._previewContainer_ytrng_17{display:grid;gap:.5rem;grid-template-columns:3fr 2fr}._options_ytrng_23{display:flex;flex-direction:column;gap:.5rem}._blink_9ahya_1{animation:_blink_9ahya_1 1s step-start infinite}@keyframes _blink_9ahya_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_9ahya_13{transform:rotate(45deg)}._growPanel_9ahya_17{flex:1}._contentLayout_9ahya_21{display:flex;flex-direction:column;gap:1rem;color:#f6f6f6;padding-top:1.5rem}
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./PipHost-CvtlZIn7.js","./vendor-q6fv0YT2.js","./vendor-4xP-6xVS.css","./EditorUtils-DuKjlUkF.js","./index-B81u4hxi.js","./index-D6S93MXv.css","./EditorUtils-L4Sg72o_.css","./timer.utils-rGyI9NYa.js","./viewUtils-B8Dr4GHH.js","./playbackstate-CPQdnF-k.js","./MultiPartProgressBar-BXdLxJpy.js","./getProgress-cLuBFPjh.js","./MultiPartProgressBar-1_EFIx1M.css","./presentation.utils-Cl-L3pHN.js","./PipHost-DEhjTbGT.css"])))=>i.map(i=>d[i]);
2
+ import{h as o,j as e,$ as M,av as A,y as L,bR as R,br as B,bS as D,bT as k,bU as w}from"./vendor-q6fv0YT2.js";import{a as V,S as q,P as O,C as F}from"./EditorUtils-DuKjlUkF.js";import{e as S,ah as $,bM as H,a as z,T as d,bk as U,y as j,ax as I,bN as T,B as h,bO as i,bP as W,ak as P,bQ as Q,bz as G,b8 as J,bA as K}from"./index-B81u4hxi.js";import{P as X}from"./ProtectRoute-BH-QvsU0.js";import{S as Y}from"./Select-BGGVCKqU.js";import{T as b}from"./Tooltip-B5vsLcFu.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new n.Error().stack;t&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[t]="1e55dc2a-bef9-4c72-bd63-4d02b1f6673d",n._sentryDebugIdIdentifier="sentry-dbid-1e55dc2a-bef9-4c72-bd63-4d02b1f6673d")}catch{}})();const Z="_inputItems_13jx0_17",ee="_label_13jx0_24",te="_active_13jx0_28",v={inputItems:Z,label:ee,active:te};function E(n){const{label:t,placeholder:a,text:s,visible:l,changeHandler:f,children:u}=n,[m,x]=o.useState(s),c=o.useRef(null),p=o.useRef(0);o.useEffect(()=>{c.current&&c.current!==document.activeElement&&(c.current.selectionStart=p.current,c.current.selectionEnd=p.current)},[s]),o.useEffect(()=>{c.current!==document.activeElement&&x(s)},[s]);const y=g=>{p.current=g.target.selectionStart??0,x(g.target.value),f(g.target.value)};return e.jsxs("div",{children:[e.jsx("label",{className:S([v.label,l??v.active]),htmlFor:t,children:t}),e.jsxs("div",{className:v.inputItems,children:[e.jsx($,{id:t,ref:c,value:m,onChange:y,placeholder:a}),u]})]})}const ne="documentPictureInPicture"in window,se=o.lazy(()=>M(()=>import("./PipHost-CvtlZIn7.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]),import.meta.url)),ae=o.memo(re);function re(){return ne?e.jsx(o.Suspense,{fallback:null,children:e.jsx(se,{})}):null}const oe="_blink_k96dq_1",ie="_preview_k96dq_17",ce="_mainContent_k96dq_25",le="_secondaryContent_k96dq_41",ue="_blackout_k96dq_45",de="_eventStatus_k96dq_49",me="_statusIcon_k96dq_58",r={blink:oe,preview:ie,mainContent:ce,secondaryContent:le,blackout:ue,eventStatus:de,statusIcon:me},xe={aux1:"Aux 1",aux2:"Aux 2",aux3:"Aux 3",secondary:"Secondary message"};function pe(){const{blink:n,blackout:t,countToEnd:a,phase:s,secondarySource:l,showTimerMessage:f,timerType:u}=H(),{data:m}=z(),x=f?"Message":u===d.None?U:s===j.Pending?"Standby to start":s===j.Overtime?"Timer Overtime":u===d.Clock?"Clock":a?"Count to End":"Timer",c=f||!l?null:xe[l],p=s===j.Warning?m.warningColor??"#ffa528":s===j.Danger?m.dangerColor??"#ff7300":m.normalColor??"#FFFC",y=x=="Timer",g=S([n&&r.blink,t&&r.blackout]);return e.jsxs("div",{className:r.preview,children:[e.jsx(V,{onExtractClick:N=>I("timer",N),pipElement:e.jsx(ae,{})}),e.jsxs("div",{className:g,children:[e.jsx("div",{className:r.mainContent,"data-phase":y&&s,style:y?{"--override-colour":p}:{},children:x}),c!==null&&e.jsx("div",{className:r.secondaryContent,children:c})]}),e.jsxs("div",{className:r.eventStatus,children:[e.jsx(b,{text:"Time type: Count down",render:e.jsx("span",{}),className:r.statusIcon,"data-active":u===d.CountDown,children:e.jsx(A,{})}),e.jsx(b,{text:"Time type: Count up",render:e.jsx("span",{}),className:r.statusIcon,"data-active":u===d.CountUp,children:e.jsx(L,{})}),e.jsx(b,{text:"Time type: Clock",render:e.jsx("span",{}),className:r.statusIcon,"data-active":u===d.Clock,children:e.jsx(R,{})}),e.jsx(b,{text:"Time type: None",render:e.jsx("span",{}),className:r.statusIcon,"data-active":u===d.None,children:e.jsx(B,{})}),e.jsx(b,{text:a?"Count to end":"Count duration",render:e.jsx("span",{}),className:r.statusIcon,"data-active":a,children:e.jsx(D,{})})]})]})}const ge="_previewContainer_ytrng_17",be="_options_ytrng_23",_={previewContainer:ge,options:be};function fe(){const{blackout:n,blink:t}=T();return e.jsxs("div",{className:_.previewContainer,children:[e.jsx(pe,{}),e.jsxs("div",{className:_.options,children:[e.jsx(ye,{}),e.jsx(q,{orientation:"horizontal"}),e.jsx(h,{variant:t?"primary":"subtle",fluid:!0,onClick:()=>i.timerBlink(!t),"data-testid":"toggle timer blink",children:"Blink"}),e.jsx(h,{variant:n?"primary":"subtle",fluid:!0,onClick:()=>i.timerBlackout(!n),"data-testid":"toggle timer blackout",children:"Blackout screen"})]})]})}function ye(){const{secondarySource:n}=T(),[t,a]=o.useState("aux1");o.useEffect(()=>{n!==null&&a(n)},[n]);const s=()=>{n===t?i.timerSecondarySource(null):i.timerSecondarySource(t)};return e.jsxs(e.Fragment,{children:[e.jsx(Y,{value:t,options:[{value:"aux1",label:"Aux 1"},{value:"aux2",label:"Aux 2"},{value:"aux3",label:"Aux 3"},{value:"secondary",label:"Secondary message"}],onValueChange:l=>{l!==null&&(n!==null&&i.timerSecondarySource(l),a(l))}}),e.jsx(h,{variant:n!==null?"primary":"subtle",fluid:!0,onClick:s,"data-testid":"toggle secondary",children:"Show secondary"})]})}function je(){return e.jsxs(e.Fragment,{children:[e.jsx(fe,{}),e.jsx(ve,{}),e.jsx(he,{})]})}function ve(){const{text:n,visible:t}=W();return e.jsx(E,{label:"Timer Message",placeholder:"Message shown fullscreen in stage timer",text:n,visible:t,changeHandler:a=>i.timerText(a),children:e.jsx(P,{"aria-label":"Toggle timer message visibility",onClick:()=>i.timerVisible(!t),variant:t?"primary":"subtle",children:t?e.jsx(k,{}):e.jsx(w,{})})})}function he(){const{text:n,visible:t}=Q(),a=()=>{t?i.timerSecondarySource(null):i.timerSecondarySource("secondary")};return e.jsx(E,{label:"Secondary Message",placeholder:"Message shown as secondary text in stage timer",text:n,visible:t,changeHandler:s=>i.secondaryMessage(s),children:e.jsx(P,{"aria-label":"Toggle secondary message visibility",onClick:a,variant:t?"primary":"subtle",children:t?e.jsx(k,{}):e.jsx(w,{})})})}const _e="_growPanel_9ahya_17",Ce="_contentLayout_9ahya_21",C={growPanel:_e,contentLayout:Ce},Ne=o.memo(ke);function ke(){const n=window.location.pathname.includes("/messagecontrol");return e.jsx(X,{permission:"editor",children:e.jsxs(O,{className:C.growPanel,"data-testid":"panel-messages-control",children:[!n&&e.jsx(F,{onClick:t=>I("messagecontrol",t)}),n&&e.jsx(G,{suppressSettings:!0,isNavigationLocked:J()}),e.jsx("div",{className:C.contentLayout,children:e.jsx(K,{children:e.jsx(je,{})})})]})})}export{Ne as default};
3
+ //# sourceMappingURL=MessageControlExport-GmOrvUik.js.map
@@ -0,0 +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-GmOrvUik.js"}
@@ -0,0 +1,2 @@
1
+ import{j as e,h as m,bj as Z,bk as oe,am as de,bl as ue,bm as P,bn as U,bo as me,bp as he,ah as xe,b9 as je,bq as be}from"./vendor-q6fv0YT2.js";import{L as b,T as y}from"./EditorUtils-DuKjlUkF.js";import{T as S,A as W,s as ge}from"./TimeInput-C8DQoFXv.js";import{u as T,m as fe}from"./dateConfig-D7xim1t4.js";import{u as J}from"./useCustomFields-k4piRt9n.js";import{T as A,E as G}from"./validateEvent-Do8yE_DJ.js";import{ah as R,aC as ve,e as O,ak as F,s as _e,m as I,T as q,B as pe,ba as ke,x as K,bk as ee}from"./index-B81u4hxi.js";import{S as M}from"./Select-BGGVCKqU.js";import{S as ae}from"./SwatchPicker-Cm5Eicvv.js";import{T as w}from"./Tooltip-B5vsLcFu.js";import{p as ie}from"./parseUserTime-YeFR8t3F.js";import{S as Q,u as re,T as te}from"./Modal-BKx0PDGT.js";import{g as ye}from"./offset-R98EXhWK.js";import{T as Ee}from"./editorSettings-D2f7e1a6.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]="47edc882-8c7a-4686-b27e-3e8e9e90ec4b",t._sentryDebugIdIdentifier="sentry-dbid-47edc882-8c7a-4686-b27e-3e8e9e90ec4b")}catch{}})();var C=(t=>(t.onLoad="onLoad",t.onStart="onStart",t.onPause="onPause",t.onStop="onStop",t.onClock="onClock",t.onUpdate="onUpdate",t.onFinish="onFinish",t.onWarning="onWarning",t.onDanger="onDanger",t))(C||{});const Ne=Object.keys(C);function Ce(t){return t.replaceAll(" ","").replaceAll(",",".")}const Te="_imageContainer_1k5qa_17",Ie="_imageOverlay_1k5qa_25",ne={imageContainer:Te,imageOverlay:Ie};function we({src:t}){return e.jsxs("div",{className:ne.imageContainer,children:[!!t&&e.jsx("img",{loading:"lazy",src:t}),e.jsx("div",{className:ne.imageOverlay})]})}function Le({value:t,inputref:s,...a}){return m.useEffect(()=>{const n=s.current;return Z(s.current),()=>{Z.destroy(n)}},[s,t]),e.jsx(Ee,{ref:s,value:t,...a})}function le(t,s,a,n){const[o,l]=m.useState(t),i=m.useRef(!1);m.useEffect(()=>{l(typeof t>"u"?"":t)},[t]);const c=m.useCallback(d=>{d!==o&&l(d)},[o]),h=m.useCallback(d=>{var j;if(d===t&&!(n!=null&&n.allowSubmitSameValue))(j=n==null?void 0:n.onCancelUpdate)==null||j.call(n);else{const r=d.trim();s(r),r!==d&&l(r)}setTimeout(()=>{var r,v,_;n!=null&&n.allowKeyboardNavigation?(v=(r=a.current)==null?void 0:r.parentElement)==null||v.focus():(_=a.current)==null||_.blur()})},[t,n,a,s]),x=m.useCallback(()=>{var d;l(t),a.current&&(a.current.value=t),(d=n==null?void 0:n.onCancelUpdate)==null||d.call(n),setTimeout(()=>{var j;return(j=a.current)==null?void 0:j.blur()})},[t,n,a]),g=m.useMemo(()=>{const d=[["Escape",r=>{r.preventDefault(),x()},{preventDefault:!0}]];n!=null&&n.submitOnEnter&&d.push(["Enter",()=>{i.current=!0,h(o),setTimeout(()=>{i.current=!1},0)}]),n!=null&&n.submitOnCtrlEnter&&d.push(["mod + Enter",()=>{i.current=!0,h(o),setTimeout(()=>{i.current=!1},0)}]);const j=oe(d);return r=>{(r.key==="ArrowLeft"||r.key==="ArrowRight"||r.key==="ArrowUp"||r.key==="ArrowDown")&&r.stopPropagation(),j(r)}},[x,h,n==null?void 0:n.submitOnCtrlEnter,n==null?void 0:n.submitOnEnter,o]);return{value:o,onChange:d=>c(d.target.value),onBlur:d=>{i.current||h(d.target.value)},onKeyDown:g}}function B({className:t,field:s,label:a,initialValue:n,style:o,submitHandler:l}){const i=m.useRef(null),c=m.useCallback(j=>l(s,j),[s,l]),{value:h,onChange:x,onBlur:g,onKeyDown:d}=le(n,c,i,{submitOnCtrlEnter:!0});return e.jsxs("div",{children:[e.jsx(b,{className:t,htmlFor:s,style:o,children:a}),e.jsx(Le,{id:s,inputref:i,rows:1,"data-testid":"input-textarea",fluid:!0,value:h,onChange:x,onBlur:g,onKeyDown:d})]})}function D({className:t,field:s,label:a,initialValue:n,style:o,submitHandler:l,maxLength:i,placeholder:c}){const h=m.useRef(null),x=m.useCallback(v=>l(s,v),[s,l]),{value:g,onChange:d,onBlur:j,onKeyDown:r}=le(n,x,h,{submitOnEnter:!0});return e.jsxs("div",{children:[e.jsx(b,{className:t,htmlFor:s,style:o,children:a}),e.jsx(R,{id:s,ref:h,maxLength:i,fluid:!0,"data-testid":"input-textfield",value:g,placeholder:c,onChange:d,onBlur:j,onKeyDown:r})]})}const De="_rundownEditor_qkzuc_19",Se="_content_qkzuc_29",Fe="_column_qkzuc_48",Oe="_decorated_qkzuc_57",Ae="_delayLabel_qkzuc_65",qe="_switchLabel_qkzuc_73",ze="_inline_qkzuc_83",He="_splitTwo_qkzuc_89",$e="_splitThree_qkzuc_96",Ve="_tooltipIcon_qkzuc_103",We="_customImage_qkzuc_110",Me="_textLikeInput_qkzuc_117",Re="_inactive_qkzuc_125",Be="_active_qkzuc_129",u={rundownEditor:De,content:Se,column:Fe,decorated:Oe,delayLabel:Ae,switchLabel:qe,inline:ze,splitTwo:He,splitThree:$e,tooltipIcon:Ve,customImage:We,textLikeInput:Me,inactive:Re,active:Be};function X({fields:t,handleSubmit:s,entry:a}){return e.jsx(m.Fragment,{children:Object.keys(t).map(n=>{const o=`${a.id}-${n}`,l=`custom-${n}`,i=a.custom[n]??"",{backgroundColor:c,color:h}=ve(t[n].colour),x=t[n].label;return t[n].type==="text"?e.jsx(B,{field:l,label:x,initialValue:i,submitHandler:s,className:u.decorated,style:{"--decorator-bg":c,"--decorator-color":h}},o):t[n].type==="image"?e.jsxs("div",{className:u.customImage,children:[e.jsx(D,{field:l,label:x,initialValue:i,placeholder:"Paste image URL",submitHandler:s,className:u.decorated,maxLength:255,style:{"--decorator-bg":c,"--decorator-color":h}},o),e.jsx(we,{src:i})]},o):null})})}const Ge="_inputGroup_1e1jq_17",Pe="_delayed_1e1jq_24",se={inputGroup:Ge,delayed:Pe};function $({hasDelay:t,children:s}){return e.jsx("div",{className:O([se.inputGroup,t&&se.delayed]),children:s})}const Ue="_fourtyfive_ezj8b_13",Ke="_timerNote_ezj8b_21",Je="_inactive_ezj8b_27",Qe="_active_ezj8b_31",Xe="_inputWrapper_ezj8b_35",Ye="_hoverLabel_ezj8b_39",k={fourtyfive:Ue,timerNote:Ke,inactive:Je,active:Qe,inputWrapper:Xe,hoverLabel:Ye},Ze=m.memo(et);function et({eventId:t,countToEnd:s,timeStart:a,timeEnd:n,duration:o,timeStrategy:l,linkStart:i,delay:c,showLabels:h}){const{updateEntry:x,updateTimer:g}=T(),d=(N,p)=>{g(t,N,p)},j=N=>{x({id:t,timeStrategy:N})},r=N=>{x({id:t,linkStart:N})},v=[];a+o>_e&&v.push("Over midnight"),s&&v.push("Count to End");const _=c!==0,f=l===A.LockEnd,E=l===A.LockDuration;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:k.inputWrapper,children:[h&&e.jsx(b,{className:k.sectionTitle,children:"Start time"}),e.jsx(b,{className:k.hoverLabel,children:"Start"}),e.jsxs($,{hasDelay:_,children:[e.jsx(S,{name:"timeStart",submitHandler:d,time:a,placeholder:"Start",align:"left",disabled:i}),e.jsx(w,{text:"Link start to previous end",onClick:()=>r(!i),render:e.jsx(F,{variant:"subtle-white",className:i?k.active:k.inactive}),children:e.jsx("span",{className:k.fourtyfive,children:i?e.jsx(de,{}):e.jsx(ue,{})})})]})]}),e.jsxs("div",{className:k.inputWrapper,children:[h&&e.jsx(b,{children:"End time"}),e.jsx(b,{className:k.hoverLabel,children:"End"}),e.jsxs($,{hasDelay:_,children:[e.jsx(S,{name:"timeEnd",submitHandler:d,time:n,placeholder:"End",align:"left",disabled:E}),e.jsx(w,{text:"Lock end",render:e.jsx(F,{variant:"subtle-white",className:f?k.active:k.inactive}),onClick:()=>j(A.LockEnd),"data-testid":"lock__end",children:f?e.jsx(P,{}):e.jsx(U,{})})]})]}),e.jsxs("div",{className:k.inputWrapper,children:[h&&e.jsx(b,{children:"Duration"}),e.jsx(b,{className:k.hoverLabel,children:"Duration"}),e.jsxs($,{hasDelay:_,children:[e.jsx(S,{name:"duration",submitHandler:d,time:o,placeholder:"Duration",align:"left",disabled:f}),e.jsx(w,{text:"Lock duration",render:e.jsx(F,{variant:"subtle-white",className:E?k.active:k.inactive}),onClick:()=>j(A.LockDuration),"data-testid":"lock__duration",children:E?e.jsx(P,{}):e.jsx(U,{})})]})]}),v.length>0&&e.jsx(w,{text:v.join(" - "),className:k.timerNote,"data-testid":"event-warning",render:e.jsx("span",{}),children:e.jsx(me,{})})]})}const tt=m.memo(nt);function nt({eventId:t,timeStart:s,timeEnd:a,duration:n,timeStrategy:o,linkStart:l,countToEnd:i,delay:c,endAction:h,timerType:x,timeWarning:g,timeDanger:d}){const{updateEntry:j}=T(),r=(f,E)=>{if(f==="countToEnd"){j({id:t,countToEnd:E});return}if(f==="timeWarning"||f==="timeDanger"){const N=ie(E);j({id:t,[f]:N});return}if(f==="timerType"||f==="endAction"){j({id:t,[f]:E});return}},_=c!==0?`Event is ${fe(c,"expanded")}. New schedule ${I(s+c)} → ${I(a+c)}`:"";return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:u.column,children:[e.jsx(y,{children:"Event schedule"}),e.jsxs("div",{children:[e.jsx("div",{className:u.inline,children:e.jsx(Ze,{eventId:t,timeStart:s,timeEnd:a,duration:n,timeStrategy:o,linkStart:l,delay:c,countToEnd:i,showLabels:!0})}),e.jsx("div",{className:u.delayLabel,children:_})]})]}),e.jsxs("div",{className:u.column,children:[e.jsx(y,{children:"Event Behaviour"}),e.jsxs("div",{className:u.splitTwo,children:[e.jsxs("div",{children:[e.jsx(b,{htmlFor:"endAction",children:"End Action"}),e.jsx(M,{value:h,onValueChange:f=>{f!==null&&r("endAction",f)},options:[{value:G.None,label:"None"},{value:G.LoadNext,label:"Load next event"},{value:G.PlayNext,label:"Play next event"}]})]}),e.jsxs("div",{children:[e.jsx(b,{htmlFor:"countToEnd",children:"Count to End"}),e.jsxs(b,{className:u.switchLabel,children:[e.jsx(ae,{id:"countToEnd",checked:i,onCheckedChange:f=>r("countToEnd",f)}),i?"On":"Off"]})]})]})]}),e.jsxs("div",{className:u.column,children:[e.jsx(y,{children:e.jsxs(w,{text:"Changes how the timer is displayed in different views. It is not reflected in the rundown",render:e.jsx("span",{}),children:["Display Options",e.jsx(he,{className:u.tooltipIcon})]})}),e.jsxs("div",{className:u.splitTwo,children:[e.jsxs("div",{children:[e.jsx(b,{htmlFor:"timerType",children:"Timer Type"}),e.jsx(M,{value:x,onValueChange:f=>{f!==null&&r("timerType",f)},options:[{value:q.CountDown,label:"Count down"},{value:q.CountUp,label:"Count up"},{value:q.Clock,label:"Clock"},{value:q.None,label:"None"}]})]}),e.jsxs("div",{className:u.inline,children:[e.jsxs("div",{children:[e.jsx(b,{htmlFor:"timeWarning",children:"Warning Time"}),e.jsx(S,{id:"timeWarning",name:"timeWarning",submitHandler:r,time:g,placeholder:"Duration"})]}),e.jsxs("div",{children:[e.jsx(b,{htmlFor:"timeDanger",children:"Danger Time"}),e.jsx(S,{id:"timeDanger",name:"timeDanger",submitHandler:r,time:d,placeholder:"Duration"})]})]})]})]})]})}const st=m.memo(at);function at({eventId:t,cue:s,flag:a,title:n,note:o,colour:l}){const{updateEntry:i}=T(),c=(g,d)=>{i({id:t,cue:Ce(d)})},h=g=>{i({id:t,flag:g})},x=(g,d)=>{i({id:t,[g]:d})};return e.jsxs("div",{className:u.column,children:[e.jsx(y,{children:"Event Data"}),e.jsxs("div",{className:u.splitThree,children:[e.jsxs("div",{children:[e.jsx(b,{htmlFor:"eventId",children:"Event ID (read only)"}),e.jsx(R,{id:"eventId","data-testid":"input-textfield",value:t,readOnly:!0,fluid:!0})]}),e.jsx(D,{field:"cue",label:"Cue",initialValue:s,submitHandler:c,maxLength:10}),e.jsxs("div",{children:[e.jsx(b,{htmlFor:"flag",children:"Flag"}),e.jsxs(b,{className:u.switchLabel,children:[e.jsx(ae,{id:"flag",checked:a,onCheckedChange:h}),a?"On":"Off"]})]})]}),e.jsxs("div",{children:[e.jsx(b,{children:"Colour"}),e.jsx(Q,{name:"colour",value:l,handleChange:x})]}),e.jsx(D,{field:"title",label:"Title",initialValue:n,submitHandler:x}),e.jsx(B,{field:"note",label:"Note",initialValue:o,submitHandler:x})]})}const it=[C.onLoad,C.onStart,C.onPause,C.onFinish,C.onWarning,C.onDanger],rt="_triggerForm_l7413_17",lt="_trigger_l7413_17",ct="_errorLabel_l7413_38",ot="_success_l7413_42",V={triggerForm:rt,trigger:lt,errorLabel:ct,success:ot};function dt({triggers:t,eventId:s}){const a=t.length>0;return e.jsxs(e.Fragment,{children:[a&&e.jsx(mt,{triggers:t,eventId:s}),e.jsx(ut,{triggers:t,eventId:s})]})}function ut({eventId:t,triggers:s}){const{data:a}=re(),{updateEntry:n}=T(),[o,l]=m.useState(void 0),[i,c]=m.useState(C.onStart),h=(r,v)=>{const _=s??new Array,f=ke();_.push({id:f,title:"",trigger:r,automationId:v}),n({id:t,triggers:_})},g=((r,v)=>{if(v===void 0)return"Select an automation";if(!Object.keys(a.automations).includes(v))return"This automation does not exist";if(s!==void 0)return Object.values(s).some(_=>_.automationId===v&&_.trigger===r)?"Automation can only be used once":void 0})(i,o),d=m.useMemo(()=>[{value:null,label:"Select Trigger"},...it.map(r=>({value:r,label:r}))],[]),j=m.useMemo(()=>[{value:null,label:"Select Automation"},...Object.values(a.automations).map(({id:r,title:v})=>({value:r,label:v}))],[a.automations]);return e.jsxs("div",{className:V.triggerForm,children:[e.jsx(M,{value:i,onValueChange:r=>{r!==null&&c(r)},options:d}),e.jsx(M,{value:o??null,onValueChange:r=>{r!==null&&l(r)},options:j}),e.jsx(pe,{disabled:g!==void 0,onClick:()=>o&&h(i,o),children:"Add"}),g!==void 0?e.jsx(w,{text:g,render:e.jsx("span",{}),children:e.jsx(je,{className:V.errorLabel})}):e.jsx(be,{className:V.success})]})}function mt({eventId:t,triggers:s}){const{updateEntry:a}=T(),{data:n}=re(),o=m.useCallback(i=>{const c=s.filter(h=>h.id!==i);a({id:t,triggers:c})},[t,s,a]),l={};return Ne.forEach(i=>{const c=s.filter(h=>h.trigger===i);c.length&&Object.assign(l,{[i]:c})}),e.jsx("div",{children:Object.entries(l).map(([i,c])=>e.jsx(m.Fragment,{children:c.map(h=>{var j;const{id:x,automationId:g}=h,d=((j=n.automations[g])==null?void 0:j.title)??"<MISSING AUTOMATION>";return e.jsxs("div",{className:V.trigger,children:[e.jsx(te,{children:i}),e.jsx(te,{children:d}),e.jsx(F,{variant:"ghosted-destructive",onClick:()=>o(x),children:e.jsx(xe,{})})]},x)})},i))})}function qt({event:t}){const{data:s}=J(),{updateEntry:a}=T(),n=window.location.pathname.includes("editor"),o=m.useCallback((l,i)=>{if(l.startsWith("custom-")){const c=l.split("custom-")[1];a({id:t.id,custom:{[c]:i}})}else a({id:t.id,[l]:i})},[t.id,a]);return e.jsxs("div",{className:u.content,children:[e.jsx(tt,{eventId:t.id,timeStart:t.timeStart,timeEnd:t.timeEnd,duration:t.duration,timeStrategy:t.timeStrategy,linkStart:t.linkStart,countToEnd:t.countToEnd,delay:t.delay,endAction:t.endAction,timerType:t.timerType,timeWarning:t.timeWarning,timeDanger:t.timeDanger},`${t.id}-times`),e.jsx(st,{eventId:t.id,cue:t.cue,flag:t.flag,title:t.title,note:t.note,colour:t.colour},`${t.id}-titles`),e.jsxs("div",{className:u.column,children:[e.jsxs(y,{children:["Custom Fields",n&&e.jsx(W,{search:"settings=manage__custom",children:"Manage Custom Fields"})]}),e.jsx(X,{fields:s,handleSubmit:o,entry:t})]}),e.jsxs("div",{className:u.column,children:[e.jsxs(y,{children:["Automations",n&&e.jsx(W,{search:"settings=automation",children:"Manage Automations"})]}),e.jsx(dt,{triggers:t.triggers,eventId:t.id})]})]})}const ht="_blink_1qqxl_1",xt="_fourtyfive_1qqxl_13",jt="_textInput_1qqxl_18",bt="_under_1qqxl_31",gt="_over_1qqxl_34",ft="_muted_1qqxl_37",vt="_disabled_1qqxl_40",z={blink:ht,fourtyfive:xt,textInput:jt,under:bt,over:gt,muted:ft,disabled:vt},ce=m.forwardRef(({offset:t,muted:s,disabled:a,children:n,className:o,...l},i)=>{const c=m.useRef(null),h=O([z.textInput,t&&z[t],s&&z.muted,a&&z.disabled,o]);return m.useImperativeHandle(i,()=>({focusParentElement(){var x,g;(g=(x=c.current)==null?void 0:x.parentElement)==null||g.focus()}})),e.jsx("div",{className:h,tabIndex:a?-1:0,...l,ref:c,children:n})});ce.displayName="TextLikeInput";const H=m.memo(ce);function _t({id:t,name:s,submitHandler:a,time:n,emptyDisplay:o,placeholder:l,disabled:i,align:c="center",className:h}){const x=m.useRef(null),[g,d]=m.useState(""),j=m.useRef(!1),r=m.useCallback(()=>{typeof n!="number"||isNaN(n)?d(o):d(I(n))},[o,n]),v=m.useCallback(()=>{var p;(p=x.current)==null||p.select()},[]),_=m.useCallback(p=>{if(p===""&&n===null)return!1;const L=ie(p);return L===n?!1:(a(s,L),!0)},[s,a,n]),f=m.useCallback(p=>{_(p)||r()},[_,r]),E=m.useCallback(p=>{var L,Y;p.key==="Enter"&&((L=x.current)==null||L.blur()),p.key==="Escape"&&(j.current=!0,(Y=x.current)==null||Y.blur(),r())},[r]),N=m.useCallback(p=>{if(j.current){j.current=!1;return}f(p.target.value)},[f]);return m.useEffect(()=>{r()},[r]),e.jsx(R,{id:t,disabled:i,ref:x,"data-testid":`time-input-${s}`,className:O([ge.timeInput,h]),placeholder:l,onFocus:v,onChange:p=>d(p.target.value),onBlur:N,onKeyDown:E,value:g,maxLength:8,autoComplete:"off",style:{textAlign:c}})}function pt({duration:t,targetDuration:s,submitHandler:a}){const n=s!==null;return e.jsxs("div",{children:[e.jsx(b,{htmlFor:"targetDuration",children:"Target duration"}),e.jsxs($,{hasDelay:n&&s!==t,children:[e.jsx(_t,{name:"targetDuration",time:s,submitHandler:a,emptyDisplay:K,className:n?"":u.inactive}),e.jsx(w,{text:"Lock to target duration",className:O([u.timeAction,n&&u.active]),onClick:()=>a("targetDuration",n?null:t),"data-testid":"lock__duration",render:e.jsx(F,{variant:"subtle-white",className:n?u.active:u.inactive}),children:n?e.jsx(P,{}):e.jsx(U,{})})]})]})}function zt({group:t}){const{data:s}=J(),{updateEntry:a}=T(),n=m.useCallback((c,h)=>{if(typeof c=="string"&&c.startsWith("custom-")){const x=c.split("custom-")[1];a({id:t.id,custom:{[x]:h}});return}return a(c==="targetDuration"?{id:t.id,targetDuration:h}:{id:t.id,[c]:h})},[t.id,a]),o=window.location.pathname.includes("editor"),l=t.targetDuration===null?null:t.duration-t.targetDuration,i=l!==null?ye(l):null;return e.jsxs("div",{className:u.content,children:[e.jsxs("div",{className:u.column,children:[e.jsx(y,{children:"Group schedule"}),e.jsxs("div",{className:u.inline,children:[e.jsxs("div",{children:[e.jsx(b,{children:"First event start"}),e.jsx(H,{className:u.textLikeInput,disabled:!0,children:I(t.timeStart,{fallback:ee})})]}),e.jsxs("div",{children:[e.jsx(b,{children:"Last event end"}),e.jsx(H,{className:u.textLikeInput,disabled:!0,children:I(t.timeEnd,{fallback:ee})})]}),e.jsxs("div",{children:[e.jsx(b,{htmlFor:"duration",children:"Scheduled duration"}),e.jsx(H,{className:u.textLikeInput,disabled:!0,children:I(t.duration,{fallback:K})})]})]}),e.jsxs("div",{className:u.inline,children:[e.jsxs("div",{children:[e.jsx(b,{htmlFor:"eventId",children:"Plan offset"}),e.jsxs(H,{offset:i,className:O([u.textLikeInput,l===null&&u.inactive]),disabled:!0,children:[l!==null&&l>0?"+":"",I(l,{fallback:K})]})]}),e.jsx(pt,{duration:t.duration,targetDuration:t.targetDuration,submitHandler:n})]})]}),e.jsxs("div",{className:u.column,children:[e.jsx(y,{children:"Group data"}),e.jsxs("div",{children:[e.jsx(b,{children:"Colour"}),e.jsx(Q,{name:"colour",value:t.colour,handleChange:n})]}),e.jsx(D,{field:"title",label:"Title",initialValue:t.title,submitHandler:n}),e.jsx(B,{field:"note",label:"Note",initialValue:t.note,submitHandler:n})]}),e.jsxs("div",{className:u.column,children:[e.jsxs(y,{children:["Custom Fields",o&&e.jsx(W,{search:"settings=manage__custom",children:"Manage Custom Fields"})]}),e.jsx(X,{fields:s,handleSubmit:n,entry:t})]})]})}function Ht({milestone:t}){const{data:s}=J(),{updateEntry:a}=T(),n=m.useCallback((l,i)=>{if(typeof l=="string"&&l.startsWith("custom-")){const c=l.split("custom-")[1];a({id:t.id,custom:{[c]:i}});return}return a({id:t.id,[l]:i})},[t.id,a]),o=window.location.pathname.includes("editor");return e.jsxs("div",{className:u.content,children:[e.jsxs("div",{className:u.column,children:[e.jsx(y,{children:"Milestone data"}),e.jsxs("div",{className:u.splitTwo,children:[e.jsxs("div",{children:[e.jsx(b,{htmlFor:"entryId",children:"Milestone ID (read only)"}),e.jsx(R,{id:"entryId","data-testid":"input-textfield",value:t.id,readOnly:!0,fluid:!0})]}),e.jsx(D,{field:"cue",label:"Cue",initialValue:t.cue,submitHandler:n,maxLength:10})]}),e.jsxs("div",{children:[e.jsx(b,{children:"Colour"}),e.jsx(Q,{name:"colour",value:t.colour,handleChange:n})]}),e.jsx(D,{field:"title",label:"Title",initialValue:t.title,submitHandler:n}),e.jsx(B,{field:"note",label:"Note",initialValue:t.note,submitHandler:n})]}),e.jsxs("div",{className:u.column,children:[e.jsxs(y,{children:["Custom Fields",o&&e.jsx(W,{search:"settings=manage__custom",children:"Manage Custom Fields"})]}),e.jsx(X,{fields:s,handleSubmit:n,entry:t})]})]})}export{Le as A,qt as E,zt as G,Ht as M,H as T,Ze as a,u as s,le as u};
2
+ //# sourceMappingURL=MilestoneEditor-BA0PVIQh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MilestoneEditor-BA0PVIQh.js","sources":["../../../../packages/types/src/definitions/core/TimerLifecycle.type.ts","../../../../packages/utils/src/cue-utils/cueUtils.ts","../../src/features/rundown/entry-editor/composite/EventEditorImage.tsx","../../src/common/components/input/auto-textarea/AutoTextarea.tsx","../../src/common/components/input/text-input/useReactiveTextInput.tsx","../../src/features/rundown/entry-editor/composite/EventTextArea.tsx","../../src/features/rundown/entry-editor/composite/EventTextInput.tsx","../../src/features/rundown/entry-editor/composite/EventEditorCustomFields.tsx","../../src/features/rundown/time-input-flow/TimeInputGroup.tsx","../../src/features/rundown/time-input-flow/TimeInputFlow.tsx","../../src/features/rundown/entry-editor/composite/EventEditorTimes.tsx","../../src/features/rundown/entry-editor/composite/EventEditorTitles.tsx","../../src/features/rundown/entry-editor/composite/eventTrigger.constants.ts","../../src/features/rundown/entry-editor/composite/EventEditorTriggers.tsx","../../src/features/rundown/entry-editor/EventEditor.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/TextLikeInput.tsx","../../src/common/components/input/time-input/NullableTimeInput.tsx","../../src/features/rundown/entry-editor/composite/TargetDurationInput.tsx","../../src/features/rundown/entry-editor/GroupEditor.tsx","../../src/features/rundown/entry-editor/MilestoneEditor.tsx"],"sourcesContent":["export enum TimerLifeCycle {\n onLoad = 'onLoad',\n onStart = 'onStart',\n onPause = 'onPause',\n onStop = 'onStop',\n onClock = 'onClock',\n onUpdate = 'onUpdate',\n onFinish = 'onFinish',\n onWarning = 'onWarning',\n onDanger = 'onDanger',\n}\n\nexport type TimerLifeCycleKey = keyof typeof TimerLifeCycle;\n\nexport const timerLifecycleValues = Object.keys(TimerLifeCycle);\n","import type { EntryId, OntimeEntry, RundownEntries } from 'ontime-types';\nimport { isOntimeEvent } from 'ontime-types';\n\nimport { getFirstEventNormal, getNextEventNormal, getPreviousEventNormal } from '../rundown-utils/rundownUtils.js';\nimport { isNumeric } from '../types/types.js';\n\n// Zero or more non-digit characters at the beginning ((\\D*)).\n// One or more digits ((\\d+)).\n// Optionally, a decimal part starting with a dot ((\\.\\d+)?).\nconst regex = /^(\\D*)(\\d+)(\\.\\d+)?$/;\n\n/**\n * Finds if last characters in input are a number and increments\n */\nexport function getIncrement(input: string): string {\n // Check if the input string contains a number at the end\n const match = regex.exec(input);\n if (match) {\n // If a number is found, extract the non-numeric prefix, integer part, and decimal part\n // eslint-disable-next-line prefer-const -- some items in the destructuring are modified\n let [, prefix, integerPart, decimalPart] = match;\n\n if (decimalPart) {\n if (decimalPart === '.99') {\n decimalPart = '.100';\n } else {\n const addDecimal = `${'0'.repeat(decimalPart.length - 2)}1`;\n const incrementedDecimal = (Number(decimalPart) + Number(`0.${addDecimal}`)).toFixed(decimalPart.length - 1);\n decimalPart = incrementedDecimal.toString().replace('0.', '.');\n }\n return `${prefix}${integerPart}${decimalPart}`;\n }\n const incrementedInteger = Number(integerPart) + 1;\n integerPart = incrementedInteger.toString();\n return `${prefix}${integerPart}`;\n }\n // If no number is found, append \"2\" to the string and return the updated string\n return `${input}2`;\n}\n\n/**\n * Gets suitable name for a new event cue\n */\nexport function getCueCandidate(entries: RundownEntries, order: EntryId[], insertAfterId: EntryId | null): string {\n // we did not provide a element to go after, we attempt to go first so only need to check for a cue with value 1\n if (insertAfterId === null || order.length === 0) {\n return addAtTop();\n }\n\n // get the given event, or any before that\n let previousEvent: OntimeEntry | null | undefined = entries[insertAfterId];\n\n if (!isOntimeEvent(previousEvent)) {\n previousEvent = getPreviousEventNormal(entries, order, insertAfterId).previousEvent;\n if (!isOntimeEvent(previousEvent)) {\n return addAtTop();\n }\n }\n\n // the cue is based on the previous event cue\n const cue = getIncrement(previousEvent.cue);\n const { nextEvent } = getNextEventNormal(entries, order, insertAfterId);\n\n // if increment is clashing with next, we add a decimal instead\n if (cue !== nextEvent?.cue) {\n return cue;\n }\n\n // there is a clash, bt the cue is a pure number\n if (isNumeric(cue)) {\n return incrementDecimal(previousEvent.cue);\n }\n\n /**\n * at this point, we know the cue is not numeric\n * but the increment failed, so we have a numeric ending\n * eg. Presenter 1 .... Presenter 2 -> Presenter1.1\n * eg. Presenter 1.1 .... Presenter 1.2 -> Presenter1.1.1\n */\n return `${previousEvent.cue}.1`;\n\n function incrementDecimal(cue: string) {\n const n = Number(cue);\n return (n + 0.1).toString();\n }\n\n function addAtTop() {\n const firstEventCue = getFirstEventNormal(entries, order).firstEvent?.cue;\n if (firstEventCue === '1') {\n return '0.1';\n }\n return '1';\n }\n}\n\nexport function sanitiseCue(cue: string) {\n return cue.replaceAll(' ', '').replaceAll(',', '.');\n}\n","import style from './EventEditorImage.module.scss';\n\ninterface EventEditorImageProps {\n src: string;\n}\n\nexport default function EventEditorImage({ src }: EventEditorImageProps) {\n return (\n <div className={style.imageContainer}>\n {Boolean(src) && <img loading='lazy' src={src} />}\n <div className={style.imageOverlay} />\n </div>\n );\n}\n","import { RefObject, useEffect } from 'react';\n// @ts-expect-error no types from library\nimport autosize from 'autosize/dist/autosize';\n\nimport Textarea, { type TextareaProps } from '../textarea/Textarea';\n\ninterface AutoTextAreaProps extends TextareaProps {\n inputref: RefObject<HTMLTextAreaElement | null>;\n}\n\n/**\n * A textarea that automatically resizes based on its content\n */\nexport function AutoTextarea({ value, inputref, ...textAreaProps }: AutoTextAreaProps) {\n // when the value changes, we use the ref to reapply autosize\n useEffect(() => {\n const node = inputref.current;\n autosize(inputref.current);\n\n return () => {\n autosize.destroy(node);\n };\n }, [inputref, value]);\n\n return <Textarea ref={inputref} value={value} {...textAreaProps} />;\n}\n","import { ChangeEvent, KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getHotkeyHandler, HotkeyItem } from '@mantine/hooks';\n\ninterface UseReactiveTextInputReturn {\n value: string;\n onChange: (event: ChangeEvent) => void;\n onBlur: (event: ChangeEvent) => void;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n}\n\nexport default function useReactiveTextInput(\n initialText: string,\n submitCallback: (newValue: string) => void,\n ref: RefObject<HTMLInputElement | HTMLTextAreaElement | null>,\n options?: {\n submitOnEnter?: boolean;\n submitOnCtrlEnter?: boolean;\n onCancelUpdate?: () => void;\n allowSubmitSameValue?: boolean;\n allowKeyboardNavigation?: boolean;\n },\n): UseReactiveTextInputReturn {\n const [text, setText] = useState<string>(initialText);\n // track whether we are submitting via a submit key (eg enter) and avoid submitting again on blur\n const isKeyboardSubmitting = useRef(false);\n\n useEffect(() => {\n if (typeof initialText === 'undefined') {\n setText('');\n } else {\n setText(initialText);\n }\n }, [initialText]);\n\n /**\n * @description Handles Input value change\n * @param {string} newValue\n */\n const handleChange = useCallback(\n (newValue: string) => {\n if (newValue !== text) {\n setText(newValue);\n }\n },\n [text],\n );\n\n /**\n * @description Handles submit events\n * @param {string} valueToSubmit\n */\n const handleSubmit = useCallback(\n (valueToSubmit: string) => {\n // No need to update if it hasn't changed\n if (valueToSubmit === initialText && !options?.allowSubmitSameValue) {\n options?.onCancelUpdate?.();\n } else {\n const cleanVal = valueToSubmit.trim();\n submitCallback(cleanVal);\n if (cleanVal !== valueToSubmit) {\n setText(cleanVal);\n }\n }\n\n setTimeout(() => {\n if (options?.allowKeyboardNavigation) {\n ref.current?.parentElement?.focus(); // Focus on parent element to continue keyboard navigation\n } else {\n ref.current?.blur();\n }\n }); // Immediate timeout to ensure text is set before blurring\n },\n [initialText, options, ref, submitCallback],\n );\n\n /**\n * @description Handles escape events\n * @param {string} valueToSubmit\n */\n const handleEscape = useCallback(() => {\n // No need to update if it hasn't changed\n setText(initialText);\n // force the text to be the initial value\n if (ref.current) {\n ref.current.value = initialText;\n }\n options?.onCancelUpdate?.();\n setTimeout(() => ref.current?.blur()); // Immediate timeout to ensure text is set before blurring\n }, [initialText, options, ref]);\n\n const keyHandler = useMemo(() => {\n const hotKeys: HotkeyItem[] = [\n [\n 'Escape',\n (event) => {\n event.preventDefault();\n handleEscape();\n },\n { preventDefault: true },\n ],\n ];\n\n if (options?.submitOnEnter) {\n hotKeys.push([\n 'Enter',\n () => {\n isKeyboardSubmitting.current = true;\n handleSubmit(text);\n // clear flag after blur has been processed\n setTimeout(() => {\n isKeyboardSubmitting.current = false;\n }, 0);\n },\n ]);\n }\n\n if (options?.submitOnCtrlEnter) {\n hotKeys.push([\n 'mod + Enter',\n () => {\n isKeyboardSubmitting.current = true;\n handleSubmit(text);\n // clear flag after blur has been processed\n setTimeout(() => {\n isKeyboardSubmitting.current = false;\n }, 0);\n },\n ]);\n }\n\n const hotKeyHandler = getHotkeyHandler(hotKeys);\n\n return (event: KeyboardEvent<HTMLElement>) => {\n // allow moving in input field with arrow keys\n if (\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' ||\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown'\n ) {\n event.stopPropagation();\n }\n\n hotKeyHandler(event);\n };\n }, [handleEscape, handleSubmit, options?.submitOnCtrlEnter, options?.submitOnEnter, text]);\n\n return {\n value: text,\n onChange: (event: ChangeEvent) => handleChange((event.target as HTMLInputElement).value),\n onBlur: (event: ChangeEvent) => {\n if (!isKeyboardSubmitting.current) {\n handleSubmit((event.target as HTMLInputElement).value);\n }\n },\n onKeyDown: keyHandler,\n };\n}\n","import { type CSSProperties, useCallback, useRef } from 'react';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport { AutoTextarea } from '../../../../common/components/input/auto-textarea/AutoTextarea';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\nimport { EventEditorUpdateFields } from '../EventEditor';\n\ninterface CountedTextAreaProps {\n className?: string;\n field: EventEditorUpdateFields;\n label: string;\n initialValue: string;\n style?: CSSProperties;\n submitHandler: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EventTextArea({\n className,\n field,\n label,\n initialValue,\n style: givenStyles,\n submitHandler,\n}: CountedTextAreaProps) {\n const ref = useRef<HTMLTextAreaElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnCtrlEnter: true,\n });\n\n return (\n <div>\n <Editor.Label className={className} htmlFor={field} style={givenStyles}>\n {label}\n </Editor.Label>\n <AutoTextarea\n id={field}\n inputref={ref}\n rows={1}\n data-testid='input-textarea'\n fluid\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n}\n","import { useCallback, useRef } from 'react';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport Input, { type InputProps } from '../../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\nimport { EventEditorUpdateFields } from '../EventEditor';\nimport { GroupEditorUpdateTextFields } from '../GroupEditor';\n\ninterface EntryEditorTextInputProps extends InputProps {\n field: EventEditorUpdateFields | GroupEditorUpdateTextFields;\n label: string;\n initialValue: string;\n placeholder?: string;\n submitHandler: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EntryEditorTextInput({\n className,\n field,\n label,\n initialValue,\n style: givenStyles,\n submitHandler,\n maxLength,\n placeholder,\n}: EntryEditorTextInputProps) {\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n return (\n <div>\n <Editor.Label className={className} htmlFor={field} style={givenStyles}>\n {label}\n </Editor.Label>\n <Input\n id={field}\n ref={ref}\n maxLength={maxLength}\n fluid\n data-testid='input-textfield'\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n}\n","import { CSSProperties, Fragment } from 'react';\nimport { CustomFields, OntimeEvent, OntimeGroup, OntimeMilestone } from 'ontime-types';\n\nimport { getAccessibleColour } from '../../../../common/utils/styleUtils';\nimport { EventEditorUpdateFields } from '../EventEditor';\n\nimport EventEditorImage from './EventEditorImage';\nimport EventTextArea from './EventTextArea';\nimport EntryEditorTextInput from './EventTextInput';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EntryEditorCustomFieldsProps {\n fields: CustomFields;\n entry: OntimeEvent | OntimeGroup | OntimeMilestone;\n handleSubmit: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EntryEditorCustomFields({\n fields: customFields,\n handleSubmit,\n entry,\n}: EntryEditorCustomFieldsProps) {\n return (\n <Fragment>\n {Object.keys(customFields).map((fieldKey) => {\n const key = `${entry.id}-${fieldKey}`;\n const fieldName = `custom-${fieldKey}`;\n const initialValue = entry.custom[fieldKey] ?? '';\n const { backgroundColor, color } = getAccessibleColour(customFields[fieldKey].colour);\n const labelText = customFields[fieldKey].label;\n\n if (customFields[fieldKey].type === 'text') {\n return (\n <EventTextArea\n key={key}\n field={fieldName}\n label={labelText}\n initialValue={initialValue}\n submitHandler={handleSubmit}\n className={style.decorated}\n style={{ '--decorator-bg': backgroundColor, '--decorator-color': color } as CSSProperties}\n />\n );\n }\n\n if (customFields[fieldKey].type === 'image') {\n return (\n <div key={key} className={style.customImage}>\n <EntryEditorTextInput\n key={key}\n field={fieldName}\n label={labelText}\n initialValue={initialValue}\n placeholder='Paste image URL'\n submitHandler={handleSubmit}\n className={style.decorated}\n maxLength={255}\n style={{ '--decorator-bg': backgroundColor, '--decorator-color': color } as CSSProperties}\n />\n <EventEditorImage src={initialValue} />\n </div>\n );\n }\n\n // we should have exhausted all types by now\n return null;\n })}\n </Fragment>\n );\n}\n","import { PropsWithChildren } from 'react';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './TimeInputGroup.module.scss';\n\ninterface TimeInputGroupProps {\n hasDelay?: boolean;\n}\n\nexport default function TimeInputGroup({ hasDelay, children }: PropsWithChildren<TimeInputGroupProps>) {\n return <div className={cx([style.inputGroup, hasDelay && style.delayed])}>{children}</div>;\n}\n","import { memo } from 'react';\nimport { IoAlertCircleOutline, IoLink, IoLockClosed, IoLockOpenOutline, IoUnlink } from 'react-icons/io5';\nimport { TimeField, TimeStrategy } from 'ontime-types';\nimport { dayInMs } from 'ontime-utils';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport TimeInput from '../../../common/components/input/time-input/TimeInput';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\n\nimport TimeInputGroup from './TimeInputGroup';\n\nimport style from './TimeInputFlow.module.scss';\n\ninterface TimeInputFlowProps {\n eventId: string;\n countToEnd: boolean;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n delay: number;\n showLabels?: boolean;\n}\n\nexport default memo(TimeInputFlow);\nfunction TimeInputFlow({\n eventId,\n countToEnd,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n delay,\n showLabels,\n}: TimeInputFlowProps) {\n const { updateEntry, updateTimer } = useEntryActions();\n\n // In sync with EventEditorTimes\n const handleSubmit = (field: TimeField, value: string) => {\n updateTimer(eventId, field, value);\n };\n\n const handleChangeStrategy = (timeStrategy: TimeStrategy) => {\n updateEntry({ id: eventId, timeStrategy });\n };\n\n const handleLink = (doLink: boolean) => {\n updateEntry({ id: eventId, linkStart: doLink });\n };\n\n const warnings = [];\n if (timeStart + duration > dayInMs) {\n warnings.push('Over midnight');\n }\n\n if (countToEnd) {\n warnings.push('Count to End');\n }\n\n const hasDelay = delay !== 0;\n const isLockedEnd = timeStrategy === TimeStrategy.LockEnd;\n const isLockedDuration = timeStrategy === TimeStrategy.LockDuration;\n\n return (\n <>\n <div className={style.inputWrapper}>\n {showLabels && <Editor.Label className={style.sectionTitle}>Start time</Editor.Label>}\n <Editor.Label className={style.hoverLabel}>Start</Editor.Label>\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='timeStart'\n submitHandler={handleSubmit}\n time={timeStart}\n placeholder='Start'\n align='left'\n disabled={linkStart}\n />\n <Tooltip\n text='Link start to previous end'\n onClick={() => handleLink(!linkStart)}\n render={<IconButton variant='subtle-white' className={linkStart ? style.active : style.inactive} />}\n >\n <span className={style.fourtyfive}>{linkStart ? <IoLink /> : <IoUnlink />}</span>\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n <div className={style.inputWrapper}>\n {showLabels && <Editor.Label>End time</Editor.Label>}\n <Editor.Label className={style.hoverLabel}>End</Editor.Label>\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='timeEnd'\n submitHandler={handleSubmit}\n time={timeEnd}\n placeholder='End'\n align='left'\n disabled={isLockedDuration}\n />\n <Tooltip\n text='Lock end'\n render={<IconButton variant='subtle-white' className={isLockedEnd ? style.active : style.inactive} />}\n onClick={() => handleChangeStrategy(TimeStrategy.LockEnd)}\n data-testid='lock__end'\n >\n {isLockedEnd ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n <div className={style.inputWrapper}>\n {showLabels && <Editor.Label>Duration</Editor.Label>}\n <Editor.Label className={style.hoverLabel}>Duration</Editor.Label>\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='duration'\n submitHandler={handleSubmit}\n time={duration}\n placeholder='Duration'\n align='left'\n disabled={isLockedEnd}\n />\n <Tooltip\n text='Lock duration'\n render={<IconButton variant='subtle-white' className={isLockedDuration ? style.active : style.inactive} />}\n onClick={() => handleChangeStrategy(TimeStrategy.LockDuration)}\n data-testid='lock__duration'\n >\n {isLockedDuration ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n {warnings.length > 0 && (\n <Tooltip text={warnings.join(' - ')} className={style.timerNote} data-testid='event-warning' render={<span />}>\n <IoAlertCircleOutline />\n </Tooltip>\n )}\n </>\n );\n}\n","import { memo } from 'react';\nimport { IoInformationCircle } from 'react-icons/io5';\nimport { EndAction, TimerType, TimeStrategy } from 'ontime-types';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport Select from '../../../../common/components/select/Select';\nimport Switch from '../../../../common/components/switch/Switch';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { millisToDelayString } from '../../../../common/utils/dateConfig';\nimport TimeInputFlow from '../../time-input-flow/TimeInputFlow';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EventEditorTimesProps {\n eventId: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n countToEnd: boolean;\n delay: number;\n endAction: EndAction;\n timerType: TimerType;\n timeWarning: number;\n timeDanger: number;\n}\n\ntype HandledActions = 'countToEnd' | 'timerType' | 'endAction' | 'timeWarning' | 'timeDanger';\n\nexport default memo(EventEditorTimes);\nfunction EventEditorTimes({\n eventId,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n countToEnd,\n delay,\n endAction,\n timerType,\n timeWarning,\n timeDanger,\n}: EventEditorTimesProps) {\n const { updateEntry } = useEntryActions();\n\n const handleSubmit = (field: HandledActions, value: string | boolean) => {\n if (field === 'countToEnd') {\n updateEntry({ id: eventId, countToEnd: value as boolean });\n return;\n }\n\n if (field === 'timeWarning' || field === 'timeDanger') {\n const newTime = parseUserTime(value as string);\n updateEntry({ id: eventId, [field]: newTime });\n return;\n }\n\n if (field === 'timerType' || field === 'endAction') {\n updateEntry({ id: eventId, [field]: value });\n return;\n }\n };\n\n const hasDelay = delay !== 0;\n const delayLabel = hasDelay\n ? `Event is ${millisToDelayString(delay, 'expanded')}. New schedule ${millisToString(\n timeStart + delay,\n )} → ${millisToString(timeEnd + delay)}`\n : '';\n\n return (\n <>\n <div className={style.column}>\n <Editor.Title>Event schedule</Editor.Title>\n <div>\n <div className={style.inline}>\n <TimeInputFlow\n eventId={eventId}\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n timeStrategy={timeStrategy}\n linkStart={linkStart}\n delay={delay}\n countToEnd={countToEnd}\n showLabels\n />\n </div>\n <div className={style.delayLabel}>{delayLabel}</div>\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>Event Behaviour</Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='endAction'>End Action</Editor.Label>\n <Select\n value={endAction}\n onValueChange={(value: EndAction | null) => {\n if (value === null) return;\n handleSubmit('endAction', value);\n }}\n options={[\n { value: EndAction.None, label: 'None' },\n { value: EndAction.LoadNext, label: 'Load next event' },\n { value: EndAction.PlayNext, label: 'Play next event' },\n ]}\n />\n </div>\n <div>\n <Editor.Label htmlFor='countToEnd'>Count to End</Editor.Label>\n <Editor.Label className={style.switchLabel}>\n <Switch\n id='countToEnd'\n checked={countToEnd}\n onCheckedChange={(value) => handleSubmit('countToEnd', value)}\n />\n {countToEnd ? 'On' : 'Off'}\n </Editor.Label>\n </div>\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n <Tooltip\n text='Changes how the timer is displayed in different views. It is not reflected in the rundown'\n render={<span />}\n >\n Display Options\n <IoInformationCircle className={style.tooltipIcon} />\n </Tooltip>\n </Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='timerType'>Timer Type</Editor.Label>\n <Select\n value={timerType}\n onValueChange={(value: TimerType | null) => {\n if (value === null) return;\n handleSubmit('timerType', value);\n }}\n options={[\n { value: TimerType.CountDown, label: 'Count down' },\n { value: TimerType.CountUp, label: 'Count up' },\n { value: TimerType.Clock, label: 'Clock' },\n { value: TimerType.None, label: 'None' },\n ]}\n />\n </div>\n\n <div className={style.inline}>\n <div>\n <Editor.Label htmlFor='timeWarning'>Warning Time</Editor.Label>\n <TimeInput\n id='timeWarning'\n name='timeWarning'\n submitHandler={handleSubmit}\n time={timeWarning}\n placeholder='Duration'\n />\n </div>\n <div>\n <Editor.Label htmlFor='timeDanger'>Danger Time</Editor.Label>\n <TimeInput\n id='timeDanger'\n name='timeDanger'\n submitHandler={handleSubmit}\n time={timeDanger}\n placeholder='Duration'\n />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n}\n","import { memo } from 'react';\nimport { sanitiseCue } from 'ontime-utils';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../../common/components/input/colour-input/SwatchSelect';\nimport Input from '../../../../common/components/input/input/Input';\nimport Switch from '../../../../common/components/switch/Switch';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\n\nimport EventTextArea from './EventTextArea';\nimport EntryEditorTextInput from './EventTextInput';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EventEditorTitlesProps {\n eventId: string;\n cue: string;\n flag: boolean;\n title: string;\n note: string;\n colour: string;\n}\n\nexport default memo(EventEditorTitles);\nfunction EventEditorTitles({ eventId, cue, flag, title, note, colour }: EventEditorTitlesProps) {\n const { updateEntry } = useEntryActions();\n\n const cueSubmitHandler = (_field: string, newValue: string) => {\n updateEntry({ id: eventId, cue: sanitiseCue(newValue) });\n };\n\n const flagSubmitHandler = (newValue: boolean) => {\n updateEntry({ id: eventId, flag: newValue });\n };\n\n const textSubmitHandler = (field: string, newValue: string) => {\n updateEntry({ id: eventId, [field]: newValue });\n };\n\n return (\n <div className={style.column}>\n <Editor.Title>Event Data</Editor.Title>\n <div className={style.splitThree}>\n <div>\n <Editor.Label htmlFor='eventId'>Event ID (read only)</Editor.Label>\n <Input id='eventId' data-testid='input-textfield' value={eventId} readOnly fluid />\n </div>\n <EntryEditorTextInput\n field='cue'\n label='Cue'\n initialValue={cue}\n submitHandler={cueSubmitHandler}\n maxLength={10}\n />\n <div>\n <Editor.Label htmlFor='flag'>Flag</Editor.Label>\n <Editor.Label className={style.switchLabel}>\n <Switch id='flag' checked={flag} onCheckedChange={flagSubmitHandler} />\n {flag ? 'On' : 'Off'}\n </Editor.Label>\n </div>\n </div>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={colour} handleChange={textSubmitHandler} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={title} submitHandler={textSubmitHandler} />\n <EventTextArea field='note' label='Note' initialValue={note} submitHandler={textSubmitHandler} />\n </div>\n );\n}\n","import { TimerLifeCycle } from 'ontime-types';\n\nexport const eventTriggerOptions: TimerLifeCycle[] = [\n TimerLifeCycle.onLoad,\n TimerLifeCycle.onStart,\n TimerLifeCycle.onPause,\n TimerLifeCycle.onFinish,\n TimerLifeCycle.onWarning,\n TimerLifeCycle.onDanger,\n];\n","import { Fragment, useCallback, useMemo, useState } from 'react';\nimport { IoAlertCircle, IoCheckmarkCircle, IoTrash } from 'react-icons/io5';\nimport { TimerLifeCycle, timerLifecycleValues, Trigger } from 'ontime-types';\nimport { generateId } from 'ontime-utils';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport Select from '../../../../common/components/select/Select';\nimport Tag from '../../../../common/components/tag/Tag';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport useAutomationSettings from '../../../../common/hooks-query/useAutomationSettings';\n\nimport { eventTriggerOptions } from './eventTrigger.constants';\n\nimport style from './EventEditorTriggers.module.scss';\n\ninterface EventEditorTriggersProps {\n eventId: string;\n triggers: Trigger[];\n}\n\nexport default function EventEditorTriggers({ triggers, eventId }: EventEditorTriggersProps) {\n const showTriggers = triggers.length > 0;\n\n return (\n <>\n {showTriggers && <ExistingEventTriggers triggers={triggers} eventId={eventId} />}\n <EventTriggerForm triggers={triggers} eventId={eventId} />\n </>\n );\n}\n\ninterface EventTriggerFormProps {\n eventId: string;\n triggers?: Trigger[];\n}\n\nfunction EventTriggerForm({ eventId, triggers }: EventTriggerFormProps) {\n const { data: automationSettings } = useAutomationSettings();\n const { updateEntry } = useEntryActions();\n const [automationId, setAutomationId] = useState<string | undefined>(undefined);\n const [cycleValue, setCycleValue] = useState(TimerLifeCycle.onStart);\n\n const handleSubmit = (triggerLifeCycle: TimerLifeCycle, automationId: string) => {\n const newTriggers = triggers ?? new Array<Trigger>();\n const id = generateId();\n newTriggers.push({ id, title: '', trigger: triggerLifeCycle, automationId });\n updateEntry({ id: eventId, triggers: newTriggers });\n };\n\n const getValidationError = (cycle: TimerLifeCycle, automationId?: string): string | undefined => {\n if (automationId === undefined) {\n return 'Select an automation';\n }\n if (!Object.keys(automationSettings.automations).includes(automationId)) {\n return 'This automation does not exist';\n }\n if (triggers === undefined) {\n return;\n }\n return Object.values(triggers).some((t) => t.automationId === automationId && t.trigger === cycle)\n ? 'Automation can only be used once'\n : undefined;\n };\n\n const validationError = getValidationError(cycleValue, automationId);\n\n const triggerOptions = useMemo(\n () => [\n { value: null, label: 'Select Trigger' },\n ...eventTriggerOptions.map((cycle) => ({ value: cycle, label: cycle })),\n ],\n [], // eventTriggerOptions is a constant, no need for dependency\n );\n\n const automationOptions = useMemo(\n () => [\n { value: null, label: 'Select Automation' },\n ...Object.values(automationSettings.automations).map(({ id, title }) => ({ value: id, label: title })),\n ],\n [automationSettings.automations], // This needs to be a dependency as it can change\n );\n\n return (\n <div className={style.triggerForm}>\n <Select\n value={cycleValue}\n onValueChange={(value) => {\n if (value !== null) setCycleValue(value);\n }}\n options={triggerOptions}\n />\n\n <Select\n value={automationId ?? null}\n onValueChange={(value) => {\n if (value !== null) setAutomationId(value);\n }}\n options={automationOptions}\n />\n\n <Button\n disabled={validationError !== undefined}\n onClick={() => automationId && handleSubmit(cycleValue, automationId)}\n >\n Add\n </Button>\n {validationError !== undefined ? (\n <Tooltip text={validationError} render={<span />}>\n <IoAlertCircle className={style.errorLabel} />\n </Tooltip>\n ) : (\n <IoCheckmarkCircle className={style.success} />\n )}\n </div>\n );\n}\n\ninterface ExistingEventTriggersProps {\n eventId: string;\n triggers: Trigger[];\n}\n\nfunction ExistingEventTriggers({ eventId, triggers }: ExistingEventTriggersProps) {\n const { updateEntry } = useEntryActions();\n const { data: automationSettings } = useAutomationSettings();\n\n const handleDelete = useCallback(\n (triggerId: string) => {\n const newTriggers = triggers.filter((trigger) => trigger.id !== triggerId);\n updateEntry({ id: eventId, triggers: newTriggers });\n },\n [eventId, triggers, updateEntry],\n );\n\n const filteredTriggers: Record<string, Trigger[]> = {};\n\n // sort triggers out into groups by the Lifecycle they are on\n timerLifecycleValues.forEach((triggerType) => {\n const thisTriggerType = triggers.filter((trigger) => trigger.trigger === triggerType);\n if (thisTriggerType.length) {\n Object.assign(filteredTriggers, { [triggerType]: thisTriggerType });\n }\n });\n\n return (\n <div>\n {Object.entries(filteredTriggers).map(([triggerLifeCycle, triggerGroup]) => (\n <Fragment key={triggerLifeCycle}>\n {triggerGroup.map((trigger) => {\n const { id, automationId } = trigger;\n const automationTitle = automationSettings.automations[automationId]?.title ?? '<MISSING AUTOMATION>';\n return (\n <div key={id} className={style.trigger}>\n <Tag>{triggerLifeCycle}</Tag>\n <Tag>{automationTitle}</Tag>\n <IconButton variant='ghosted-destructive' onClick={() => handleDelete(id)}>\n <IoTrash />\n </IconButton>\n </div>\n );\n })}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { OntimeEvent } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventEditorTimes from './composite/EventEditorTimes';\nimport EventEditorTitles from './composite/EventEditorTitles';\nimport EventEditorTriggers from './composite/EventEditorTriggers';\n\nimport style from './EntryEditor.module.scss';\n\n// any of the titles + colour + custom field labels\nexport type EventEditorUpdateFields = 'cue' | 'title' | 'note' | 'colour' | string;\n\ninterface EventEditorProps {\n event: OntimeEvent;\n}\n\nexport default function EventEditor({ event }: EventEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActions();\n\n const isEditor = window.location.pathname.includes('editor');\n\n const handleSubmit = useCallback(\n (field: EventEditorUpdateFields, value: string) => {\n if (field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: event.id, custom: { [fieldLabel]: value } });\n } else {\n updateEntry({ id: event.id, [field]: value });\n }\n },\n [event.id, updateEntry],\n );\n\n return (\n <div className={style.content}>\n <EventEditorTimes\n key={`${event.id}-times`}\n eventId={event.id}\n timeStart={event.timeStart}\n timeEnd={event.timeEnd}\n duration={event.duration}\n timeStrategy={event.timeStrategy}\n linkStart={event.linkStart}\n countToEnd={event.countToEnd}\n delay={event.delay}\n endAction={event.endAction}\n timerType={event.timerType}\n timeWarning={event.timeWarning}\n timeDanger={event.timeDanger}\n />\n <EventEditorTitles\n key={`${event.id}-titles`}\n eventId={event.id}\n cue={event.cue}\n flag={event.flag}\n title={event.title}\n note={event.note}\n colour={event.colour}\n />\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={event} />\n </div>\n <div className={style.column}>\n <Editor.Title>\n Automations\n {isEditor && <AppLink search='settings=automation'>Manage Automations</AppLink>}\n </Editor.Title>\n <EventEditorTriggers triggers={event.triggers} eventId={event.id} />\n </div>\n </div>\n );\n}\n","import { forwardRef, HTMLAttributes, memo, PropsWithChildren, useImperativeHandle, useRef } from 'react';\n\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './TextLikeInput.module.scss';\n\ninterface TextLikeInputProps extends HTMLAttributes<HTMLSpanElement> {\n offset?: 'over' | 'under' | 'muted' | null;\n muted?: boolean;\n disabled?: boolean;\n}\n\nconst TextLikeInput = forwardRef(\n (\n { offset, muted, disabled, children, className, ...elementProps }: PropsWithChildren<TextLikeInputProps>,\n textRef,\n ) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const classes = cx([\n style.textInput,\n offset && style[offset],\n muted && style.muted,\n disabled && style.disabled,\n className,\n ]);\n\n useImperativeHandle(textRef, () => {\n return {\n focusParentElement() {\n ref.current?.parentElement?.focus();\n },\n };\n });\n\n return (\n <div className={classes} tabIndex={disabled ? -1 : 0} {...elementProps} ref={ref}>\n {children}\n </div>\n );\n },\n);\n\nTextLikeInput.displayName = 'TextLikeInput';\n\nexport default memo(TextLikeInput);\n","import { FocusEvent, KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { cx } from '../../../utils/styleUtils';\nimport Input from '../input/Input';\n\nimport style from './TimeInput.module.scss';\n\ninterface NullableTimeInputProps<T extends string> {\n id?: T;\n name: T;\n submitHandler: (field: T, value: number) => void;\n time?: number | null;\n emptyDisplay: string;\n placeholder?: string;\n disabled?: boolean;\n align?: 'left' | 'center';\n className?: string;\n}\n\n/**\n * Similar to TimeInput, but allows clearing the time value\n */\nexport default function NullableTimeInput<T extends string>({\n id,\n name,\n submitHandler,\n time,\n emptyDisplay,\n placeholder,\n disabled,\n align = 'center',\n className,\n}: NullableTimeInputProps<T>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [value, setValue] = useState<string>('');\n const ignoreChange = useRef(false);\n\n /**\n * @description Resets input value to given\n */\n const resetValue = useCallback(() => {\n if (typeof time !== 'number' || isNaN(time)) {\n setValue(emptyDisplay);\n } else {\n setValue(millisToString(time));\n }\n }, [emptyDisplay, time]);\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = useCallback(() => {\n inputRef.current?.select();\n }, []);\n\n /**\n * @description Submit handler\n * @param {string} newValue\n */\n const handleSubmit = useCallback(\n (newValue: string) => {\n // skip if user deleted and time is already null\n if (newValue === '' && time === null) {\n return false;\n }\n\n // skip if the value evaluates to the same thing\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis === time) {\n return false;\n }\n\n submitHandler(name, valueInMillis);\n return true;\n },\n [name, submitHandler, time],\n );\n\n /**\n * @description Prepare time fields\n * @param {string} value string to be parsed\n */\n const validateAndSubmit = useCallback(\n (newValue: string) => {\n const success = handleSubmit(newValue);\n if (!success) {\n resetValue();\n }\n },\n [handleSubmit, resetValue],\n );\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n }\n if (event.key === 'Escape') {\n ignoreChange.current = true;\n inputRef.current?.blur();\n resetValue();\n }\n },\n [resetValue],\n );\n\n const onBlurHandler = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (ignoreChange.current) {\n ignoreChange.current = false;\n return;\n }\n validateAndSubmit((event.target as HTMLInputElement).value);\n },\n [validateAndSubmit],\n );\n\n useEffect(() => {\n resetValue();\n }, [resetValue]);\n\n return (\n <Input\n id={id}\n disabled={disabled}\n ref={inputRef}\n data-testid={`time-input-${name}`}\n className={cx([style.timeInput, className])}\n placeholder={placeholder}\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlurHandler}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={8}\n autoComplete='off'\n style={{\n textAlign: align,\n }}\n />\n );\n}\n","import { IoLockClosed, IoLockOpenOutline } from 'react-icons/io5';\nimport { MaybeNumber } from 'ontime-types';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport NullableTimeInput from '../../../../common/components/input/time-input/NullableTimeInput';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { cx, enDash } from '../../../../common/utils/styleUtils';\nimport TimeInputGroup from '../../time-input-flow/TimeInputGroup';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface TargetDurationInputProps {\n duration: MaybeNumber;\n targetDuration: MaybeNumber;\n submitHandler: (field: 'targetDuration', value: MaybeNumber) => void;\n}\n\nexport default function TargetDurationInput({ duration, targetDuration, submitHandler }: TargetDurationInputProps) {\n const isLocked = targetDuration !== null;\n\n return (\n <div>\n <Editor.Label htmlFor='targetDuration'>Target duration</Editor.Label>\n <TimeInputGroup hasDelay={isLocked && targetDuration !== duration}>\n <NullableTimeInput\n name='targetDuration'\n time={targetDuration}\n submitHandler={submitHandler}\n emptyDisplay={enDash}\n className={isLocked ? '' : style.inactive}\n />\n <Tooltip\n text='Lock to target duration'\n className={cx([style.timeAction, isLocked && style.active])}\n onClick={() => submitHandler('targetDuration', isLocked ? null : duration)}\n data-testid='lock__duration'\n render={<IconButton variant='subtle-white' className={isLocked ? style.active : style.inactive} />}\n >\n {isLocked ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { MaybeNumber, OntimeGroup } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../common/components/input/colour-input/SwatchSelect';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { cx, enDash, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport TextLikeInput from '../../../views/cuesheet/cuesheet-table/cuesheet-table-elements/TextLikeInput';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventTextArea from './composite/EventTextArea';\nimport EntryEditorTextInput from './composite/EventTextInput';\nimport TargetDurationInput from './composite/TargetDurationInput';\n\nimport style from './EntryEditor.module.scss';\n\n// title + colour + custom field labels\nexport type GroupEditorUpdateTextFields = 'title' | 'colour' | string;\nexport type GroupEditorUpdateMaybeNumberFields = 'targetDuration';\n\ninterface GroupEditorProps {\n group: OntimeGroup;\n}\n\nexport default function GroupEditor({ group }: GroupEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActions();\n\n const handleSubmit = useCallback(\n (field: GroupEditorUpdateTextFields | GroupEditorUpdateMaybeNumberFields, value: string | MaybeNumber) => {\n // Handle custom fields\n if (typeof field === 'string' && field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: group.id, custom: { [fieldLabel]: value as string } });\n return;\n }\n\n if (field === 'targetDuration') {\n return updateEntry({ id: group.id, targetDuration: value as MaybeNumber });\n }\n\n // all other strings are text fields\n return updateEntry({ id: group.id, [field]: value as string });\n },\n [group.id, updateEntry],\n );\n\n const isEditor = window.location.pathname.includes('editor');\n const planOffset = group.targetDuration === null ? null : group.duration - group.targetDuration;\n const planOffsetLabel = planOffset !== null ? getOffsetState(planOffset) : null;\n\n return (\n <div className={style.content}>\n <div className={style.column}>\n <Editor.Title>Group schedule</Editor.Title>\n <div className={style.inline}>\n <div>\n <Editor.Label>First event start</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.timeStart, { fallback: timerPlaceholder })}\n </TextLikeInput>\n </div>\n <div>\n <Editor.Label>Last event end</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.timeEnd, { fallback: timerPlaceholder })}\n </TextLikeInput>\n </div>\n <div>\n <Editor.Label htmlFor='duration'>Scheduled duration</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.duration, { fallback: enDash })}\n </TextLikeInput>\n </div>\n </div>\n <div className={style.inline}>\n <div>\n <Editor.Label htmlFor='eventId'>Plan offset</Editor.Label>\n <TextLikeInput\n offset={planOffsetLabel}\n className={cx([style.textLikeInput, planOffset === null && style.inactive])}\n disabled\n >\n {planOffset !== null && planOffset > 0 ? '+' : ''}\n {millisToString(planOffset, { fallback: enDash })}\n </TextLikeInput>\n </div>\n <TargetDurationInput\n duration={group.duration}\n targetDuration={group.targetDuration}\n submitHandler={handleSubmit}\n />\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>Group data</Editor.Title>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={group.colour} handleChange={handleSubmit} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={group.title} submitHandler={handleSubmit} />\n <EventTextArea field='note' label='Note' initialValue={group.note} submitHandler={handleSubmit} />\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={group} />\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { OntimeMilestone } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../common/components/input/colour-input/SwatchSelect';\nimport Input from '../../../common/components/input/input/Input';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventTextArea from './composite/EventTextArea';\nimport EntryEditorTextInput from './composite/EventTextInput';\n\nimport style from './EntryEditor.module.scss';\n\n// cue + title + colour + custom field labels\nexport type MilestoneEditorUpdateTextFields = 'cue' | 'title' | 'colour' | string;\n\ninterface MilestoneEditorProps {\n milestone: OntimeMilestone;\n}\nexport default function MilestoneEditor({ milestone }: MilestoneEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActions();\n\n const handleSubmit = useCallback(\n (field: MilestoneEditorUpdateTextFields, value: string) => {\n // Handle custom fields\n if (typeof field === 'string' && field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: milestone.id, custom: { [fieldLabel]: value } });\n return;\n }\n // all other strings are text fields\n return updateEntry({ id: milestone.id, [field]: value });\n },\n [milestone.id, updateEntry],\n );\n\n const isEditor = window.location.pathname.includes('editor');\n\n return (\n <div className={style.content}>\n <div className={style.column}>\n <Editor.Title>Milestone data</Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='entryId'>Milestone ID (read only)</Editor.Label>\n <Input id='entryId' data-testid='input-textfield' value={milestone.id} readOnly fluid />\n </div>\n <EntryEditorTextInput\n field='cue'\n label='Cue'\n initialValue={milestone.cue}\n submitHandler={handleSubmit}\n maxLength={10}\n />\n </div>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={milestone.colour} handleChange={handleSubmit} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={milestone.title} submitHandler={handleSubmit} />\n <EventTextArea field='note' label='Note' initialValue={milestone.note} submitHandler={handleSubmit} />\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={milestone} />\n </div>\n </div>\n );\n}\n"],"names":["TimerLifeCycle","onLoad","onStart","onPause","onStop","onClock","onUpdate","onFinish","onWarning","onDanger","timerLifecycleValues","Object","keys","sanitiseCue","cue","replaceAll","EventEditorImage","src","jsxs","style","imageContainer","Boolean","jsx","imageOverlay","AutoTextarea","value","inputref","textAreaProps","useEffect","node","current","autosize","destroy","Textarea","useReactiveTextInput","initialText","submitCallback","ref","options","text","setText","useState","isKeyboardSubmitting","useRef","handleChange","useCallback","newValue","handleSubmit","valueToSubmit","allowSubmitSameValue","onCancelUpdate","cleanVal","trim","setTimeout","allowKeyboardNavigation","parentElement","focus","blur","handleEscape","keyHandler","useMemo","hotKeys","event","preventDefault","submitOnEnter","push","submitOnCtrlEnter","hotKeyHandler","getHotkeyHandler","key","stopPropagation","onChange","target","onBlur","onKeyDown","EventTextArea","className","field","label","initialValue","givenStyles","submitHandler","Editor.Label","EntryEditorTextInput","maxLength","placeholder","Input","EntryEditorCustomFields","fields","customFields","entry","Fragment","map","fieldKey","id","fieldName","custom","backgroundColor","color","getAccessibleColour","colour","labelText","type","decorated","customImage","TimeInputGroup","hasDelay","children","cx","inputGroup","delayed","memo","TimeInputFlow","eventId","countToEnd","timeStart","timeEnd","duration","timeStrategy","linkStart","delay","showLabels","updateEntry","updateTimer","useEntryActions","handleChangeStrategy","handleLink","doLink","warnings","dayInMs","isLockedEnd","TimeStrategy","LockEnd","isLockedDuration","LockDuration","inputWrapper","sectionTitle","hoverLabel","TimeInput","Tooltip","IconButton","active","inactive","fourtyfive","IoLink","IoUnlink","IoLockClosed","IoLockOpenOutline","length","join","timerNote","IoAlertCircleOutline","EventEditorTimes","endAction","timerType","timeWarning","timeDanger","newTime","parseUserTime","delayLabel","millisToDelayString","millisToString","column","Editor.Title","inline","splitTwo","Select","EndAction","None","LoadNext","PlayNext","switchLabel","Switch","IoInformationCircle","tooltipIcon","TimerType","CountDown","CountUp","Clock","EventEditorTitles","flag","title","note","cueSubmitHandler","_field","flagSubmitHandler","textSubmitHandler","splitThree","SwatchSelect","eventTriggerOptions","EventEditorTriggers","triggers","showTriggers","ExistingEventTriggers","EventTriggerForm","data","automationSettings","useAutomationSettings","automationId","setAutomationId","undefined","cycleValue","setCycleValue","triggerLifeCycle","newTriggers","Array","generateId","trigger","validationError","getValidationError","cycle","automations","includes","values","some","t","triggerOptions","automationOptions","triggerForm","Button","IoAlertCircle","errorLabel","IoCheckmarkCircle","success","handleDelete","triggerId","filter","filteredTriggers","forEach","triggerType","thisTriggerType","assign","entries","triggerGroup","automationTitle","Tag","IoTrash","EventEditor","useCustomFields","isEditor","window","location","pathname","startsWith","fieldLabel","split","content","AppLink","TextLikeInput","forwardRef","offset","muted","disabled","elementProps","textRef","classes","textInput","useImperativeHandle","focusParentElement","displayName","NullableTimeInput","name","time","emptyDisplay","align","inputRef","setValue","ignoreChange","resetValue","isNaN","handleFocus","select","valueInMillis","validateAndSubmit","onKeyDownHandler","onBlurHandler","timeInput","textAlign","TargetDurationInput","targetDuration","isLocked","enDash","timeAction","GroupEditor","group","planOffset","planOffsetLabel","getOffsetState","textLikeInput","fallback","timerPlaceholder","MilestoneEditor","milestone"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{e as i,k as w,j as e,br as N,h as k,bs as b,bt as g,bu as y,bv as h,bw as m,bx as x,by as j,D,q as v,s as $,t as C,v as I}from"./vendor-q6fv0YT2.js";import{ay as P,aG as S,bB as E,e as M,ak as A}from"./index-B81u4hxi.js";import{s as u,b as T}from"./SwatchPicker-Cm5Eicvv.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="298c76b4-4ab0-49b9-9059-e567dd9f7386",s._sentryDebugIdIdentifier="sentry-dbid-298c76b4-4ab0-49b9-9059-e567dd9f7386")}catch{}})();const c=`${P}/automations`;async function F(){return(await i.get(c)).data}async function V(s){return(await i.post(c,s)).data}async function ss(s){return(await i.post(`${c}/trigger`,s)).data}async function es(s,t){return(await i.put(`${c}/trigger/${s}`,t)).data}function ts(s){return i.delete(`${c}/trigger/${s}`)}async function as(s){return(await i.post(`${c}/automation`,s)).data}async function ns(s,t){return(await i.put(`${c}/automation/${s}`,t)).data}function os(s){return i.delete(`${c}/automation/${s}`)}function rs(s){return i.post(`${c}/test`,s)}const O={enabledAutomations:!1,enabledOscIn:!1,oscPortIn:8888,triggers:[],automations:{}};function is(){const{data:s,status:t,isFetching:n,isError:o,refetch:a}=w({queryKey:E,queryFn:F,placeholderData:(r,p)=>r,retry:5,retryDelay:r=>r*2500,refetchInterval:S,networkMode:"always"});return{data:s??O,status:t,isFetching:n,isError:o,refetch:a}}const B="_tag_1hjkh_17",q={tag:B};function cs({children:s}){return e.jsx("span",{className:q.tag,children:s})}function R({color:s,isSelected:t,onClick:n}){const o=r=>{n==null||n(s),r.preventDefault(),r.stopPropagation()},a=M([u.swatch,t&&u.selected,n&&u.selectable]);return s?e.jsx("div",{className:a,style:{backgroundColor:`${s}`},onClick:o}):e.jsx("div",{className:a,onClick:o,children:e.jsx(N,{})})}const f=["","#FFCC78","#FFAB33","#77C785","#339E4E","#779BE7","#3E75E8","#FF7878","#ED3333","#A790F5","#8064E1","#9d9d9d","#ececec"];function ls(s){const{value:t,name:n,handleChange:o}=s,a=k.useCallback(r=>{r!==t&&o(n,r)},[o,n,t]);return e.jsxs("div",{className:u.list,children:[f.map(r=>e.jsx(R,{color:r,onClick:a,isSelected:t===r},r)),e.jsx(T,{color:t,onChange:a,isSelected:!f.includes(t)})]})}const Q="_positioner_18ray_17",U="_popup_18ray_21",G="_item_18ray_39",K="_separator_18ray_75",l={positioner:Q,popup:U,item:G,separator:K};function ds({items:s,children:t,...n}){return e.jsxs(b,{children:[e.jsx(g,{...n,children:t}),e.jsx(y,{children:e.jsx(h,{className:l.positioner,align:"start",sideOffset:8,children:e.jsx(m,{className:l.popup,children:s.map((o,a)=>o.type==="divider"?e.jsx(x,{className:l.separator},a):e.jsxs(j,{className:l.item,onClick:o.onClick,disabled:o.disabled,"data-type":o.type,children:[o.icon&&e.jsx(o.icon,{}),o.label]},a))})})})]})}function us({items:s,isOpen:t,position:n,onClose:o}){return e.jsxs(b,{open:t,onOpenChange:a=>{a||o()},children:[e.jsx(g,{style:{position:"fixed",left:n.x,top:n.y},"aria-hidden":!0}),e.jsx(y,{children:e.jsx(h,{className:l.positioner,align:"start",sideOffset:8,alignOffset:8,children:e.jsx(m,{className:l.popup,children:s.map((a,r)=>a.type==="divider"?e.jsx(x,{className:l.separator},r):e.jsxs(j,{className:l.item,onClick:a.onClick,disabled:a.disabled,children:[a.icon&&e.jsx(a.icon,{}),a.label]},r))})})})]})}const z="_modal_4rabb_17",H="_backdrop_4rabb_34",J="_title_4rabb_44",L="_body_4rabb_53",W="_footer_4rabb_61",d={modal:z,backdrop:H,title:J,body:L,footer:W};function ps({isOpen:s,title:t,showCloseButton:n,showBackdrop:o,bodyElements:a,footerElements:r,onClose:p}){return e.jsx(D,{open:s,onOpenChange:_=>{_||p()},disablePointerDismissal:!0,children:e.jsxs(v,{children:[o&&e.jsx($,{className:d.backdrop}),e.jsxs(C,{className:d.modal,children:[e.jsxs("div",{className:d.title,children:[t,n&&e.jsx(A,{variant:"subtle-white",onClick:p,children:e.jsx(I,{})})]}),e.jsx("div",{className:d.body,children:a}),e.jsx("div",{className:d.footer,children:r})]})]})})}export{ds as D,ps as M,us as P,ls as S,cs as T,ns as a,as as b,es as c,os as d,V as e,ss as f,ts as g,R as h,rs as t,is as u};
2
+ //# sourceMappingURL=Modal-BKx0PDGT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal-BKx0PDGT.js","sources":["../../src/common/api/automation.ts","../../src/common/models/AutomationSettings.ts","../../src/common/hooks-query/useAutomationSettings.ts","../../src/common/components/tag/Tag.tsx","../../src/common/components/input/colour-input/Swatch.tsx","../../src/common/components/input/colour-input/SwatchSelect.tsx","../../src/common/components/dropdown-menu/DropdownMenu.tsx","../../src/common/components/modal/Modal.tsx"],"sourcesContent":["import axios from 'axios';\nimport type {\n Automation,\n AutomationDTO,\n AutomationOutput,\n AutomationSettings,\n Trigger,\n TriggerDTO,\n} from 'ontime-types';\n\nimport { apiEntryUrl } from './constants';\n\nconst automationsPath = `${apiEntryUrl}/automations`;\n\n/**\n * HTTP request to get the automations settings\n */\nexport async function getAutomationSettings(): Promise<AutomationSettings> {\n const res = await axios.get(automationsPath);\n return res.data;\n}\n\n/**\n * HTTP request to edit the automations settings\n */\nexport async function editAutomationSettings(\n automationSettings: Partial<AutomationSettings>,\n): Promise<AutomationSettings> {\n const res = await axios.post(automationsPath, automationSettings);\n return res.data;\n}\n\n/**\n * HTTP request to create a new automation trigger\n */\nexport async function addTrigger(trigger: TriggerDTO): Promise<Trigger> {\n const res = await axios.post(`${automationsPath}/trigger`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to update an automation trigger\n */\nexport async function editTrigger(id: string, trigger: Trigger): Promise<Trigger> {\n const res = await axios.put(`${automationsPath}/trigger/${id}`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to delete an automation trigger\n */\nexport function deleteTrigger(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/trigger/${id}`);\n}\n\n/**\n * HTTP request to create a new automation\n */\nexport async function addAutomation(automation: AutomationDTO): Promise<Automation> {\n const res = await axios.post(`${automationsPath}/automation`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to update a automation\n */\nexport async function editAutomation(id: string, automation: Automation): Promise<Automation> {\n const res = await axios.put(`${automationsPath}/automation/${id}`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to delete a automation\n */\nexport function deleteAutomation(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/automation/${id}`);\n}\n\n/**\n * HTTP request to test automation output\n * The return is irrelevant as we care for the resolution of the promise\n */\nexport function testOutput(output: AutomationOutput): Promise<void> {\n return axios.post(`${automationsPath}/test`, output);\n}\n","import { AutomationSettings } from 'ontime-types';\n\nexport const automationPlaceholderSettings: AutomationSettings = {\n enabledAutomations: false,\n enabledOscIn: false,\n oscPortIn: 8888,\n triggers: [],\n automations: {},\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport { queryRefetchIntervalSlow } from '../../ontimeConfig';\nimport { getAutomationSettings } from '../api/automation';\nimport { AUTOMATION } from '../api/constants';\nimport { automationPlaceholderSettings } from '../models/AutomationSettings';\n\nexport default function useAutomationSettings() {\n const { data, status, isFetching, isError, refetch } = useQuery({\n queryKey: AUTOMATION,\n queryFn: getAutomationSettings,\n placeholderData: (previousData, _previousQuery) => previousData,\n retry: 5,\n retryDelay: (attempt: number) => attempt * 2500,\n refetchInterval: queryRefetchIntervalSlow,\n networkMode: 'always',\n });\n\n return { data: data ?? automationPlaceholderSettings, status, isFetching, isError, refetch };\n}\n","import { ReactNode } from 'react';\n\nimport style from './Tag.module.scss';\n\nexport default function Tag({ children }: { children: ReactNode }) {\n return <span className={style.tag}>{children}</span>;\n}\n","import { MouseEvent } from 'react';\nimport { IoBan } from 'react-icons/io5';\n\nimport { cx } from '../../../utils/styleUtils';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface SwatchProps {\n color: string;\n onClick?: (color: string) => void;\n isSelected?: boolean;\n}\n\nexport default function Swatch({ color, isSelected, onClick }: SwatchProps) {\n const handleClick = (event: MouseEvent) => {\n onClick?.(color);\n event.preventDefault();\n event.stopPropagation();\n };\n\n const classes = cx([style.swatch, isSelected && style.selected, onClick && style.selectable]);\n\n if (!color) {\n return (\n <div className={classes} onClick={handleClick}>\n <IoBan />\n </div>\n );\n }\n return <div className={classes} style={{ backgroundColor: `${color}` }} onClick={handleClick} />;\n}\n","import { useCallback } from 'react';\n\nimport Swatch from './Swatch';\nimport SwatchPicker from './SwatchPicker';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface ColourInputProps {\n value: string;\n name: 'colour';\n handleChange: (newValue: 'colour', name: string) => void;\n}\n\nconst colours = [\n '',\n '#FFCC78', // $orange-400\n '#FFAB33', // $orange-600\n '#77C785', // $green-400\n '#339E4E', // $green-600\n '#779BE7', // $blue-400\n '#3E75E8', // $blue-600\n '#FF7878', // $red-400\n '#ED3333', // $red-600\n '#A790F5', // $violet-400\n '#8064E1', // $violet-600\n '#9d9d9d', // $gray-500\n '#ececec', // $gray-100\n];\n\nexport default function SwatchSelect(props: ColourInputProps) {\n const { value, name, handleChange } = props;\n\n const setColour = useCallback(\n (newValue: string) => {\n if (newValue !== value) {\n handleChange(name, newValue);\n }\n },\n [handleChange, name, value],\n );\n\n return (\n <div className={style.list}>\n {colours.map((colour) => (\n <Swatch key={colour} color={colour} onClick={setColour} isSelected={value === colour} />\n ))}\n <SwatchPicker color={value} onChange={setColour} isSelected={!colours.includes(value)} />\n </div>\n );\n}\n","import { PropsWithChildren } from 'react';\nimport { IconType } from 'react-icons';\nimport { Menu as BaseMenu } from '@base-ui/react/menu';\n\nimport style from './DropdownMenu.module.scss';\n\ntype DropdownMenuItemDivider = { type: 'divider' };\ntype DropdownMenuItem = {\n type: 'item' | 'destructive';\n label: string;\n icon?: IconType;\n disabled?: boolean;\n onClick: () => void;\n};\n\nexport type DropdownMenuOption = DropdownMenuItemDivider | DropdownMenuItem;\n\ninterface DropdownMenuProps extends BaseMenu.Trigger.Props {\n items: DropdownMenuOption[];\n}\n\nexport function DropdownMenu({ items, children, ...triggerProps }: PropsWithChildren<DropdownMenuProps>) {\n return (\n <BaseMenu.Root>\n <BaseMenu.Trigger {...triggerProps}>{children}</BaseMenu.Trigger>\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item\n key={index}\n className={style.item}\n onClick={item.onClick}\n disabled={item.disabled}\n data-type={item.type}\n >\n {item.icon && <item.icon />}\n {item.label}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n\ninterface PositionedDropdownMenuProps {\n items: Array<DropdownMenuItemDivider | DropdownMenuItem>;\n isOpen: boolean;\n onClose: () => void;\n position: { x: number; y: number };\n}\n\nexport function PositionedDropdownMenu({ items, isOpen, position, onClose }: PositionedDropdownMenuProps) {\n return (\n <BaseMenu.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <BaseMenu.Trigger style={{ position: 'fixed', left: position.x, top: position.y }} aria-hidden />\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8} alignOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item key={index} className={style.item} onClick={item.onClick} disabled={item.disabled}>\n {item.icon && <item.icon />}\n {item.label}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n","import type { ReactNode } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog as BaseDialog } from '@base-ui/react/dialog';\n\nimport IconButton from '../buttons/IconButton';\n\nimport style from './Modal.module.scss';\n\ninterface ModalProps {\n isOpen: boolean;\n title?: string;\n showCloseButton?: boolean;\n showBackdrop?: boolean;\n bodyElements: ReactNode;\n footerElements?: ReactNode;\n onClose: () => void;\n}\n\nexport default function Modal({\n isOpen,\n title,\n showCloseButton,\n showBackdrop,\n bodyElements,\n footerElements,\n onClose,\n}: ModalProps) {\n return (\n <BaseDialog.Root\n open={isOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n disablePointerDismissal\n >\n <BaseDialog.Portal>\n {showBackdrop && <BaseDialog.Backdrop className={style.backdrop} />}\n <BaseDialog.Popup className={style.modal}>\n <div className={style.title}>\n {title}\n {showCloseButton && (\n <IconButton variant='subtle-white' onClick={onClose}>\n <IoClose />\n </IconButton>\n )}\n </div>\n <div className={style.body}>{bodyElements}</div>\n <div className={style.footer}>{footerElements}</div>\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n );\n}\n"],"names":["automationsPath","apiEntryUrl","getAutomationSettings","axios","get","data","editAutomationSettings","automationSettings","post","addTrigger","trigger","editTrigger","id","put","deleteTrigger","delete","addAutomation","automation","editAutomation","deleteAutomation","testOutput","output","automationPlaceholderSettings","enabledAutomations","enabledOscIn","oscPortIn","triggers","automations","useAutomationSettings","status","isFetching","isError","refetch","useQuery","queryKey","AUTOMATION","queryFn","placeholderData","previousData","_previousQuery","retry","retryDelay","attempt","refetchInterval","queryRefetchIntervalSlow","networkMode","Tag","children","jsx","style","tag","Swatch","color","isSelected","onClick","handleClick","event","preventDefault","stopPropagation","classes","cx","swatch","selected","selectable","backgroundColor","IoBan","colours","SwatchSelect","props","value","name","handleChange","setColour","useCallback","newValue","jsxs","list","map","colour","SwatchPicker","includes","DropdownMenu","items","triggerProps","BaseMenu.Root","BaseMenu.Trigger","BaseMenu.Portal","BaseMenu.Positioner","positioner","BaseMenu.Popup","popup","item","index","type","BaseMenu.Separator","separator","BaseMenu.Item","disabled","icon","label","PositionedDropdownMenu","isOpen","position","onClose","open","left","x","top","y","Modal","title","showCloseButton","showBackdrop","bodyElements","footerElements","BaseDialog.Root","BaseDialog.Portal","BaseDialog.Backdrop","backdrop","BaseDialog.Popup","modal","IconButton","IoClose","body","footer"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as r}from"./vendor-Cdwxo8bP.js";import{g as o}from"./getProgress-sdxPEEPi.js";import{e as l}from"./index-CoGiopcb.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]="e86c5420-869a-40eb-824b-fd83e714dca7",e._sentryDebugIdIdentifier="sentry-dbid-e86c5420-869a-40eb-824b-fd83e714dca7")}catch{}})();function j(e){const{now:s,complete:i,normalColor:g,warning:n,warningColor:c,danger:a,dangerColor:m,hidden:b,hideOvertime:u,ignoreCssOverride:p,className:f=""}=e,_=100-o(s,i),t=a?100-o(a,i):0,h=n?100-t-o(n,i):0,d=s!==null&&s<0&&!u;return r.jsx("div",{className:l(["multiprogress-bar",b&&"multiprogress-bar--hidden",p&&"multiprogress-bar--ignore-css-override",f]),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-BKHk19Hb.js.map
1
+ import{j as r}from"./vendor-q6fv0YT2.js";import{g as o}from"./getProgress-cLuBFPjh.js";import{e as l}from"./index-B81u4hxi.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]="e86c5420-869a-40eb-824b-fd83e714dca7",e._sentryDebugIdIdentifier="sentry-dbid-e86c5420-869a-40eb-824b-fd83e714dca7")}catch{}})();function j(e){const{now:s,complete:i,normalColor:g,warning:n,warningColor:c,danger:a,dangerColor:m,hidden:b,hideOvertime:u,ignoreCssOverride:p,className:f=""}=e,_=100-o(s,i),t=a?100-o(a,i):0,h=n?100-t-o(n,i):0,d=s!==null&&s<0&&!u;return r.jsx("div",{className:l(["multiprogress-bar",b&&"multiprogress-bar--hidden",p&&"multiprogress-bar--ignore-css-override",f]),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-BXdLxJpy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultiPartProgressBar-BKHk19Hb.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-BXdLxJpy.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"}
@@ -0,0 +1 @@
1
+ ._blink_1k6b9_1{animation:_blink_1k6b9_1 1s step-start infinite}@keyframes _blink_1k6b9_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1k6b9_13{transform:rotate(45deg)}._editModal_1k6b9_17{position:fixed;top:10%;left:50%;transform:translate(-50%);padding-inline:1rem;min-width:min(720px,90vw);background-color:#202020;color:#f6f6f6;border-radius:3px;box-shadow:#00000026 0 3px 3px;border:1px solid #2d2d2d}._title_1k6b9_31{font-size:1.25rem;padding-block:1rem;display:flex;align-items:center;justify-content:space-between}._body_1k6b9_39{flex:1;display:flex;flex-direction:column;gap:.5rem;max-height:min(60vh,600px);overflow-y:auto}._label_1k6b9_48{background-color:var(--user-bg, #4c4c4c);width:fit-content;padding-inline:1rem}._footer_1k6b9_54{padding-block:1rem;display:flex;align-items:center;justify-content:end;gap:1rem}._blink_9py1c_1{animation:_blink_9py1c_1 1s step-start infinite}@keyframes _blink_9py1c_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_9py1c_13{transform:rotate(45deg)}._mirror_9py1c_17{transform:rotate(180deg)}._event_9py1c_21{opacity:1;border-top:1px solid rgba(255,255,255,.01);padding-right:.5rem;color:#ffffffe6;background-color:#ffffff0d;display:grid;align-items:center;column-gap:.5rem;row-gap:.5rem;grid-template-rows:auto auto auto;grid-template-columns:1.5rem 1fr auto;grid-template-areas:"binder main schedule" "binder secondary running" "binder fields fields"}._event_9py1c_21._subscribed_9py1c_35{background-color:#202020}._event_9py1c_21._running_9py1c_38{border-top:1px solid #1a1a1a;background-color:var(--operator-running-bg-override, #087A27)}._event_9py1c_21._past_9py1c_42{border-top:1px solid transparent;opacity:.2}._binder_9py1c_47{grid-area:binder;color:#f6f6f6;height:100%;display:grid;place-content:center;position:relative;background-color:#303030;font-weight:600}._binder_9py1c_47 ._cue_9py1c_57{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;width:6em;rotate:-90deg;letter-spacing:.5px}._mainField_9py1c_67{grid-area:main;font-size:1.5rem;color:#f6f6f6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._secondaryField_9py1c_76{grid-area:secondary;font-size:1.25rem;line-height:1em;white-space:pre-line}._plannedStart_9py1c_83,._timeUntil_9py1c_84,._runningTime_9py1c_85{border-radius:3px;padding:.25rem .5rem;line-height:1}._plannedStart_9py1c_83{font-size:1.5rem;margin-right:.5rem;display:inline;background-color:#fff3;letter-spacing:1px}._timeUntil_9py1c_84{grid-area:schedule;font-size:calc(1rem - 2px);justify-self:end;background-color:#fff3;letter-spacing:1px}._runningTime_9py1c_85{grid-area:running;font-size:1.25rem;justify-self:end;background-color:#ffffff12}._fields_9py1c_114{grid-area:fields;margin-top:0;border-top:0}._fields_9py1c_114 ._field_9py1c_114{font-weight:600;padding-inline:.25rem}._fields_9py1c_114 ._noColour_9py1c_123{outline:.15rem solid #f6f6f6;outline-offset:-.15rem;padding-right:.3rem;color:#f6f6f6}._fields_9py1c_114 ._value_9py1c_129{display:inline-flex;padding-inline:.25rem;background-color:#202020;color:#f6f6f6;white-space:pre-line}._fields_9py1c_114._fieldsWithContent_9py1c_136{margin-top:.25rem;padding-block:.5rem;border-top:1px solid rgba(255,255,255,.13);display:grid;grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));gap:.25rem .75rem;line-height:1.25em;font-size:var(--operator-customfield-font-size-override, 1.25rem);font-weight:400;color:#101010}._blink_c6uj3_1{animation:_blink_c6uj3_1 1s step-start infinite}@keyframes _blink_c6uj3_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_c6uj3_13{transform:rotate(45deg)}._group_c6uj3_17{width:100%;padding:.25rem .5rem;background-color:#101010;font-size:1.25rem}@media (min-width: 500px){._group_c6uj3_17{padding:.25rem 1rem}}._blink_1va40_1{animation:_blink_1va40_1 1s step-start infinite}@keyframes _blink_1va40_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1va40_13{transform:rotate(45deg)}._statusBar_1va40_17{position:sticky;top:0;width:100%;z-index:100;background-color:#101010}._timers_1va40_25{padding-block:1rem .5rem;padding-inline:1rem .5rem;display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-areas:". timers clock"}._runningTimer_1va40_33{grid-area:timers;justify-self:center}._runningTimer_1va40_33 :nth-child(2){font-size:2.5rem;line-height:1.2}._timeNow_1va40_42{grid-area:clock;justify-self:right}._timeNow_1va40_42 :nth-child(2){font-size:2.5rem;line-height:1.2}._progressOverride_1va40_51{grid-area:bar;height:1rem;--progress-bar-br: 0}@media (max-width: 500px){._timers_1va40_25{grid-template-columns:1fr 1fr;grid-template-areas:"timers clock"}}._blink_1o5o0_1{animation:_blink_1o5o0_1 1s step-start infinite}@keyframes _blink_1o5o0_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1o5o0_13{transform:rotate(45deg)}._operatorContainer_1o5o0_17{width:100vw;height:100vh;background-color:#101010;color:#f6f6f6}._operatorEvents_1o5o0_24{width:100vw;height:100vh;padding-top:.25rem;overflow:auto;display:flex;flex-direction:column;gap:2px;padding-bottom:95vh}._editPrompt_1o5o0_35{position:fixed;z-index:400;left:50%;transform:translate(-50%);text-align:center;background:#000000b3;border-radius:2px;padding:.5em 2em;color:#ffbc56;opacity:0;transition-property:opacity;transition-duration:.3s}._editPrompt_1o5o0_35._show_1o5o0_49{opacity:1}._schedule_1o5o0_53{display:flex;gap:.25em}
@@ -0,0 +1,2 @@
1
+ import{h as c,j as e,D as ae,q as le,t as ce,v as de,l as ue}from"./vendor-q6fv0YT2.js";import{P as me}from"./ProtectRoute-BH-QvsU0.js";import{ak as pe,B as z,t as te,r as fe,be as he,aC as ge,e as T,f as _e,bf as ve,k as be,M as ye,bg as xe,b0 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-B81u4hxi.js";import{t as Fe,i as q,j as De}from"./useRundown-Bn6ZPsz0.js";import{E as Le}from"./EmptyPage-Bc358YpE.js";import{m as Me,b as ke,O as $,V as Re}from"./ViewParamsEditor-C2-TRP6e.js";import{u as Ie}from"./useFollowComponent-B7vvPzG2.js";import{u as Ue}from"./useWindowTitle-Bpmo_HzW.js";import{T as Be}from"./editorSettings-D2f7e1a6.js";import{u as Ae}from"./dateConfig-D7xim1t4.js";import{F as We}from"./FollowButton-C6Fvaqh0.js";import{D as Ve}from"./DelayIndicator-D--91EO3.js";import{f as $e,T as Ge,C as He}from"./TimeElements-DbclWDbU.js";import{S as Ze}from"./SuperscriptPeriod-DsPdWN_s.js";import{M as ze}from"./MultiPartProgressBar-BXdLxJpy.js";import{g as qe,a as Qe}from"./viewLoader.utils-b42scp-I.js";import{i as G,b as Q}from"./viewUtils-B8Dr4GHH.js";import{u as Je}from"./useCustomFields-k4piRt9n.js";import"./Empty-CJbZxh45.js";import"./Select-BGGVCKqU.js";import"./SwatchPicker-Cm5Eicvv.js";import"./validateEvent-Do8yE_DJ.js";import"./parseUserTime-YeFR8t3F.js";import"./rundownUtils-CtVGQDQn.js";import"./Tooltip-B5vsLcFu.js";import"./offset-R98EXhWK.js";import"./playbackstate-CPQdnF-k.js";/* empty css */import"./getProgress-cLuBFPjh.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]="f4d9d8ee-1c9b-46ed-ae9b-a9433ce5b68b",t._sentryDebugIdIdentifier="sentry-dbid-f4d9d8ee-1c9b-46ed-ae9b-a9433ce5b68b")}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}=Ae(),[n,i]=c.useState(!1),u=c.useRef(new Array),g=async()=>{if(!u.current)return;i(!0);const a={id:s.id};u.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(de,{})})]}),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(Be,{name:a.id,ref:l=>{l&&u.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,u=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),u.current=!0},o))},h=m=>{!K(m)&&!J(m)||(u.current?n==null||n(m):g.current&&(i==null||i(m)),u.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",dt="_mainField_9py1c_67",ut="_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:dt,secondaryField:ut,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:u,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:u,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:u}){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:u})}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]=ue(),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,u=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:u,subscribedData:a}}function Ut(){const{data:t,rundownMetadata:s,status:o}=Fe(),{data:r,status:n}=Je(),{data:i,status:u}=we();return{data:{rundown:t,rundownMetadata:s,customFields:r,settings:i},status:Qe([o,n,u])}}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 Ue("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{selectedEventId:n}=Ce(),{subscribe:i,mainSource:u,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(),d=b.current.getBoundingClientRect();if(y&&d){const w=y.top-d.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 d=t.entries[y];if(q(d)){const{isPast:S,isLinkedToLoaded:W,isLoaded:O,totalGap:_}=s[y];if(l&&S||d.skip)return null;const{mainField:L,secondaryField:M,subscribedData:V}=Y(d,u,g,i,o);return e.jsx(X,{id:d.id,colour:d.colour,cue:d.cue,main:L,secondary:M,timeStart:d.timeStart,duration:d.duration,delay:d.delay,dayOffset:d.dayOffset,isLinkedToLoaded:W,isSelected:O,isPast:S,selectedRef:O?v:void 0,showStart:h,subscribed:V,totalGap:_,onLongPress:A?H:()=>{}},d.id)}if(De(d)){const{isPast:S}=s[d.id],W=n?((w=s[n])==null?void 0:w.groupId)===d.id:!1;return l&&S&&!W?null:e.jsxs(c.Fragment,{children:[e.jsx(wt,{title:d.title},d.id),d.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(_,u,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)})]},d.id)}return null})}),e.jsx(We,{isVisible:j,onClickHandler:I})]})}function ys(){return e.jsx(me,{permission:"operator",children:e.jsx($t,{})})}export{ys as default};
2
+ //# sourceMappingURL=OperatorExport-X7-qi2jv.js.map