@getontime/cli 4.4.1 → 4.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/client/assets/{Backstage-BY9GL_rk.js → Backstage-BdrcXNr9.js} +2 -2
  2. package/client/assets/Backstage-BdrcXNr9.js.br +0 -0
  3. package/client/assets/Backstage-BdrcXNr9.js.gz +0 -0
  4. package/client/assets/{Backstage-BY9GL_rk.js.map → Backstage-BdrcXNr9.js.map} +1 -1
  5. package/client/assets/{Countdown-CXFgDHND.js → Countdown-DQM2ppPg.js} +2 -2
  6. package/client/assets/Countdown-DQM2ppPg.js.br +0 -0
  7. package/client/assets/Countdown-DQM2ppPg.js.gz +0 -0
  8. package/client/assets/{Countdown-CXFgDHND.js.map → Countdown-DQM2ppPg.js.map} +1 -1
  9. package/client/assets/{CuesheetTable-BLICUNky.js → CuesheetTable-B5LQVh5m.js} +2 -2
  10. package/client/assets/CuesheetTable-B5LQVh5m.js.br +0 -0
  11. package/client/assets/CuesheetTable-B5LQVh5m.js.gz +0 -0
  12. package/client/assets/{CuesheetTable-BLICUNky.js.map → CuesheetTable-B5LQVh5m.js.map} +1 -1
  13. package/client/assets/{CustomTranslationModal-4PVZBtkC.js → CustomTranslationModal-CML7Vsot.js} +2 -2
  14. package/client/assets/CustomTranslationModal-CML7Vsot.js.br +0 -0
  15. package/client/assets/CustomTranslationModal-CML7Vsot.js.gz +0 -0
  16. package/client/assets/{CustomTranslationModal-4PVZBtkC.js.map → CustomTranslationModal-CML7Vsot.js.map} +1 -1
  17. package/client/assets/{DelayIndicator-DUbpd6DG.js → DelayIndicator-DKS6mZdB.js} +2 -2
  18. package/client/assets/DelayIndicator-DKS6mZdB.js.br +0 -0
  19. package/client/assets/DelayIndicator-DKS6mZdB.js.gz +0 -0
  20. package/client/assets/{DelayIndicator-DUbpd6DG.js.map → DelayIndicator-DKS6mZdB.js.map} +1 -1
  21. package/client/assets/{EditorFeatureWrapper-CV_zaDoG.js → EditorFeatureWrapper-C1vLQxiy.js} +2 -2
  22. package/client/assets/EditorFeatureWrapper-C1vLQxiy.js.br +0 -0
  23. package/client/assets/EditorFeatureWrapper-C1vLQxiy.js.gz +0 -0
  24. package/client/assets/{EditorFeatureWrapper-CV_zaDoG.js.map → EditorFeatureWrapper-C1vLQxiy.js.map} +1 -1
  25. package/client/assets/{EditorUtils-CLBWDP4k.js → EditorUtils-BLcTuWz1.js} +2 -2
  26. package/client/assets/EditorUtils-BLcTuWz1.js.br +0 -0
  27. package/client/assets/EditorUtils-BLcTuWz1.js.gz +0 -0
  28. package/client/assets/{EditorUtils-CLBWDP4k.js.map → EditorUtils-BLcTuWz1.js.map} +1 -1
  29. package/client/assets/{EmptyPage-DmpOAg7R.js → EmptyPage-CYVrjOvI.js} +2 -2
  30. package/client/assets/EmptyPage-CYVrjOvI.js.br +0 -0
  31. package/client/assets/EmptyPage-CYVrjOvI.js.gz +0 -0
  32. package/client/assets/{EmptyPage-DmpOAg7R.js.map → EmptyPage-CYVrjOvI.js.map} +1 -1
  33. package/client/assets/{FollowButton-CAUWz5Ma.js → FollowButton-DcSbb4R_.js} +2 -2
  34. package/client/assets/FollowButton-DcSbb4R_.js.br +0 -0
  35. package/client/assets/FollowButton-DcSbb4R_.js.gz +0 -0
  36. package/client/assets/{FollowButton-CAUWz5Ma.js.map → FollowButton-DcSbb4R_.js.map} +1 -1
  37. package/client/assets/{MessageControlExport-Dm8IjSr4.js → MessageControlExport-BgT9JaXk.js} +3 -3
  38. package/client/assets/MessageControlExport-BgT9JaXk.js.br +0 -0
  39. package/client/assets/MessageControlExport-BgT9JaXk.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-Dm8IjSr4.js.map → MessageControlExport-BgT9JaXk.js.map} +1 -1
  41. package/client/assets/{MultiPartProgressBar-Fp-sTN2u.js → MultiPartProgressBar-W2a-JWPY.js} +2 -2
  42. package/client/assets/MultiPartProgressBar-W2a-JWPY.js.br +0 -0
  43. package/client/assets/MultiPartProgressBar-W2a-JWPY.js.gz +0 -0
  44. package/client/assets/{MultiPartProgressBar-Fp-sTN2u.js.map → MultiPartProgressBar-W2a-JWPY.js.map} +1 -1
  45. package/client/assets/{OperatorExport-CE4ajLPS.js → OperatorExport-CbWojpp6.js} +2 -2
  46. package/client/assets/OperatorExport-CbWojpp6.js.br +0 -0
  47. package/client/assets/OperatorExport-CbWojpp6.js.gz +0 -0
  48. package/client/assets/{OperatorExport-CE4ajLPS.js.map → OperatorExport-CbWojpp6.js.map} +1 -1
  49. package/client/assets/{OverviewWrapper-BNnAIUP1.js → OverviewWrapper-B2i8d3rt.js} +2 -2
  50. package/client/assets/OverviewWrapper-B2i8d3rt.js.br +0 -0
  51. package/client/assets/OverviewWrapper-B2i8d3rt.js.gz +0 -0
  52. package/client/assets/{OverviewWrapper-BNnAIUP1.js.map → OverviewWrapper-B2i8d3rt.js.map} +1 -1
  53. package/client/assets/{PipHost-CbNFsfqp.js → PipHost-Dz2oy7XG.js} +2 -2
  54. package/client/assets/PipHost-Dz2oy7XG.js.br +0 -0
  55. package/client/assets/PipHost-Dz2oy7XG.js.gz +0 -0
  56. package/client/assets/{PipHost-CbNFsfqp.js.map → PipHost-Dz2oy7XG.js.map} +1 -1
  57. package/client/assets/{ProjectInfo-Bf5z4Xsv.js → ProjectInfo-BR_7Hp5u.js} +2 -2
  58. package/client/assets/ProjectInfo-BR_7Hp5u.js.br +0 -0
  59. package/client/assets/ProjectInfo-BR_7Hp5u.js.gz +0 -0
  60. package/client/assets/{ProjectInfo-Bf5z4Xsv.js.map → ProjectInfo-BR_7Hp5u.js.map} +1 -1
  61. package/client/assets/{ProtectRoute-CCHzyy0I.js → ProtectRoute-Bxq6q7ba.js} +2 -2
  62. package/client/assets/ProtectRoute-Bxq6q7ba.js.br +0 -0
  63. package/client/assets/ProtectRoute-Bxq6q7ba.js.gz +0 -0
  64. package/client/assets/{ProtectRoute-CCHzyy0I.js.map → ProtectRoute-Bxq6q7ba.js.map} +1 -1
  65. package/client/assets/{ProtectedCuesheet-COI1W_V3.js → ProtectedCuesheet-C7AqD2dy.js} +2 -2
  66. package/client/assets/ProtectedCuesheet-C7AqD2dy.js.br +0 -0
  67. package/client/assets/ProtectedCuesheet-C7AqD2dy.js.gz +0 -0
  68. package/client/assets/{ProtectedCuesheet-COI1W_V3.js.map → ProtectedCuesheet-C7AqD2dy.js.map} +1 -1
  69. package/client/assets/{ProtectedEditor-BvTFmv-F.js → ProtectedEditor-CsfvVyOU.js} +3 -3
  70. package/client/assets/ProtectedEditor-CsfvVyOU.js.br +0 -0
  71. package/client/assets/ProtectedEditor-CsfvVyOU.js.gz +0 -0
  72. package/client/assets/{ProtectedEditor-BvTFmv-F.js.map → ProtectedEditor-CsfvVyOU.js.map} +1 -1
  73. package/client/assets/{RundownExport-C_q3KYN_.js → RundownExport-25orDQIW.js} +2 -2
  74. package/client/assets/RundownExport-25orDQIW.js.br +0 -0
  75. package/client/assets/RundownExport-25orDQIW.js.gz +0 -0
  76. package/client/assets/{RundownExport-C_q3KYN_.js.map → RundownExport-25orDQIW.js.map} +1 -1
  77. package/client/assets/{Select-DQwYPDyI.js → Select-BnGTAeXJ.js} +2 -2
  78. package/client/assets/Select-BnGTAeXJ.js.br +0 -0
  79. package/client/assets/Select-BnGTAeXJ.js.gz +0 -0
  80. package/client/assets/{Select-DQwYPDyI.js.map → Select-BnGTAeXJ.js.map} +1 -1
  81. package/client/assets/{Studio-DzXTmBx4.js → Studio-BK2Klo_K.js} +2 -2
  82. package/client/assets/Studio-BK2Klo_K.js.br +0 -0
  83. package/client/assets/Studio-BK2Klo_K.js.gz +0 -0
  84. package/client/assets/{Studio-DzXTmBx4.js.map → Studio-BK2Klo_K.js.map} +1 -1
  85. package/client/assets/{StyleEditor-ClMEMaWh.js → StyleEditor-DIHQ1PUV.js} +2 -2
  86. package/client/assets/StyleEditor-DIHQ1PUV.js.br +0 -0
  87. package/client/assets/StyleEditor-DIHQ1PUV.js.gz +0 -0
  88. package/client/assets/{StyleEditor-ClMEMaWh.js.map → StyleEditor-DIHQ1PUV.js.map} +1 -1
  89. package/client/assets/{SuperscriptPeriod-CBiZU34J.js → SuperscriptPeriod-EEedc9rG.js} +2 -2
  90. package/client/assets/SuperscriptPeriod-EEedc9rG.js.br +0 -0
  91. package/client/assets/SuperscriptPeriod-EEedc9rG.js.gz +0 -0
  92. package/client/assets/{SuperscriptPeriod-CBiZU34J.js.map → SuperscriptPeriod-EEedc9rG.js.map} +1 -1
  93. package/client/assets/{SuperscriptTime-DP1CDlOX.js → SuperscriptTime-BVanhNvd.js} +2 -2
  94. package/client/assets/SuperscriptTime-BVanhNvd.js.br +0 -0
  95. package/client/assets/SuperscriptTime-BVanhNvd.js.gz +0 -0
  96. package/client/assets/{SuperscriptTime-DP1CDlOX.js.map → SuperscriptTime-BVanhNvd.js.map} +1 -1
  97. package/client/assets/{SwatchPicker-Dyxkxf3_.js → SwatchPicker-Ckpchvjo.js} +2 -2
  98. package/client/assets/SwatchPicker-Ckpchvjo.js.br +0 -0
  99. package/client/assets/SwatchPicker-Ckpchvjo.js.gz +0 -0
  100. package/client/assets/{SwatchPicker-Dyxkxf3_.js.map → SwatchPicker-Ckpchvjo.js.map} +1 -1
  101. package/client/assets/{TimeElements-pDYJeFbV.js → TimeElements-CYIgGk0T.js} +2 -2
  102. package/client/assets/TimeElements-CYIgGk0T.js.br +0 -0
  103. package/client/assets/TimeElements-CYIgGk0T.js.gz +0 -0
  104. package/client/assets/{TimeElements-pDYJeFbV.js.map → TimeElements-CYIgGk0T.js.map} +1 -1
  105. package/client/assets/{TimeInput-DTWDnaum.js → TimeInput-Cwl9vLWA.js} +2 -2
  106. package/client/assets/TimeInput-Cwl9vLWA.js.br +0 -0
  107. package/client/assets/TimeInput-Cwl9vLWA.js.gz +0 -0
  108. package/client/assets/{TimeInput-DTWDnaum.js.map → TimeInput-Cwl9vLWA.js.map} +1 -1
  109. package/client/assets/{TimelinePage-DbLt9rQi.js → TimelinePage-D4QNdk-Z.js} +2 -2
  110. package/client/assets/TimelinePage-D4QNdk-Z.js.br +0 -0
  111. package/client/assets/TimelinePage-D4QNdk-Z.js.gz +0 -0
  112. package/client/assets/{TimelinePage-DbLt9rQi.js.map → TimelinePage-D4QNdk-Z.js.map} +1 -1
  113. package/client/assets/{Timer-BfyVKQ8U.js → Timer-BJQKNHfo.js} +2 -2
  114. package/client/assets/Timer-BJQKNHfo.js.br +0 -0
  115. package/client/assets/Timer-BJQKNHfo.js.gz +0 -0
  116. package/client/assets/{Timer-BfyVKQ8U.js.map → Timer-BJQKNHfo.js.map} +1 -1
  117. package/client/assets/{TimerControlExport-BJfhJc07.js → TimerControlExport-Ba1vifNg.js} +2 -2
  118. package/client/assets/TimerControlExport-Ba1vifNg.js.br +0 -0
  119. package/client/assets/TimerControlExport-Ba1vifNg.js.gz +0 -0
  120. package/client/assets/{TimerControlExport-BJfhJc07.js.map → TimerControlExport-Ba1vifNg.js.map} +1 -1
  121. package/client/assets/{TimerDisplay-Dgmbqf65.js → TimerDisplay-tVcUk9j3.js} +2 -2
  122. package/client/assets/TimerDisplay-tVcUk9j3.js.br +0 -0
  123. package/client/assets/TimerDisplay-tVcUk9j3.js.gz +0 -0
  124. package/client/assets/{TimerDisplay-Dgmbqf65.js.map → TimerDisplay-tVcUk9j3.js.map} +1 -1
  125. package/client/assets/{TitleCard-MUurHeZ7.js → TitleCard-BNjv58eq.js} +2 -2
  126. package/client/assets/TitleCard-BNjv58eq.js.br +0 -0
  127. package/client/assets/TitleCard-BNjv58eq.js.gz +0 -0
  128. package/client/assets/{TitleCard-MUurHeZ7.js.map → TitleCard-BNjv58eq.js.map} +1 -1
  129. package/client/assets/{Tooltip-DXph8P8p.js → Tooltip-DZJ7u9gm.js} +2 -2
  130. package/client/assets/Tooltip-DZJ7u9gm.js.br +4 -0
  131. package/client/assets/Tooltip-DZJ7u9gm.js.gz +0 -0
  132. package/client/assets/{Tooltip-DXph8P8p.js.map → Tooltip-DZJ7u9gm.js.map} +1 -1
  133. package/client/assets/{ViewLogo-Ckp7i75x.js → ViewLogo-2I7w5Yms.js} +2 -2
  134. package/client/assets/ViewLogo-2I7w5Yms.js.br +0 -0
  135. package/client/assets/ViewLogo-2I7w5Yms.js.gz +0 -0
  136. package/client/assets/{ViewLogo-Ckp7i75x.js.map → ViewLogo-2I7w5Yms.js.map} +1 -1
  137. package/client/assets/{ViewParamsEditor-Cxngd15h.js → ViewParamsEditor-BX2RM8sx.js} +2 -2
  138. package/client/assets/ViewParamsEditor-BX2RM8sx.js.br +0 -0
  139. package/client/assets/ViewParamsEditor-BX2RM8sx.js.gz +0 -0
  140. package/client/assets/{ViewParamsEditor-Cxngd15h.js.map → ViewParamsEditor-BX2RM8sx.js.map} +1 -1
  141. package/client/assets/{editorSettings-D4jfu68W.js → editorSettings-_x6YKRfR.js} +2 -2
  142. package/client/assets/editorSettings-_x6YKRfR.js.br +6 -0
  143. package/client/assets/editorSettings-_x6YKRfR.js.gz +0 -0
  144. package/client/assets/{editorSettings-D4jfu68W.js.map → editorSettings-_x6YKRfR.js.map} +1 -1
  145. package/client/assets/{getProgress-B9UANc25.js → getProgress-ZUTmCn_v.js} +2 -2
  146. package/client/assets/getProgress-ZUTmCn_v.js.br +0 -0
  147. package/client/assets/getProgress-ZUTmCn_v.js.gz +0 -0
  148. package/client/assets/{getProgress-B9UANc25.js.map → getProgress-ZUTmCn_v.js.map} +1 -1
  149. package/client/assets/{index-2lQ-45a9.js → index-Dm-4OTmY.js} +3 -3
  150. package/client/assets/index-Dm-4OTmY.js.br +0 -0
  151. package/client/assets/index-Dm-4OTmY.js.gz +0 -0
  152. package/client/assets/{index-2lQ-45a9.js.map → index-Dm-4OTmY.js.map} +1 -1
  153. package/client/assets/{offset-DAyBfv5b.js → offset-VthsmtrO.js} +2 -2
  154. package/client/assets/offset-VthsmtrO.js.br +0 -0
  155. package/client/assets/offset-VthsmtrO.js.gz +0 -0
  156. package/client/assets/{offset-DAyBfv5b.js.map → offset-VthsmtrO.js.map} +1 -1
  157. package/client/assets/{parseUserTime-WkVNjkkE.js → parseUserTime-sZbEBi61.js} +2 -2
  158. package/client/assets/parseUserTime-sZbEBi61.js.br +0 -0
  159. package/client/assets/parseUserTime-sZbEBi61.js.gz +0 -0
  160. package/client/assets/{parseUserTime-WkVNjkkE.js.map → parseUserTime-sZbEBi61.js.map} +1 -1
  161. package/client/assets/{playbackstate-znZk3SSJ.js → playbackstate-Dl_ZJABT.js} +2 -2
  162. package/client/assets/playbackstate-Dl_ZJABT.js.br +0 -0
  163. package/client/assets/playbackstate-Dl_ZJABT.js.gz +0 -0
  164. package/client/assets/{playbackstate-znZk3SSJ.js.map → playbackstate-Dl_ZJABT.js.map} +1 -1
  165. package/client/assets/{presentation.utils-CjjYs5II.js → presentation.utils-Z61KykAH.js} +2 -2
  166. package/client/assets/presentation.utils-Z61KykAH.js.br +0 -0
  167. package/client/assets/presentation.utils-Z61KykAH.js.gz +0 -0
  168. package/client/assets/{presentation.utils-CjjYs5II.js.map → presentation.utils-Z61KykAH.js.map} +1 -1
  169. package/client/assets/{rundownUtils-BTQ3EeqN.js → rundownUtils-CXZRD6yP.js} +2 -2
  170. package/client/assets/rundownUtils-CXZRD6yP.js.br +0 -0
  171. package/client/assets/rundownUtils-CXZRD6yP.js.gz +0 -0
  172. package/client/assets/{rundownUtils-BTQ3EeqN.js.map → rundownUtils-CXZRD6yP.js.map} +1 -1
  173. package/client/assets/timer.utils-B4bvsns3.js +2 -0
  174. package/client/assets/timer.utils-B4bvsns3.js.br +0 -0
  175. package/client/assets/timer.utils-B4bvsns3.js.gz +0 -0
  176. package/client/assets/{timer.utils-B-Ui91P7.js.map → timer.utils-B4bvsns3.js.map} +1 -1
  177. package/client/assets/{useCustomFields-zr9SUl5o.js → useCustomFields-BBE4LBBr.js} +2 -2
  178. package/client/assets/useCustomFields-BBE4LBBr.js.br +0 -0
  179. package/client/assets/useCustomFields-BBE4LBBr.js.gz +0 -0
  180. package/client/assets/{useCustomFields-zr9SUl5o.js.map → useCustomFields-BBE4LBBr.js.map} +1 -1
  181. package/client/assets/{useEventSelection-B9mbj1cM.js → useEventSelection-Bpbu89c7.js} +2 -2
  182. package/client/assets/useEventSelection-Bpbu89c7.js.br +0 -0
  183. package/client/assets/useEventSelection-Bpbu89c7.js.gz +0 -0
  184. package/client/assets/{useEventSelection-B9mbj1cM.js.map → useEventSelection-Bpbu89c7.js.map} +1 -1
  185. package/client/assets/{useProjectData-DD_BQ9eJ.js → useProjectData-C110zIXC.js} +2 -2
  186. package/client/assets/useProjectData-C110zIXC.js.br +0 -0
  187. package/client/assets/useProjectData-C110zIXC.js.gz +0 -0
  188. package/client/assets/{useProjectData-DD_BQ9eJ.js.map → useProjectData-C110zIXC.js.map} +1 -1
  189. package/client/assets/{useReport-DozG5uz5.js → useReport-DqSBq4MG.js} +2 -2
  190. package/client/assets/useReport-DqSBq4MG.js.br +0 -0
  191. package/client/assets/useReport-DqSBq4MG.js.gz +0 -0
  192. package/client/assets/{useReport-DozG5uz5.js.map → useReport-DqSBq4MG.js.map} +1 -1
  193. package/client/assets/{useRundown-D6vokFHi.js → useRundown-DAo6huE4.js} +2 -2
  194. package/client/assets/useRundown-DAo6huE4.js.br +0 -0
  195. package/client/assets/useRundown-DAo6huE4.js.gz +0 -0
  196. package/client/assets/{useRundown-D6vokFHi.js.map → useRundown-DAo6huE4.js.map} +1 -1
  197. package/client/assets/{useSelectAndRevealEntry-Dd6MpVHe.js → useSelectAndRevealEntry-DTg0hmxA.js} +2 -2
  198. package/client/assets/useSelectAndRevealEntry-DTg0hmxA.js.br +0 -0
  199. package/client/assets/useSelectAndRevealEntry-DTg0hmxA.js.gz +0 -0
  200. package/client/assets/{useSelectAndRevealEntry-Dd6MpVHe.js.map → useSelectAndRevealEntry-DTg0hmxA.js.map} +1 -1
  201. package/client/assets/{useWindowTitle-bg-fLPOk.js → useWindowTitle-DM8dIp8L.js} +2 -2
  202. package/client/assets/useWindowTitle-DM8dIp8L.js.br +0 -0
  203. package/client/assets/useWindowTitle-DM8dIp8L.js.gz +0 -0
  204. package/client/assets/{useWindowTitle-bg-fLPOk.js.map → useWindowTitle-DM8dIp8L.js.map} +1 -1
  205. package/client/assets/{validateEvent-BUgLWn7x.js → validateEvent-GnPt-e9-.js} +2 -2
  206. package/client/assets/validateEvent-GnPt-e9-.js.br +0 -0
  207. package/client/assets/validateEvent-GnPt-e9-.js.gz +0 -0
  208. package/client/assets/{validateEvent-BUgLWn7x.js.map → validateEvent-GnPt-e9-.js.map} +1 -1
  209. package/client/assets/{vendor-CKDP5hij.js → vendor-BKUJ0_Du.js} +2 -2
  210. package/client/assets/vendor-BKUJ0_Du.js.br +0 -0
  211. package/client/assets/{vendor-CKDP5hij.js.gz → vendor-BKUJ0_Du.js.gz} +0 -0
  212. package/client/assets/{vendor-CKDP5hij.js.map → vendor-BKUJ0_Du.js.map} +1 -1
  213. package/client/assets/{viewLoader.utils-Bn5zu5sz.js → viewLoader.utils-4lL4PiNI.js} +2 -2
  214. package/client/assets/viewLoader.utils-4lL4PiNI.js.br +0 -0
  215. package/client/assets/viewLoader.utils-4lL4PiNI.js.gz +0 -0
  216. package/client/assets/{viewLoader.utils-Bn5zu5sz.js.map → viewLoader.utils-4lL4PiNI.js.map} +1 -1
  217. package/client/assets/{viewUtils-DQFwr7hm.js → viewUtils-29a3Mmiu.js} +2 -2
  218. package/client/assets/viewUtils-29a3Mmiu.js.br +0 -0
  219. package/client/assets/viewUtils-29a3Mmiu.js.gz +0 -0
  220. package/client/assets/{viewUtils-DQFwr7hm.js.map → viewUtils-29a3Mmiu.js.map} +1 -1
  221. package/client/index.html +2 -2
  222. package/package.json +1 -1
  223. package/server/index.cjs +1 -1
  224. package/client/assets/Backstage-BY9GL_rk.js.br +0 -0
  225. package/client/assets/Backstage-BY9GL_rk.js.gz +0 -0
  226. package/client/assets/Countdown-CXFgDHND.js.br +0 -0
  227. package/client/assets/Countdown-CXFgDHND.js.gz +0 -0
  228. package/client/assets/CuesheetTable-BLICUNky.js.br +0 -0
  229. package/client/assets/CuesheetTable-BLICUNky.js.gz +0 -0
  230. package/client/assets/CustomTranslationModal-4PVZBtkC.js.br +0 -0
  231. package/client/assets/CustomTranslationModal-4PVZBtkC.js.gz +0 -0
  232. package/client/assets/DelayIndicator-DUbpd6DG.js.br +0 -0
  233. package/client/assets/DelayIndicator-DUbpd6DG.js.gz +0 -0
  234. package/client/assets/EditorFeatureWrapper-CV_zaDoG.js.br +0 -0
  235. package/client/assets/EditorFeatureWrapper-CV_zaDoG.js.gz +0 -0
  236. package/client/assets/EditorUtils-CLBWDP4k.js.br +0 -0
  237. package/client/assets/EditorUtils-CLBWDP4k.js.gz +0 -0
  238. package/client/assets/EmptyPage-DmpOAg7R.js.br +0 -2
  239. package/client/assets/EmptyPage-DmpOAg7R.js.gz +0 -0
  240. package/client/assets/FollowButton-CAUWz5Ma.js.br +0 -0
  241. package/client/assets/FollowButton-CAUWz5Ma.js.gz +0 -0
  242. package/client/assets/MessageControlExport-Dm8IjSr4.js.br +0 -0
  243. package/client/assets/MessageControlExport-Dm8IjSr4.js.gz +0 -0
  244. package/client/assets/MultiPartProgressBar-Fp-sTN2u.js.br +0 -0
  245. package/client/assets/MultiPartProgressBar-Fp-sTN2u.js.gz +0 -0
  246. package/client/assets/OperatorExport-CE4ajLPS.js.br +0 -0
  247. package/client/assets/OperatorExport-CE4ajLPS.js.gz +0 -0
  248. package/client/assets/OverviewWrapper-BNnAIUP1.js.br +0 -0
  249. package/client/assets/OverviewWrapper-BNnAIUP1.js.gz +0 -0
  250. package/client/assets/PipHost-CbNFsfqp.js.br +0 -0
  251. package/client/assets/PipHost-CbNFsfqp.js.gz +0 -0
  252. package/client/assets/ProjectInfo-Bf5z4Xsv.js.br +0 -0
  253. package/client/assets/ProjectInfo-Bf5z4Xsv.js.gz +0 -0
  254. package/client/assets/ProtectRoute-CCHzyy0I.js.br +0 -0
  255. package/client/assets/ProtectRoute-CCHzyy0I.js.gz +0 -0
  256. package/client/assets/ProtectedCuesheet-COI1W_V3.js.br +0 -0
  257. package/client/assets/ProtectedCuesheet-COI1W_V3.js.gz +0 -0
  258. package/client/assets/ProtectedEditor-BvTFmv-F.js.br +0 -0
  259. package/client/assets/ProtectedEditor-BvTFmv-F.js.gz +0 -0
  260. package/client/assets/RundownExport-C_q3KYN_.js.br +0 -0
  261. package/client/assets/RundownExport-C_q3KYN_.js.gz +0 -0
  262. package/client/assets/Select-DQwYPDyI.js.br +0 -0
  263. package/client/assets/Select-DQwYPDyI.js.gz +0 -0
  264. package/client/assets/Studio-DzXTmBx4.js.br +0 -0
  265. package/client/assets/Studio-DzXTmBx4.js.gz +0 -0
  266. package/client/assets/StyleEditor-ClMEMaWh.js.br +0 -0
  267. package/client/assets/StyleEditor-ClMEMaWh.js.gz +0 -0
  268. package/client/assets/SuperscriptPeriod-CBiZU34J.js.br +0 -0
  269. package/client/assets/SuperscriptPeriod-CBiZU34J.js.gz +0 -0
  270. package/client/assets/SuperscriptTime-DP1CDlOX.js.br +0 -0
  271. package/client/assets/SuperscriptTime-DP1CDlOX.js.gz +0 -0
  272. package/client/assets/SwatchPicker-Dyxkxf3_.js.br +0 -0
  273. package/client/assets/SwatchPicker-Dyxkxf3_.js.gz +0 -0
  274. package/client/assets/TimeElements-pDYJeFbV.js.br +0 -0
  275. package/client/assets/TimeElements-pDYJeFbV.js.gz +0 -0
  276. package/client/assets/TimeInput-DTWDnaum.js.br +0 -0
  277. package/client/assets/TimeInput-DTWDnaum.js.gz +0 -0
  278. package/client/assets/TimelinePage-DbLt9rQi.js.br +0 -0
  279. package/client/assets/TimelinePage-DbLt9rQi.js.gz +0 -0
  280. package/client/assets/Timer-BfyVKQ8U.js.br +0 -0
  281. package/client/assets/Timer-BfyVKQ8U.js.gz +0 -0
  282. package/client/assets/TimerControlExport-BJfhJc07.js.br +0 -0
  283. package/client/assets/TimerControlExport-BJfhJc07.js.gz +0 -0
  284. package/client/assets/TimerDisplay-Dgmbqf65.js.br +0 -0
  285. package/client/assets/TimerDisplay-Dgmbqf65.js.gz +0 -0
  286. package/client/assets/TitleCard-MUurHeZ7.js.br +0 -0
  287. package/client/assets/TitleCard-MUurHeZ7.js.gz +0 -0
  288. package/client/assets/Tooltip-DXph8P8p.js.br +0 -0
  289. package/client/assets/Tooltip-DXph8P8p.js.gz +0 -0
  290. package/client/assets/ViewLogo-Ckp7i75x.js.br +0 -0
  291. package/client/assets/ViewLogo-Ckp7i75x.js.gz +0 -0
  292. package/client/assets/ViewParamsEditor-Cxngd15h.js.br +0 -0
  293. package/client/assets/ViewParamsEditor-Cxngd15h.js.gz +0 -0
  294. package/client/assets/editorSettings-D4jfu68W.js.br +0 -0
  295. package/client/assets/editorSettings-D4jfu68W.js.gz +0 -0
  296. package/client/assets/getProgress-B9UANc25.js.br +0 -0
  297. package/client/assets/getProgress-B9UANc25.js.gz +0 -0
  298. package/client/assets/index-2lQ-45a9.js.br +0 -0
  299. package/client/assets/index-2lQ-45a9.js.gz +0 -0
  300. package/client/assets/offset-DAyBfv5b.js.br +0 -4
  301. package/client/assets/offset-DAyBfv5b.js.gz +0 -0
  302. package/client/assets/parseUserTime-WkVNjkkE.js.br +0 -0
  303. package/client/assets/parseUserTime-WkVNjkkE.js.gz +0 -0
  304. package/client/assets/playbackstate-znZk3SSJ.js.br +0 -0
  305. package/client/assets/playbackstate-znZk3SSJ.js.gz +0 -0
  306. package/client/assets/presentation.utils-CjjYs5II.js.br +0 -0
  307. package/client/assets/presentation.utils-CjjYs5II.js.gz +0 -0
  308. package/client/assets/rundownUtils-BTQ3EeqN.js.br +0 -0
  309. package/client/assets/rundownUtils-BTQ3EeqN.js.gz +0 -0
  310. package/client/assets/timer.utils-B-Ui91P7.js +0 -2
  311. package/client/assets/timer.utils-B-Ui91P7.js.br +0 -0
  312. package/client/assets/timer.utils-B-Ui91P7.js.gz +0 -0
  313. package/client/assets/useCustomFields-zr9SUl5o.js.br +0 -0
  314. package/client/assets/useCustomFields-zr9SUl5o.js.gz +0 -0
  315. package/client/assets/useEventSelection-B9mbj1cM.js.br +0 -0
  316. package/client/assets/useEventSelection-B9mbj1cM.js.gz +0 -0
  317. package/client/assets/useProjectData-DD_BQ9eJ.js.br +0 -0
  318. package/client/assets/useProjectData-DD_BQ9eJ.js.gz +0 -0
  319. package/client/assets/useReport-DozG5uz5.js.br +0 -0
  320. package/client/assets/useReport-DozG5uz5.js.gz +0 -0
  321. package/client/assets/useRundown-D6vokFHi.js.br +0 -0
  322. package/client/assets/useRundown-D6vokFHi.js.gz +0 -0
  323. package/client/assets/useSelectAndRevealEntry-Dd6MpVHe.js.br +0 -0
  324. package/client/assets/useSelectAndRevealEntry-Dd6MpVHe.js.gz +0 -0
  325. package/client/assets/useWindowTitle-bg-fLPOk.js.br +0 -0
  326. package/client/assets/useWindowTitle-bg-fLPOk.js.gz +0 -0
  327. package/client/assets/validateEvent-BUgLWn7x.js.br +0 -0
  328. package/client/assets/validateEvent-BUgLWn7x.js.gz +0 -0
  329. package/client/assets/vendor-CKDP5hij.js.br +0 -0
  330. package/client/assets/viewLoader.utils-Bn5zu5sz.js.br +0 -0
  331. package/client/assets/viewLoader.utils-Bn5zu5sz.js.gz +0 -0
  332. package/client/assets/viewUtils-DQFwr7hm.js.br +0 -0
  333. package/client/assets/viewUtils-DQFwr7hm.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Timer-BfyVKQ8U.js","sources":["../../src/views/timer/timer.options.ts","../../src/views/timer/useTimerData.ts","../../src/views/timer/Timer.tsx"],"sourcesContent":["import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, TimerType } from 'ontime-types';\nimport { validateTimerType } from 'ontime-utils';\n\nimport type { SelectOption } from '../../common/components/select/Select';\nimport {\n getTimeOption,\n hideTimerSeconds,\n showLeadingZeros,\n} from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport { makeOptionsFromCustomFields } from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean, makeColourString } from '../common/viewUtils';\n\n// manually match the properties of TimerType excluding the None\nconst timerDisplayOptions: SelectOption[] = [\n { value: 'no-overrides', label: 'No Overrides' },\n { value: TimerType.CountUp, label: 'Count Up' },\n { value: TimerType.CountDown, label: 'Count Down' },\n { value: TimerType.Clock, label: 'Clock' },\n];\n\nexport const getTimerOptions = (timeFormat: string, customFields: CustomFields): ViewOption[] => {\n const mainOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n ]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n { value: 'parent', label: 'Group Title' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.TimerOptions,\n collapsible: true,\n options: [\n hideTimerSeconds,\n showLeadingZeros,\n {\n id: 'timerType',\n title: 'Timer type',\n description: 'Override the timer type',\n type: 'option',\n values: timerDisplayOptions,\n defaultValue: 'no-overrides',\n },\n {\n id: 'freezeOvertime',\n title: 'Freeze Overtime',\n description: 'If active, the timer will not count into negative numbers',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'freezeMessage',\n title: 'Freeze Message',\n description:\n 'An optional message to show when the timer is in overtime (must be set in combination with Freeze Overtime)',\n type: 'string',\n defaultValue: '',\n placeholder: 'e.g. Time is up!',\n },\n {\n id: 'hidePhase',\n title: 'Hide progress styles',\n description: 'Whether to suppress the progress styles (warning, danger and overtime)',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main text',\n description: 'Select the data source for the main text',\n type: 'option',\n values: mainOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary text',\n description: 'Select the data source for the secondary text',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hideClock',\n title: 'Hide Time Now',\n description: 'Hides the Time Now field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideCards',\n title: 'Hide Cards',\n description: 'Hides the Now and Next cards',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideProgress',\n title: 'Hide progress bar',\n description: 'Hides the progress bar',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideMessage',\n title: 'Hide Timer Message',\n description: 'Prevents displaying fullscreen messages in the timer',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideSecondary',\n title: 'Hide Auxiliary timer / Secondary message',\n description: 'Prevents the screen from displaying the secondary timer field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideLogo',\n title: 'Hide the project logo',\n description: 'Prevents the screen from displaying the given project logo',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.StyleOverride,\n collapsible: true,\n options: [\n {\n id: 'font',\n title: 'Font',\n description: 'Font family, will use the fonts available in the system',\n type: 'string',\n placeholder: 'Open Sans (default)',\n },\n {\n id: 'keyColour',\n title: 'Key Colour',\n description: 'Background or key colour for entire view. Default: #101010',\n type: 'colour',\n defaultValue: '101010',\n },\n {\n id: 'timerColour',\n title: 'Timer Colour',\n description: 'Timer colour. Default: #f6f6f6',\n type: 'colour',\n defaultValue: 'f6f6f6',\n },\n ],\n },\n ];\n};\n\ntype TimerOptions = {\n hideClock: boolean;\n hideCards: boolean;\n hideProgress: boolean;\n hideMessage: boolean;\n hideSecondary: boolean;\n hideLogo: boolean;\n hideTimerSeconds: boolean;\n removeLeadingZeros: boolean;\n mainSource: keyof OntimeEvent | null | 'none';\n secondarySource: keyof OntimeEvent | null | 'none';\n timerType?: TimerType;\n freezeOvertime: boolean;\n freezeMessage: string;\n hidePhase: boolean;\n font?: string;\n keyColour?: string;\n timerColour?: string;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallbacks are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): TimerOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Get timerType from either source\n const timerType = validateTimerType(getValue('timerType'), TimerType.None);\n\n return {\n hideClock: isStringBoolean(getValue('hideClock')),\n hideCards: isStringBoolean(getValue('hideCards')),\n hideProgress: isStringBoolean(getValue('hideProgress')),\n hideMessage: isStringBoolean(getValue('hideMessage')),\n hideSecondary: isStringBoolean(getValue('hideSecondary')),\n hideLogo: isStringBoolean(getValue('hideLogo')),\n hideTimerSeconds: isStringBoolean(getValue('hideTimerSeconds')),\n removeLeadingZeros: !isStringBoolean(getValue('showLeadingZeros')),\n\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n\n // none doesnt make sense as a configuration of the view\n timerType: timerType === TimerType.None ? undefined : timerType,\n freezeOvertime: isStringBoolean(getValue('freezeOvertime')),\n freezeMessage: getValue('freezeMessage') ?? '',\n hidePhase: isStringBoolean(getValue('hidePhase')),\n\n font: getValue('font') ?? undefined,\n keyColour: makeColourString(getValue('keyColour')),\n timerColour: makeColourString(getValue('timerColour')),\n };\n}\n\n/**\n * Hook exposes the timer view options\n */\nexport function useTimerOptions(): TimerOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { CustomFields, ProjectData, RundownEntries, Settings, ViewSettings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport useRundown from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport useViewSettings from '../../common/hooks-query/useViewSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface TimerData {\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n viewSettings: ViewSettings;\n entries: RundownEntries;\n}\n\nexport function useTimerData(): ViewData<TimerData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: viewSettings, status: viewSettingsStatus } = useViewSettings();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n const { data: rundown, status: rundownStatus } = useRundown();\n const { entries } = rundown;\n\n return {\n data: {\n customFields,\n projectData,\n isMirrored,\n settings,\n viewSettings,\n entries,\n },\n status: aggregateQueryStatus([\n projectDataStatus,\n viewSettingsStatus,\n settingsStatus,\n customFieldsStatus,\n rundownStatus,\n ]),\n };\n}\n","import { useMemo } from 'react';\nimport { OntimeView, TimerType } from 'ontime-types';\n\nimport { FitText } from '../../common/components/fit-text/FitText';\nimport MultiPartProgressBar from '../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport TitleCard from '../../common/components/title-card/TitleCard';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useTimerSocket } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport SuperscriptTime from '../common/superscript-time/SuperscriptTime';\nimport { getFormattedTimer, getTimerByType } from '../common/viewUtils';\nimport { getTimerColour } from '../utils/presentation.utils';\n\nimport { getTimerOptions, useTimerOptions } from './timer.options';\nimport {\n getCardData,\n getEstimatedFontSize,\n getIsPlaying,\n getSecondaryDisplay,\n getShowClock,\n getShowMessage,\n getShowModifiers,\n getShowProgressBar,\n getTotalTime,\n} from './timer.utils';\nimport { TimerData, useTimerData } from './useTimerData';\n\nimport './Timer.scss';\n\nexport default function TimerLoader() {\n const { data, status } = useTimerData();\n\n useWindowTitle('Timer');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Timer {...data} />;\n}\n\nfunction Timer({ customFields, projectData, isMirrored, settings, viewSettings, entries }: TimerData) {\n const { eventNext, eventNow, message, time, clock, timerTypeNow, countToEndNow, auxTimer } = useTimerSocket();\n const {\n hideClock,\n hideCards,\n hideProgress,\n hideMessage,\n hideSecondary,\n hideLogo,\n hideTimerSeconds,\n removeLeadingZeros,\n mainSource,\n secondarySource,\n timerType,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n font,\n keyColour,\n timerColour,\n } = useTimerOptions();\n\n const { getLocalizedString } = useTranslation();\n const localisedMinutes = getLocalizedString('common.minutes');\n\n // gather modifiers\n const viewTimerType = timerType ?? timerTypeNow;\n const showOverlay = getShowMessage(message.timer);\n const { showEndMessage, showFinished, showWarning, showDanger } = getShowModifiers(\n timerTypeNow,\n countToEndNow,\n time.phase,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n );\n const isPlaying = getIsPlaying(time.playback);\n const showClock = !hideClock && getShowClock(viewTimerType);\n const showProgressBar = !hideProgress && getShowProgressBar(viewTimerType);\n\n // gather card data\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n mainSource,\n secondarySource,\n time.playback,\n time.phase,\n entries,\n );\n\n // gather timer data\n const totalTime = getTotalTime(time.duration, time.addedTime);\n const formattedClock = formatTime(clock);\n const stageTimer = getTimerByType(freezeOvertime, timerTypeNow, clock, time, timerType);\n const display = getFormattedTimer(stageTimer, viewTimerType, localisedMinutes, {\n removeSeconds: hideTimerSeconds,\n removeLeadingZero: removeLeadingZeros,\n });\n\n const currentAux = (() => {\n if (message.timer.secondarySource === 'aux1') {\n return auxTimer.aux1;\n }\n if (message.timer.secondarySource === 'aux2') {\n return auxTimer.aux2;\n }\n if (message.timer.secondarySource === 'aux3') {\n return auxTimer.aux3;\n }\n return null;\n })();\n\n const secondaryContent = getSecondaryDisplay(\n message,\n currentAux,\n localisedMinutes,\n hideTimerSeconds,\n removeLeadingZeros,\n hideSecondary,\n );\n\n // gather presentation styles\n const resolvedTimerColour = getTimerColour(viewSettings, timerColour, showWarning, showDanger);\n const timerFontSize = getEstimatedFontSize(display, secondaryContent);\n const subduePaused = !isPlaying && viewTimerType !== TimerType.Clock;\n const userStyles = {\n ...(keyColour && { '--timer-bg': keyColour }),\n ...(resolvedTimerColour && { '--timer-colour': resolvedTimerColour }),\n ...(font && { '--timer-font': font }),\n };\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const timerOptions = useMemo(() => getTimerOptions(defaultFormat, customFields), [customFields, defaultFormat]);\n\n return (\n <div\n data-testid='timer-view'\n className={cx(['stage-timer', isMirrored && 'mirror', showFinished && 'stage-timer--finished'])}\n style={userStyles}\n >\n {!hideLogo && projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n\n <ViewParamsEditor target={OntimeView.Timer} viewOptions={timerOptions} />\n\n <div className={cx(['blackout', message.timer.blackout && 'blackout--active'])} />\n\n {!hideMessage && (\n <div className={cx(['message-overlay', showOverlay && 'message-overlay--active'])}>\n <FitText mode='multi' min={32} max={256} className={cx(['message', message.timer.blink && 'blink'])}>\n {message.timer.text}\n </FitText>\n </div>\n )}\n\n {showClock && (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='clock' />\n </div>\n )}\n\n <div className={cx(['timer-container', message.timer.blink && !showOverlay && 'blink'])}>\n {showEndMessage ? (\n <FitText mode='multi' min={64} max={256} className='end-message'>\n {freezeMessage}\n </FitText>\n ) : (\n <div\n className={cx(['timer', subduePaused && 'timer--paused', showFinished && 'timer--finished'])}\n style={{ fontSize: `${timerFontSize}vw` }}\n data-type={viewTimerType}\n data-phase={time.phase}\n >\n {display}\n </div>\n )}\n <div className={cx(['secondary', !secondaryContent && 'secondary--hidden'])}>\n <FitText mode='multi' min={64} max={256}>\n {secondaryContent}\n </FitText>\n </div>\n </div>\n\n {showProgressBar && (\n <MultiPartProgressBar\n className={cx(['progress-container', !isPlaying && 'progress-container--paused'])}\n now={time.current}\n complete={totalTime}\n normalColor={viewSettings.normalColor}\n warning={eventNow?.timeWarning}\n warningColor={viewSettings.warningColor}\n danger={eventNow?.timeDanger}\n dangerColor={viewSettings.dangerColor}\n hideOvertime={!showFinished}\n />\n )}\n\n {!hideCards && (\n <>\n {showNow && <TitleCard className='event now' label='now' title={nowMain} secondary={nowSecondary} />}\n {showNext && <TitleCard className='event next' label='next' title={nextMain} secondary={nextSecondary} />}\n </>\n )}\n </div>\n );\n}\n"],"names":["timerDisplayOptions","value","label","TimerType","CountUp","CountDown","Clock","getTimerOptions","timeFormat","customFields","mainOptions","makeOptionsFromCustomFields","secondaryOptions","title","OptionTitle","ClockOptions","collapsible","options","getTimeOption","TimerOptions","hideTimerSeconds","showLeadingZeros","id","description","type","values","defaultValue","placeholder","DataSources","ElementVisibility","StyleOverride","getOptionsFromParams","searchParams","defaultValues","getValue","key","get","timerType","validateTimerType","None","hideClock","isStringBoolean","hideCards","hideProgress","hideMessage","hideSecondary","hideLogo","removeLeadingZeros","mainSource","secondarySource","undefined","freezeOvertime","freezeMessage","hidePhase","font","keyColour","makeColourString","timerColour","useTimerOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","URLSearchParams","search","useTimerData","isMirrored","useViewOptionsStore","state","mirror","data","projectData","status","projectDataStatus","useProjectData","viewSettings","viewSettingsStatus","useViewSettings","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","rundown","rundownStatus","useRundown","entries","aggregateQueryStatus","TimerLoader","useWindowTitle","Loader","jsx","EmptyPage","Timer","eventNext","eventNow","message","time","clock","timerTypeNow","countToEndNow","auxTimer","useTimerSocket","getLocalizedString","useTranslation","localisedMinutes","viewTimerType","showOverlay","getShowMessage","timer","showEndMessage","showFinished","showWarning","showDanger","getShowModifiers","phase","isPlaying","getIsPlaying","playback","showClock","getShowClock","showProgressBar","getShowProgressBar","showNow","nowMain","nowSecondary","showNext","nextMain","nextSecondary","getCardData","totalTime","getTotalTime","duration","addedTime","formattedClock","formatTime","stageTimer","getTimerByType","display","getFormattedTimer","removeSeconds","removeLeadingZero","currentAux","aux1","aux2","aux3","secondaryContent","getSecondaryDisplay","resolvedTimerColour","getTimerColour","timerFontSize","getEstimatedFontSize","subduePaused","userStyles","defaultFormat","getDefaultFormat","timerOptions","jsxs","cx","logo","ViewLogo","ViewParamsEditor","OntimeView","blackout","FitText","blink","text","SuperscriptTime","fontSize","MultiPartProgressBar","current","normalColor","timeWarning","warningColor","timeDanger","dangerColor","TitleCard"],"mappings":"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"}
1
+ {"version":3,"file":"Timer-BJQKNHfo.js","sources":["../../src/views/timer/timer.options.ts","../../src/views/timer/useTimerData.ts","../../src/views/timer/Timer.tsx"],"sourcesContent":["import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, TimerType } from 'ontime-types';\nimport { validateTimerType } from 'ontime-utils';\n\nimport type { SelectOption } from '../../common/components/select/Select';\nimport {\n getTimeOption,\n hideTimerSeconds,\n showLeadingZeros,\n} from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport { makeOptionsFromCustomFields } from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean, makeColourString } from '../common/viewUtils';\n\n// manually match the properties of TimerType excluding the None\nconst timerDisplayOptions: SelectOption[] = [\n { value: 'no-overrides', label: 'No Overrides' },\n { value: TimerType.CountUp, label: 'Count Up' },\n { value: TimerType.CountDown, label: 'Count Down' },\n { value: TimerType.Clock, label: 'Clock' },\n];\n\nexport const getTimerOptions = (timeFormat: string, customFields: CustomFields): ViewOption[] => {\n const mainOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n ]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n { value: 'parent', label: 'Group Title' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.TimerOptions,\n collapsible: true,\n options: [\n hideTimerSeconds,\n showLeadingZeros,\n {\n id: 'timerType',\n title: 'Timer type',\n description: 'Override the timer type',\n type: 'option',\n values: timerDisplayOptions,\n defaultValue: 'no-overrides',\n },\n {\n id: 'freezeOvertime',\n title: 'Freeze Overtime',\n description: 'If active, the timer will not count into negative numbers',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'freezeMessage',\n title: 'Freeze Message',\n description:\n 'An optional message to show when the timer is in overtime (must be set in combination with Freeze Overtime)',\n type: 'string',\n defaultValue: '',\n placeholder: 'e.g. Time is up!',\n },\n {\n id: 'hidePhase',\n title: 'Hide progress styles',\n description: 'Whether to suppress the progress styles (warning, danger and overtime)',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main text',\n description: 'Select the data source for the main text',\n type: 'option',\n values: mainOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary text',\n description: 'Select the data source for the secondary text',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hideClock',\n title: 'Hide Time Now',\n description: 'Hides the Time Now field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideCards',\n title: 'Hide Cards',\n description: 'Hides the Now and Next cards',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideProgress',\n title: 'Hide progress bar',\n description: 'Hides the progress bar',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideMessage',\n title: 'Hide Timer Message',\n description: 'Prevents displaying fullscreen messages in the timer',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideSecondary',\n title: 'Hide Auxiliary timer / Secondary message',\n description: 'Prevents the screen from displaying the secondary timer field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideLogo',\n title: 'Hide the project logo',\n description: 'Prevents the screen from displaying the given project logo',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.StyleOverride,\n collapsible: true,\n options: [\n {\n id: 'font',\n title: 'Font',\n description: 'Font family, will use the fonts available in the system',\n type: 'string',\n placeholder: 'Open Sans (default)',\n },\n {\n id: 'keyColour',\n title: 'Key Colour',\n description: 'Background or key colour for entire view. Default: #101010',\n type: 'colour',\n defaultValue: '101010',\n },\n {\n id: 'timerColour',\n title: 'Timer Colour',\n description: 'Timer colour. Default: #f6f6f6',\n type: 'colour',\n defaultValue: 'f6f6f6',\n },\n ],\n },\n ];\n};\n\ntype TimerOptions = {\n hideClock: boolean;\n hideCards: boolean;\n hideProgress: boolean;\n hideMessage: boolean;\n hideSecondary: boolean;\n hideLogo: boolean;\n hideTimerSeconds: boolean;\n removeLeadingZeros: boolean;\n mainSource: keyof OntimeEvent | null | 'none';\n secondarySource: keyof OntimeEvent | null | 'none';\n timerType?: TimerType;\n freezeOvertime: boolean;\n freezeMessage: string;\n hidePhase: boolean;\n font?: string;\n keyColour?: string;\n timerColour?: string;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallbacks are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): TimerOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Get timerType from either source\n const timerType = validateTimerType(getValue('timerType'), TimerType.None);\n\n return {\n hideClock: isStringBoolean(getValue('hideClock')),\n hideCards: isStringBoolean(getValue('hideCards')),\n hideProgress: isStringBoolean(getValue('hideProgress')),\n hideMessage: isStringBoolean(getValue('hideMessage')),\n hideSecondary: isStringBoolean(getValue('hideSecondary')),\n hideLogo: isStringBoolean(getValue('hideLogo')),\n hideTimerSeconds: isStringBoolean(getValue('hideTimerSeconds')),\n removeLeadingZeros: !isStringBoolean(getValue('showLeadingZeros')),\n\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n\n // none doesnt make sense as a configuration of the view\n timerType: timerType === TimerType.None ? undefined : timerType,\n freezeOvertime: isStringBoolean(getValue('freezeOvertime')),\n freezeMessage: getValue('freezeMessage') ?? '',\n hidePhase: isStringBoolean(getValue('hidePhase')),\n\n font: getValue('font') ?? undefined,\n keyColour: makeColourString(getValue('keyColour')),\n timerColour: makeColourString(getValue('timerColour')),\n };\n}\n\n/**\n * Hook exposes the timer view options\n */\nexport function useTimerOptions(): TimerOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { CustomFields, ProjectData, RundownEntries, Settings, ViewSettings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport useRundown from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport useViewSettings from '../../common/hooks-query/useViewSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface TimerData {\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n viewSettings: ViewSettings;\n entries: RundownEntries;\n}\n\nexport function useTimerData(): ViewData<TimerData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: viewSettings, status: viewSettingsStatus } = useViewSettings();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n const { data: rundown, status: rundownStatus } = useRundown();\n const { entries } = rundown;\n\n return {\n data: {\n customFields,\n projectData,\n isMirrored,\n settings,\n viewSettings,\n entries,\n },\n status: aggregateQueryStatus([\n projectDataStatus,\n viewSettingsStatus,\n settingsStatus,\n customFieldsStatus,\n rundownStatus,\n ]),\n };\n}\n","import { useMemo } from 'react';\nimport { OntimeView, TimerType } from 'ontime-types';\n\nimport { FitText } from '../../common/components/fit-text/FitText';\nimport MultiPartProgressBar from '../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport TitleCard from '../../common/components/title-card/TitleCard';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useTimerSocket } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport SuperscriptTime from '../common/superscript-time/SuperscriptTime';\nimport { getFormattedTimer, getTimerByType } from '../common/viewUtils';\nimport { getTimerColour } from '../utils/presentation.utils';\n\nimport { getTimerOptions, useTimerOptions } from './timer.options';\nimport {\n getCardData,\n getEstimatedFontSize,\n getIsPlaying,\n getSecondaryDisplay,\n getShowClock,\n getShowMessage,\n getShowModifiers,\n getShowProgressBar,\n getTotalTime,\n} from './timer.utils';\nimport { TimerData, useTimerData } from './useTimerData';\n\nimport './Timer.scss';\n\nexport default function TimerLoader() {\n const { data, status } = useTimerData();\n\n useWindowTitle('Timer');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Timer {...data} />;\n}\n\nfunction Timer({ customFields, projectData, isMirrored, settings, viewSettings, entries }: TimerData) {\n const { eventNext, eventNow, message, time, clock, timerTypeNow, countToEndNow, auxTimer } = useTimerSocket();\n const {\n hideClock,\n hideCards,\n hideProgress,\n hideMessage,\n hideSecondary,\n hideLogo,\n hideTimerSeconds,\n removeLeadingZeros,\n mainSource,\n secondarySource,\n timerType,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n font,\n keyColour,\n timerColour,\n } = useTimerOptions();\n\n const { getLocalizedString } = useTranslation();\n const localisedMinutes = getLocalizedString('common.minutes');\n\n // gather modifiers\n const viewTimerType = timerType ?? timerTypeNow;\n const showOverlay = getShowMessage(message.timer);\n const { showEndMessage, showFinished, showWarning, showDanger } = getShowModifiers(\n timerTypeNow,\n countToEndNow,\n time.phase,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n );\n const isPlaying = getIsPlaying(time.playback);\n const showClock = !hideClock && getShowClock(viewTimerType);\n const showProgressBar = !hideProgress && getShowProgressBar(viewTimerType);\n\n // gather card data\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n mainSource,\n secondarySource,\n time.playback,\n time.phase,\n entries,\n );\n\n // gather timer data\n const totalTime = getTotalTime(time.duration, time.addedTime);\n const formattedClock = formatTime(clock);\n const stageTimer = getTimerByType(freezeOvertime, timerTypeNow, clock, time, timerType);\n const display = getFormattedTimer(stageTimer, viewTimerType, localisedMinutes, {\n removeSeconds: hideTimerSeconds,\n removeLeadingZero: removeLeadingZeros,\n });\n\n const currentAux = (() => {\n if (message.timer.secondarySource === 'aux1') {\n return auxTimer.aux1;\n }\n if (message.timer.secondarySource === 'aux2') {\n return auxTimer.aux2;\n }\n if (message.timer.secondarySource === 'aux3') {\n return auxTimer.aux3;\n }\n return null;\n })();\n\n const secondaryContent = getSecondaryDisplay(\n message,\n currentAux,\n localisedMinutes,\n hideTimerSeconds,\n removeLeadingZeros,\n hideSecondary,\n );\n\n // gather presentation styles\n const resolvedTimerColour = getTimerColour(viewSettings, timerColour, showWarning, showDanger);\n const timerFontSize = getEstimatedFontSize(display, secondaryContent);\n const subduePaused = !isPlaying && viewTimerType !== TimerType.Clock;\n const userStyles = {\n ...(keyColour && { '--timer-bg': keyColour }),\n ...(resolvedTimerColour && { '--timer-colour': resolvedTimerColour }),\n ...(font && { '--timer-font': font }),\n };\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const timerOptions = useMemo(() => getTimerOptions(defaultFormat, customFields), [customFields, defaultFormat]);\n\n return (\n <div\n data-testid='timer-view'\n className={cx(['stage-timer', isMirrored && 'mirror', showFinished && 'stage-timer--finished'])}\n style={userStyles}\n >\n {!hideLogo && projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n\n <ViewParamsEditor target={OntimeView.Timer} viewOptions={timerOptions} />\n\n <div className={cx(['blackout', message.timer.blackout && 'blackout--active'])} />\n\n {!hideMessage && (\n <div className={cx(['message-overlay', showOverlay && 'message-overlay--active'])}>\n <FitText mode='multi' min={32} max={256} className={cx(['message', message.timer.blink && 'blink'])}>\n {message.timer.text}\n </FitText>\n </div>\n )}\n\n {showClock && (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='clock' />\n </div>\n )}\n\n <div className={cx(['timer-container', message.timer.blink && !showOverlay && 'blink'])}>\n {showEndMessage ? (\n <FitText mode='multi' min={64} max={256} className='end-message'>\n {freezeMessage}\n </FitText>\n ) : (\n <div\n className={cx(['timer', subduePaused && 'timer--paused', showFinished && 'timer--finished'])}\n style={{ fontSize: `${timerFontSize}vw` }}\n data-type={viewTimerType}\n data-phase={time.phase}\n >\n {display}\n </div>\n )}\n <div className={cx(['secondary', !secondaryContent && 'secondary--hidden'])}>\n <FitText mode='multi' min={64} max={256}>\n {secondaryContent}\n </FitText>\n </div>\n </div>\n\n {showProgressBar && (\n <MultiPartProgressBar\n className={cx(['progress-container', !isPlaying && 'progress-container--paused'])}\n now={time.current}\n complete={totalTime}\n normalColor={viewSettings.normalColor}\n warning={eventNow?.timeWarning}\n warningColor={viewSettings.warningColor}\n danger={eventNow?.timeDanger}\n dangerColor={viewSettings.dangerColor}\n hideOvertime={!showFinished}\n />\n )}\n\n {!hideCards && (\n <>\n {showNow && <TitleCard className='event now' label='now' title={nowMain} secondary={nowSecondary} />}\n {showNext && <TitleCard className='event next' label='next' title={nextMain} secondary={nextSecondary} />}\n </>\n )}\n </div>\n );\n}\n"],"names":["timerDisplayOptions","value","label","TimerType","CountUp","CountDown","Clock","getTimerOptions","timeFormat","customFields","mainOptions","makeOptionsFromCustomFields","secondaryOptions","title","OptionTitle","ClockOptions","collapsible","options","getTimeOption","TimerOptions","hideTimerSeconds","showLeadingZeros","id","description","type","values","defaultValue","placeholder","DataSources","ElementVisibility","StyleOverride","getOptionsFromParams","searchParams","defaultValues","getValue","key","get","timerType","validateTimerType","None","hideClock","isStringBoolean","hideCards","hideProgress","hideMessage","hideSecondary","hideLogo","removeLeadingZeros","mainSource","secondarySource","undefined","freezeOvertime","freezeMessage","hidePhase","font","keyColour","makeColourString","timerColour","useTimerOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","URLSearchParams","search","useTimerData","isMirrored","useViewOptionsStore","state","mirror","data","projectData","status","projectDataStatus","useProjectData","viewSettings","viewSettingsStatus","useViewSettings","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","rundown","rundownStatus","useRundown","entries","aggregateQueryStatus","TimerLoader","useWindowTitle","Loader","jsx","EmptyPage","Timer","eventNext","eventNow","message","time","clock","timerTypeNow","countToEndNow","auxTimer","useTimerSocket","getLocalizedString","useTranslation","localisedMinutes","viewTimerType","showOverlay","getShowMessage","timer","showEndMessage","showFinished","showWarning","showDanger","getShowModifiers","phase","isPlaying","getIsPlaying","playback","showClock","getShowClock","showProgressBar","getShowProgressBar","showNow","nowMain","nowSecondary","showNext","nextMain","nextSecondary","getCardData","totalTime","getTotalTime","duration","addedTime","formattedClock","formatTime","stageTimer","getTimerByType","display","getFormattedTimer","removeSeconds","removeLeadingZero","currentAux","aux1","aux2","aux3","secondaryContent","getSecondaryDisplay","resolvedTimerColour","getTimerColour","timerFontSize","getEstimatedFontSize","subduePaused","userStyles","defaultFormat","getDefaultFormat","timerOptions","jsxs","cx","logo","ViewLogo","ViewParamsEditor","OntimeView","blackout","FitText","blink","text","SuperscriptTime","fontSize","MultiPartProgressBar","current","normalColor","timeWarning","warningColor","timeDanger","dangerColor","TitleCard"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{ay as M,j as t,aB as U,T as O,av as X,y as F,aA as I,aD as P,aC as A,c5 as H,az as G,bf as V,h as z}from"./vendor-CKDP5hij.js";import{P as K,C as W}from"./EditorUtils-CLBWDP4k.js";import{h as c,I as J,b2 as u,b0 as Q,b3 as k,b4 as h,b5 as v,b1 as Y,m as g,K as Z,y as C,k as T,s as tt,a$ as at,ax as st,bA as et,be as nt,bB as it}from"./index-2lQ-45a9.js";import{P as ot}from"./ProtectRoute-CCHzyy0I.js";import{T as S,A as lt}from"./TimeInput-DTWDnaum.js";import{T as i,g as rt,a as ct}from"./TimerDisplay-Dgmbqf65.js";import{p as R}from"./parseUserTime-WkVNjkkE.js";import{T as N}from"./Tooltip-DXph8P8p.js";import{u as dt}from"./useReport-DozG5uz5.js";(function(){try{var a=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new a.Error().stack;s&&(a._sentryDebugIds=a._sentryDebugIds||{},a._sentryDebugIds[s]="9687f8a4-2fac-4667-932b-52812007a83a",a._sentryDebugIdIdentifier="sentry-dbid-9687f8a4-2fac-4667-932b-52812007a83a")}catch{}})();const mt="_addTime_18oax_17",ut="_addButtons_18oax_24",xt="_tallButtons_18oax_30",b={addTime:mt,addButtons:ut,tallButtons:xt};function pt(a){const{playback:s}=a,[e,n]=M({key:"add-time",defaultValue:3e5}),l=(x,j)=>{const y=R(j);n(Math.min(y,J))},r=x=>{x==="add"?u.addTime(e):u.addTime(-1*e)},m=!(s===c.Play||s===c.Pause)||e===0;return t.jsxs("div",{className:b.addTime,children:[t.jsx(S,{name:"addtime",submitHandler:l,time:e,placeholder:"Add time"}),t.jsxs("div",{className:b.addButtons,children:[t.jsx(i,{onClick:()=>r("remove"),disabled:m,className:b.tallButtons,children:t.jsx(U,{})}),t.jsx(i,{onClick:()=>r("add"),disabled:m,className:b.tallButtons,children:t.jsx(O,{})})]})]})}const ht="_label_tat6w_17",_t="_controls_tat6w_24",bt="_input_tat6w_28",jt="_twoSides_tat6w_34",yt="_fakeInput_tat6w_42",_={label:ht,controls:_t,input:bt,twoSides:jt,fakeInput:yt};function f({index:a}){const{playback:s,direction:e}=Q(a),{stop:n,setDirection:l}=v,r=()=>{const x=e===h.CountDown?h.CountUp:h.CountDown;l(a,x)},d=s!==k.Stop,m=s===k.Start?"pause":"play";return t.jsxs("label",{className:_.label,children:["Aux Timer ",a,t.jsxs("div",{className:_.controls,children:[t.jsxs("div",{className:_.input,children:[t.jsx(ft,{index:a,isActive:d}),t.jsxs(i,{onClick:r,aspect:"tight",disabled:d,children:[e===h.CountDown&&t.jsx(X,{"data-testid":`aux-timer-direction-${a}`}),e===h.CountUp&&t.jsx(F,{"data-testid":`aux-timer-direction-${a}`})]})]}),t.jsxs("div",{className:_.twoSides,children:[t.jsx(gt,{index:a,action:m}),t.jsx(i,{onClick:()=>n(a),theme:c.Stop,disabled:!d,children:t.jsx(I,{"data-testid":`aux-timer-stop-${a}`})})]})]})]})}function ft({index:a,isActive:s}){const e=Y(a),{setDuration:n}=v,l=(r,d)=>{const m=R(d);n(a,m)};return s?t.jsx("div",{className:_.fakeInput,"data-testid":`time-label-aux${a}`,children:g(e)}):t.jsx(S,{submitHandler:l,name:`aux${a}`,time:e,placeholder:`Aux ${a}`})}function gt({index:a,action:s}){const{start:e,pause:n}=v;return s==="play"?t.jsx(i,{onClick:()=>e(a),theme:c.Play,children:t.jsx(P,{"data-testid":`aux-timer-start-${a}`})}):t.jsx(i,{onClick:()=>n(a),theme:c.Pause,children:t.jsx(A,{"data-testid":`aux-timer-pause-${a}`})})}const vt="_buttonContainer_1mqxq_17",kt="_go_1mqxq_25",Ct="_playbackContainer_1mqxq_30",Tt="_transportContainer_1mqxq_37",Nt="_extra_1mqxq_44",wt="_invertX_1mqxq_51",p={buttonContainer:vt,go:kt,playbackContainer:Ct,transportContainer:Tt,extra:Nt,invertX:wt};function It({playback:a,numEvents:s,selectedEventIndex:e,timerPhase:n}){const{isPlaying:l,isPaused:r,isRolling:d,disableGo:m,disableNext:x,disablePrev:j,disableStart:y,disablePause:q,disableRoll:D,disableStop:B,disableReload:$,goAction:E,goLabel:L}=rt({playback:a,numEvents:s,selectedEventIndex:e,timerPhase:n});return t.jsxs("div",{className:p.buttonContainer,children:[t.jsx(i,{disabled:m,onClick:E,aspect:"fill",className:p.go,children:L}),t.jsxs("div",{className:p.playbackContainer,children:[t.jsx(i,{onClick:u.start,disabled:y,theme:c.Play,active:l,children:t.jsx(P,{})}),t.jsx(i,{onClick:u.pause,disabled:q,theme:c.Pause,active:r,children:t.jsx(A,{})})]}),t.jsxs("div",{className:p.transportContainer,children:[t.jsx(i,{onClick:u.previous,disabled:j,children:t.jsx(H,{})}),t.jsx(i,{onClick:u.next,disabled:x,children:t.jsx(G,{})})]}),t.jsxs("div",{className:p.extra,children:[t.jsx(i,{onClick:u.roll,disabled:D,theme:c.Roll,active:d,children:"Roll"}),t.jsx(i,{onClick:u.reload,disabled:$,children:t.jsx(V,{className:p.invertX})}),t.jsx(i,{onClick:u.stop,disabled:B,theme:c.Stop,children:t.jsx(I,{})})]})]})}const Pt="_timeContainer_1ihqw_17",At="_indicators_1ihqw_32",St="_indicatorRoll_1ihqw_41",Rt="_indicatorDelay_1ihqw_42",qt="_indicatorNegative_1ihqw_43",Dt="_status_1ihqw_72",Bt="_tag_1ihqw_79",$t="_time_1ihqw_17",Et="_rolltag_1ihqw_91",o={timeContainer:Pt,indicators:At,indicatorRoll:St,indicatorDelay:Rt,indicatorNegative:qt,status:Dt,tag:Bt,time:$t,rolltag:Et};function Lt(a){return a>0?`Added ${T(a,!1)}`:a<0?`Removed ${T(Math.abs(a),!1)}`:""}function Mt({children:a}){const s=Z(),e=s.playback===c.Roll,n=s.phase===C.Pending,l=s.phase===C.Overtime,r=!!s.addedTime,d=e?"Roll mode active":"",m=Lt(s.addedTime);return t.jsxs("div",{className:o.timeContainer,children:[t.jsxs("div",{className:o.indicators,children:[t.jsx(N,{text:d,render:t.jsx("div",{}),className:o.indicatorRoll,"data-active":e}),t.jsx("div",{className:o.indicatorNegative,"data-active":l}),t.jsx(N,{text:m,render:t.jsx("div",{}),className:o.indicatorDelay,"data-active":r})]}),t.jsx(ct,{time:n?s.secondaryTimer:s.current,phase:s.phase}),t.jsx("div",{className:o.status,children:n?t.jsx("span",{className:o.rolltag,children:"Roll: Countdown to start"}):t.jsx(Ut,{startedAt:s.startedAt,expectedFinish:s.expectedFinish,playback:s.playback})}),a]})}function Ut({startedAt:a,expectedFinish:s,playback:e}){if(e===c.Stop)return t.jsx(Ot,{});const n=g(a),l=s!==null?s%tt:null,r=g(l);return t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:o.start,children:[t.jsx("span",{className:o.tag,children:"Started at"}),t.jsx("span",{className:o.time,children:n})]}),t.jsxs("span",{className:o.finish,children:[t.jsx("span",{className:o.tag,children:"Expect end"}),t.jsx("span",{className:o.time,children:r})]})]})}function Ot(){const{data:a}=dt();return Object.keys(a).length>0?t.jsx(lt,{search:"settings=sharing__report",children:"Go to report management"}):null}const Xt="_mainContainer_1qlxm_17",Ft="_auxTimers_1qlxm_22",w={mainContainer:Xt,auxTimers:Ft};function Ht(){const a=at();return t.jsxs("div",{className:w.mainContainer,children:[t.jsx(Mt,{children:t.jsx(pt,{playback:a.playback})}),t.jsx(It,{playback:a.playback,numEvents:a.numEvents,selectedEventIndex:a.selectedEventIndex,timerPhase:a.timerPhase}),t.jsxs("div",{className:w.auxTimers,children:[t.jsx(f,{index:1}),t.jsx(f,{index:2}),t.jsx(f,{index:3})]})]})}const Gt="_content_hnvy8_17",Vt={content:Gt},ea=z.memo(zt);function zt(){const a=window.location.pathname.includes("/timercontrol");return t.jsx(ot,{permission:"editor",children:t.jsxs(K,{"data-testid":"panel-timer-control",children:[!a&&t.jsx(W,{onClick:s=>st("timercontrol",s)}),a&&t.jsx(et,{suppressSettings:!0,isNavigationLocked:nt()}),t.jsx("div",{className:Vt.content,children:t.jsx(it,{children:t.jsx(Ht,{})})})]})})}export{ea as default};
2
- //# sourceMappingURL=TimerControlExport-BJfhJc07.js.map
1
+ import{ay as M,j as t,aB as U,T as O,av as X,y as F,aA as I,aD as P,aC as A,c5 as H,az as G,bf as V,h as z}from"./vendor-BKUJ0_Du.js";import{P as K,C as W}from"./EditorUtils-BLcTuWz1.js";import{h as c,I as J,b2 as u,b0 as Q,b3 as k,b4 as h,b5 as v,b1 as Y,m as g,K as Z,y as C,k as T,s as tt,a$ as at,ax as st,bA as et,be as nt,bB as it}from"./index-Dm-4OTmY.js";import{P as ot}from"./ProtectRoute-Bxq6q7ba.js";import{T as S,A as lt}from"./TimeInput-Cwl9vLWA.js";import{T as i,g as rt,a as ct}from"./TimerDisplay-tVcUk9j3.js";import{p as R}from"./parseUserTime-sZbEBi61.js";import{T as N}from"./Tooltip-DZJ7u9gm.js";import{u as dt}from"./useReport-DqSBq4MG.js";(function(){try{var a=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new a.Error().stack;s&&(a._sentryDebugIds=a._sentryDebugIds||{},a._sentryDebugIds[s]="9687f8a4-2fac-4667-932b-52812007a83a",a._sentryDebugIdIdentifier="sentry-dbid-9687f8a4-2fac-4667-932b-52812007a83a")}catch{}})();const mt="_addTime_18oax_17",ut="_addButtons_18oax_24",xt="_tallButtons_18oax_30",b={addTime:mt,addButtons:ut,tallButtons:xt};function pt(a){const{playback:s}=a,[e,n]=M({key:"add-time",defaultValue:3e5}),l=(x,j)=>{const y=R(j);n(Math.min(y,J))},r=x=>{x==="add"?u.addTime(e):u.addTime(-1*e)},m=!(s===c.Play||s===c.Pause)||e===0;return t.jsxs("div",{className:b.addTime,children:[t.jsx(S,{name:"addtime",submitHandler:l,time:e,placeholder:"Add time"}),t.jsxs("div",{className:b.addButtons,children:[t.jsx(i,{onClick:()=>r("remove"),disabled:m,className:b.tallButtons,children:t.jsx(U,{})}),t.jsx(i,{onClick:()=>r("add"),disabled:m,className:b.tallButtons,children:t.jsx(O,{})})]})]})}const ht="_label_tat6w_17",_t="_controls_tat6w_24",bt="_input_tat6w_28",jt="_twoSides_tat6w_34",yt="_fakeInput_tat6w_42",_={label:ht,controls:_t,input:bt,twoSides:jt,fakeInput:yt};function f({index:a}){const{playback:s,direction:e}=Q(a),{stop:n,setDirection:l}=v,r=()=>{const x=e===h.CountDown?h.CountUp:h.CountDown;l(a,x)},d=s!==k.Stop,m=s===k.Start?"pause":"play";return t.jsxs("label",{className:_.label,children:["Aux Timer ",a,t.jsxs("div",{className:_.controls,children:[t.jsxs("div",{className:_.input,children:[t.jsx(ft,{index:a,isActive:d}),t.jsxs(i,{onClick:r,aspect:"tight",disabled:d,children:[e===h.CountDown&&t.jsx(X,{"data-testid":`aux-timer-direction-${a}`}),e===h.CountUp&&t.jsx(F,{"data-testid":`aux-timer-direction-${a}`})]})]}),t.jsxs("div",{className:_.twoSides,children:[t.jsx(gt,{index:a,action:m}),t.jsx(i,{onClick:()=>n(a),theme:c.Stop,disabled:!d,children:t.jsx(I,{"data-testid":`aux-timer-stop-${a}`})})]})]})]})}function ft({index:a,isActive:s}){const e=Y(a),{setDuration:n}=v,l=(r,d)=>{const m=R(d);n(a,m)};return s?t.jsx("div",{className:_.fakeInput,"data-testid":`time-label-aux${a}`,children:g(e)}):t.jsx(S,{submitHandler:l,name:`aux${a}`,time:e,placeholder:`Aux ${a}`})}function gt({index:a,action:s}){const{start:e,pause:n}=v;return s==="play"?t.jsx(i,{onClick:()=>e(a),theme:c.Play,children:t.jsx(P,{"data-testid":`aux-timer-start-${a}`})}):t.jsx(i,{onClick:()=>n(a),theme:c.Pause,children:t.jsx(A,{"data-testid":`aux-timer-pause-${a}`})})}const vt="_buttonContainer_1mqxq_17",kt="_go_1mqxq_25",Ct="_playbackContainer_1mqxq_30",Tt="_transportContainer_1mqxq_37",Nt="_extra_1mqxq_44",wt="_invertX_1mqxq_51",p={buttonContainer:vt,go:kt,playbackContainer:Ct,transportContainer:Tt,extra:Nt,invertX:wt};function It({playback:a,numEvents:s,selectedEventIndex:e,timerPhase:n}){const{isPlaying:l,isPaused:r,isRolling:d,disableGo:m,disableNext:x,disablePrev:j,disableStart:y,disablePause:q,disableRoll:D,disableStop:B,disableReload:$,goAction:E,goLabel:L}=rt({playback:a,numEvents:s,selectedEventIndex:e,timerPhase:n});return t.jsxs("div",{className:p.buttonContainer,children:[t.jsx(i,{disabled:m,onClick:E,aspect:"fill",className:p.go,children:L}),t.jsxs("div",{className:p.playbackContainer,children:[t.jsx(i,{onClick:u.start,disabled:y,theme:c.Play,active:l,children:t.jsx(P,{})}),t.jsx(i,{onClick:u.pause,disabled:q,theme:c.Pause,active:r,children:t.jsx(A,{})})]}),t.jsxs("div",{className:p.transportContainer,children:[t.jsx(i,{onClick:u.previous,disabled:j,children:t.jsx(H,{})}),t.jsx(i,{onClick:u.next,disabled:x,children:t.jsx(G,{})})]}),t.jsxs("div",{className:p.extra,children:[t.jsx(i,{onClick:u.roll,disabled:D,theme:c.Roll,active:d,children:"Roll"}),t.jsx(i,{onClick:u.reload,disabled:$,children:t.jsx(V,{className:p.invertX})}),t.jsx(i,{onClick:u.stop,disabled:B,theme:c.Stop,children:t.jsx(I,{})})]})]})}const Pt="_timeContainer_1ihqw_17",At="_indicators_1ihqw_32",St="_indicatorRoll_1ihqw_41",Rt="_indicatorDelay_1ihqw_42",qt="_indicatorNegative_1ihqw_43",Dt="_status_1ihqw_72",Bt="_tag_1ihqw_79",$t="_time_1ihqw_17",Et="_rolltag_1ihqw_91",o={timeContainer:Pt,indicators:At,indicatorRoll:St,indicatorDelay:Rt,indicatorNegative:qt,status:Dt,tag:Bt,time:$t,rolltag:Et};function Lt(a){return a>0?`Added ${T(a,!1)}`:a<0?`Removed ${T(Math.abs(a),!1)}`:""}function Mt({children:a}){const s=Z(),e=s.playback===c.Roll,n=s.phase===C.Pending,l=s.phase===C.Overtime,r=!!s.addedTime,d=e?"Roll mode active":"",m=Lt(s.addedTime);return t.jsxs("div",{className:o.timeContainer,children:[t.jsxs("div",{className:o.indicators,children:[t.jsx(N,{text:d,render:t.jsx("div",{}),className:o.indicatorRoll,"data-active":e}),t.jsx("div",{className:o.indicatorNegative,"data-active":l}),t.jsx(N,{text:m,render:t.jsx("div",{}),className:o.indicatorDelay,"data-active":r})]}),t.jsx(ct,{time:n?s.secondaryTimer:s.current,phase:s.phase}),t.jsx("div",{className:o.status,children:n?t.jsx("span",{className:o.rolltag,children:"Roll: Countdown to start"}):t.jsx(Ut,{startedAt:s.startedAt,expectedFinish:s.expectedFinish,playback:s.playback})}),a]})}function Ut({startedAt:a,expectedFinish:s,playback:e}){if(e===c.Stop)return t.jsx(Ot,{});const n=g(a),l=s!==null?s%tt:null,r=g(l);return t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:o.start,children:[t.jsx("span",{className:o.tag,children:"Started at"}),t.jsx("span",{className:o.time,children:n})]}),t.jsxs("span",{className:o.finish,children:[t.jsx("span",{className:o.tag,children:"Expect end"}),t.jsx("span",{className:o.time,children:r})]})]})}function Ot(){const{data:a}=dt();return Object.keys(a).length>0?t.jsx(lt,{search:"settings=sharing__report",children:"Go to report management"}):null}const Xt="_mainContainer_1qlxm_17",Ft="_auxTimers_1qlxm_22",w={mainContainer:Xt,auxTimers:Ft};function Ht(){const a=at();return t.jsxs("div",{className:w.mainContainer,children:[t.jsx(Mt,{children:t.jsx(pt,{playback:a.playback})}),t.jsx(It,{playback:a.playback,numEvents:a.numEvents,selectedEventIndex:a.selectedEventIndex,timerPhase:a.timerPhase}),t.jsxs("div",{className:w.auxTimers,children:[t.jsx(f,{index:1}),t.jsx(f,{index:2}),t.jsx(f,{index:3})]})]})}const Gt="_content_hnvy8_17",Vt={content:Gt},ea=z.memo(zt);function zt(){const a=window.location.pathname.includes("/timercontrol");return t.jsx(ot,{permission:"editor",children:t.jsxs(K,{"data-testid":"panel-timer-control",children:[!a&&t.jsx(W,{onClick:s=>st("timercontrol",s)}),a&&t.jsx(et,{suppressSettings:!0,isNavigationLocked:nt()}),t.jsx("div",{className:Vt.content,children:t.jsx(it,{children:t.jsx(Ht,{})})})]})})}export{ea as default};
2
+ //# sourceMappingURL=TimerControlExport-Ba1vifNg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimerControlExport-BJfhJc07.js","sources":["../../src/features/control/playback/add-time/AddTime.tsx","../../src/features/control/playback/aux-timer/AuxTimer.tsx","../../src/features/control/playback/playback-buttons/PlaybackButtons.tsx","../../src/features/control/playback/playback-timer/PlaybackTimer.tsx","../../src/features/control/playback/PlaybackControl.tsx","../../src/features/control/playback/TimerControlExport.tsx"],"sourcesContent":["import { IoAdd, IoRemove } from 'react-icons/io5';\nimport { useLocalStorage } from '@mantine/hooks';\nimport { Playback } from 'ontime-types';\nimport { MILLIS_PER_HOUR, parseUserTime } from 'ontime-utils';\n\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport { setPlayback } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './AddTime.module.scss';\n\ninterface AddTimeProps {\n playback: Playback;\n}\n\nexport default function AddTime(props: AddTimeProps) {\n const { playback } = props;\n const [timeInMs, setTime] = useLocalStorage({ key: 'add-time', defaultValue: 300_000 }); // 5 minutes\n\n const handleTimeChange = (_field: string, value: string) => {\n const newTimeInMs = parseUserTime(value);\n // cap add time to 1 hour\n setTime(Math.min(newTimeInMs, MILLIS_PER_HOUR));\n };\n\n const handleAddTime = (direction: 'add' | 'remove') => {\n // API expects input in milliseconds\n if (direction === 'add') {\n setPlayback.addTime(timeInMs);\n } else {\n setPlayback.addTime(-1 * timeInMs);\n }\n };\n\n const canAddTime = playback === Playback.Play || playback === Playback.Pause;\n const doDisableButtons = !canAddTime || timeInMs === 0;\n\n return (\n <div className={style.addTime}>\n <TimeInput name='addtime' submitHandler={handleTimeChange} time={timeInMs} placeholder='Add time' />\n <div className={style.addButtons}>\n <TapButton onClick={() => handleAddTime('remove')} disabled={doDisableButtons} className={style.tallButtons}>\n <IoRemove />\n </TapButton>\n <TapButton onClick={() => handleAddTime('add')} disabled={doDisableButtons} className={style.tallButtons}>\n <IoAdd />\n </TapButton>\n </div>\n </div>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoPause, IoPlay, IoStop } from 'react-icons/io5';\nimport { Playback, SimpleDirection, SimplePlayback } from 'ontime-types';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport { setAuxTimer, useAuxTimerControl, useAuxTimerTime } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './AuxTimer.module.scss';\n\ninterface AuxTimerProps {\n index: number;\n}\n\nexport function AuxTimer({ index }: AuxTimerProps) {\n const { playback, direction } = useAuxTimerControl(index);\n\n const { stop, setDirection } = setAuxTimer;\n\n const toggleDirection = () => {\n const newDirection = direction === SimpleDirection.CountDown ? SimpleDirection.CountUp : SimpleDirection.CountDown;\n setDirection(index, newDirection);\n };\n\n const isActive = playback !== SimplePlayback.Stop;\n const playbackAction = playback === SimplePlayback.Start ? 'pause' : 'play';\n\n return (\n <label className={style.label}>\n Aux Timer {index}\n <div className={style.controls}>\n <div className={style.input}>\n <AuxTimerInput index={index} isActive={isActive} />\n <TapButton onClick={toggleDirection} aspect='tight' disabled={isActive}>\n {direction === SimpleDirection.CountDown && <IoArrowDown data-testid={`aux-timer-direction-${index}`} />}\n {direction === SimpleDirection.CountUp && <IoArrowUp data-testid={`aux-timer-direction-${index}`} />}\n </TapButton>\n </div>\n <div className={style.twoSides}>\n <AuxTogglePlay index={index} action={playbackAction} />\n <TapButton onClick={() => stop(index)} theme={Playback.Stop} disabled={!isActive}>\n <IoStop data-testid={`aux-timer-stop-${index}`} />\n </TapButton>\n </div>\n </div>\n </label>\n );\n}\n\ninterface AuxTimerInputProps {\n index: number;\n isActive: boolean;\n}\n\nfunction AuxTimerInput({ index, isActive }: AuxTimerInputProps) {\n const newTimeInMs = useAuxTimerTime(index);\n const { setDuration } = setAuxTimer;\n\n const handleTimeUpdate = (_field: string, value: string) => {\n const newTimeInMs = parseUserTime(value);\n setDuration(index, newTimeInMs);\n };\n\n if (isActive) {\n return (\n <div className={style.fakeInput} data-testid={`time-label-aux${index}`}>\n {millisToString(newTimeInMs)}\n </div>\n );\n }\n\n return (\n <TimeInput submitHandler={handleTimeUpdate} name={`aux${index}`} time={newTimeInMs} placeholder={`Aux ${index}`} />\n );\n}\n\ninterface AuxTogglePlayProps {\n index: number;\n action: 'play' | 'pause';\n}\n\nfunction AuxTogglePlay({ index, action }: AuxTogglePlayProps) {\n const { start, pause } = setAuxTimer;\n\n if (action === 'play') {\n return (\n <TapButton onClick={() => start(index)} theme={Playback.Play}>\n <IoPlay data-testid={`aux-timer-start-${index}`} />\n </TapButton>\n );\n }\n\n return (\n <TapButton onClick={() => pause(index)} theme={Playback.Pause}>\n <IoPause data-testid={`aux-timer-pause-${index}`} />\n </TapButton>\n );\n}\n","import { IoPause, IoPlay, IoPlaySkipBack, IoPlaySkipForward, IoReload, IoStop } from 'react-icons/io5';\nimport { Playback, TimerPhase } from 'ontime-types';\n\nimport { setPlayback } from '../../../../common/hooks/useSocket';\nimport { getPlaybackControlState } from '../playbackControl.utils';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './PlaybackButtons.module.scss';\n\ninterface PlaybackButtonsProps {\n playback: Playback;\n numEvents: number;\n selectedEventIndex: number | null;\n timerPhase: TimerPhase;\n}\n\nexport default function PlaybackButtons({ playback, numEvents, selectedEventIndex, timerPhase }: PlaybackButtonsProps) {\n const {\n isPlaying,\n isPaused,\n isRolling,\n disableGo,\n disableNext,\n disablePrev,\n disableStart,\n disablePause,\n disableRoll,\n disableStop,\n disableReload,\n goAction,\n goLabel,\n } = getPlaybackControlState({\n playback,\n numEvents,\n selectedEventIndex,\n timerPhase,\n });\n\n return (\n <div className={style.buttonContainer}>\n <TapButton disabled={disableGo} onClick={goAction} aspect='fill' className={style.go}>\n {goLabel}\n </TapButton>\n <div className={style.playbackContainer}>\n <TapButton onClick={setPlayback.start} disabled={disableStart} theme={Playback.Play} active={isPlaying}>\n <IoPlay />\n </TapButton>\n\n <TapButton onClick={setPlayback.pause} disabled={disablePause} theme={Playback.Pause} active={isPaused}>\n <IoPause />\n </TapButton>\n </div>\n <div className={style.transportContainer}>\n <TapButton onClick={setPlayback.previous} disabled={disablePrev}>\n <IoPlaySkipBack />\n </TapButton>\n <TapButton onClick={setPlayback.next} disabled={disableNext}>\n <IoPlaySkipForward />\n </TapButton>\n </div>\n <div className={style.extra}>\n <TapButton onClick={setPlayback.roll} disabled={disableRoll} theme={Playback.Roll} active={isRolling}>\n Roll\n </TapButton>\n <TapButton onClick={setPlayback.reload} disabled={disableReload}>\n <IoReload className={style.invertX} />\n </TapButton>\n <TapButton onClick={setPlayback.stop} disabled={disableStop} theme={Playback.Stop}>\n <IoStop />\n </TapButton>\n </div>\n </div>\n );\n}\n","import { PropsWithChildren } from 'react';\nimport { MaybeNumber, Playback, TimerPhase } from 'ontime-types';\nimport { dayInMs, millisToString } from 'ontime-utils';\n\nimport AppLink from '../../../../common/components/link/app-link/AppLink';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useTimer } from '../../../../common/hooks/useSocket';\nimport useReport from '../../../../common/hooks-query/useReport';\nimport { formatDuration } from '../../../../common/utils/time';\nimport TimerDisplay from '../timer-display/TimerDisplay';\n\nimport style from './PlaybackTimer.module.scss';\n\nfunction resolveAddedTimeLabel(addedTime: number) {\n if (addedTime > 0) {\n return `Added ${formatDuration(addedTime, false)}`;\n }\n\n if (addedTime < 0) {\n return `Removed ${formatDuration(Math.abs(addedTime), false)}`;\n }\n\n return '';\n}\n\nexport default function PlaybackTimer({ children }: PropsWithChildren) {\n const timer = useTimer();\n\n const isRolling = timer.playback === Playback.Roll;\n const isWaiting = timer.phase === TimerPhase.Pending;\n const isOvertime = timer.phase === TimerPhase.Overtime;\n const hasAddedTime = Boolean(timer.addedTime);\n\n const rollLabel = isRolling ? 'Roll mode active' : '';\n\n const addedTimeLabel = resolveAddedTimeLabel(timer.addedTime);\n\n return (\n <div className={style.timeContainer}>\n <div className={style.indicators}>\n <Tooltip text={rollLabel} render={<div />} className={style.indicatorRoll} data-active={isRolling} />\n <div className={style.indicatorNegative} data-active={isOvertime} />\n <Tooltip text={addedTimeLabel} render={<div />} className={style.indicatorDelay} data-active={hasAddedTime} />\n </div>\n <TimerDisplay time={isWaiting ? timer.secondaryTimer : timer.current} phase={timer.phase} />\n <div className={style.status}>\n {isWaiting ? (\n <span className={style.rolltag}>Roll: Countdown to start</span>\n ) : (\n <RunningStatus startedAt={timer.startedAt} expectedFinish={timer.expectedFinish} playback={timer.playback} />\n )}\n </div>\n {children}\n </div>\n );\n}\n\ninterface RunningStatusProps {\n startedAt: MaybeNumber;\n expectedFinish: MaybeNumber;\n playback: Playback;\n}\nfunction RunningStatus({ startedAt, expectedFinish, playback }: RunningStatusProps) {\n if (playback === Playback.Stop) {\n return <StoppedStatus />;\n }\n\n const started = millisToString(startedAt);\n const finishedMs = expectedFinish !== null ? expectedFinish % dayInMs : null;\n const finish = millisToString(finishedMs);\n\n return (\n <>\n <span className={style.start}>\n <span className={style.tag}>Started at</span>\n <span className={style.time}>{started}</span>\n </span>\n <span className={style.finish}>\n <span className={style.tag}>Expect end</span>\n <span className={style.time}>{finish}</span>\n </span>\n </>\n );\n}\n\nfunction StoppedStatus() {\n const { data } = useReport();\n const hasReport = Object.keys(data).length > 0;\n\n if (hasReport) {\n return <AppLink search='settings=sharing__report'>Go to report management</AppLink>;\n }\n\n return null;\n}\n","import { usePlaybackControl } from '../../../common/hooks/useSocket';\n\nimport AddTime from './add-time/AddTime';\nimport { AuxTimer } from './aux-timer/AuxTimer';\nimport PlaybackButtons from './playback-buttons/PlaybackButtons';\nimport PlaybackTimer from './playback-timer/PlaybackTimer';\n\nimport style from './PlaybackControl.module.scss';\n\nexport default function PlaybackControl() {\n const data = usePlaybackControl();\n\n return (\n <div className={style.mainContainer}>\n <PlaybackTimer>\n <AddTime playback={data.playback} />\n </PlaybackTimer>\n <PlaybackButtons\n playback={data.playback}\n numEvents={data.numEvents}\n selectedEventIndex={data.selectedEventIndex}\n timerPhase={data.timerPhase}\n />\n <div className={style.auxTimers}>\n <AuxTimer index={1} />\n <AuxTimer index={2} />\n <AuxTimer index={3} />\n </div>\n </div>\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 PlaybackControl from './PlaybackControl';\n\nimport style from './TimerControlExport.module.scss';\n\nexport default memo(TimerControlExport);\nfunction TimerControlExport() {\n const isExtracted = window.location.pathname.includes('/timercontrol');\n\n return (\n <ProtectRoute permission='editor'>\n <Editor.Panel data-testid='panel-timer-control'>\n {!isExtracted && <Editor.CornerExtract onClick={(event) => handleLinks('timercontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings isNavigationLocked={getIsNavigationLocked()} />}\n\n <div className={style.content}>\n <ErrorBoundary>\n <PlaybackControl />\n </ErrorBoundary>\n </div>\n </Editor.Panel>\n </ProtectRoute>\n );\n}\n"],"names":["AddTime","props","playback","timeInMs","setTime","useLocalStorage","key","defaultValue","handleTimeChange","_field","value","newTimeInMs","parseUserTime","Math","min","MILLIS_PER_HOUR","handleAddTime","direction","setPlayback","addTime","doDisableButtons","Playback","Play","Pause","jsxs","style","jsx","TimeInput","addButtons","TapButton","tallButtons","IoRemove","IoAdd","AuxTimer","index","useAuxTimerControl","stop","setDirection","setAuxTimer","toggleDirection","newDirection","SimpleDirection","CountDown","CountUp","isActive","SimplePlayback","Stop","playbackAction","Start","label","controls","input","AuxTimerInput","IoArrowDown","IoArrowUp","twoSides","AuxTogglePlay","IoStop","useAuxTimerTime","setDuration","handleTimeUpdate","fakeInput","millisToString","action","start","pause","IoPlay","IoPause","PlaybackButtons","numEvents","selectedEventIndex","timerPhase","isPlaying","isPaused","isRolling","disableGo","disableNext","disablePrev","disableStart","disablePause","disableRoll","disableStop","disableReload","goAction","goLabel","getPlaybackControlState","buttonContainer","go","playbackContainer","transportContainer","previous","IoPlaySkipBack","next","IoPlaySkipForward","extra","roll","Roll","reload","IoReload","invertX","resolveAddedTimeLabel","addedTime","formatDuration","abs","PlaybackTimer","children","timer","useTimer","isWaiting","phase","TimerPhase","Pending","isOvertime","Overtime","hasAddedTime","Boolean","rollLabel","addedTimeLabel","timeContainer","indicators","Tooltip","indicatorRoll","indicatorNegative","indicatorDelay","TimerDisplay","secondaryTimer","current","status","rolltag","RunningStatus","startedAt","expectedFinish","StoppedStatus","started","finishedMs","dayInMs","finish","Fragment","tag","time","data","useReport","Object","keys","length","AppLink","PlaybackControl","usePlaybackControl","mainContainer","auxTimers","memo","TimerControlExport","isExtracted","window","location","pathname","includes","ProtectRoute","Editor.Panel","Editor.CornerExtract","handleLinks","event","ViewNavigationMenu","getIsNavigationLocked","content","ErrorBoundary"],"mappings":"6mCAeA,SAAwBA,GAAQC,EAAqB,CAC7C,KAAA,CAAEC,SAAAA,CAAAA,EAAaD,EACf,CAACE,EAAUC,CAAO,EAAIC,EAAgB,CAAEC,IAAK,WAAYC,aAAc,GAAA,CAAS,EAEhFC,EAAmBA,CAACC,EAAgBC,IAAkB,CACpDC,MAAAA,EAAcC,EAAcF,CAAK,EAEvCN,EAAQS,KAAKC,IAAIH,EAAaI,CAAe,CAAC,CAChD,EAEMC,EAAiBC,GAAgC,CAEjDA,IAAc,MAChBC,EAAYC,QAAQhB,CAAQ,EAEhBgB,EAAAA,QAAQ,GAAKhB,CAAQ,CAErC,EAGMiB,EAAmB,EADNlB,IAAamB,EAASC,MAAQpB,IAAamB,EAASE,QAC/BpB,IAAa,EAErD,OACGqB,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAMN,QACpB,SAAA,CAACO,EAAAA,IAAAC,EAAA,CAAU,KAAK,UAAU,cAAenB,EAAkB,KAAML,EAAU,YAAY,UAAU,CAAA,EAChGqB,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAMG,WACpB,SAAA,CAAAF,EAAA,IAACG,EAAU,CAAA,QAAS,IAAMb,EAAc,QAAQ,EAAG,SAAUI,EAAkB,UAAWK,EAAMK,YAC9F,SAAAJ,EAAA,IAACK,GAAQ,CAAA,EACX,EACCL,EAAA,IAAAG,EAAA,CAAU,QAAS,IAAMb,EAAc,KAAK,EAAG,SAAUI,EAAkB,UAAWK,EAAMK,YAC3F,SAAAJ,EAAAA,IAACM,IAAK,CACR,CAAA,CAAA,CACF,CAAA,CAAA,EACF,CAEJ,qLCpCO,SAASC,EAAS,CAAEC,MAAAA,CAAqB,EAAG,CAC3C,KAAA,CAAEhC,SAAAA,EAAUe,UAAAA,CAAAA,EAAckB,EAAmBD,CAAK,EAElD,CAAEE,KAAAA,EAAMC,aAAAA,CAAAA,EAAiBC,EAEzBC,EAAkBA,IAAM,CAC5B,MAAMC,EAAevB,IAAcwB,EAAgBC,UAAYD,EAAgBE,QAAUF,EAAgBC,UACzGL,EAAaH,EAAOM,CAAY,CAClC,EAEMI,EAAW1C,IAAa2C,EAAeC,KACvCC,EAAiB7C,IAAa2C,EAAeG,MAAQ,QAAU,OAErE,OACGxB,EAAAA,KAAA,QAAA,CAAM,UAAWC,EAAMwB,MAAM,SAAA,CAAA,aACjBf,EACVV,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAMyB,SACpB,SAAA,CAAC1B,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAM0B,MACpB,SAAA,CAACzB,EAAAA,IAAA0B,GAAA,CAAc,MAAAlB,EAAc,SAAAU,CAAmB,CAAA,SAC/Cf,EAAU,CAAA,QAASU,EAAiB,OAAO,QAAQ,SAAUK,EAC3D3B,SAAAA,CAAAA,IAAcwB,EAAgBC,WAAahB,EAAAA,IAAC2B,GAAY,cAAa,uBAAuBnB,CAAK,GAAM,EACvGjB,IAAcwB,EAAgBE,SAAWjB,MAAC4B,GAAU,cAAa,uBAAuBpB,CAAK,EAAM,CAAA,CAAA,CACtG,CAAA,CAAA,EACF,EACCV,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAM8B,SACpB,SAAA,CAAC7B,EAAAA,IAAA8B,GAAA,CAAc,MAAAtB,EAAc,OAAQa,CAAe,CAAA,QACnDlB,EAAU,CAAA,QAAS,IAAMO,EAAKF,CAAK,EAAG,MAAOb,EAASyB,KAAM,SAAU,CAACF,EACtE,SAAClB,EAAA,IAAA+B,EAAA,CAAO,cAAa,kBAAkBvB,CAAK,GAAG,CACjD,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,EACF,CAEJ,CAOA,SAASkB,GAAc,CAAElB,MAAAA,EAAOU,SAAAA,CAA6B,EAAG,CACxDjC,MAAAA,EAAc+C,EAAgBxB,CAAK,EACnC,CAAEyB,YAAAA,CAAAA,EAAgBrB,EAElBsB,EAAmBA,CAACnD,EAAgBC,IAAkB,CACpDC,MAAAA,EAAcC,EAAcF,CAAK,EACvCiD,EAAYzB,EAAOvB,CAAW,CAChC,EAEA,OAAIiC,EAEAlB,EAAAA,IAAC,MAAI,CAAA,UAAWD,EAAMoC,UAAW,cAAa,iBAAiB3B,CAAK,GACjE4B,SAAenD,EAAAA,CAAW,CAC7B,CAAA,EAKDe,EAAAA,IAAAC,EAAA,CAAU,cAAeiC,EAAkB,KAAM,MAAM1B,CAAK,GAAI,KAAMvB,EAAa,YAAa,OAAOuB,CAAK,GAAM,CAEvH,CAOA,SAASsB,GAAc,CAAEtB,MAAAA,EAAO6B,OAAAA,CAA2B,EAAG,CACtD,KAAA,CAAEC,MAAAA,EAAOC,MAAAA,CAAAA,EAAU3B,EAEzB,OAAIyB,IAAW,aAEVlC,EAAU,CAAA,QAAS,IAAMmC,EAAM9B,CAAK,EAAG,MAAOb,EAASC,KACtD,eAAC4C,EAAO,CAAA,cAAa,mBAAmBhC,CAAK,EAAG,CAAA,EAClD,QAKDL,EAAU,CAAA,QAAS,IAAMoC,EAAM/B,CAAK,EAAG,MAAOb,EAASE,MACtD,eAAC4C,EAAQ,CAAA,cAAa,mBAAmBjC,CAAK,EAAG,CAAA,EACnD,CAEJ,mQCjFA,SAAwBkC,GAAgB,CAAElE,SAAAA,EAAUmE,UAAAA,EAAWC,mBAAAA,EAAoBC,WAAAA,CAAiC,EAAG,CAC/G,KAAA,CACJC,UAAAA,EACAC,SAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAC,YAAAA,EACAC,YAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,YAAAA,EACAC,cAAAA,EACAC,SAAAA,EACAC,QAAAA,GACEC,GAAwB,CAC1BnF,SAAAA,EACAmE,UAAAA,EACAC,mBAAAA,EACAC,WAAAA,CAAAA,CACD,EAED,OACG/C,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM6D,gBACpB,SAAA,CAAC5D,EAAAA,IAAAG,EAAA,CAAU,SAAU8C,EAAW,QAASQ,EAAU,OAAO,OAAO,UAAW1D,EAAM8D,GAC/EH,SACHA,CAAA,CAAA,EACC5D,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAM+D,kBACpB,SAAA,CAAA9D,EAAA,IAACG,EAAU,CAAA,QAASX,EAAY8C,MAAO,SAAUc,EAAc,MAAOzD,EAASC,KAAM,OAAQkD,EAC3F,SAAA9C,EAAAA,IAACwC,GAAM,CAAA,EACT,EAECxC,EAAA,IAAAG,EAAA,CAAU,QAASX,EAAY+C,MAAO,SAAUc,EAAc,MAAO1D,EAASE,MAAO,OAAQkD,EAC5F,SAAA/C,MAACyC,IAAO,CACV,CAAA,CAAA,EACF,EACC3C,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAMgE,mBACpB,SAAA,CAAC/D,EAAAA,IAAAG,EAAA,CAAU,QAASX,EAAYwE,SAAU,SAAUb,EAClD,SAAAnD,EAAA,IAACiE,IAAc,CACjB,CAAA,EACAjE,EAAAA,IAACG,GAAU,QAASX,EAAY0E,KAAM,SAAUhB,EAC9C,SAAClD,EAAAA,IAAAmE,EAAA,CAAiB,CAAA,CACpB,CAAA,CAAA,EACF,EACCrE,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAMqE,MACpB,SAAA,CAACpE,EAAA,IAAAG,EAAA,CAAU,QAASX,EAAY6E,KAAM,SAAUf,EAAa,MAAO3D,EAAS2E,KAAM,OAAQtB,EAAU,SAErG,OAAA,EACChD,EAAA,IAAAG,EAAA,CAAU,QAASX,EAAY+E,OAAQ,SAAUf,EAChD,SAAAxD,EAAA,IAACwE,EAAS,CAAA,UAAWzE,EAAM0E,OAAQ,CAAA,EACrC,EACCzE,EAAA,IAAAG,EAAA,CAAU,QAASX,EAAYkB,KAAM,SAAU6C,EAAa,MAAO5D,EAASyB,KAC3E,SAACpB,EAAAA,IAAA+B,EAAA,CAAA,CAAM,CACT,CAAA,CAAA,CACF,CAAA,CAAA,EACF,CAEJ,6WC5DA,SAAS2C,GAAsBC,EAAmB,CAChD,OAAIA,EAAY,EACP,SAASC,EAAeD,EAAW,EAAK,CAAC,GAG9CA,EAAY,EACP,WAAWC,EAAezF,KAAK0F,IAAIF,CAAS,EAAG,EAAK,CAAC,GAGvD,EACT,CAEA,SAAwBG,GAAc,CAAEC,SAAAA,CAA4B,EAAG,CACrE,MAAMC,EAAQC,EAAS,EAEjBjC,EAAYgC,EAAMxG,WAAamB,EAAS2E,KACxCY,EAAYF,EAAMG,QAAUC,EAAWC,QACvCC,EAAaN,EAAMG,QAAUC,EAAWG,SACxCC,EAAeC,EAAQT,EAAML,UAE7Be,EAAY1C,EAAY,mBAAqB,GAE7C2C,EAAiBjB,GAAsBM,EAAML,SAAS,EAE5D,OACG7E,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM6F,cACpB,SAAA,CAAC9F,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAM8F,WACpB,SAAA,CAAC7F,EAAA,IAAA8F,EAAA,CAAQ,KAAMJ,EAAW,OAAQ1F,EAAAA,IAAC,MAAM,CAAA,CAAA,EAAE,UAAWD,EAAMgG,cAAe,cAAa/C,CAAU,CAAA,QACjG,MAAI,CAAA,UAAWjD,EAAMiG,kBAAmB,cAAaV,EAAW,EAChEtF,EAAAA,IAAA8F,EAAA,CAAQ,KAAMH,EAAgB,OAAQ3F,EAAA,IAAC,MAAM,CAAA,CAAA,EAAE,UAAWD,EAAMkG,eAAgB,cAAaT,CAAa,CAAA,CAAA,EAC7G,EACAxF,EAAAA,IAACkG,GAAa,CAAA,KAAMhB,EAAYF,EAAMmB,eAAiBnB,EAAMoB,QAAS,MAAOpB,EAAMG,KAAM,CAAA,EACzFnF,EAAAA,IAAC,MAAI,CAAA,UAAWD,EAAMsG,OACnBnB,WACElF,EAAAA,IAAA,OAAA,CAAK,UAAWD,EAAMuG,QAAS,SAAA,0BAAwB,CAAA,EAEvDtG,EAAAA,IAAAuG,GAAA,CAAc,UAAWvB,EAAMwB,UAAW,eAAgBxB,EAAMyB,eAAgB,SAAUzB,EAAMxG,QAAAA,CAClG,CACH,CAAA,EACCuG,CAAAA,EACH,CAEJ,CAOA,SAASwB,GAAc,CAAEC,UAAAA,EAAWC,eAAAA,EAAgBjI,SAAAA,CAA6B,EAAG,CAC9EA,GAAAA,IAAamB,EAASyB,KACxB,aAAQsF,GAAgB,EAAA,EAGpBC,MAAAA,EAAUvE,EAAeoE,CAAS,EAClCI,EAAaH,IAAmB,KAAOA,EAAiBI,GAAU,KAClEC,EAAS1E,EAAewE,CAAU,EAExC,OAEI9G,EAAA,KAAAiH,WAAA,CAAA,SAAA,CAACjH,EAAA,KAAA,OAAA,CAAK,UAAWC,EAAMuC,MACrB,SAAA,CAAAtC,EAAA,IAAC,OAAK,CAAA,UAAWD,EAAMiH,IAAK,SAAU,aAAA,EACrChH,EAAA,IAAA,OAAA,CAAK,UAAWD,EAAMkH,KAAON,SAAQA,CAAA,CAAA,CAAA,EACxC,EACC7G,EAAA,KAAA,OAAA,CAAK,UAAWC,EAAM+G,OACrB,SAAA,CAAA9G,EAAA,IAAC,OAAK,CAAA,UAAWD,EAAMiH,IAAK,SAAU,aAAA,EACrChH,EAAA,IAAA,OAAA,CAAK,UAAWD,EAAMkH,KAAOH,SAAOA,CAAA,CAAA,CAAA,CACvC,CAAA,CAAA,EACF,CAEJ,CAEA,SAASJ,IAAgB,CACjB,KAAA,CAAEQ,KAAAA,GAASC,GAAU,EAG3B,OAFkBC,OAAOC,KAAKH,CAAI,EAAEI,OAAS,EAGnCtH,EAAAA,IAAAuH,GAAA,CAAQ,OAAO,2BAA2B,SAAuB,0BAAA,EAGpE,IACT,+FCrFA,SAAwBC,IAAkB,CACxC,MAAMN,EAAOO,GAAmB,EAEhC,OACG3H,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM2H,cACpB,SAAA,CAAA1H,EAAAA,IAAC8E,IACC,SAAC9E,MAAA1B,GAAA,CAAQ,SAAU4I,EAAK1I,QAAS,CAAA,EACnC,EACCwB,EAAA,IAAA0C,GAAA,CACC,SAAUwE,EAAK1I,SACf,UAAW0I,EAAKvE,UAChB,mBAAoBuE,EAAKtE,mBACzB,WAAYsE,EAAKrE,WAAW,EAE7B/C,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAM4H,UACpB,SAAA,CAAC3H,EAAAA,IAAAO,EAAA,CAAS,MAAO,CAAE,CAAA,EACnBP,EAAAA,IAACO,EAAS,CAAA,MAAO,CAAE,CAAA,EACnBP,EAAAA,IAACO,EAAS,CAAA,MAAO,CAAE,CAAA,CAAA,CACrB,CAAA,CAAA,EACF,CAEJ,8CCjBeqH,GAAAA,EAAAA,KAAKC,EAAkB,EACtC,SAASA,IAAqB,CAC5B,MAAMC,EAAcC,OAAOC,SAASC,SAASC,SAAS,eAAe,EAGnE,OAAAlI,MAACmI,IAAa,WAAW,SACvB,gBAACC,EAAA,CAAa,cAAY,sBACvB,SAAA,CAACN,CAAAA,GAAgB9H,EAAAA,IAAAqI,EAAA,CAAqB,QAAoBC,GAAAA,GAAY,eAAgBC,CAAK,EAAK,EAChGT,GAAgB9H,EAAAA,IAAAwI,GAAA,CAAmB,iBAAgB,GAAC,mBAAoBC,KAA2B,EAEpGzI,EAAA,IAAC,MAAI,CAAA,UAAWD,GAAM2I,QACpB,eAACC,GACC,CAAA,SAAA3I,EAAA,IAACwH,GAAe,CAAA,CAAA,CAClB,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ"}
1
+ {"version":3,"file":"TimerControlExport-Ba1vifNg.js","sources":["../../src/features/control/playback/add-time/AddTime.tsx","../../src/features/control/playback/aux-timer/AuxTimer.tsx","../../src/features/control/playback/playback-buttons/PlaybackButtons.tsx","../../src/features/control/playback/playback-timer/PlaybackTimer.tsx","../../src/features/control/playback/PlaybackControl.tsx","../../src/features/control/playback/TimerControlExport.tsx"],"sourcesContent":["import { IoAdd, IoRemove } from 'react-icons/io5';\nimport { useLocalStorage } from '@mantine/hooks';\nimport { Playback } from 'ontime-types';\nimport { MILLIS_PER_HOUR, parseUserTime } from 'ontime-utils';\n\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport { setPlayback } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './AddTime.module.scss';\n\ninterface AddTimeProps {\n playback: Playback;\n}\n\nexport default function AddTime(props: AddTimeProps) {\n const { playback } = props;\n const [timeInMs, setTime] = useLocalStorage({ key: 'add-time', defaultValue: 300_000 }); // 5 minutes\n\n const handleTimeChange = (_field: string, value: string) => {\n const newTimeInMs = parseUserTime(value);\n // cap add time to 1 hour\n setTime(Math.min(newTimeInMs, MILLIS_PER_HOUR));\n };\n\n const handleAddTime = (direction: 'add' | 'remove') => {\n // API expects input in milliseconds\n if (direction === 'add') {\n setPlayback.addTime(timeInMs);\n } else {\n setPlayback.addTime(-1 * timeInMs);\n }\n };\n\n const canAddTime = playback === Playback.Play || playback === Playback.Pause;\n const doDisableButtons = !canAddTime || timeInMs === 0;\n\n return (\n <div className={style.addTime}>\n <TimeInput name='addtime' submitHandler={handleTimeChange} time={timeInMs} placeholder='Add time' />\n <div className={style.addButtons}>\n <TapButton onClick={() => handleAddTime('remove')} disabled={doDisableButtons} className={style.tallButtons}>\n <IoRemove />\n </TapButton>\n <TapButton onClick={() => handleAddTime('add')} disabled={doDisableButtons} className={style.tallButtons}>\n <IoAdd />\n </TapButton>\n </div>\n </div>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoPause, IoPlay, IoStop } from 'react-icons/io5';\nimport { Playback, SimpleDirection, SimplePlayback } from 'ontime-types';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport { setAuxTimer, useAuxTimerControl, useAuxTimerTime } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './AuxTimer.module.scss';\n\ninterface AuxTimerProps {\n index: number;\n}\n\nexport function AuxTimer({ index }: AuxTimerProps) {\n const { playback, direction } = useAuxTimerControl(index);\n\n const { stop, setDirection } = setAuxTimer;\n\n const toggleDirection = () => {\n const newDirection = direction === SimpleDirection.CountDown ? SimpleDirection.CountUp : SimpleDirection.CountDown;\n setDirection(index, newDirection);\n };\n\n const isActive = playback !== SimplePlayback.Stop;\n const playbackAction = playback === SimplePlayback.Start ? 'pause' : 'play';\n\n return (\n <label className={style.label}>\n Aux Timer {index}\n <div className={style.controls}>\n <div className={style.input}>\n <AuxTimerInput index={index} isActive={isActive} />\n <TapButton onClick={toggleDirection} aspect='tight' disabled={isActive}>\n {direction === SimpleDirection.CountDown && <IoArrowDown data-testid={`aux-timer-direction-${index}`} />}\n {direction === SimpleDirection.CountUp && <IoArrowUp data-testid={`aux-timer-direction-${index}`} />}\n </TapButton>\n </div>\n <div className={style.twoSides}>\n <AuxTogglePlay index={index} action={playbackAction} />\n <TapButton onClick={() => stop(index)} theme={Playback.Stop} disabled={!isActive}>\n <IoStop data-testid={`aux-timer-stop-${index}`} />\n </TapButton>\n </div>\n </div>\n </label>\n );\n}\n\ninterface AuxTimerInputProps {\n index: number;\n isActive: boolean;\n}\n\nfunction AuxTimerInput({ index, isActive }: AuxTimerInputProps) {\n const newTimeInMs = useAuxTimerTime(index);\n const { setDuration } = setAuxTimer;\n\n const handleTimeUpdate = (_field: string, value: string) => {\n const newTimeInMs = parseUserTime(value);\n setDuration(index, newTimeInMs);\n };\n\n if (isActive) {\n return (\n <div className={style.fakeInput} data-testid={`time-label-aux${index}`}>\n {millisToString(newTimeInMs)}\n </div>\n );\n }\n\n return (\n <TimeInput submitHandler={handleTimeUpdate} name={`aux${index}`} time={newTimeInMs} placeholder={`Aux ${index}`} />\n );\n}\n\ninterface AuxTogglePlayProps {\n index: number;\n action: 'play' | 'pause';\n}\n\nfunction AuxTogglePlay({ index, action }: AuxTogglePlayProps) {\n const { start, pause } = setAuxTimer;\n\n if (action === 'play') {\n return (\n <TapButton onClick={() => start(index)} theme={Playback.Play}>\n <IoPlay data-testid={`aux-timer-start-${index}`} />\n </TapButton>\n );\n }\n\n return (\n <TapButton onClick={() => pause(index)} theme={Playback.Pause}>\n <IoPause data-testid={`aux-timer-pause-${index}`} />\n </TapButton>\n );\n}\n","import { IoPause, IoPlay, IoPlaySkipBack, IoPlaySkipForward, IoReload, IoStop } from 'react-icons/io5';\nimport { Playback, TimerPhase } from 'ontime-types';\n\nimport { setPlayback } from '../../../../common/hooks/useSocket';\nimport { getPlaybackControlState } from '../playbackControl.utils';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './PlaybackButtons.module.scss';\n\ninterface PlaybackButtonsProps {\n playback: Playback;\n numEvents: number;\n selectedEventIndex: number | null;\n timerPhase: TimerPhase;\n}\n\nexport default function PlaybackButtons({ playback, numEvents, selectedEventIndex, timerPhase }: PlaybackButtonsProps) {\n const {\n isPlaying,\n isPaused,\n isRolling,\n disableGo,\n disableNext,\n disablePrev,\n disableStart,\n disablePause,\n disableRoll,\n disableStop,\n disableReload,\n goAction,\n goLabel,\n } = getPlaybackControlState({\n playback,\n numEvents,\n selectedEventIndex,\n timerPhase,\n });\n\n return (\n <div className={style.buttonContainer}>\n <TapButton disabled={disableGo} onClick={goAction} aspect='fill' className={style.go}>\n {goLabel}\n </TapButton>\n <div className={style.playbackContainer}>\n <TapButton onClick={setPlayback.start} disabled={disableStart} theme={Playback.Play} active={isPlaying}>\n <IoPlay />\n </TapButton>\n\n <TapButton onClick={setPlayback.pause} disabled={disablePause} theme={Playback.Pause} active={isPaused}>\n <IoPause />\n </TapButton>\n </div>\n <div className={style.transportContainer}>\n <TapButton onClick={setPlayback.previous} disabled={disablePrev}>\n <IoPlaySkipBack />\n </TapButton>\n <TapButton onClick={setPlayback.next} disabled={disableNext}>\n <IoPlaySkipForward />\n </TapButton>\n </div>\n <div className={style.extra}>\n <TapButton onClick={setPlayback.roll} disabled={disableRoll} theme={Playback.Roll} active={isRolling}>\n Roll\n </TapButton>\n <TapButton onClick={setPlayback.reload} disabled={disableReload}>\n <IoReload className={style.invertX} />\n </TapButton>\n <TapButton onClick={setPlayback.stop} disabled={disableStop} theme={Playback.Stop}>\n <IoStop />\n </TapButton>\n </div>\n </div>\n );\n}\n","import { PropsWithChildren } from 'react';\nimport { MaybeNumber, Playback, TimerPhase } from 'ontime-types';\nimport { dayInMs, millisToString } from 'ontime-utils';\n\nimport AppLink from '../../../../common/components/link/app-link/AppLink';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useTimer } from '../../../../common/hooks/useSocket';\nimport useReport from '../../../../common/hooks-query/useReport';\nimport { formatDuration } from '../../../../common/utils/time';\nimport TimerDisplay from '../timer-display/TimerDisplay';\n\nimport style from './PlaybackTimer.module.scss';\n\nfunction resolveAddedTimeLabel(addedTime: number) {\n if (addedTime > 0) {\n return `Added ${formatDuration(addedTime, false)}`;\n }\n\n if (addedTime < 0) {\n return `Removed ${formatDuration(Math.abs(addedTime), false)}`;\n }\n\n return '';\n}\n\nexport default function PlaybackTimer({ children }: PropsWithChildren) {\n const timer = useTimer();\n\n const isRolling = timer.playback === Playback.Roll;\n const isWaiting = timer.phase === TimerPhase.Pending;\n const isOvertime = timer.phase === TimerPhase.Overtime;\n const hasAddedTime = Boolean(timer.addedTime);\n\n const rollLabel = isRolling ? 'Roll mode active' : '';\n\n const addedTimeLabel = resolveAddedTimeLabel(timer.addedTime);\n\n return (\n <div className={style.timeContainer}>\n <div className={style.indicators}>\n <Tooltip text={rollLabel} render={<div />} className={style.indicatorRoll} data-active={isRolling} />\n <div className={style.indicatorNegative} data-active={isOvertime} />\n <Tooltip text={addedTimeLabel} render={<div />} className={style.indicatorDelay} data-active={hasAddedTime} />\n </div>\n <TimerDisplay time={isWaiting ? timer.secondaryTimer : timer.current} phase={timer.phase} />\n <div className={style.status}>\n {isWaiting ? (\n <span className={style.rolltag}>Roll: Countdown to start</span>\n ) : (\n <RunningStatus startedAt={timer.startedAt} expectedFinish={timer.expectedFinish} playback={timer.playback} />\n )}\n </div>\n {children}\n </div>\n );\n}\n\ninterface RunningStatusProps {\n startedAt: MaybeNumber;\n expectedFinish: MaybeNumber;\n playback: Playback;\n}\nfunction RunningStatus({ startedAt, expectedFinish, playback }: RunningStatusProps) {\n if (playback === Playback.Stop) {\n return <StoppedStatus />;\n }\n\n const started = millisToString(startedAt);\n const finishedMs = expectedFinish !== null ? expectedFinish % dayInMs : null;\n const finish = millisToString(finishedMs);\n\n return (\n <>\n <span className={style.start}>\n <span className={style.tag}>Started at</span>\n <span className={style.time}>{started}</span>\n </span>\n <span className={style.finish}>\n <span className={style.tag}>Expect end</span>\n <span className={style.time}>{finish}</span>\n </span>\n </>\n );\n}\n\nfunction StoppedStatus() {\n const { data } = useReport();\n const hasReport = Object.keys(data).length > 0;\n\n if (hasReport) {\n return <AppLink search='settings=sharing__report'>Go to report management</AppLink>;\n }\n\n return null;\n}\n","import { usePlaybackControl } from '../../../common/hooks/useSocket';\n\nimport AddTime from './add-time/AddTime';\nimport { AuxTimer } from './aux-timer/AuxTimer';\nimport PlaybackButtons from './playback-buttons/PlaybackButtons';\nimport PlaybackTimer from './playback-timer/PlaybackTimer';\n\nimport style from './PlaybackControl.module.scss';\n\nexport default function PlaybackControl() {\n const data = usePlaybackControl();\n\n return (\n <div className={style.mainContainer}>\n <PlaybackTimer>\n <AddTime playback={data.playback} />\n </PlaybackTimer>\n <PlaybackButtons\n playback={data.playback}\n numEvents={data.numEvents}\n selectedEventIndex={data.selectedEventIndex}\n timerPhase={data.timerPhase}\n />\n <div className={style.auxTimers}>\n <AuxTimer index={1} />\n <AuxTimer index={2} />\n <AuxTimer index={3} />\n </div>\n </div>\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 PlaybackControl from './PlaybackControl';\n\nimport style from './TimerControlExport.module.scss';\n\nexport default memo(TimerControlExport);\nfunction TimerControlExport() {\n const isExtracted = window.location.pathname.includes('/timercontrol');\n\n return (\n <ProtectRoute permission='editor'>\n <Editor.Panel data-testid='panel-timer-control'>\n {!isExtracted && <Editor.CornerExtract onClick={(event) => handleLinks('timercontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings isNavigationLocked={getIsNavigationLocked()} />}\n\n <div className={style.content}>\n <ErrorBoundary>\n <PlaybackControl />\n </ErrorBoundary>\n </div>\n </Editor.Panel>\n </ProtectRoute>\n );\n}\n"],"names":["AddTime","props","playback","timeInMs","setTime","useLocalStorage","key","defaultValue","handleTimeChange","_field","value","newTimeInMs","parseUserTime","Math","min","MILLIS_PER_HOUR","handleAddTime","direction","setPlayback","addTime","doDisableButtons","Playback","Play","Pause","jsxs","style","jsx","TimeInput","addButtons","TapButton","tallButtons","IoRemove","IoAdd","AuxTimer","index","useAuxTimerControl","stop","setDirection","setAuxTimer","toggleDirection","newDirection","SimpleDirection","CountDown","CountUp","isActive","SimplePlayback","Stop","playbackAction","Start","label","controls","input","AuxTimerInput","IoArrowDown","IoArrowUp","twoSides","AuxTogglePlay","IoStop","useAuxTimerTime","setDuration","handleTimeUpdate","fakeInput","millisToString","action","start","pause","IoPlay","IoPause","PlaybackButtons","numEvents","selectedEventIndex","timerPhase","isPlaying","isPaused","isRolling","disableGo","disableNext","disablePrev","disableStart","disablePause","disableRoll","disableStop","disableReload","goAction","goLabel","getPlaybackControlState","buttonContainer","go","playbackContainer","transportContainer","previous","IoPlaySkipBack","next","IoPlaySkipForward","extra","roll","Roll","reload","IoReload","invertX","resolveAddedTimeLabel","addedTime","formatDuration","abs","PlaybackTimer","children","timer","useTimer","isWaiting","phase","TimerPhase","Pending","isOvertime","Overtime","hasAddedTime","Boolean","rollLabel","addedTimeLabel","timeContainer","indicators","Tooltip","indicatorRoll","indicatorNegative","indicatorDelay","TimerDisplay","secondaryTimer","current","status","rolltag","RunningStatus","startedAt","expectedFinish","StoppedStatus","started","finishedMs","dayInMs","finish","Fragment","tag","time","data","useReport","Object","keys","length","AppLink","PlaybackControl","usePlaybackControl","mainContainer","auxTimers","memo","TimerControlExport","isExtracted","window","location","pathname","includes","ProtectRoute","Editor.Panel","Editor.CornerExtract","handleLinks","event","ViewNavigationMenu","getIsNavigationLocked","content","ErrorBoundary"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{h as m,j as u}from"./vendor-CKDP5hij.js";import{h as e,y as b,b2 as d,e as f,m as x,bk as g}from"./index-2lQ-45a9.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]="c6d23acc-058e-410d-accc-af5a8ae6c2e6",t._sentryDebugIdIdentifier="sentry-dbid-c6d23acc-058e-410d-accc-af5a8ae6c2e6")}catch{}})();function w(t,s){return{start:t!==e.Stop&&t!==e.Play,pause:t===e.Play,roll:t!==e.Roll&&s!==b.Overtime,stop:t!==e.Stop,reload:t!==e.Stop&&t!==e.Roll}}function O({playback:t,numEvents:s,selectedEventIndex:a,timerPhase:n}){const c=a===0,r=a===s-1,o=s===0,l=t===e.Roll,i=w(t,n),{action:p,label:y}=h(t,a,r);return{isPlaying:t===e.Play,isPaused:t===e.Pause,isRolling:l,isArmed:t===e.Armed,isStopped:t===e.Stop,isFirst:c,isLast:r,noEvents:o,disableGo:l||o,disableNext:l||o||r,disablePrev:l||o||c,disableStart:!i.start,disablePause:!i.pause,disableRoll:!i.roll||o,disableStop:!i.stop,disableReload:!i.reload,disableAddTime:t!==e.Play&&t!==e.Pause,goAction:p,goLabel:y}}function h(t,s,a){return t===e.Armed?{action:d.start,label:"Start"}:a?{action:d.stop,label:"Finish"}:s===null?{action:d.startNext,label:"Start"}:{action:d.startNext,label:"Next"}}const z="_blink_yewzx_1",v="_fourtyfive_yewzx_13",S="_tapButton_yewzx_17",P="_neutral_yewzx_29",T="_active_yewzx_51",N="_play_yewzx_66",R="_roll_yewzx_93",A="_pause_yewzx_120",B="_ontime_yewzx_147",D="_stop_yewzx_174",j="_square_yewzx_201",q="_tight_yewzx_206",C="_fill_yewzx_211",_={blink:z,fourtyfive:v,tapButton:S,neutral:P,active:T,play:N,roll:R,pause:A,ontime:B,stop:D,square:j,tight:q,fill:C},I=m.forwardRef((t,s)=>{const{children:a,disabled:n,onClick:c,theme:r="neutral",aspect:o="normal",active:l,className:i}=t;return u.jsx("button",{className:f([_.tapButton,i,_[r],_[o],l&&_.active]),disabled:n,type:"button",onClick:c,ref:s,children:a})});I.displayName="TabButton";const F="_timer_kvqsa_21",G={timer:F};function $({time:t,phase:s,className:a}){const n=x(t,{fallback:g}).replace("-","");return u.jsx("div",{className:f([G.timer,a]),"data-phase":s,children:n})}export{I as T,$ as a,O as g};
2
- //# sourceMappingURL=TimerDisplay-Dgmbqf65.js.map
1
+ import{h as m,j as u}from"./vendor-BKUJ0_Du.js";import{h as e,y as b,b2 as d,e as f,m as x,bk as g}from"./index-Dm-4OTmY.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]="c6d23acc-058e-410d-accc-af5a8ae6c2e6",t._sentryDebugIdIdentifier="sentry-dbid-c6d23acc-058e-410d-accc-af5a8ae6c2e6")}catch{}})();function w(t,s){return{start:t!==e.Stop&&t!==e.Play,pause:t===e.Play,roll:t!==e.Roll&&s!==b.Overtime,stop:t!==e.Stop,reload:t!==e.Stop&&t!==e.Roll}}function O({playback:t,numEvents:s,selectedEventIndex:a,timerPhase:n}){const c=a===0,r=a===s-1,o=s===0,l=t===e.Roll,i=w(t,n),{action:p,label:y}=h(t,a,r);return{isPlaying:t===e.Play,isPaused:t===e.Pause,isRolling:l,isArmed:t===e.Armed,isStopped:t===e.Stop,isFirst:c,isLast:r,noEvents:o,disableGo:l||o,disableNext:l||o||r,disablePrev:l||o||c,disableStart:!i.start,disablePause:!i.pause,disableRoll:!i.roll||o,disableStop:!i.stop,disableReload:!i.reload,disableAddTime:t!==e.Play&&t!==e.Pause,goAction:p,goLabel:y}}function h(t,s,a){return t===e.Armed?{action:d.start,label:"Start"}:a?{action:d.stop,label:"Finish"}:s===null?{action:d.startNext,label:"Start"}:{action:d.startNext,label:"Next"}}const z="_blink_yewzx_1",v="_fourtyfive_yewzx_13",S="_tapButton_yewzx_17",P="_neutral_yewzx_29",T="_active_yewzx_51",N="_play_yewzx_66",R="_roll_yewzx_93",A="_pause_yewzx_120",B="_ontime_yewzx_147",D="_stop_yewzx_174",j="_square_yewzx_201",q="_tight_yewzx_206",C="_fill_yewzx_211",_={blink:z,fourtyfive:v,tapButton:S,neutral:P,active:T,play:N,roll:R,pause:A,ontime:B,stop:D,square:j,tight:q,fill:C},I=m.forwardRef((t,s)=>{const{children:a,disabled:n,onClick:c,theme:r="neutral",aspect:o="normal",active:l,className:i}=t;return u.jsx("button",{className:f([_.tapButton,i,_[r],_[o],l&&_.active]),disabled:n,type:"button",onClick:c,ref:s,children:a})});I.displayName="TabButton";const F="_timer_kvqsa_21",G={timer:F};function $({time:t,phase:s,className:a}){const n=x(t,{fallback:g}).replace("-","");return u.jsx("div",{className:f([G.timer,a]),"data-phase":s,children:n})}export{I as T,$ as a,O as g};
2
+ //# sourceMappingURL=TimerDisplay-tVcUk9j3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimerDisplay-Dgmbqf65.js","sources":["../../../../packages/utils/src/validate-action/validatePlayback.ts","../../src/features/control/playback/playbackControl.utils.ts","../../src/features/control/playback/tap-button/TapButton.tsx","../../src/features/control/playback/timer-display/TimerDisplay.tsx"],"sourcesContent":["import { Playback, TimerPhase } from 'ontime-types';\n\n/**\n * Simple rules to determine whether a playback action is valid\n */\nexport function validatePlayback(currentPlayback: Playback, timerPhase: TimerPhase) {\n return {\n start: currentPlayback !== Playback.Stop && currentPlayback !== Playback.Play,\n pause: currentPlayback === Playback.Play,\n roll: currentPlayback !== Playback.Roll && timerPhase !== TimerPhase.Overtime,\n stop: currentPlayback !== Playback.Stop,\n reload: currentPlayback !== Playback.Stop && currentPlayback !== Playback.Roll,\n };\n}\n","import { Playback, TimerPhase } from 'ontime-types';\nimport { validatePlayback } from 'ontime-utils';\n\nimport { setPlayback } from '../../../common/hooks/useSocket';\n\nexport interface PlaybackControlInput {\n playback: Playback;\n numEvents: number;\n selectedEventIndex: number | null;\n timerPhase: TimerPhase;\n}\n\nexport interface PlaybackControlState {\n // Playback states\n isPlaying: boolean;\n isPaused: boolean;\n isRolling: boolean;\n isArmed: boolean;\n isStopped: boolean;\n\n // Position states\n isFirst: boolean;\n isLast: boolean;\n noEvents: boolean;\n\n // Disable flags\n disableGo: boolean;\n disableNext: boolean;\n disablePrev: boolean;\n disableStart: boolean;\n disablePause: boolean;\n disableRoll: boolean;\n disableStop: boolean;\n disableReload: boolean;\n disableAddTime: boolean;\n\n // Go button configuration\n goAction: () => void;\n goLabel: 'Start' | 'Next' | 'Finish';\n}\n\n/**\n * Centralized playback control state calculator.\n * Consolidates all playback logic, disable states, and derived values in one place.\n */\nexport function getPlaybackControlState({\n playback,\n numEvents,\n selectedEventIndex,\n timerPhase,\n}: PlaybackControlInput): PlaybackControlState {\n const isFirst = selectedEventIndex === 0;\n const isLast = selectedEventIndex === numEvents - 1;\n const noEvents = numEvents === 0;\n const isRolling = playback === Playback.Roll;\n\n const playbackCan = validatePlayback(playback, timerPhase);\n const { action: goAction, label: goLabel } = getGoAction(playback, selectedEventIndex, isLast);\n\n return {\n isPlaying: playback === Playback.Play,\n isPaused: playback === Playback.Pause,\n isRolling,\n isArmed: playback === Playback.Armed,\n isStopped: playback === Playback.Stop,\n isFirst,\n isLast,\n noEvents,\n disableGo: isRolling || noEvents,\n disableNext: isRolling || noEvents || isLast,\n disablePrev: isRolling || noEvents || isFirst,\n disableStart: !playbackCan.start,\n disablePause: !playbackCan.pause,\n disableRoll: !playbackCan.roll || noEvents,\n disableStop: !playbackCan.stop,\n disableReload: !playbackCan.reload,\n disableAddTime: playback !== Playback.Play && playback !== Playback.Pause,\n goAction,\n goLabel,\n };\n}\n\n/**\n * Determines the action and label for the \"Go\" button based on playback state.\n */\nfunction getGoAction(\n playback: Playback,\n selectedEventIndex: number | null,\n isLast: boolean,\n): { action: () => void; label: 'Start' | 'Next' | 'Finish' } {\n if (playback === Playback.Armed) return { action: setPlayback.start, label: 'Start' };\n if (isLast) return { action: setPlayback.stop, label: 'Finish' };\n if (selectedEventIndex === null) return { action: setPlayback.startNext, label: 'Start' };\n return { action: setPlayback.startNext, label: 'Next' };\n}\n","import { ForwardedRef, forwardRef, PropsWithChildren } from 'react';\nimport { Playback } from 'ontime-types';\n\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './TapButton.module.scss';\n\ninterface TapButtonProps {\n disabled?: boolean;\n aspect?: 'normal' | 'square' | 'fill' | 'tight';\n free?: boolean;\n onClick: () => void;\n theme?: Playback | 'neutral';\n active?: boolean;\n className?: string;\n}\n\nconst TapButton = forwardRef((props: PropsWithChildren<TapButtonProps>, ref: ForwardedRef<HTMLButtonElement>) => {\n const { children, disabled, onClick, theme = 'neutral', aspect = 'normal', active, className } = props;\n\n return (\n <button\n className={cx([style.tapButton, className, style[theme], style[aspect], active && style.active])}\n disabled={disabled}\n type='button'\n onClick={onClick}\n ref={ref}\n >\n {children}\n </button>\n );\n});\n\nTapButton.displayName = 'TabButton';\nexport default TapButton;\n","import { MaybeNumber, TimerPhase } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport { cx, timerPlaceholder } from '../../../../common/utils/styleUtils';\n\nimport style from './TimerDisplay.module.scss';\n\ninterface TimerDisplayProps {\n time: MaybeNumber;\n phase: TimerPhase;\n className?: string;\n}\n\n/**\n * Displays time in ms in formatted timetag\n * Used in editor\n */\nexport default function TimerDisplay({ time, phase, className }: TimerDisplayProps) {\n const display = millisToString(time, { fallback: timerPlaceholder }).replace('-', '');\n\n return (\n <div className={cx([style.timer, className])} data-phase={phase}>\n {display}\n </div>\n );\n}\n"],"names":["validatePlayback","currentPlayback","timerPhase","start","Playback","Stop","Play","pause","roll","Roll","TimerPhase","Overtime","stop","reload","getPlaybackControlState","playback","numEvents","selectedEventIndex","isFirst","isLast","noEvents","isRolling","playbackCan","action","goAction","label","goLabel","getGoAction","isPlaying","isPaused","Pause","isArmed","Armed","isStopped","disableGo","disableNext","disablePrev","disableStart","disablePause","disableRoll","disableStop","disableReload","disableAddTime","setPlayback","startNext","TapButton","forwardRef","props","ref","children","disabled","onClick","theme","aspect","active","className","jsx","cx","style","tapButton","displayName","TimerDisplay","time","phase","display","millisToString","fallback","timerPlaceholder","replace","timer"],"mappings":"udAKgBA,SAAAA,EAAiBC,EAA2BC,EAAwB,CAC3E,MAAA,CACLC,MAAOF,IAAoBG,EAASC,MAAQJ,IAAoBG,EAASE,KACzEC,MAAON,IAAoBG,EAASE,KACpCE,KAAMP,IAAoBG,EAASK,MAAQP,IAAeQ,EAAWC,SACrEC,KAAMX,IAAoBG,EAASC,KACnCQ,OAAQZ,IAAoBG,EAASC,MAAQJ,IAAoBG,EAASK,IAC5E,CACF,CCgCO,SAASK,EAAwB,CACtCC,SAAAA,EACAC,UAAAA,EACAC,mBAAAA,EACAf,WAAAA,CACoB,EAAyB,CAC7C,MAAMgB,EAAUD,IAAuB,EACjCE,EAASF,IAAuBD,EAAY,EAC5CI,EAAWJ,IAAc,EACzBK,EAAYN,IAAaX,EAASK,KAElCa,EAActB,EAAiBe,EAAUb,CAAU,EACnD,CAAEqB,OAAQC,EAAUC,MAAOC,CAAYC,EAAAA,EAAYZ,EAAUE,EAAoBE,CAAM,EAEtF,MAAA,CACLS,UAAWb,IAAaX,EAASE,KACjCuB,SAAUd,IAAaX,EAAS0B,MAChCT,UAAAA,EACAU,QAAShB,IAAaX,EAAS4B,MAC/BC,UAAWlB,IAAaX,EAASC,KACjCa,QAAAA,EACAC,OAAAA,EACAC,SAAAA,EACAc,UAAWb,GAAaD,EACxBe,YAAad,GAAaD,GAAYD,EACtCiB,YAAaf,GAAaD,GAAYF,EACtCmB,aAAc,CAACf,EAAYnB,MAC3BmC,aAAc,CAAChB,EAAYf,MAC3BgC,YAAa,CAACjB,EAAYd,MAAQY,EAClCoB,YAAa,CAAClB,EAAYV,KAC1B6B,cAAe,CAACnB,EAAYT,OAC5B6B,eAAgB3B,IAAaX,EAASE,MAAQS,IAAaX,EAAS0B,MACpEN,SAAAA,EACAE,QAAAA,CACF,CACF,CAKA,SAASC,EACPZ,EACAE,EACAE,EAC4D,CACxDJ,OAAAA,IAAaX,EAAS4B,MAAc,CAAET,OAAQoB,EAAYxC,MAAOsB,MAAO,OAAQ,EAChFN,EAAe,CAAEI,OAAQoB,EAAY/B,KAAMa,MAAO,QAAS,EAC3DR,IAAuB,KAAa,CAAEM,OAAQoB,EAAYC,UAAWnB,MAAO,OAAQ,EACjF,CAAEF,OAAQoB,EAAYC,UAAWnB,MAAO,MAAO,CACxD,gZC7EMoB,EAAYC,EAAAA,WAAW,CAACC,EAA0CC,IAAyC,CACzG,KAAA,CAAEC,SAAAA,EAAUC,SAAAA,EAAUC,QAAAA,EAASC,MAAAA,EAAQ,UAAWC,OAAAA,EAAS,SAAUC,OAAAA,EAAQC,UAAAA,CAAAA,EAAcR,EAG/F,OAAAS,MAAC,SACC,CAAA,UAAWC,EAAG,CAACC,EAAMC,UAAWJ,EAAWG,EAAMN,CAAK,EAAGM,EAAML,CAAM,EAAGC,GAAUI,EAAMJ,MAAM,CAAC,EAC/F,SAAAJ,EACA,KAAK,SACL,QAAAC,EACA,IAAAH,EAECC,SAAAA,CACH,CAAA,CAEJ,CAAC,EAEDJ,EAAUe,YAAc,kDChBxB,SAAwBC,EAAa,CAAEC,KAAAA,EAAMC,MAAAA,EAAOR,UAAAA,CAA6B,EAAG,CAC5ES,MAAAA,EAAUC,EAAeH,EAAM,CAAEI,SAAUC,CAAAA,CAAkB,EAAEC,QAAQ,IAAK,EAAE,EAEpF,OACGZ,EAAA,IAAA,MAAA,CAAI,UAAWC,EAAG,CAACC,EAAMW,MAAOd,CAAS,CAAC,EAAG,aAAYQ,EACvDC,SACHA,CAAA,CAAA,CAEJ"}
1
+ {"version":3,"file":"TimerDisplay-tVcUk9j3.js","sources":["../../../../packages/utils/src/validate-action/validatePlayback.ts","../../src/features/control/playback/playbackControl.utils.ts","../../src/features/control/playback/tap-button/TapButton.tsx","../../src/features/control/playback/timer-display/TimerDisplay.tsx"],"sourcesContent":["import { Playback, TimerPhase } from 'ontime-types';\n\n/**\n * Simple rules to determine whether a playback action is valid\n */\nexport function validatePlayback(currentPlayback: Playback, timerPhase: TimerPhase) {\n return {\n start: currentPlayback !== Playback.Stop && currentPlayback !== Playback.Play,\n pause: currentPlayback === Playback.Play,\n roll: currentPlayback !== Playback.Roll && timerPhase !== TimerPhase.Overtime,\n stop: currentPlayback !== Playback.Stop,\n reload: currentPlayback !== Playback.Stop && currentPlayback !== Playback.Roll,\n };\n}\n","import { Playback, TimerPhase } from 'ontime-types';\nimport { validatePlayback } from 'ontime-utils';\n\nimport { setPlayback } from '../../../common/hooks/useSocket';\n\nexport interface PlaybackControlInput {\n playback: Playback;\n numEvents: number;\n selectedEventIndex: number | null;\n timerPhase: TimerPhase;\n}\n\nexport interface PlaybackControlState {\n // Playback states\n isPlaying: boolean;\n isPaused: boolean;\n isRolling: boolean;\n isArmed: boolean;\n isStopped: boolean;\n\n // Position states\n isFirst: boolean;\n isLast: boolean;\n noEvents: boolean;\n\n // Disable flags\n disableGo: boolean;\n disableNext: boolean;\n disablePrev: boolean;\n disableStart: boolean;\n disablePause: boolean;\n disableRoll: boolean;\n disableStop: boolean;\n disableReload: boolean;\n disableAddTime: boolean;\n\n // Go button configuration\n goAction: () => void;\n goLabel: 'Start' | 'Next' | 'Finish';\n}\n\n/**\n * Centralized playback control state calculator.\n * Consolidates all playback logic, disable states, and derived values in one place.\n */\nexport function getPlaybackControlState({\n playback,\n numEvents,\n selectedEventIndex,\n timerPhase,\n}: PlaybackControlInput): PlaybackControlState {\n const isFirst = selectedEventIndex === 0;\n const isLast = selectedEventIndex === numEvents - 1;\n const noEvents = numEvents === 0;\n const isRolling = playback === Playback.Roll;\n\n const playbackCan = validatePlayback(playback, timerPhase);\n const { action: goAction, label: goLabel } = getGoAction(playback, selectedEventIndex, isLast);\n\n return {\n isPlaying: playback === Playback.Play,\n isPaused: playback === Playback.Pause,\n isRolling,\n isArmed: playback === Playback.Armed,\n isStopped: playback === Playback.Stop,\n isFirst,\n isLast,\n noEvents,\n disableGo: isRolling || noEvents,\n disableNext: isRolling || noEvents || isLast,\n disablePrev: isRolling || noEvents || isFirst,\n disableStart: !playbackCan.start,\n disablePause: !playbackCan.pause,\n disableRoll: !playbackCan.roll || noEvents,\n disableStop: !playbackCan.stop,\n disableReload: !playbackCan.reload,\n disableAddTime: playback !== Playback.Play && playback !== Playback.Pause,\n goAction,\n goLabel,\n };\n}\n\n/**\n * Determines the action and label for the \"Go\" button based on playback state.\n */\nfunction getGoAction(\n playback: Playback,\n selectedEventIndex: number | null,\n isLast: boolean,\n): { action: () => void; label: 'Start' | 'Next' | 'Finish' } {\n if (playback === Playback.Armed) return { action: setPlayback.start, label: 'Start' };\n if (isLast) return { action: setPlayback.stop, label: 'Finish' };\n if (selectedEventIndex === null) return { action: setPlayback.startNext, label: 'Start' };\n return { action: setPlayback.startNext, label: 'Next' };\n}\n","import { ForwardedRef, forwardRef, PropsWithChildren } from 'react';\nimport { Playback } from 'ontime-types';\n\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './TapButton.module.scss';\n\ninterface TapButtonProps {\n disabled?: boolean;\n aspect?: 'normal' | 'square' | 'fill' | 'tight';\n free?: boolean;\n onClick: () => void;\n theme?: Playback | 'neutral';\n active?: boolean;\n className?: string;\n}\n\nconst TapButton = forwardRef((props: PropsWithChildren<TapButtonProps>, ref: ForwardedRef<HTMLButtonElement>) => {\n const { children, disabled, onClick, theme = 'neutral', aspect = 'normal', active, className } = props;\n\n return (\n <button\n className={cx([style.tapButton, className, style[theme], style[aspect], active && style.active])}\n disabled={disabled}\n type='button'\n onClick={onClick}\n ref={ref}\n >\n {children}\n </button>\n );\n});\n\nTapButton.displayName = 'TabButton';\nexport default TapButton;\n","import { MaybeNumber, TimerPhase } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport { cx, timerPlaceholder } from '../../../../common/utils/styleUtils';\n\nimport style from './TimerDisplay.module.scss';\n\ninterface TimerDisplayProps {\n time: MaybeNumber;\n phase: TimerPhase;\n className?: string;\n}\n\n/**\n * Displays time in ms in formatted timetag\n * Used in editor\n */\nexport default function TimerDisplay({ time, phase, className }: TimerDisplayProps) {\n const display = millisToString(time, { fallback: timerPlaceholder }).replace('-', '');\n\n return (\n <div className={cx([style.timer, className])} data-phase={phase}>\n {display}\n </div>\n );\n}\n"],"names":["validatePlayback","currentPlayback","timerPhase","start","Playback","Stop","Play","pause","roll","Roll","TimerPhase","Overtime","stop","reload","getPlaybackControlState","playback","numEvents","selectedEventIndex","isFirst","isLast","noEvents","isRolling","playbackCan","action","goAction","label","goLabel","getGoAction","isPlaying","isPaused","Pause","isArmed","Armed","isStopped","disableGo","disableNext","disablePrev","disableStart","disablePause","disableRoll","disableStop","disableReload","disableAddTime","setPlayback","startNext","TapButton","forwardRef","props","ref","children","disabled","onClick","theme","aspect","active","className","jsx","cx","style","tapButton","displayName","TimerDisplay","time","phase","display","millisToString","fallback","timerPlaceholder","replace","timer"],"mappings":"udAKgBA,SAAAA,EAAiBC,EAA2BC,EAAwB,CAC3E,MAAA,CACLC,MAAOF,IAAoBG,EAASC,MAAQJ,IAAoBG,EAASE,KACzEC,MAAON,IAAoBG,EAASE,KACpCE,KAAMP,IAAoBG,EAASK,MAAQP,IAAeQ,EAAWC,SACrEC,KAAMX,IAAoBG,EAASC,KACnCQ,OAAQZ,IAAoBG,EAASC,MAAQJ,IAAoBG,EAASK,IAC5E,CACF,CCgCO,SAASK,EAAwB,CACtCC,SAAAA,EACAC,UAAAA,EACAC,mBAAAA,EACAf,WAAAA,CACoB,EAAyB,CAC7C,MAAMgB,EAAUD,IAAuB,EACjCE,EAASF,IAAuBD,EAAY,EAC5CI,EAAWJ,IAAc,EACzBK,EAAYN,IAAaX,EAASK,KAElCa,EAActB,EAAiBe,EAAUb,CAAU,EACnD,CAAEqB,OAAQC,EAAUC,MAAOC,CAAYC,EAAAA,EAAYZ,EAAUE,EAAoBE,CAAM,EAEtF,MAAA,CACLS,UAAWb,IAAaX,EAASE,KACjCuB,SAAUd,IAAaX,EAAS0B,MAChCT,UAAAA,EACAU,QAAShB,IAAaX,EAAS4B,MAC/BC,UAAWlB,IAAaX,EAASC,KACjCa,QAAAA,EACAC,OAAAA,EACAC,SAAAA,EACAc,UAAWb,GAAaD,EACxBe,YAAad,GAAaD,GAAYD,EACtCiB,YAAaf,GAAaD,GAAYF,EACtCmB,aAAc,CAACf,EAAYnB,MAC3BmC,aAAc,CAAChB,EAAYf,MAC3BgC,YAAa,CAACjB,EAAYd,MAAQY,EAClCoB,YAAa,CAAClB,EAAYV,KAC1B6B,cAAe,CAACnB,EAAYT,OAC5B6B,eAAgB3B,IAAaX,EAASE,MAAQS,IAAaX,EAAS0B,MACpEN,SAAAA,EACAE,QAAAA,CACF,CACF,CAKA,SAASC,EACPZ,EACAE,EACAE,EAC4D,CACxDJ,OAAAA,IAAaX,EAAS4B,MAAc,CAAET,OAAQoB,EAAYxC,MAAOsB,MAAO,OAAQ,EAChFN,EAAe,CAAEI,OAAQoB,EAAY/B,KAAMa,MAAO,QAAS,EAC3DR,IAAuB,KAAa,CAAEM,OAAQoB,EAAYC,UAAWnB,MAAO,OAAQ,EACjF,CAAEF,OAAQoB,EAAYC,UAAWnB,MAAO,MAAO,CACxD,gZC7EMoB,EAAYC,EAAAA,WAAW,CAACC,EAA0CC,IAAyC,CACzG,KAAA,CAAEC,SAAAA,EAAUC,SAAAA,EAAUC,QAAAA,EAASC,MAAAA,EAAQ,UAAWC,OAAAA,EAAS,SAAUC,OAAAA,EAAQC,UAAAA,CAAAA,EAAcR,EAG/F,OAAAS,MAAC,SACC,CAAA,UAAWC,EAAG,CAACC,EAAMC,UAAWJ,EAAWG,EAAMN,CAAK,EAAGM,EAAML,CAAM,EAAGC,GAAUI,EAAMJ,MAAM,CAAC,EAC/F,SAAAJ,EACA,KAAK,SACL,QAAAC,EACA,IAAAH,EAECC,SAAAA,CACH,CAAA,CAEJ,CAAC,EAEDJ,EAAUe,YAAc,kDChBxB,SAAwBC,EAAa,CAAEC,KAAAA,EAAMC,MAAAA,EAAOR,UAAAA,CAA6B,EAAG,CAC5ES,MAAAA,EAAUC,EAAeH,EAAM,CAAEI,SAAUC,CAAAA,CAAkB,EAAEC,QAAQ,IAAK,EAAE,EAEpF,OACGZ,EAAA,IAAA,MAAA,CAAI,UAAWC,EAAG,CAACC,EAAMW,MAAOd,CAAS,CAAC,EAAG,aAAYQ,EACvDC,SACHA,CAAA,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{h as o,j as t}from"./vendor-CKDP5hij.js";import{d as f,e as n}from"./index-2lQ-45a9.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},a=new e.Error().stack;a&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[a]="730f5ea8-2753-4e71-b032-7d755a9f78cc",e._sentryDebugIdIdentifier="sentry-dbid-730f5ea8-2753-4e71-b032-7d755a9f78cc")}catch{}})();const b=o.forwardRef((e,a)=>{const{label:s,title:d,secondary:r,className:l=""}=e,{getLocalizedString:c}=f(),i=s==="now";return t.jsxs("div",{className:n(["title-card",l]),ref:a,children:[t.jsx("span",{className:"title-card__title",children:d}),t.jsx("span",{className:n(["title-card__label",i&&"title-card__label--accent"]),children:s&&c(`common.${s}`)}),t.jsx("div",{className:"title-card__secondary",children:r})]})});b.displayName="TitleCard";export{b as T};
2
- //# sourceMappingURL=TitleCard-MUurHeZ7.js.map
1
+ import{h as o,j as t}from"./vendor-BKUJ0_Du.js";import{d as f,e as n}from"./index-Dm-4OTmY.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},a=new e.Error().stack;a&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[a]="730f5ea8-2753-4e71-b032-7d755a9f78cc",e._sentryDebugIdIdentifier="sentry-dbid-730f5ea8-2753-4e71-b032-7d755a9f78cc")}catch{}})();const b=o.forwardRef((e,a)=>{const{label:s,title:d,secondary:r,className:l=""}=e,{getLocalizedString:c}=f(),i=s==="now";return t.jsxs("div",{className:n(["title-card",l]),ref:a,children:[t.jsx("span",{className:"title-card__title",children:d}),t.jsx("span",{className:n(["title-card__label",i&&"title-card__label--accent"]),children:s&&c(`common.${s}`)}),t.jsx("div",{className:"title-card__secondary",children:r})]})});b.displayName="TitleCard";export{b as T};
2
+ //# sourceMappingURL=TitleCard-BNjv58eq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TitleCard-MUurHeZ7.js","sources":["../../src/common/components/title-card/TitleCard.tsx"],"sourcesContent":["import { ForwardedRef, forwardRef } from 'react';\n\nimport { useTranslation } from '../../../translation/TranslationProvider';\nimport { cx } from '../../utils/styleUtils';\n\nimport './TitleCard.scss';\n\ninterface TitleCardProps {\n title?: string;\n label?: 'now' | 'next';\n secondary?: string;\n className?: string;\n}\n\nconst TitleCard = forwardRef((props: TitleCardProps, ref: ForwardedRef<HTMLDivElement>) => {\n const { label, title, secondary, className = '' } = props;\n const { getLocalizedString } = useTranslation();\n\n const accent = label === 'now';\n\n return (\n <div className={cx(['title-card', className])} ref={ref}>\n <span className='title-card__title'>{title}</span>\n <span className={cx(['title-card__label', accent && 'title-card__label--accent'])}>\n {label && getLocalizedString(`common.${label}`)}\n </span>\n <div className='title-card__secondary'>{secondary}</div>\n </div>\n );\n});\n\nTitleCard.displayName = 'TitleCard';\nexport default TitleCard;\n"],"names":["TitleCard","forwardRef","props","ref","label","title","secondary","className","getLocalizedString","useTranslation","accent","jsxs","cx","jsx","displayName"],"mappings":"ybAcA,MAAMA,EAAYC,EAAAA,WAAW,CAACC,EAAuBC,IAAsC,CACnF,KAAA,CAAEC,MAAAA,EAAOC,MAAAA,EAAOC,UAAAA,EAAWC,UAAAA,EAAY,EAAA,EAAOL,EAC9C,CAAEM,mBAAAA,GAAuBC,EAAe,EAExCC,EAASN,IAAU,MAGvB,OAAAO,OAAC,OAAI,UAAWC,EAAG,CAAC,aAAcL,CAAS,CAAC,EAAG,IAAAJ,EAC7C,SAAA,CAACU,EAAA,IAAA,OAAA,CAAK,UAAU,oBAAqBR,SAAMA,EAAA,EAC1CQ,EAAA,IAAA,OAAA,CAAK,UAAWD,EAAG,CAAC,oBAAqBF,GAAU,2BAA2B,CAAC,EAC7EN,SAASI,GAAAA,EAAmB,UAAUJ,CAAK,EAAE,EAChD,EACCS,EAAA,IAAA,MAAA,CAAI,UAAU,wBAAyBP,SAAUA,CAAA,CAAA,CAAA,EACpD,CAEJ,CAAC,EAEDN,EAAUc,YAAc"}
1
+ {"version":3,"file":"TitleCard-BNjv58eq.js","sources":["../../src/common/components/title-card/TitleCard.tsx"],"sourcesContent":["import { ForwardedRef, forwardRef } from 'react';\n\nimport { useTranslation } from '../../../translation/TranslationProvider';\nimport { cx } from '../../utils/styleUtils';\n\nimport './TitleCard.scss';\n\ninterface TitleCardProps {\n title?: string;\n label?: 'now' | 'next';\n secondary?: string;\n className?: string;\n}\n\nconst TitleCard = forwardRef((props: TitleCardProps, ref: ForwardedRef<HTMLDivElement>) => {\n const { label, title, secondary, className = '' } = props;\n const { getLocalizedString } = useTranslation();\n\n const accent = label === 'now';\n\n return (\n <div className={cx(['title-card', className])} ref={ref}>\n <span className='title-card__title'>{title}</span>\n <span className={cx(['title-card__label', accent && 'title-card__label--accent'])}>\n {label && getLocalizedString(`common.${label}`)}\n </span>\n <div className='title-card__secondary'>{secondary}</div>\n </div>\n );\n});\n\nTitleCard.displayName = 'TitleCard';\nexport default TitleCard;\n"],"names":["TitleCard","forwardRef","props","ref","label","title","secondary","className","getLocalizedString","useTranslation","accent","jsxs","cx","jsx","displayName"],"mappings":"ybAcA,MAAMA,EAAYC,EAAAA,WAAW,CAACC,EAAuBC,IAAsC,CACnF,KAAA,CAAEC,MAAAA,EAAOC,MAAAA,EAAOC,UAAAA,EAAWC,UAAAA,EAAY,EAAA,EAAOL,EAC9C,CAAEM,mBAAAA,GAAuBC,EAAe,EAExCC,EAASN,IAAU,MAGvB,OAAAO,OAAC,OAAI,UAAWC,EAAG,CAAC,aAAcL,CAAS,CAAC,EAAG,IAAAJ,EAC7C,SAAA,CAACU,EAAA,IAAA,OAAA,CAAK,UAAU,oBAAqBR,SAAMA,EAAA,EAC1CQ,EAAA,IAAA,OAAA,CAAK,UAAWD,EAAG,CAAC,oBAAqBF,GAAU,2BAA2B,CAAC,EAC7EN,SAASI,GAAAA,EAAmB,UAAUJ,CAAK,EAAE,EAChD,EACCS,EAAA,IAAA,MAAA,CAAI,UAAU,wBAAyBP,SAAUA,CAAA,CAAA,CAAA,EACpD,CAEJ,CAAC,EAEDN,EAAUc,YAAc"}
@@ -1,2 +1,2 @@
1
- import{j as t,co as i,cp as n,cq as l,cr as r,cs as d,ct as f}from"./vendor-CKDP5hij.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new o.Error().stack;e&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[e]="f98e3f03-2dce-4864-983f-fe75768554b9",o._sentryDebugIdIdentifier="sentry-dbid-f98e3f03-2dce-4864-983f-fe75768554b9")}catch{}})();const p="_tooltip_1391b_17",c={tooltip:p};function b({text:o,children:e,...s}){return t.jsxs(i,{children:[t.jsx(n,{...s,children:e}),t.jsx(l,{children:t.jsx(r,{side:"bottom",sideOffset:4,children:t.jsxs(d,{className:c.tooltip,children:[t.jsx(f,{}),o]})})})]})}export{b as T};
2
- //# sourceMappingURL=Tooltip-DXph8P8p.js.map
1
+ import{j as t,co as i,cp as n,cq as l,cr as r,cs as d,ct as f}from"./vendor-BKUJ0_Du.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new o.Error().stack;e&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[e]="f98e3f03-2dce-4864-983f-fe75768554b9",o._sentryDebugIdIdentifier="sentry-dbid-f98e3f03-2dce-4864-983f-fe75768554b9")}catch{}})();const p="_tooltip_1391b_17",c={tooltip:p};function b({text:o,children:e,...s}){return t.jsxs(i,{children:[t.jsx(n,{...s,children:e}),t.jsx(l,{children:t.jsx(r,{side:"bottom",sideOffset:4,children:t.jsxs(d,{className:c.tooltip,children:[t.jsx(f,{}),o]})})})]})}export{b as T};
2
+ //# sourceMappingURL=Tooltip-DZJ7u9gm.js.map
@@ -0,0 +1,4 @@
1
+ � �o�w�˔�� �j�:����M�w?�>3�)q�/�Z7sk,|�b�f.���Fd��U���ȩCC=*0��1"t]YD�!�ˀ��oά���%~��ßj�x�9����@���3��
2
+ }��S&7���;���D"��+,;�c/
3
+ <LJ�3<�� �}�3F�ç,��"��&�v��g�� ��z�E��V,���m����ț���'3"��T�&�t����r~����ʁ"��ya$���+9(-��Zi���Z:�WEe�����=5x@`�*R��
4
+ ��~��_�zG0bR�B��W�=�>g�u23��[.f������f�����,��&�$�G7
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip-DXph8P8p.js","sources":["../../src/common/components/tooltip/Tooltip.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\nimport { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';\n\nimport style from './Tooltip.module.scss';\n\ninterface TooltipProps extends BaseTooltip.Trigger.Props {\n text: string;\n}\n\nexport default function Tooltip({ text, children, ...triggerProps }: PropsWithChildren<TooltipProps>) {\n return (\n <BaseTooltip.Root>\n <BaseTooltip.Trigger {...triggerProps}>{children}</BaseTooltip.Trigger>\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner side='bottom' sideOffset={4}>\n <BaseTooltip.Popup className={style.tooltip}>\n <BaseTooltip.Arrow />\n {text}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n}\n"],"names":["Tooltip","text","children","triggerProps","jsxs","BaseTooltip.Root","jsx","BaseTooltip.Trigger","BaseTooltip.Portal","BaseTooltip.Positioner","BaseTooltip.Popup","style","tooltip","BaseTooltip.Arrow"],"mappings":"6dASA,SAAwBA,EAAQ,CAAEC,KAAAA,EAAMC,SAAAA,EAAU,GAAGC,CAA8C,EAAG,CAElG,OAAAC,EAAA,KAACC,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAwBJ,GAAAA,EAAeD,SAAAA,CAAS,CAAA,QAChDM,EAAA,CACC,SAACF,EAAA,IAAAG,EAAA,CAAuB,KAAK,SAAS,WAAY,EAChD,SAACL,EAAAA,KAAAM,EAAA,CAAkB,UAAWC,EAAMC,QAClC,SAAA,CAACN,EAAA,IAAAO,EAAA,EAAiB,EACjBZ,CAAAA,CACH,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"Tooltip-DZJ7u9gm.js","sources":["../../src/common/components/tooltip/Tooltip.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\nimport { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';\n\nimport style from './Tooltip.module.scss';\n\ninterface TooltipProps extends BaseTooltip.Trigger.Props {\n text: string;\n}\n\nexport default function Tooltip({ text, children, ...triggerProps }: PropsWithChildren<TooltipProps>) {\n return (\n <BaseTooltip.Root>\n <BaseTooltip.Trigger {...triggerProps}>{children}</BaseTooltip.Trigger>\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner side='bottom' sideOffset={4}>\n <BaseTooltip.Popup className={style.tooltip}>\n <BaseTooltip.Arrow />\n {text}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n}\n"],"names":["Tooltip","text","children","triggerProps","jsxs","BaseTooltip.Root","jsx","BaseTooltip.Trigger","BaseTooltip.Portal","BaseTooltip.Positioner","BaseTooltip.Popup","style","tooltip","BaseTooltip.Arrow"],"mappings":"6dASA,SAAwBA,EAAQ,CAAEC,KAAAA,EAAMC,SAAAA,EAAU,GAAGC,CAA8C,EAAG,CAElG,OAAAC,EAAA,KAACC,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAwBJ,GAAAA,EAAeD,SAAAA,CAAS,CAAA,QAChDM,EAAA,CACC,SAACF,EAAA,IAAAG,EAAA,CAAuB,KAAK,SAAS,WAAY,EAChD,SAACL,EAAAA,KAAAM,EAAA,CAAkB,UAAWC,EAAMC,QAClC,SAAA,CAACN,EAAA,IAAAO,EAAA,EAAiB,EACjBZ,CAAAA,CACH,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{h as a,j as o}from"./vendor-CKDP5hij.js";import{N as s}from"./index-2lQ-45a9.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new e.Error().stack;r&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[r]="6bf22d2d-1cd6-4a1c-a028-becb64aafaad",e._sentryDebugIdIdentifier="sentry-dbid-6bf22d2d-1cd6-4a1c-a028-becb64aafaad")}catch{}})();function f({name:e,className:r}){const n=a.useRef(null),t=()=>{n.current&&(n.current.style.display="none")};return o.jsx("div",{className:r,children:o.jsx("img",{ref:n,alt:"",src:`${s}/${e}`,className:"viewLogo",onError:t})})}export{f as V};
2
- //# sourceMappingURL=ViewLogo-Ckp7i75x.js.map
1
+ import{h as a,j as o}from"./vendor-BKUJ0_Du.js";import{N as s}from"./index-Dm-4OTmY.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new e.Error().stack;r&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[r]="6bf22d2d-1cd6-4a1c-a028-becb64aafaad",e._sentryDebugIdIdentifier="sentry-dbid-6bf22d2d-1cd6-4a1c-a028-becb64aafaad")}catch{}})();function f({name:e,className:r}){const n=a.useRef(null),t=()=>{n.current&&(n.current.style.display="none")};return o.jsx("div",{className:r,children:o.jsx("img",{ref:n,alt:"",src:`${s}/${e}`,className:"viewLogo",onError:t})})}export{f as V};
2
+ //# sourceMappingURL=ViewLogo-2I7w5Yms.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewLogo-Ckp7i75x.js","sources":["../../src/common/components/view-logo/ViewLogo.tsx"],"sourcesContent":["import { useRef } from 'react';\n\nimport { projectLogoPath } from '../../api/constants';\n\nimport './ViewLogo.scss';\n\ninterface ViewLogoProps {\n name: string;\n className: string;\n}\n\nexport default function ViewLogo({ name, className }: ViewLogoProps) {\n const imageRef = useRef<HTMLImageElement>(null);\n\n const hideImage = () => {\n if (!imageRef.current) return;\n\n imageRef.current.style.display = 'none';\n };\n\n // we wrap the image in a div to help maintain the aspect ratio\n return (\n <div className={className}>\n <img ref={imageRef} alt='' src={`${projectLogoPath}/${name}`} className='viewLogo' onError={hideImage} />\n </div>\n );\n}\n"],"names":["ViewLogo","name","className","imageRef","useRef","hideImage","current","style","display","projectLogoPath"],"mappings":"kbAWA,SAAwBA,EAAS,CAAEC,KAAAA,EAAMC,UAAAA,CAAyB,EAAG,CAC7DC,MAAAA,EAAWC,SAAyB,IAAI,EAExCC,EAAYA,IAAM,CACjBF,EAASG,UAELA,EAAAA,QAAQC,MAAMC,QAAU,OACnC,EAGA,aACG,MAAI,CAAA,UAAAN,EACH,eAAC,MAAI,CAAA,IAAKC,EAAU,IAAI,GAAG,IAAK,GAAGM,CAAe,IAAIR,CAAI,GAAI,UAAU,WAAW,QAASI,EAAU,CACxG,CAAA,CAEJ"}
1
+ {"version":3,"file":"ViewLogo-2I7w5Yms.js","sources":["../../src/common/components/view-logo/ViewLogo.tsx"],"sourcesContent":["import { useRef } from 'react';\n\nimport { projectLogoPath } from '../../api/constants';\n\nimport './ViewLogo.scss';\n\ninterface ViewLogoProps {\n name: string;\n className: string;\n}\n\nexport default function ViewLogo({ name, className }: ViewLogoProps) {\n const imageRef = useRef<HTMLImageElement>(null);\n\n const hideImage = () => {\n if (!imageRef.current) return;\n\n imageRef.current.style.display = 'none';\n };\n\n // we wrap the image in a div to help maintain the aspect ratio\n return (\n <div className={className}>\n <img ref={imageRef} alt='' src={`${projectLogoPath}/${name}`} className='viewLogo' onError={hideImage} />\n </div>\n );\n}\n"],"names":["ViewLogo","name","className","imageRef","useRef","hideImage","current","style","display","projectLogoPath"],"mappings":"kbAWA,SAAwBA,EAAS,CAAEC,KAAAA,EAAMC,UAAAA,CAAyB,EAAG,CAC7DC,MAAAA,EAAWC,SAAyB,IAAI,EAExCC,EAAYA,IAAM,CACjBF,EAASG,UAELA,EAAAA,QAAQC,MAAMC,QAAU,OACnC,EAGA,aACG,MAAI,CAAA,UAAAN,EACH,eAAC,MAAI,CAAA,IAAKC,EAAU,IAAI,GAAG,IAAK,GAAGM,CAAe,IAAIR,CAAI,GAAI,UAAU,WAAW,QAASI,EAAU,CACxG,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{l as S,j as t,h as d,ay as E,aN as D,D as F,q as I,s as $,t as O,G as A,v as H}from"./vendor-CKDP5hij.js";import{bi as L,e as _,B as j,ah as v,a as z,bj as R,D as B,ak as U}from"./index-2lQ-45a9.js";import{b as q,C as W,S as M,I as G}from"./SwatchPicker-Dyxkxf3_.js";import{i as J}from"./viewUtils-DQFwr7hm.js";import{S as K}from"./Select-DQwYPDyI.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]="b27e1550-e944-4ef8-9021-80ff441c3857",e._sentryDebugIdIdentifier="sentry-dbid-b27e1550-e944-4ef8-9021-80ff441c3857")}catch{}})();function Re(e,s=[],a=!0){const n=[...s];for(const[r,o]of Object.entries(e))a&&o.type==="image"||n.push({value:`custom-${r}`,label:`Custom: ${o.label}`});return n}function Be(e,s=!0){const a=[];for(const[n,r]of Object.entries(e))s&&r.type==="image"||a.push({value:n,label:r.label,colour:r.colour});return a}function Ue(e,s=[]){const a=e.custom.map((n,r)=>({value:`${r}-${n.title}`,label:n.title}));return[...s,...a]}function Q(e){return e.startsWith("#")?e.substring(1):e}function X(e){const s={defaultValues:{},colorFields:new Set,booleanFields:new Set,isPersistedField:new Set,persistedValues:{}};return e.forEach(a=>{a.options.forEach(n=>{n.type==="persist"?(s.isPersistedField.add(n.id),n.values&&(s.persistedValues[n.id]=n.values)):s.defaultValues[n.id]=String(n.defaultValue),n.type==="colour"?s.colorFields.add(n.id):n.type==="boolean"&&s.booleanFields.add(n.id)})}),s}function Y(e,s){const a=new URLSearchParams,n=new Set,r=X(s),o=(i,l)=>{const c=`${i}:${l}`;n.has(c)||(n.add(c),a.append(i,l))};return Object.entries(r.persistedValues).forEach(([i,l])=>{l.forEach(c=>{c&&o(i,c)})}),Object.entries(e).forEach(([i,l])=>{typeof l=="string"&&l.length&&(r.isPersistedField.has(i)&&(Array.from(n).forEach(c=>{c.startsWith(`${i}:`)&&n.delete(c)}),a.delete(i)),l.split(",").forEach(c=>{const u=r.colorFields.has(i)?Q(c):r.booleanFields.has(i)?c==="on"?"true":"false":c;(r.isPersistedField.has(i)||r.defaultValues[i]!==u)&&o(i,u)}))}),a}function Z(e,s){const a=new Set;s.forEach(r=>{r.options.forEach(o=>{a.add(o.id)})});const n=new URLSearchParams;return e.forEach((r,o)=>{a.has(o)||n.append(o,r)}),n}const T="_presetSection_gc8wt_17",ee="_preset_gc8wt_17",se="_active_gc8wt_34",te="_presetActions_gc8wt_38",p={presetSection:T,preset:ee,active:se,presetActions:te};function ae({target:e}){const{viewPresets:s}=L(e),[a,n]=S(),r=o=>{const i=new URLSearchParams(o.search);i.set("alias",o.alias),n(i)};return s.length===0?null:t.jsx("div",{className:p.presetSection,children:s.map(o=>{const i=a.get("alias")===o.alias;return t.jsxs("div",{className:_([p.preset,i&&p.active]),children:[t.jsx("div",{children:o.alias}),t.jsx(j,{variant:i?"ghosted":"subtle-white",onClick:()=>r(o),disabled:i,className:p.presetActions,children:i?"Applied":"Apply"})]},o.alias)})})}var w=(e=>(e.ClockOptions="Clock Options",e.TimerOptions="Timer Options",e.DataSources="Data sources",e.ElementVisibility="Element visibility",e.BehaviourOptions="View behaviour",e.StyleOverride="View style override",e.Animation="View animation",e.Schedule="Schedule options",e.Hidden="Hidden options",e))(w||{});const ne="_inline_4jmjk_17",re={inline:ne},y=e=>e.startsWith("#")?e:`#${e}`;function oe({name:e,value:s}){const[a,n]=d.useState(()=>y(s));return d.useEffect(()=>{n(y(s))},[s]),t.jsxs("div",{className:re.inline,children:[t.jsx(q,{color:a,onChange:n,alwaysDisplayColor:!0}),t.jsx("span",{children:a}),t.jsx("input",{type:"hidden",name:e,value:a})]})}const ie="_inline_7qz4u_17",le="_toggleSelect_7qz4u_24",ce="_empty_7qz4u_52",g={inline:ie,toggleSelect:le,empty:ce};function P({paramField:e}){const[s]=S(),{id:a,type:n,defaultValue:r}=e;if(n==="persist")return!e.values||!e.values.length?null:t.jsx("input",{hidden:!0,name:a,readOnly:!0,value:e.values.join(",")});if(n==="option"){const c=s.get(a)||r;return e.values.length===0?t.jsx("span",{className:g.empty,children:"No options available"}):t.jsx(me,{id:a,initialValue:c,options:e.values})}if(n==="multi-option"){const l=s.getAll(a);return t.jsx(de,{paramField:e,options:l.length?l:e.defaultValue??[""]})}if(n==="boolean")return t.jsx(ue,{id:a,initialValue:J(s.get(a))??r});if(n==="number"){const{placeholder:l}=e,c=s.get(a)??r;return t.jsx(v,{height:"large",type:"number",step:"any",name:a,defaultValue:c,placeholder:l})}if(n==="colour")return t.jsx(oe,{name:a,value:s.get(a)??r});const o=s.get(a)??r??"",{placeholder:i}=e;return t.jsx(fe,{id:a,initialValue:o,placeholder:i})}function de({paramField:e,options:s}){const{id:a,values:n}=e,[r,o]=d.useState(s);d.useEffect(()=>{o(s)},[s]);const i=(l,c)=>{o(c?u=>[...u,l]:u=>u.filter(b=>b!==l))};return n.length===0?t.jsx("span",{className:g.empty,children:"No options available"}):t.jsxs(t.Fragment,{children:[t.jsx("input",{name:a,hidden:!0,readOnly:!0,value:r.join(",")}),t.jsx("div",{className:g.inline,children:n.map(l=>t.jsxs("label",{className:g.toggleSelect,style:{"--user-bg":l.colour},children:[t.jsx(W,{checked:r.includes(l.value),onCheckedChange:c=>i(l.value,c)}),l.label]},l.value))})]})}function ue({id:e,initialValue:s}){const[a,n]=d.useState(s);return d.useEffect(()=>{n(s)},[s]),t.jsx(M,{size:"large",name:e,checked:a,onCheckedChange:n})}function me({id:e,initialValue:s,options:a}){const[n,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),t.jsx(K,{size:"large",name:e,options:a,value:n,onValueChange:o=>{o!==null&&r(o)}})}function fe({id:e,initialValue:s,...a}){const[n,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),t.jsx(v,{height:"large",name:e,value:n,onChange:o=>r(o.target.value),...a})}const he="_section_1ssto_17",pe="_sectionHeader_1ssto_22",ge="_collapsible_1ssto_28",_e="_label_1ssto_32",be="_title_1ssto_41",je="_description_1ssto_47",Se="_closed_1ssto_53",xe="_open_1ssto_58",ye="_hidden_1ssto_63",f={section:he,sectionHeader:pe,collapsible:ge,label:_e,title:be,description:je,closed:Se,open:xe,hidden:ye};function ve({title:e,collapsible:s,options:a}){const[n,r]=E({key:`params-${e}`,defaultValue:!1}),o=()=>{s&&r(i=>!i)};return t.jsx("section",{className:f.section,children:e===w.Hidden?t.jsx(Pe,{options:a}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:_([f.sectionHeader,s&&f.collapsible]),onClick:o,children:[e,s&&t.jsx(D,{className:_([n?f.closed:f.open])})]}),t.jsx(we,{options:a,collapsed:n})]})})}function we({options:e,collapsed:s}){return t.jsx(t.Fragment,{children:e.map(a=>t.jsxs("label",{className:_([f.label,s&&f.hidden]),children:[t.jsx("span",{className:f.title,children:a.title}),t.jsx("span",{className:f.description,children:a.description}),t.jsx(P,{paramField:a})]},a.title))})}function Pe({options:e}){return t.jsx(t.Fragment,{children:e.map((s,a)=>t.jsx(P,{paramField:s},s.title+a))})}const Ce="_backdrop_1pnpt_26",ke="_drawer_1pnpt_17",Ve="_header_1pnpt_67",Ne="_body_1pnpt_77",Ee="_footer_1pnpt_84",De="_sectionList_1pnpt_92",Fe="_info_1pnpt_99",h={backdrop:Ce,drawer:ke,header:Ve,body:Ne,footer:Ee,sectionList:De,info:Fe},qe=d.memo(Ie);function Ie({target:e,viewOptions:s}){const[a,n]=S(),{data:r}=z(),{isOpen:o,close:i}=R(),l=B(),c=()=>Z(a,s),u=()=>{i()},b=()=>{n(c())},C=m=>{m.preventDefault();const k=Object.fromEntries(new FormData(m.currentTarget)),x=Y(k,s);c().forEach((V,N)=>{x.append(N,V)}),n(x),l&&i()};return t.jsx(F,{open:o,onOpenChange:m=>{m||u()},children:t.jsxs(I,{children:[t.jsx($,{className:h.backdrop}),t.jsxs(O,{className:h.drawer,children:[t.jsxs("div",{className:h.header,children:[t.jsx(A,{children:"Customise"}),t.jsx(U,{variant:"subtle-white",size:"large","data-testid":"close-view-params",onClick:u,children:t.jsx(H,{})})]}),t.jsxs("div",{className:h.body,children:[r.overrideStyles&&t.jsx(G,{className:h.info,children:"This view style is being modified by a custom CSS file."}),t.jsx(ae,{target:e}),t.jsx("form",{id:"edit-params-form",onSubmit:C,className:h.sectionList,children:s.map(m=>t.jsx(ve,{title:m.title,collapsible:m.collapsible,options:m.options},m.title))})]}),t.jsxs("div",{className:h.footer,children:[t.jsx(j,{variant:"subtle",size:"large",onClick:b,type:"reset",children:"Reset to default"}),t.jsx(j,{variant:"primary",size:"large",form:"edit-params-form",type:"submit","data-testid":"apply-view-params",children:"Apply"})]})]})]})})}export{w as O,qe as V,Ue as a,Be as b,Re as m};
2
- //# sourceMappingURL=ViewParamsEditor-Cxngd15h.js.map
1
+ import{l as S,j as t,h as d,ay as E,aN as D,D as F,q as I,s as $,t as O,G as A,v as H}from"./vendor-BKUJ0_Du.js";import{bi as L,e as _,B as j,ah as v,a as z,bj as R,D as B,ak as U}from"./index-Dm-4OTmY.js";import{b as q,C as W,S as M,I as G}from"./SwatchPicker-Ckpchvjo.js";import{i as J}from"./viewUtils-29a3Mmiu.js";import{S as K}from"./Select-BnGTAeXJ.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]="b27e1550-e944-4ef8-9021-80ff441c3857",e._sentryDebugIdIdentifier="sentry-dbid-b27e1550-e944-4ef8-9021-80ff441c3857")}catch{}})();function Re(e,s=[],a=!0){const n=[...s];for(const[r,o]of Object.entries(e))a&&o.type==="image"||n.push({value:`custom-${r}`,label:`Custom: ${o.label}`});return n}function Be(e,s=!0){const a=[];for(const[n,r]of Object.entries(e))s&&r.type==="image"||a.push({value:n,label:r.label,colour:r.colour});return a}function Ue(e,s=[]){const a=e.custom.map((n,r)=>({value:`${r}-${n.title}`,label:n.title}));return[...s,...a]}function Q(e){return e.startsWith("#")?e.substring(1):e}function X(e){const s={defaultValues:{},colorFields:new Set,booleanFields:new Set,isPersistedField:new Set,persistedValues:{}};return e.forEach(a=>{a.options.forEach(n=>{n.type==="persist"?(s.isPersistedField.add(n.id),n.values&&(s.persistedValues[n.id]=n.values)):s.defaultValues[n.id]=String(n.defaultValue),n.type==="colour"?s.colorFields.add(n.id):n.type==="boolean"&&s.booleanFields.add(n.id)})}),s}function Y(e,s){const a=new URLSearchParams,n=new Set,r=X(s),o=(i,l)=>{const c=`${i}:${l}`;n.has(c)||(n.add(c),a.append(i,l))};return Object.entries(r.persistedValues).forEach(([i,l])=>{l.forEach(c=>{c&&o(i,c)})}),Object.entries(e).forEach(([i,l])=>{typeof l=="string"&&l.length&&(r.isPersistedField.has(i)&&(Array.from(n).forEach(c=>{c.startsWith(`${i}:`)&&n.delete(c)}),a.delete(i)),l.split(",").forEach(c=>{const u=r.colorFields.has(i)?Q(c):r.booleanFields.has(i)?c==="on"?"true":"false":c;(r.isPersistedField.has(i)||r.defaultValues[i]!==u)&&o(i,u)}))}),a}function Z(e,s){const a=new Set;s.forEach(r=>{r.options.forEach(o=>{a.add(o.id)})});const n=new URLSearchParams;return e.forEach((r,o)=>{a.has(o)||n.append(o,r)}),n}const T="_presetSection_gc8wt_17",ee="_preset_gc8wt_17",se="_active_gc8wt_34",te="_presetActions_gc8wt_38",p={presetSection:T,preset:ee,active:se,presetActions:te};function ae({target:e}){const{viewPresets:s}=L(e),[a,n]=S(),r=o=>{const i=new URLSearchParams(o.search);i.set("alias",o.alias),n(i)};return s.length===0?null:t.jsx("div",{className:p.presetSection,children:s.map(o=>{const i=a.get("alias")===o.alias;return t.jsxs("div",{className:_([p.preset,i&&p.active]),children:[t.jsx("div",{children:o.alias}),t.jsx(j,{variant:i?"ghosted":"subtle-white",onClick:()=>r(o),disabled:i,className:p.presetActions,children:i?"Applied":"Apply"})]},o.alias)})})}var w=(e=>(e.ClockOptions="Clock Options",e.TimerOptions="Timer Options",e.DataSources="Data sources",e.ElementVisibility="Element visibility",e.BehaviourOptions="View behaviour",e.StyleOverride="View style override",e.Animation="View animation",e.Schedule="Schedule options",e.Hidden="Hidden options",e))(w||{});const ne="_inline_4jmjk_17",re={inline:ne},y=e=>e.startsWith("#")?e:`#${e}`;function oe({name:e,value:s}){const[a,n]=d.useState(()=>y(s));return d.useEffect(()=>{n(y(s))},[s]),t.jsxs("div",{className:re.inline,children:[t.jsx(q,{color:a,onChange:n,alwaysDisplayColor:!0}),t.jsx("span",{children:a}),t.jsx("input",{type:"hidden",name:e,value:a})]})}const ie="_inline_7qz4u_17",le="_toggleSelect_7qz4u_24",ce="_empty_7qz4u_52",g={inline:ie,toggleSelect:le,empty:ce};function P({paramField:e}){const[s]=S(),{id:a,type:n,defaultValue:r}=e;if(n==="persist")return!e.values||!e.values.length?null:t.jsx("input",{hidden:!0,name:a,readOnly:!0,value:e.values.join(",")});if(n==="option"){const c=s.get(a)||r;return e.values.length===0?t.jsx("span",{className:g.empty,children:"No options available"}):t.jsx(me,{id:a,initialValue:c,options:e.values})}if(n==="multi-option"){const l=s.getAll(a);return t.jsx(de,{paramField:e,options:l.length?l:e.defaultValue??[""]})}if(n==="boolean")return t.jsx(ue,{id:a,initialValue:J(s.get(a))??r});if(n==="number"){const{placeholder:l}=e,c=s.get(a)??r;return t.jsx(v,{height:"large",type:"number",step:"any",name:a,defaultValue:c,placeholder:l})}if(n==="colour")return t.jsx(oe,{name:a,value:s.get(a)??r});const o=s.get(a)??r??"",{placeholder:i}=e;return t.jsx(fe,{id:a,initialValue:o,placeholder:i})}function de({paramField:e,options:s}){const{id:a,values:n}=e,[r,o]=d.useState(s);d.useEffect(()=>{o(s)},[s]);const i=(l,c)=>{o(c?u=>[...u,l]:u=>u.filter(b=>b!==l))};return n.length===0?t.jsx("span",{className:g.empty,children:"No options available"}):t.jsxs(t.Fragment,{children:[t.jsx("input",{name:a,hidden:!0,readOnly:!0,value:r.join(",")}),t.jsx("div",{className:g.inline,children:n.map(l=>t.jsxs("label",{className:g.toggleSelect,style:{"--user-bg":l.colour},children:[t.jsx(W,{checked:r.includes(l.value),onCheckedChange:c=>i(l.value,c)}),l.label]},l.value))})]})}function ue({id:e,initialValue:s}){const[a,n]=d.useState(s);return d.useEffect(()=>{n(s)},[s]),t.jsx(M,{size:"large",name:e,checked:a,onCheckedChange:n})}function me({id:e,initialValue:s,options:a}){const[n,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),t.jsx(K,{size:"large",name:e,options:a,value:n,onValueChange:o=>{o!==null&&r(o)}})}function fe({id:e,initialValue:s,...a}){const[n,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),t.jsx(v,{height:"large",name:e,value:n,onChange:o=>r(o.target.value),...a})}const he="_section_1ssto_17",pe="_sectionHeader_1ssto_22",ge="_collapsible_1ssto_28",_e="_label_1ssto_32",be="_title_1ssto_41",je="_description_1ssto_47",Se="_closed_1ssto_53",xe="_open_1ssto_58",ye="_hidden_1ssto_63",f={section:he,sectionHeader:pe,collapsible:ge,label:_e,title:be,description:je,closed:Se,open:xe,hidden:ye};function ve({title:e,collapsible:s,options:a}){const[n,r]=E({key:`params-${e}`,defaultValue:!1}),o=()=>{s&&r(i=>!i)};return t.jsx("section",{className:f.section,children:e===w.Hidden?t.jsx(Pe,{options:a}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:_([f.sectionHeader,s&&f.collapsible]),onClick:o,children:[e,s&&t.jsx(D,{className:_([n?f.closed:f.open])})]}),t.jsx(we,{options:a,collapsed:n})]})})}function we({options:e,collapsed:s}){return t.jsx(t.Fragment,{children:e.map(a=>t.jsxs("label",{className:_([f.label,s&&f.hidden]),children:[t.jsx("span",{className:f.title,children:a.title}),t.jsx("span",{className:f.description,children:a.description}),t.jsx(P,{paramField:a})]},a.title))})}function Pe({options:e}){return t.jsx(t.Fragment,{children:e.map((s,a)=>t.jsx(P,{paramField:s},s.title+a))})}const Ce="_backdrop_1pnpt_26",ke="_drawer_1pnpt_17",Ve="_header_1pnpt_67",Ne="_body_1pnpt_77",Ee="_footer_1pnpt_84",De="_sectionList_1pnpt_92",Fe="_info_1pnpt_99",h={backdrop:Ce,drawer:ke,header:Ve,body:Ne,footer:Ee,sectionList:De,info:Fe},qe=d.memo(Ie);function Ie({target:e,viewOptions:s}){const[a,n]=S(),{data:r}=z(),{isOpen:o,close:i}=R(),l=B(),c=()=>Z(a,s),u=()=>{i()},b=()=>{n(c())},C=m=>{m.preventDefault();const k=Object.fromEntries(new FormData(m.currentTarget)),x=Y(k,s);c().forEach((V,N)=>{x.append(N,V)}),n(x),l&&i()};return t.jsx(F,{open:o,onOpenChange:m=>{m||u()},children:t.jsxs(I,{children:[t.jsx($,{className:h.backdrop}),t.jsxs(O,{className:h.drawer,children:[t.jsxs("div",{className:h.header,children:[t.jsx(A,{children:"Customise"}),t.jsx(U,{variant:"subtle-white",size:"large","data-testid":"close-view-params",onClick:u,children:t.jsx(H,{})})]}),t.jsxs("div",{className:h.body,children:[r.overrideStyles&&t.jsx(G,{className:h.info,children:"This view style is being modified by a custom CSS file."}),t.jsx(ae,{target:e}),t.jsx("form",{id:"edit-params-form",onSubmit:C,className:h.sectionList,children:s.map(m=>t.jsx(ve,{title:m.title,collapsible:m.collapsible,options:m.options},m.title))})]}),t.jsxs("div",{className:h.footer,children:[t.jsx(j,{variant:"subtle",size:"large",onClick:b,type:"reset",children:"Reset to default"}),t.jsx(j,{variant:"primary",size:"large",form:"edit-params-form",type:"submit","data-testid":"apply-view-params",children:"Apply"})]})]})]})})}export{w as O,qe as V,Ue as a,Be as b,Re as m};
2
+ //# sourceMappingURL=ViewParamsEditor-BX2RM8sx.js.map