@getontime/cli 4.4.2 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/client/assets/{Backstage-BdrcXNr9.js → Backstage-DQu8ne-1.js} +2 -2
  2. package/client/assets/Backstage-DQu8ne-1.js.br +0 -0
  3. package/client/assets/Backstage-DQu8ne-1.js.gz +0 -0
  4. package/client/assets/{Backstage-BdrcXNr9.js.map → Backstage-DQu8ne-1.js.map} +1 -1
  5. package/client/assets/{Countdown-DQM2ppPg.js → Countdown-COte1yne.js} +2 -2
  6. package/client/assets/Countdown-COte1yne.js.br +0 -0
  7. package/client/assets/Countdown-COte1yne.js.gz +0 -0
  8. package/client/assets/{Countdown-DQM2ppPg.js.map → Countdown-COte1yne.js.map} +1 -1
  9. package/client/assets/CuesheetTable-BQfxAp-I.js +2 -0
  10. package/client/assets/CuesheetTable-BQfxAp-I.js.br +0 -0
  11. package/client/assets/CuesheetTable-BQfxAp-I.js.gz +0 -0
  12. package/client/assets/CuesheetTable-BQfxAp-I.js.map +1 -0
  13. package/client/assets/CustomTranslationModal-C5mAtBjW.js +2 -0
  14. package/client/assets/CustomTranslationModal-C5mAtBjW.js.br +0 -0
  15. package/client/assets/CustomTranslationModal-C5mAtBjW.js.gz +0 -0
  16. package/client/assets/{CustomTranslationModal-CML7Vsot.js.map → CustomTranslationModal-C5mAtBjW.js.map} +1 -1
  17. package/client/assets/{DelayIndicator-DKS6mZdB.js → DelayIndicator-B0cudY9N.js} +2 -2
  18. package/client/assets/DelayIndicator-B0cudY9N.js.br +0 -0
  19. package/client/assets/DelayIndicator-B0cudY9N.js.gz +0 -0
  20. package/client/assets/DelayIndicator-B0cudY9N.js.map +1 -0
  21. package/client/assets/{EditorFeatureWrapper-C1vLQxiy.js → EditorFeatureWrapper-DpDaCaJ3.js} +2 -2
  22. package/client/assets/EditorFeatureWrapper-DpDaCaJ3.js.br +0 -0
  23. package/client/assets/EditorFeatureWrapper-DpDaCaJ3.js.gz +0 -0
  24. package/client/assets/{EditorFeatureWrapper-C1vLQxiy.js.map → EditorFeatureWrapper-DpDaCaJ3.js.map} +1 -1
  25. package/client/assets/{EditorUtils-BLcTuWz1.js → EditorUtils-k5KpETPG.js} +2 -2
  26. package/client/assets/EditorUtils-k5KpETPG.js.br +0 -0
  27. package/client/assets/EditorUtils-k5KpETPG.js.gz +0 -0
  28. package/client/assets/{EditorUtils-BLcTuWz1.js.map → EditorUtils-k5KpETPG.js.map} +1 -1
  29. package/client/assets/EmptyPage-aTb22KTq.js +2 -0
  30. package/client/assets/EmptyPage-aTb22KTq.js.br +0 -0
  31. package/client/assets/EmptyPage-aTb22KTq.js.gz +0 -0
  32. package/client/assets/{EmptyPage-CYVrjOvI.js.map → EmptyPage-aTb22KTq.js.map} +1 -1
  33. package/client/assets/{FollowButton-DcSbb4R_.js → FollowButton--Bj9S6jO.js} +2 -2
  34. package/client/assets/FollowButton--Bj9S6jO.js.br +0 -0
  35. package/client/assets/FollowButton--Bj9S6jO.js.gz +0 -0
  36. package/client/assets/{FollowButton-DcSbb4R_.js.map → FollowButton--Bj9S6jO.js.map} +1 -1
  37. package/client/assets/MessageControlExport-BN6OfADo.js +3 -0
  38. package/client/assets/MessageControlExport-BN6OfADo.js.br +0 -0
  39. package/client/assets/MessageControlExport-BN6OfADo.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-BgT9JaXk.js.map → MessageControlExport-BN6OfADo.js.map} +1 -1
  41. package/client/assets/{MultiPartProgressBar-W2a-JWPY.js → MultiPartProgressBar-BlLJNQ0D.js} +2 -2
  42. package/client/assets/MultiPartProgressBar-BlLJNQ0D.js.br +0 -0
  43. package/client/assets/MultiPartProgressBar-BlLJNQ0D.js.gz +0 -0
  44. package/client/assets/{MultiPartProgressBar-W2a-JWPY.js.map → MultiPartProgressBar-BlLJNQ0D.js.map} +1 -1
  45. package/client/assets/{OperatorExport-CbWojpp6.js → OperatorExport-CmgIl1lz.js} +2 -2
  46. package/client/assets/OperatorExport-CmgIl1lz.js.br +0 -0
  47. package/client/assets/OperatorExport-CmgIl1lz.js.gz +0 -0
  48. package/client/assets/OperatorExport-CmgIl1lz.js.map +1 -0
  49. package/client/assets/OverviewWrapper-B4nU68Eq.js +2 -0
  50. package/client/assets/OverviewWrapper-B4nU68Eq.js.br +0 -0
  51. package/client/assets/OverviewWrapper-B4nU68Eq.js.gz +0 -0
  52. package/client/assets/{OverviewWrapper-B2i8d3rt.js.map → OverviewWrapper-B4nU68Eq.js.map} +1 -1
  53. package/client/assets/OverviewWrapper-fPfl6o_p.css +1 -0
  54. package/client/assets/OverviewWrapper-fPfl6o_p.css.br +0 -0
  55. package/client/assets/OverviewWrapper-fPfl6o_p.css.gz +0 -0
  56. package/client/assets/{PipHost-Dz2oy7XG.js → PipHost-BZy7ouDv.js} +2 -2
  57. package/client/assets/PipHost-BZy7ouDv.js.br +0 -0
  58. package/client/assets/PipHost-BZy7ouDv.js.gz +0 -0
  59. package/client/assets/{PipHost-Dz2oy7XG.js.map → PipHost-BZy7ouDv.js.map} +1 -1
  60. package/client/assets/{ProjectInfo-BR_7Hp5u.js → ProjectInfo-D0X9vdIX.js} +2 -2
  61. package/client/assets/ProjectInfo-D0X9vdIX.js.br +0 -0
  62. package/client/assets/ProjectInfo-D0X9vdIX.js.gz +0 -0
  63. package/client/assets/{ProjectInfo-BR_7Hp5u.js.map → ProjectInfo-D0X9vdIX.js.map} +1 -1
  64. package/client/assets/ProtectRoute-DSilyhst.js +2 -0
  65. package/client/assets/ProtectRoute-DSilyhst.js.br +0 -0
  66. package/client/assets/ProtectRoute-DSilyhst.js.gz +0 -0
  67. package/client/assets/{ProtectRoute-Bxq6q7ba.js.map → ProtectRoute-DSilyhst.js.map} +1 -1
  68. package/client/assets/ProtectedCuesheet-DRTfZTZN.js +2 -0
  69. package/client/assets/ProtectedCuesheet-DRTfZTZN.js.br +0 -0
  70. package/client/assets/ProtectedCuesheet-DRTfZTZN.js.gz +0 -0
  71. package/client/assets/ProtectedCuesheet-DRTfZTZN.js.map +1 -0
  72. package/client/assets/ProtectedEditor-DNOiQqIU.js +3 -0
  73. package/client/assets/ProtectedEditor-DNOiQqIU.js.br +0 -0
  74. package/client/assets/ProtectedEditor-DNOiQqIU.js.gz +0 -0
  75. package/client/assets/ProtectedEditor-DNOiQqIU.js.map +1 -0
  76. package/client/assets/ProtectedEditor-DyaLP0mG.css +1 -0
  77. package/client/assets/ProtectedEditor-DyaLP0mG.css.br +0 -0
  78. package/client/assets/ProtectedEditor-DyaLP0mG.css.gz +0 -0
  79. package/client/assets/{RundownExport-25orDQIW.js → RundownExport-Bvc1J50m.js} +2 -2
  80. package/client/assets/RundownExport-Bvc1J50m.js.br +0 -0
  81. package/client/assets/RundownExport-Bvc1J50m.js.gz +0 -0
  82. package/client/assets/RundownExport-Bvc1J50m.js.map +1 -0
  83. package/client/assets/{Select-BnGTAeXJ.js → Select-CvUrsmYI.js} +2 -2
  84. package/client/assets/Select-CvUrsmYI.js.br +0 -0
  85. package/client/assets/Select-CvUrsmYI.js.gz +0 -0
  86. package/client/assets/{Select-BnGTAeXJ.js.map → Select-CvUrsmYI.js.map} +1 -1
  87. package/client/assets/{Studio-BK2Klo_K.js → Studio-BSSiKd6k.js} +2 -2
  88. package/client/assets/Studio-BSSiKd6k.js.br +0 -0
  89. package/client/assets/Studio-BSSiKd6k.js.gz +0 -0
  90. package/client/assets/{Studio-BK2Klo_K.js.map → Studio-BSSiKd6k.js.map} +1 -1
  91. package/client/assets/{StyleEditor-DIHQ1PUV.js → StyleEditor-buc-zQHR.js} +2 -2
  92. package/client/assets/StyleEditor-buc-zQHR.js.br +0 -0
  93. package/client/assets/StyleEditor-buc-zQHR.js.gz +0 -0
  94. package/client/assets/{StyleEditor-DIHQ1PUV.js.map → StyleEditor-buc-zQHR.js.map} +1 -1
  95. package/client/assets/{SuperscriptPeriod-EEedc9rG.js → SuperscriptPeriod-CSX8zFgq.js} +2 -2
  96. package/client/assets/SuperscriptPeriod-CSX8zFgq.js.br +0 -0
  97. package/client/assets/SuperscriptPeriod-CSX8zFgq.js.gz +0 -0
  98. package/client/assets/{SuperscriptPeriod-EEedc9rG.js.map → SuperscriptPeriod-CSX8zFgq.js.map} +1 -1
  99. package/client/assets/{SuperscriptTime-BVanhNvd.js → SuperscriptTime-retbmT5o.js} +2 -2
  100. package/client/assets/SuperscriptTime-retbmT5o.js.br +0 -0
  101. package/client/assets/SuperscriptTime-retbmT5o.js.gz +0 -0
  102. package/client/assets/{SuperscriptTime-BVanhNvd.js.map → SuperscriptTime-retbmT5o.js.map} +1 -1
  103. package/client/assets/SwatchPicker-DuWAohyD.js +2 -0
  104. package/client/assets/SwatchPicker-DuWAohyD.js.br +0 -0
  105. package/client/assets/SwatchPicker-DuWAohyD.js.gz +0 -0
  106. package/client/assets/{SwatchPicker-Ckpchvjo.js.map → SwatchPicker-DuWAohyD.js.map} +1 -1
  107. package/client/assets/TimeElements-BfxdLkpO.js +2 -0
  108. package/client/assets/TimeElements-BfxdLkpO.js.br +0 -0
  109. package/client/assets/TimeElements-BfxdLkpO.js.gz +0 -0
  110. package/client/assets/{TimeElements-CYIgGk0T.js.map → TimeElements-BfxdLkpO.js.map} +1 -1
  111. package/client/assets/{TimeInput-Cwl9vLWA.js → TimeInput-BjOTgjcv.js} +2 -2
  112. package/client/assets/TimeInput-BjOTgjcv.js.br +0 -0
  113. package/client/assets/TimeInput-BjOTgjcv.js.gz +0 -0
  114. package/client/assets/{TimeInput-Cwl9vLWA.js.map → TimeInput-BjOTgjcv.js.map} +1 -1
  115. package/client/assets/{TimelinePage-D4QNdk-Z.js → TimelinePage-pjff5TxG.js} +2 -2
  116. package/client/assets/TimelinePage-pjff5TxG.js.br +0 -0
  117. package/client/assets/TimelinePage-pjff5TxG.js.gz +0 -0
  118. package/client/assets/TimelinePage-pjff5TxG.js.map +1 -0
  119. package/client/assets/{Timer-BJQKNHfo.js → Timer-ahF-O2zN.js} +2 -2
  120. package/client/assets/Timer-ahF-O2zN.js.br +0 -0
  121. package/client/assets/Timer-ahF-O2zN.js.gz +0 -0
  122. package/client/assets/{Timer-BJQKNHfo.js.map → Timer-ahF-O2zN.js.map} +1 -1
  123. package/client/assets/TimerControlExport-De2n8HWG.js +2 -0
  124. package/client/assets/TimerControlExport-De2n8HWG.js.br +0 -0
  125. package/client/assets/TimerControlExport-De2n8HWG.js.gz +0 -0
  126. package/client/assets/TimerControlExport-De2n8HWG.js.map +1 -0
  127. package/client/assets/TimerDisplay-DeFQvmo9.js +2 -0
  128. package/client/assets/TimerDisplay-DeFQvmo9.js.br +0 -0
  129. package/client/assets/TimerDisplay-DeFQvmo9.js.gz +0 -0
  130. package/client/assets/{TimerDisplay-tVcUk9j3.js.map → TimerDisplay-DeFQvmo9.js.map} +1 -1
  131. package/client/assets/{TitleCard-BNjv58eq.js → TitleCard-BiaQE4ZK.js} +2 -2
  132. package/client/assets/TitleCard-BiaQE4ZK.js.br +0 -0
  133. package/client/assets/TitleCard-BiaQE4ZK.js.gz +0 -0
  134. package/client/assets/{TitleCard-BNjv58eq.js.map → TitleCard-BiaQE4ZK.js.map} +1 -1
  135. package/client/assets/{Tooltip-DZJ7u9gm.js → Tooltip-C5iPq6NR.js} +2 -2
  136. package/client/assets/Tooltip-C5iPq6NR.js.br +0 -0
  137. package/client/assets/Tooltip-C5iPq6NR.js.gz +0 -0
  138. package/client/assets/{Tooltip-DZJ7u9gm.js.map → Tooltip-C5iPq6NR.js.map} +1 -1
  139. package/client/assets/{ViewLogo-2I7w5Yms.js → ViewLogo-DcDhyyIF.js} +2 -2
  140. package/client/assets/ViewLogo-DcDhyyIF.js.br +0 -0
  141. package/client/assets/ViewLogo-DcDhyyIF.js.gz +0 -0
  142. package/client/assets/{ViewLogo-2I7w5Yms.js.map → ViewLogo-DcDhyyIF.js.map} +1 -1
  143. package/client/assets/{ViewParamsEditor-BX2RM8sx.js → ViewParamsEditor-DeMdkxxC.js} +2 -2
  144. package/client/assets/ViewParamsEditor-DeMdkxxC.js.br +0 -0
  145. package/client/assets/ViewParamsEditor-DeMdkxxC.js.gz +0 -0
  146. package/client/assets/{ViewParamsEditor-BX2RM8sx.js.map → ViewParamsEditor-DeMdkxxC.js.map} +1 -1
  147. package/client/assets/{editorSettings-_x6YKRfR.js → editorSettings-xk5GwlLv.js} +2 -2
  148. package/client/assets/editorSettings-xk5GwlLv.js.br +0 -0
  149. package/client/assets/editorSettings-xk5GwlLv.js.gz +0 -0
  150. package/client/assets/{editorSettings-_x6YKRfR.js.map → editorSettings-xk5GwlLv.js.map} +1 -1
  151. package/client/assets/{getProgress-ZUTmCn_v.js → getProgress-CWSCZOIN.js} +2 -2
  152. package/client/assets/getProgress-CWSCZOIN.js.br +0 -0
  153. package/client/assets/getProgress-CWSCZOIN.js.gz +0 -0
  154. package/client/assets/{getProgress-ZUTmCn_v.js.map → getProgress-CWSCZOIN.js.map} +1 -1
  155. package/client/assets/index-3aosT33y.js +3 -0
  156. package/client/assets/index-3aosT33y.js.br +0 -0
  157. package/client/assets/index-3aosT33y.js.gz +0 -0
  158. package/client/assets/index-3aosT33y.js.map +1 -0
  159. package/client/assets/{offset-VthsmtrO.js → offset-yVqq_CB1.js} +2 -2
  160. package/client/assets/offset-yVqq_CB1.js.br +0 -0
  161. package/client/assets/offset-yVqq_CB1.js.gz +0 -0
  162. package/client/assets/{offset-VthsmtrO.js.map → offset-yVqq_CB1.js.map} +1 -1
  163. package/client/assets/parseUserTime-wAKk9aCJ.js +2 -0
  164. package/client/assets/parseUserTime-wAKk9aCJ.js.br +0 -0
  165. package/client/assets/parseUserTime-wAKk9aCJ.js.gz +0 -0
  166. package/client/assets/{parseUserTime-sZbEBi61.js.map → parseUserTime-wAKk9aCJ.js.map} +1 -1
  167. package/client/assets/{playbackstate-Dl_ZJABT.js → playbackstate-BZ9WYn2k.js} +2 -2
  168. package/client/assets/playbackstate-BZ9WYn2k.js.br +0 -0
  169. package/client/assets/playbackstate-BZ9WYn2k.js.gz +0 -0
  170. package/client/assets/{playbackstate-Dl_ZJABT.js.map → playbackstate-BZ9WYn2k.js.map} +1 -1
  171. package/client/assets/{presentation.utils-Z61KykAH.js → presentation.utils-lyuuD4A5.js} +2 -2
  172. package/client/assets/presentation.utils-lyuuD4A5.js.br +0 -0
  173. package/client/assets/presentation.utils-lyuuD4A5.js.gz +0 -0
  174. package/client/assets/{presentation.utils-Z61KykAH.js.map → presentation.utils-lyuuD4A5.js.map} +1 -1
  175. package/client/assets/{rundownUtils-CXZRD6yP.js → rundownUtils-XX_c4Pcl.js} +2 -2
  176. package/client/assets/rundownUtils-XX_c4Pcl.js.br +0 -0
  177. package/client/assets/rundownUtils-XX_c4Pcl.js.gz +0 -0
  178. package/client/assets/{rundownUtils-CXZRD6yP.js.map → rundownUtils-XX_c4Pcl.js.map} +1 -1
  179. package/client/assets/{timer.utils-B4bvsns3.js → timer.utils-CWHFVz06.js} +2 -2
  180. package/client/assets/timer.utils-CWHFVz06.js.br +0 -0
  181. package/client/assets/timer.utils-CWHFVz06.js.gz +0 -0
  182. package/client/assets/{timer.utils-B4bvsns3.js.map → timer.utils-CWHFVz06.js.map} +1 -1
  183. package/client/assets/useCustomFields-kBD1jvDA.js +2 -0
  184. package/client/assets/useCustomFields-kBD1jvDA.js.br +0 -0
  185. package/client/assets/useCustomFields-kBD1jvDA.js.gz +0 -0
  186. package/client/assets/{useCustomFields-BBE4LBBr.js.map → useCustomFields-kBD1jvDA.js.map} +1 -1
  187. package/client/assets/{useEventSelection-Bpbu89c7.js → useEventSelection-Cvdw9all.js} +2 -2
  188. package/client/assets/useEventSelection-Cvdw9all.js.br +0 -0
  189. package/client/assets/useEventSelection-Cvdw9all.js.gz +0 -0
  190. package/client/assets/{useEventSelection-Bpbu89c7.js.map → useEventSelection-Cvdw9all.js.map} +1 -1
  191. package/client/assets/{useProjectData-C110zIXC.js → useProjectData-gGT2eczr.js} +2 -2
  192. package/client/assets/useProjectData-gGT2eczr.js.br +0 -0
  193. package/client/assets/useProjectData-gGT2eczr.js.gz +0 -0
  194. package/client/assets/{useProjectData-C110zIXC.js.map → useProjectData-gGT2eczr.js.map} +1 -1
  195. package/client/assets/{useReport-DqSBq4MG.js → useReport-CG6m_Zb0.js} +2 -2
  196. package/client/assets/useReport-CG6m_Zb0.js.br +0 -0
  197. package/client/assets/useReport-CG6m_Zb0.js.gz +0 -0
  198. package/client/assets/{useReport-DqSBq4MG.js.map → useReport-CG6m_Zb0.js.map} +1 -1
  199. package/client/assets/{useRundown-DAo6huE4.js → useRundown-C6stroSA.js} +2 -2
  200. package/client/assets/useRundown-C6stroSA.js.br +0 -0
  201. package/client/assets/useRundown-C6stroSA.js.gz +0 -0
  202. package/client/assets/useRundown-C6stroSA.js.map +1 -0
  203. package/client/assets/{useSelectAndRevealEntry-DTg0hmxA.js → useSelectAndRevealEntry-D79sYFHr.js} +2 -2
  204. package/client/assets/useSelectAndRevealEntry-D79sYFHr.js.br +0 -0
  205. package/client/assets/useSelectAndRevealEntry-D79sYFHr.js.gz +0 -0
  206. package/client/assets/{useSelectAndRevealEntry-DTg0hmxA.js.map → useSelectAndRevealEntry-D79sYFHr.js.map} +1 -1
  207. package/client/assets/{useWindowTitle-DM8dIp8L.js → useWindowTitle-CQ8nEeel.js} +2 -2
  208. package/client/assets/useWindowTitle-CQ8nEeel.js.br +0 -0
  209. package/client/assets/useWindowTitle-CQ8nEeel.js.gz +0 -0
  210. package/client/assets/{useWindowTitle-DM8dIp8L.js.map → useWindowTitle-CQ8nEeel.js.map} +1 -1
  211. package/client/assets/{validateEvent-GnPt-e9-.js → validateEvent-BnwPmDph.js} +2 -2
  212. package/client/assets/validateEvent-BnwPmDph.js.br +0 -0
  213. package/client/assets/validateEvent-BnwPmDph.js.gz +0 -0
  214. package/client/assets/{validateEvent-GnPt-e9-.js.map → validateEvent-BnwPmDph.js.map} +1 -1
  215. package/client/assets/{vendor-BKUJ0_Du.js → vendor-Dt3_Fdfs.js} +2 -2
  216. package/client/assets/vendor-Dt3_Fdfs.js.br +0 -0
  217. package/client/assets/vendor-Dt3_Fdfs.js.gz +0 -0
  218. package/client/assets/{vendor-BKUJ0_Du.js.map → vendor-Dt3_Fdfs.js.map} +1 -1
  219. package/client/assets/{viewLoader.utils-4lL4PiNI.js → viewLoader.utils-H7r-zNPP.js} +2 -2
  220. package/client/assets/viewLoader.utils-H7r-zNPP.js.br +0 -0
  221. package/client/assets/viewLoader.utils-H7r-zNPP.js.gz +0 -0
  222. package/client/assets/{viewLoader.utils-4lL4PiNI.js.map → viewLoader.utils-H7r-zNPP.js.map} +1 -1
  223. package/client/assets/{viewUtils-29a3Mmiu.js → viewUtils-k0tARVDN.js} +2 -2
  224. package/client/assets/viewUtils-k0tARVDN.js.br +0 -0
  225. package/client/assets/viewUtils-k0tARVDN.js.gz +0 -0
  226. package/client/assets/{viewUtils-29a3Mmiu.js.map → viewUtils-k0tARVDN.js.map} +1 -1
  227. package/client/index.html +2 -2
  228. package/package.json +1 -1
  229. package/server/index.cjs +104 -104
  230. package/client/assets/Backstage-BdrcXNr9.js.br +0 -0
  231. package/client/assets/Backstage-BdrcXNr9.js.gz +0 -0
  232. package/client/assets/Countdown-DQM2ppPg.js.br +0 -0
  233. package/client/assets/Countdown-DQM2ppPg.js.gz +0 -0
  234. package/client/assets/CuesheetTable-B5LQVh5m.js +0 -2
  235. package/client/assets/CuesheetTable-B5LQVh5m.js.br +0 -0
  236. package/client/assets/CuesheetTable-B5LQVh5m.js.gz +0 -0
  237. package/client/assets/CuesheetTable-B5LQVh5m.js.map +0 -1
  238. package/client/assets/CustomTranslationModal-CML7Vsot.js +0 -2
  239. package/client/assets/CustomTranslationModal-CML7Vsot.js.br +0 -0
  240. package/client/assets/CustomTranslationModal-CML7Vsot.js.gz +0 -0
  241. package/client/assets/DelayIndicator-DKS6mZdB.js.br +0 -0
  242. package/client/assets/DelayIndicator-DKS6mZdB.js.gz +0 -0
  243. package/client/assets/DelayIndicator-DKS6mZdB.js.map +0 -1
  244. package/client/assets/EditorFeatureWrapper-C1vLQxiy.js.br +0 -0
  245. package/client/assets/EditorFeatureWrapper-C1vLQxiy.js.gz +0 -0
  246. package/client/assets/EditorUtils-BLcTuWz1.js.br +0 -0
  247. package/client/assets/EditorUtils-BLcTuWz1.js.gz +0 -0
  248. package/client/assets/EmptyPage-CYVrjOvI.js +0 -2
  249. package/client/assets/EmptyPage-CYVrjOvI.js.br +0 -0
  250. package/client/assets/EmptyPage-CYVrjOvI.js.gz +0 -0
  251. package/client/assets/FollowButton-DcSbb4R_.js.br +0 -0
  252. package/client/assets/FollowButton-DcSbb4R_.js.gz +0 -0
  253. package/client/assets/MessageControlExport-BgT9JaXk.js +0 -3
  254. package/client/assets/MessageControlExport-BgT9JaXk.js.br +0 -0
  255. package/client/assets/MessageControlExport-BgT9JaXk.js.gz +0 -0
  256. package/client/assets/MultiPartProgressBar-W2a-JWPY.js.br +0 -0
  257. package/client/assets/MultiPartProgressBar-W2a-JWPY.js.gz +0 -0
  258. package/client/assets/OperatorExport-CbWojpp6.js.br +0 -0
  259. package/client/assets/OperatorExport-CbWojpp6.js.gz +0 -0
  260. package/client/assets/OperatorExport-CbWojpp6.js.map +0 -1
  261. package/client/assets/OverviewWrapper-B2i8d3rt.js +0 -2
  262. package/client/assets/OverviewWrapper-B2i8d3rt.js.br +0 -0
  263. package/client/assets/OverviewWrapper-B2i8d3rt.js.gz +0 -0
  264. package/client/assets/OverviewWrapper-DOYzR0Ef.css +0 -1
  265. package/client/assets/OverviewWrapper-DOYzR0Ef.css.br +0 -0
  266. package/client/assets/OverviewWrapper-DOYzR0Ef.css.gz +0 -0
  267. package/client/assets/PipHost-Dz2oy7XG.js.br +0 -0
  268. package/client/assets/PipHost-Dz2oy7XG.js.gz +0 -0
  269. package/client/assets/ProjectInfo-BR_7Hp5u.js.br +0 -0
  270. package/client/assets/ProjectInfo-BR_7Hp5u.js.gz +0 -0
  271. package/client/assets/ProtectRoute-Bxq6q7ba.js +0 -2
  272. package/client/assets/ProtectRoute-Bxq6q7ba.js.br +0 -0
  273. package/client/assets/ProtectRoute-Bxq6q7ba.js.gz +0 -0
  274. package/client/assets/ProtectedCuesheet-C7AqD2dy.js +0 -2
  275. package/client/assets/ProtectedCuesheet-C7AqD2dy.js.br +0 -0
  276. package/client/assets/ProtectedCuesheet-C7AqD2dy.js.gz +0 -0
  277. package/client/assets/ProtectedCuesheet-C7AqD2dy.js.map +0 -1
  278. package/client/assets/ProtectedEditor-CsfvVyOU.js +0 -3
  279. package/client/assets/ProtectedEditor-CsfvVyOU.js.br +0 -0
  280. package/client/assets/ProtectedEditor-CsfvVyOU.js.gz +0 -0
  281. package/client/assets/ProtectedEditor-CsfvVyOU.js.map +0 -1
  282. package/client/assets/ProtectedEditor-DID9cfOA.css +0 -1
  283. package/client/assets/ProtectedEditor-DID9cfOA.css.br +0 -0
  284. package/client/assets/ProtectedEditor-DID9cfOA.css.gz +0 -0
  285. package/client/assets/RundownExport-25orDQIW.js.br +0 -0
  286. package/client/assets/RundownExport-25orDQIW.js.gz +0 -0
  287. package/client/assets/RundownExport-25orDQIW.js.map +0 -1
  288. package/client/assets/Select-BnGTAeXJ.js.br +0 -0
  289. package/client/assets/Select-BnGTAeXJ.js.gz +0 -0
  290. package/client/assets/Studio-BK2Klo_K.js.br +0 -0
  291. package/client/assets/Studio-BK2Klo_K.js.gz +0 -0
  292. package/client/assets/StyleEditor-DIHQ1PUV.js.br +0 -0
  293. package/client/assets/StyleEditor-DIHQ1PUV.js.gz +0 -0
  294. package/client/assets/SuperscriptPeriod-EEedc9rG.js.br +0 -0
  295. package/client/assets/SuperscriptPeriod-EEedc9rG.js.gz +0 -0
  296. package/client/assets/SuperscriptTime-BVanhNvd.js.br +0 -0
  297. package/client/assets/SuperscriptTime-BVanhNvd.js.gz +0 -0
  298. package/client/assets/SwatchPicker-Ckpchvjo.js +0 -2
  299. package/client/assets/SwatchPicker-Ckpchvjo.js.br +0 -0
  300. package/client/assets/SwatchPicker-Ckpchvjo.js.gz +0 -0
  301. package/client/assets/TimeElements-CYIgGk0T.js +0 -2
  302. package/client/assets/TimeElements-CYIgGk0T.js.br +0 -0
  303. package/client/assets/TimeElements-CYIgGk0T.js.gz +0 -0
  304. package/client/assets/TimeInput-Cwl9vLWA.js.br +0 -0
  305. package/client/assets/TimeInput-Cwl9vLWA.js.gz +0 -0
  306. package/client/assets/TimelinePage-D4QNdk-Z.js.br +0 -0
  307. package/client/assets/TimelinePage-D4QNdk-Z.js.gz +0 -0
  308. package/client/assets/TimelinePage-D4QNdk-Z.js.map +0 -1
  309. package/client/assets/Timer-BJQKNHfo.js.br +0 -0
  310. package/client/assets/Timer-BJQKNHfo.js.gz +0 -0
  311. package/client/assets/TimerControlExport-Ba1vifNg.js +0 -2
  312. package/client/assets/TimerControlExport-Ba1vifNg.js.br +0 -0
  313. package/client/assets/TimerControlExport-Ba1vifNg.js.gz +0 -0
  314. package/client/assets/TimerControlExport-Ba1vifNg.js.map +0 -1
  315. package/client/assets/TimerDisplay-tVcUk9j3.js +0 -2
  316. package/client/assets/TimerDisplay-tVcUk9j3.js.br +0 -0
  317. package/client/assets/TimerDisplay-tVcUk9j3.js.gz +0 -0
  318. package/client/assets/TitleCard-BNjv58eq.js.br +0 -0
  319. package/client/assets/TitleCard-BNjv58eq.js.gz +0 -0
  320. package/client/assets/Tooltip-DZJ7u9gm.js.br +0 -4
  321. package/client/assets/Tooltip-DZJ7u9gm.js.gz +0 -0
  322. package/client/assets/ViewLogo-2I7w5Yms.js.br +0 -0
  323. package/client/assets/ViewLogo-2I7w5Yms.js.gz +0 -0
  324. package/client/assets/ViewParamsEditor-BX2RM8sx.js.br +0 -0
  325. package/client/assets/ViewParamsEditor-BX2RM8sx.js.gz +0 -0
  326. package/client/assets/editorSettings-_x6YKRfR.js.br +0 -6
  327. package/client/assets/editorSettings-_x6YKRfR.js.gz +0 -0
  328. package/client/assets/getProgress-ZUTmCn_v.js.br +0 -0
  329. package/client/assets/getProgress-ZUTmCn_v.js.gz +0 -0
  330. package/client/assets/index-Dm-4OTmY.js +0 -3
  331. package/client/assets/index-Dm-4OTmY.js.br +0 -0
  332. package/client/assets/index-Dm-4OTmY.js.gz +0 -0
  333. package/client/assets/index-Dm-4OTmY.js.map +0 -1
  334. package/client/assets/offset-VthsmtrO.js.br +0 -0
  335. package/client/assets/offset-VthsmtrO.js.gz +0 -0
  336. package/client/assets/parseUserTime-sZbEBi61.js +0 -2
  337. package/client/assets/parseUserTime-sZbEBi61.js.br +0 -0
  338. package/client/assets/parseUserTime-sZbEBi61.js.gz +0 -0
  339. package/client/assets/playbackstate-Dl_ZJABT.js.br +0 -0
  340. package/client/assets/playbackstate-Dl_ZJABT.js.gz +0 -0
  341. package/client/assets/presentation.utils-Z61KykAH.js.br +0 -0
  342. package/client/assets/presentation.utils-Z61KykAH.js.gz +0 -0
  343. package/client/assets/rundownUtils-CXZRD6yP.js.br +0 -0
  344. package/client/assets/rundownUtils-CXZRD6yP.js.gz +0 -0
  345. package/client/assets/timer.utils-B4bvsns3.js.br +0 -0
  346. package/client/assets/timer.utils-B4bvsns3.js.gz +0 -0
  347. package/client/assets/useCustomFields-BBE4LBBr.js +0 -2
  348. package/client/assets/useCustomFields-BBE4LBBr.js.br +0 -0
  349. package/client/assets/useCustomFields-BBE4LBBr.js.gz +0 -0
  350. package/client/assets/useEventSelection-Bpbu89c7.js.br +0 -0
  351. package/client/assets/useEventSelection-Bpbu89c7.js.gz +0 -0
  352. package/client/assets/useProjectData-C110zIXC.js.br +0 -0
  353. package/client/assets/useProjectData-C110zIXC.js.gz +0 -0
  354. package/client/assets/useReport-DqSBq4MG.js.br +0 -0
  355. package/client/assets/useReport-DqSBq4MG.js.gz +0 -0
  356. package/client/assets/useRundown-DAo6huE4.js.br +0 -0
  357. package/client/assets/useRundown-DAo6huE4.js.gz +0 -0
  358. package/client/assets/useRundown-DAo6huE4.js.map +0 -1
  359. package/client/assets/useSelectAndRevealEntry-DTg0hmxA.js.br +0 -0
  360. package/client/assets/useSelectAndRevealEntry-DTg0hmxA.js.gz +0 -0
  361. package/client/assets/useWindowTitle-DM8dIp8L.js.br +0 -0
  362. package/client/assets/useWindowTitle-DM8dIp8L.js.gz +0 -0
  363. package/client/assets/validateEvent-GnPt-e9-.js.br +0 -0
  364. package/client/assets/validateEvent-GnPt-e9-.js.gz +0 -0
  365. package/client/assets/vendor-BKUJ0_Du.js.br +0 -0
  366. package/client/assets/vendor-BKUJ0_Du.js.gz +0 -0
  367. package/client/assets/viewLoader.utils-4lL4PiNI.js.br +0 -0
  368. package/client/assets/viewLoader.utils-4lL4PiNI.js.gz +0 -0
  369. package/client/assets/viewUtils-29a3Mmiu.js.br +0 -0
  370. package/client/assets/viewUtils-29a3Mmiu.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["InputRow","props","label","placeholder","text","visible","changeHandler","children","value","setValue","useState","inputRef","useRef","cursorPositionRef","useEffect","current","document","activeElement","selectionStart","selectionEnd","handleInputChange","event","target","jsx","cx","style","active","jsxs","inputItems","Input","isPipSupported","window","PipTimerHost","lazy","__vitePreload","memo","PipRoot","Suspense","secondarySourceLabels","aux1","aux2","aux3","secondary","TimerPreview","blink","blackout","countToEnd","phase","secondarySource","showTimerMessage","timerType","useMessagePreview","data","useViewSettings","main","TimerType","None","timerPlaceholder","TimerPhase","Pending","Overtime","Clock","overrideColour","Warning","warningColor","Danger","dangerColor","normalColor","showColourOverride","contentClasses","preview","CornerWithPip","handleLinks","mainContent","secondaryContent","eventStatus","Tooltip","statusIcon","CountDown","IoArrowDown","CountUp","IoArrowUp","IoTime","IoBan","LuArrowDownToLine","TimerControlsPreview","useTimerViewControl","previewContainer","options","SecondarySourceControl","Editor.Separator","Button","setMessage","timerBlink","timerBlackout","toggleSecondary","timerSecondarySource","Fragment","Select","MessageControl","TimerMessageInput","SecondaryInput","useTimerMessageInput","newValue","timerText","IconButton","timerVisible","IoEye","IoEyeOffOutline","useSecondaryMessageInput","secondaryMessage","MessageControlExport","isExtracted","location","pathname","includes","ProtectRoute","Editor.Panel","growPanel","Editor.CornerExtract","ViewNavigationMenu","getIsNavigationLocked","contentLayout","ErrorBoundary"],"ignoreList":[],"sources":["../../src/features/control/message/InputRow.tsx","../../src/views/editor/pip-timer/pip.utils.ts","../../src/views/editor/pip-timer/PipRoot.tsx","../../src/features/control/message/TimerPreview.tsx","../../src/features/control/message/TimerViewControl.tsx","../../src/features/control/message/MessageControl.tsx","../../src/features/control/message/MessageControlExport.tsx"],"sourcesContent":["import { PropsWithChildren, useEffect, useRef, useState } from 'react';\n\nimport Input from '../../../common/components/input/input/Input';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './InputRow.module.scss';\n\ninterface InputRowProps {\n label: string;\n placeholder: string;\n text: string;\n visible: boolean;\n changeHandler: (newValue: string) => void;\n}\n\nexport default function InputRow(props: PropsWithChildren<InputRowProps>) {\n const { label, placeholder, text, visible, changeHandler, children } = props;\n\n const [value, setValue] = useState(text);\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef(0);\n\n // sync cursor position with text\n useEffect(() => {\n if (inputRef.current && inputRef.current !== document.activeElement) {\n inputRef.current.selectionStart = cursorPositionRef.current;\n inputRef.current.selectionEnd = cursorPositionRef.current;\n }\n }, [text]);\n\n // synchronise external text\n useEffect(() => {\n if (inputRef.current !== document.activeElement) {\n setValue(text);\n }\n }, [text]);\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n cursorPositionRef.current = event.target.selectionStart ?? 0;\n setValue(event.target.value);\n changeHandler(event.target.value);\n };\n\n return (\n <div>\n <label className={cx([style.label, visible ?? style.active])} htmlFor={label}>\n {label}\n </label>\n <div className={style.inputItems}>\n <Input id={label} ref={inputRef} value={value} onChange={handleInputChange} placeholder={placeholder} />\n {children}\n </div>\n </div>\n );\n}\n","export const isPipSupported = 'documentPictureInPicture' in window;\n","import { lazy, memo, Suspense } from 'react';\n\nimport { isPipSupported } from './pip.utils';\n\nconst PipTimerHost = lazy(() => import('./PipHost'));\n\nexport default memo(PipRoot);\nfunction PipRoot() {\n if (!isPipSupported) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <PipTimerHost />\n </Suspense>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoBan, IoTime } from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { TimerPhase, TimerType } from 'ontime-types';\n\nimport { CornerWithPip } from '../../../common/components/editor-utils/EditorUtils';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useMessagePreview } from '../../../common/hooks/useSocket';\nimport useViewSettings from '../../../common/hooks-query/useViewSettings';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { cx, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport PipRoot from '../../../views/editor/pip-timer/PipRoot';\n\nimport style from './TimerPreview.module.scss';\n\nconst secondarySourceLabels: Record<string, string> = {\n aux1: 'Aux 1',\n aux2: 'Aux 2',\n aux3: 'Aux 3',\n secondary: 'Secondary message',\n};\n\nexport default function TimerPreview() {\n const { blink, blackout, countToEnd, phase, secondarySource, showTimerMessage, timerType } = useMessagePreview();\n const { data } = useViewSettings();\n\n const main = (() => {\n if (showTimerMessage) return 'Message';\n if (timerType === TimerType.None) return timerPlaceholder;\n if (phase === TimerPhase.Pending) return 'Standby to start';\n if (phase === TimerPhase.Overtime) return 'Timer Overtime';\n if (timerType === TimerType.Clock) return 'Clock';\n if (countToEnd) return 'Count to End';\n return 'Timer';\n })();\n\n const secondary = (() => {\n // message is a fullscreen overlay or secondary is not active\n if (showTimerMessage || !secondarySource) return null;\n\n // we need to check aux first since it takes priority\n return secondarySourceLabels[secondarySource];\n })();\n\n const overrideColour = (() => {\n // override fallback colours from starter project\n if (phase === TimerPhase.Warning) return data.warningColor ?? '#ffa528';\n if (phase === TimerPhase.Danger) return data.dangerColor ?? '#ff7300';\n return data.normalColor ?? '#FFFC';\n })();\n\n const showColourOverride = main == 'Timer';\n const contentClasses = cx([blink && style.blink, blackout && style.blackout]);\n\n return (\n <div className={style.preview}>\n <CornerWithPip onExtractClick={(event) => handleLinks('timer', event)} pipElement={<PipRoot />} />\n <div className={contentClasses}>\n <div\n className={style.mainContent}\n data-phase={showColourOverride && phase}\n style={showColourOverride ? { '--override-colour': overrideColour } : {}}\n >\n {main}\n </div>\n {secondary !== null && <div className={style.secondaryContent}>{secondary}</div>}\n </div>\n <div className={style.eventStatus}>\n <Tooltip\n text='Time type: Count down'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountDown}\n >\n <IoArrowDown />\n </Tooltip>\n <Tooltip\n text='Time type: Count up'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountUp}\n >\n <IoArrowUp />\n </Tooltip>\n <Tooltip\n text='Time type: Clock'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.Clock}\n >\n <IoTime />\n </Tooltip>\n <Tooltip\n text='Time type: None'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.None}\n >\n <IoBan />\n </Tooltip>\n <Tooltip\n text={countToEnd ? 'Count to end' : 'Count duration'}\n render={<span />}\n className={style.statusIcon}\n data-active={countToEnd}\n >\n <LuArrowDownToLine />\n </Tooltip>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { SecondarySource } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport Select from '../../../common/components/select/Select';\nimport { setMessage, useTimerViewControl } from '../../../common/hooks/useSocket';\n\nimport TimerPreview from './TimerPreview';\n\nimport style from './TimerViewControl.module.scss';\n\nexport default function TimerControlsPreview() {\n const { blackout, blink } = useTimerViewControl();\n\n return (\n <div className={style.previewContainer}>\n <TimerPreview />\n <div className={style.options}>\n <SecondarySourceControl />\n\n <Editor.Separator orientation='horizontal' />\n\n <Button\n variant={blink ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlink(!blink)}\n data-testid='toggle timer blink'\n >\n Blink\n </Button>\n <Button\n variant={blackout ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlackout(!blackout)}\n data-testid='toggle timer blackout'\n >\n Blackout screen\n </Button>\n </div>\n </div>\n );\n}\n\nfunction SecondarySourceControl() {\n const { secondarySource } = useTimerViewControl();\n const [value, setValue] = useState<SecondarySource>('aux1');\n\n // sync secondary source with external changes\n useEffect(() => {\n if (secondarySource !== null) {\n setValue(secondarySource);\n }\n }, [secondarySource]);\n\n const toggleSecondary = () => {\n if (secondarySource === value) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource(value);\n }\n };\n\n return (\n <>\n <Select\n value={value}\n options={[\n { value: 'aux1', label: 'Aux 1' },\n { value: 'aux2', label: 'Aux 2' },\n { value: 'aux3', label: 'Aux 3' },\n { value: 'secondary', label: 'Secondary message' },\n ]}\n onValueChange={(value: SecondarySource | null) => {\n if (value === null) return;\n // we can only update the remote if it is enabled\n if (secondarySource !== null) {\n setMessage.timerSecondarySource(value);\n }\n setValue(value);\n }}\n />\n <Button\n variant={secondarySource !== null ? 'primary' : 'subtle'}\n fluid\n onClick={toggleSecondary}\n data-testid='toggle secondary'\n >\n Show secondary\n </Button>\n </>\n );\n}\n","import { IoEye, IoEyeOffOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport {\n setMessage,\n useExternalMessageInput as useSecondaryMessageInput,\n useTimerMessageInput,\n} from '../../../common/hooks/useSocket';\n\nimport InputRow from './InputRow';\nimport TimerControlsPreview from './TimerViewControl';\n\nexport default function MessageControl() {\n return (\n <>\n <TimerControlsPreview />\n <TimerMessageInput />\n <SecondaryInput />\n </>\n );\n}\n\nfunction TimerMessageInput() {\n const { text, visible } = useTimerMessageInput();\n\n return (\n <InputRow\n label='Timer Message'\n placeholder='Message shown fullscreen in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.timerText(newValue)}\n >\n <IconButton\n aria-label='Toggle timer message visibility'\n onClick={() => setMessage.timerVisible(!visible)}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n\nfunction SecondaryInput() {\n const { text, visible } = useSecondaryMessageInput();\n\n const toggleSecondary = () => {\n if (visible) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource('secondary');\n }\n };\n\n return (\n <InputRow\n label='Secondary Message'\n placeholder='Message shown as secondary text in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.secondaryMessage(newValue)}\n >\n <IconButton\n aria-label='Toggle secondary message visibility'\n onClick={toggleSecondary}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n","import { memo } from 'react';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { getIsNavigationLocked } from '../../../externals';\n\nimport MessageControl from './MessageControl';\n\nimport style from './MessageControlExport.module.scss';\n\nexport default memo(MessageControlExport);\nfunction MessageControlExport() {\n const isExtracted = window.location.pathname.includes('/messagecontrol');\n\n return (\n <ProtectRoute permission='editor'>\n <Editor.Panel className={style.growPanel} data-testid='panel-messages-control'>\n {!isExtracted && <Editor.CornerExtract onClick={(event) => handleLinks('messagecontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings isNavigationLocked={getIsNavigationLocked()} />}\n\n <div className={style.contentLayout}>\n <ErrorBoundary>\n <MessageControl />\n </ErrorBoundary>\n </div>\n </Editor.Panel>\n </ProtectRoute>\n );\n}\n"],"file":"assets/MessageControlExport-BgT9JaXk.js"}
1
+ {"version":3,"mappings":"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","names":["InputRow","props","label","placeholder","text","visible","changeHandler","children","value","setValue","useState","inputRef","useRef","cursorPositionRef","useEffect","current","document","activeElement","selectionStart","selectionEnd","handleInputChange","event","target","jsx","cx","style","active","jsxs","inputItems","Input","isPipSupported","window","PipTimerHost","lazy","__vitePreload","memo","PipRoot","Suspense","secondarySourceLabels","aux1","aux2","aux3","secondary","TimerPreview","blink","blackout","countToEnd","phase","secondarySource","showTimerMessage","timerType","useMessagePreview","data","useViewSettings","main","TimerType","None","timerPlaceholder","TimerPhase","Pending","Overtime","Clock","overrideColour","Warning","warningColor","Danger","dangerColor","normalColor","showColourOverride","contentClasses","preview","CornerWithPip","handleLinks","mainContent","secondaryContent","eventStatus","Tooltip","statusIcon","CountDown","IoArrowDown","CountUp","IoArrowUp","IoTime","IoBan","LuArrowDownToLine","TimerControlsPreview","useTimerViewControl","previewContainer","options","SecondarySourceControl","Editor.Separator","Button","setMessage","timerBlink","timerBlackout","toggleSecondary","timerSecondarySource","Fragment","Select","MessageControl","TimerMessageInput","SecondaryInput","useTimerMessageInput","newValue","timerText","IconButton","timerVisible","IoEye","IoEyeOffOutline","useSecondaryMessageInput","secondaryMessage","MessageControlExport","isExtracted","location","pathname","includes","ProtectRoute","Editor.Panel","growPanel","Editor.CornerExtract","ViewNavigationMenu","getIsNavigationLocked","contentLayout","ErrorBoundary"],"ignoreList":[],"sources":["../../src/features/control/message/InputRow.tsx","../../src/views/editor/pip-timer/pip.utils.ts","../../src/views/editor/pip-timer/PipRoot.tsx","../../src/features/control/message/TimerPreview.tsx","../../src/features/control/message/TimerViewControl.tsx","../../src/features/control/message/MessageControl.tsx","../../src/features/control/message/MessageControlExport.tsx"],"sourcesContent":["import { PropsWithChildren, useEffect, useRef, useState } from 'react';\n\nimport Input from '../../../common/components/input/input/Input';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './InputRow.module.scss';\n\ninterface InputRowProps {\n label: string;\n placeholder: string;\n text: string;\n visible: boolean;\n changeHandler: (newValue: string) => void;\n}\n\nexport default function InputRow(props: PropsWithChildren<InputRowProps>) {\n const { label, placeholder, text, visible, changeHandler, children } = props;\n\n const [value, setValue] = useState(text);\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef(0);\n\n // sync cursor position with text\n useEffect(() => {\n if (inputRef.current && inputRef.current !== document.activeElement) {\n inputRef.current.selectionStart = cursorPositionRef.current;\n inputRef.current.selectionEnd = cursorPositionRef.current;\n }\n }, [text]);\n\n // synchronise external text\n useEffect(() => {\n if (inputRef.current !== document.activeElement) {\n setValue(text);\n }\n }, [text]);\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n cursorPositionRef.current = event.target.selectionStart ?? 0;\n setValue(event.target.value);\n changeHandler(event.target.value);\n };\n\n return (\n <div>\n <label className={cx([style.label, visible ?? style.active])} htmlFor={label}>\n {label}\n </label>\n <div className={style.inputItems}>\n <Input id={label} ref={inputRef} value={value} onChange={handleInputChange} placeholder={placeholder} />\n {children}\n </div>\n </div>\n );\n}\n","export const isPipSupported = 'documentPictureInPicture' in window;\n","import { lazy, memo, Suspense } from 'react';\n\nimport { isPipSupported } from './pip.utils';\n\nconst PipTimerHost = lazy(() => import('./PipHost'));\n\nexport default memo(PipRoot);\nfunction PipRoot() {\n if (!isPipSupported) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <PipTimerHost />\n </Suspense>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoBan, IoTime } from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { TimerPhase, TimerType } from 'ontime-types';\n\nimport { CornerWithPip } from '../../../common/components/editor-utils/EditorUtils';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useMessagePreview } from '../../../common/hooks/useSocket';\nimport useViewSettings from '../../../common/hooks-query/useViewSettings';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { cx, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport PipRoot from '../../../views/editor/pip-timer/PipRoot';\n\nimport style from './TimerPreview.module.scss';\n\nconst secondarySourceLabels: Record<string, string> = {\n aux1: 'Aux 1',\n aux2: 'Aux 2',\n aux3: 'Aux 3',\n secondary: 'Secondary message',\n};\n\nexport default function TimerPreview() {\n const { blink, blackout, countToEnd, phase, secondarySource, showTimerMessage, timerType } = useMessagePreview();\n const { data } = useViewSettings();\n\n const main = (() => {\n if (showTimerMessage) return 'Message';\n if (timerType === TimerType.None) return timerPlaceholder;\n if (phase === TimerPhase.Pending) return 'Standby to start';\n if (phase === TimerPhase.Overtime) return 'Timer Overtime';\n if (timerType === TimerType.Clock) return 'Clock';\n if (countToEnd) return 'Count to End';\n return 'Timer';\n })();\n\n const secondary = (() => {\n // message is a fullscreen overlay or secondary is not active\n if (showTimerMessage || !secondarySource) return null;\n\n // we need to check aux first since it takes priority\n return secondarySourceLabels[secondarySource];\n })();\n\n const overrideColour = (() => {\n // override fallback colours from starter project\n if (phase === TimerPhase.Warning) return data.warningColor ?? '#ffa528';\n if (phase === TimerPhase.Danger) return data.dangerColor ?? '#ff7300';\n return data.normalColor ?? '#FFFC';\n })();\n\n const showColourOverride = main == 'Timer';\n const contentClasses = cx([blink && style.blink, blackout && style.blackout]);\n\n return (\n <div className={style.preview}>\n <CornerWithPip onExtractClick={(event) => handleLinks('timer', event)} pipElement={<PipRoot />} />\n <div className={contentClasses}>\n <div\n className={style.mainContent}\n data-phase={showColourOverride && phase}\n style={showColourOverride ? { '--override-colour': overrideColour } : {}}\n >\n {main}\n </div>\n {secondary !== null && <div className={style.secondaryContent}>{secondary}</div>}\n </div>\n <div className={style.eventStatus}>\n <Tooltip\n text='Time type: Count down'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountDown}\n >\n <IoArrowDown />\n </Tooltip>\n <Tooltip\n text='Time type: Count up'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountUp}\n >\n <IoArrowUp />\n </Tooltip>\n <Tooltip\n text='Time type: Clock'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.Clock}\n >\n <IoTime />\n </Tooltip>\n <Tooltip\n text='Time type: None'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.None}\n >\n <IoBan />\n </Tooltip>\n <Tooltip\n text={countToEnd ? 'Count to end' : 'Count duration'}\n render={<span />}\n className={style.statusIcon}\n data-active={countToEnd}\n >\n <LuArrowDownToLine />\n </Tooltip>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { SecondarySource } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport Select from '../../../common/components/select/Select';\nimport { setMessage, useTimerViewControl } from '../../../common/hooks/useSocket';\n\nimport TimerPreview from './TimerPreview';\n\nimport style from './TimerViewControl.module.scss';\n\nexport default function TimerControlsPreview() {\n const { blackout, blink } = useTimerViewControl();\n\n return (\n <div className={style.previewContainer}>\n <TimerPreview />\n <div className={style.options}>\n <SecondarySourceControl />\n\n <Editor.Separator orientation='horizontal' />\n\n <Button\n variant={blink ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlink(!blink)}\n data-testid='toggle timer blink'\n >\n Blink\n </Button>\n <Button\n variant={blackout ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlackout(!blackout)}\n data-testid='toggle timer blackout'\n >\n Blackout screen\n </Button>\n </div>\n </div>\n );\n}\n\nfunction SecondarySourceControl() {\n const { secondarySource } = useTimerViewControl();\n const [value, setValue] = useState<SecondarySource>('aux1');\n\n // sync secondary source with external changes\n useEffect(() => {\n if (secondarySource !== null) {\n setValue(secondarySource);\n }\n }, [secondarySource]);\n\n const toggleSecondary = () => {\n if (secondarySource === value) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource(value);\n }\n };\n\n return (\n <>\n <Select\n value={value}\n options={[\n { value: 'aux1', label: 'Aux 1' },\n { value: 'aux2', label: 'Aux 2' },\n { value: 'aux3', label: 'Aux 3' },\n { value: 'secondary', label: 'Secondary message' },\n ]}\n onValueChange={(value: SecondarySource | null) => {\n if (value === null) return;\n // we can only update the remote if it is enabled\n if (secondarySource !== null) {\n setMessage.timerSecondarySource(value);\n }\n setValue(value);\n }}\n />\n <Button\n variant={secondarySource !== null ? 'primary' : 'subtle'}\n fluid\n onClick={toggleSecondary}\n data-testid='toggle secondary'\n >\n Show secondary\n </Button>\n </>\n );\n}\n","import { IoEye, IoEyeOffOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport {\n setMessage,\n useExternalMessageInput as useSecondaryMessageInput,\n useTimerMessageInput,\n} from '../../../common/hooks/useSocket';\n\nimport InputRow from './InputRow';\nimport TimerControlsPreview from './TimerViewControl';\n\nexport default function MessageControl() {\n return (\n <>\n <TimerControlsPreview />\n <TimerMessageInput />\n <SecondaryInput />\n </>\n );\n}\n\nfunction TimerMessageInput() {\n const { text, visible } = useTimerMessageInput();\n\n return (\n <InputRow\n label='Timer Message'\n placeholder='Message shown fullscreen in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.timerText(newValue)}\n >\n <IconButton\n aria-label='Toggle timer message visibility'\n onClick={() => setMessage.timerVisible(!visible)}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n\nfunction SecondaryInput() {\n const { text, visible } = useSecondaryMessageInput();\n\n const toggleSecondary = () => {\n if (visible) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource('secondary');\n }\n };\n\n return (\n <InputRow\n label='Secondary Message'\n placeholder='Message shown as secondary text in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.secondaryMessage(newValue)}\n >\n <IconButton\n aria-label='Toggle secondary message visibility'\n onClick={toggleSecondary}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n","import { memo } from 'react';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { getIsNavigationLocked } from '../../../externals';\n\nimport MessageControl from './MessageControl';\n\nimport style from './MessageControlExport.module.scss';\n\nexport default memo(MessageControlExport);\nfunction MessageControlExport() {\n const isExtracted = window.location.pathname.includes('/messagecontrol');\n\n return (\n <ProtectRoute permission='editor'>\n <Editor.Panel className={style.growPanel} data-testid='panel-messages-control'>\n {!isExtracted && <Editor.CornerExtract onClick={(event) => handleLinks('messagecontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings isNavigationLocked={getIsNavigationLocked()} />}\n\n <div className={style.contentLayout}>\n <ErrorBoundary>\n <MessageControl />\n </ErrorBoundary>\n </div>\n </Editor.Panel>\n </ProtectRoute>\n );\n}\n"],"file":"assets/MessageControlExport-BN6OfADo.js"}
@@ -1,2 +1,2 @@
1
- import{j as r}from"./vendor-BKUJ0_Du.js";import{g as a}from"./getProgress-ZUTmCn_v.js";import{e as l}from"./index-Dm-4OTmY.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="b6a510aa-980d-46cf-8eca-62faf0652c7b",e._sentryDebugIdIdentifier="sentry-dbid-b6a510aa-980d-46cf-8eca-62faf0652c7b")}catch{}})();function j(e){const{now:s,complete:i,normalColor:g,warning:o,warningColor:c,danger:n,dangerColor:m,hidden:b,hideOvertime:u,ignoreCssOverride:f,className:p=""}=e,_=100-a(s,i),t=n?100-a(n,i):0,h=o?100-t-a(o,i):0,d=s!==null&&s<0&&!u;return r.jsx("div",{className:l(["multiprogress-bar",b&&"multiprogress-bar--hidden",f&&"multiprogress-bar--ignore-css-override",p]),children:s!==null&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"multiprogress-bar__bg",children:[r.jsx("div",{className:"multiprogress-bar__bg-normal",style:{backgroundColor:g}}),r.jsx("div",{className:"multiprogress-bar__bg-warning",style:{width:`${h}%`,backgroundColor:c}}),r.jsx("div",{className:l(["multiprogress-bar__bg-danger",d&&"multiprogress-bar__bg-danger--overtime"]),style:{width:`${t}%`,backgroundColor:d?void 0:m}})]}),r.jsx("div",{className:"multiprogress-bar__indicator",children:r.jsx("div",{className:"multiprogress-bar__indicator-bar",style:{width:`${_}%`}})})]})})}export{j as M};
2
- //# sourceMappingURL=MultiPartProgressBar-W2a-JWPY.js.map
1
+ import{j as r}from"./vendor-Dt3_Fdfs.js";import{g as a}from"./getProgress-CWSCZOIN.js";import{e as l}from"./index-3aosT33y.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="b6a510aa-980d-46cf-8eca-62faf0652c7b",e._sentryDebugIdIdentifier="sentry-dbid-b6a510aa-980d-46cf-8eca-62faf0652c7b")}catch{}})();function j(e){const{now:s,complete:i,normalColor:g,warning:o,warningColor:c,danger:n,dangerColor:m,hidden:b,hideOvertime:u,ignoreCssOverride:f,className:p=""}=e,_=100-a(s,i),t=n?100-a(n,i):0,h=o?100-t-a(o,i):0,d=s!==null&&s<0&&!u;return r.jsx("div",{className:l(["multiprogress-bar",b&&"multiprogress-bar--hidden",f&&"multiprogress-bar--ignore-css-override",p]),children:s!==null&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"multiprogress-bar__bg",children:[r.jsx("div",{className:"multiprogress-bar__bg-normal",style:{backgroundColor:g}}),r.jsx("div",{className:"multiprogress-bar__bg-warning",style:{width:`${h}%`,backgroundColor:c}}),r.jsx("div",{className:l(["multiprogress-bar__bg-danger",d&&"multiprogress-bar__bg-danger--overtime"]),style:{width:`${t}%`,backgroundColor:d?void 0:m}})]}),r.jsx("div",{className:"multiprogress-bar__indicator",children:r.jsx("div",{className:"multiprogress-bar__indicator-bar",style:{width:`${_}%`}})})]})})}export{j as M};
2
+ //# sourceMappingURL=MultiPartProgressBar-BlLJNQ0D.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultiPartProgressBar-W2a-JWPY.js","sources":["../../src/common/components/multi-part-progress-bar/MultiPartProgressBar.tsx"],"sourcesContent":["import { MaybeNumber } from 'ontime-types';\n\nimport { getProgress } from '../../utils/getProgress';\nimport { cx } from '../../utils/styleUtils';\n\nimport './MultiPartProgressBar.scss';\n\ninterface MultiPartProgressBar {\n now: MaybeNumber;\n complete: MaybeNumber;\n normalColor: string;\n warning?: MaybeNumber;\n warningColor: string;\n danger?: MaybeNumber;\n dangerColor: string;\n hidden?: boolean;\n hideOvertime?: boolean;\n ignoreCssOverride?: boolean;\n className?: string;\n}\n\nexport default function MultiPartProgressBar(props: MultiPartProgressBar) {\n const {\n now,\n complete,\n normalColor,\n warning,\n warningColor,\n danger,\n dangerColor,\n hidden,\n hideOvertime,\n ignoreCssOverride,\n className = '',\n } = props;\n\n const percentRemaining = 100 - getProgress(now, complete);\n const dangerWidth = danger ? 100 - getProgress(danger, complete) : 0;\n const warningWidth = warning ? 100 - dangerWidth - getProgress(warning, complete) : 0;\n const isOvertime = now !== null && now < 0;\n const showOvertime = isOvertime && !hideOvertime;\n\n return (\n <div\n className={cx([\n 'multiprogress-bar',\n hidden && 'multiprogress-bar--hidden',\n ignoreCssOverride && 'multiprogress-bar--ignore-css-override',\n className,\n ])}\n >\n {now !== null && (\n <>\n <div className='multiprogress-bar__bg'>\n <div className='multiprogress-bar__bg-normal' style={{ backgroundColor: normalColor }} />\n <div\n className='multiprogress-bar__bg-warning'\n style={{ width: `${warningWidth}%`, backgroundColor: warningColor }}\n />\n <div\n className={cx(['multiprogress-bar__bg-danger', showOvertime && 'multiprogress-bar__bg-danger--overtime'])}\n style={{ width: `${dangerWidth}%`, backgroundColor: showOvertime ? undefined : dangerColor }}\n />\n </div>\n <div className='multiprogress-bar__indicator'>\n <div className='multiprogress-bar__indicator-bar' style={{ width: `${percentRemaining}%` }} />\n </div>\n </>\n )}\n </div>\n );\n}\n"],"names":["MultiPartProgressBar","props","now","complete","normalColor","warning","warningColor","danger","dangerColor","hidden","hideOvertime","ignoreCssOverride","className","percentRemaining","getProgress","dangerWidth","warningWidth","showOvertime","jsx","cx","jsxs","Fragment","backgroundColor","width","undefined"],"mappings":"ydAqBA,SAAwBA,EAAqBC,EAA6B,CAClE,KAAA,CACJC,IAAAA,EACAC,SAAAA,EACAC,YAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,OAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,aAAAA,EACAC,kBAAAA,EACAC,UAAAA,EAAY,EAAA,EACVX,EAEEY,EAAmB,IAAMC,EAAYZ,EAAKC,CAAQ,EAClDY,EAAcR,EAAS,IAAMO,EAAYP,EAAQJ,CAAQ,EAAI,EAC7Da,EAAeX,EAAU,IAAMU,EAAcD,EAAYT,EAASF,CAAQ,EAAI,EAE9Ec,EADaf,IAAQ,MAAQA,EAAM,GACN,CAACQ,EAEpC,OACGQ,EAAA,IAAA,MAAA,CACC,UAAWC,EAAG,CACZ,oBACAV,GAAU,4BACVE,GAAqB,yCACrBC,CAAS,CACV,EAEAV,SAAAA,IAAQ,MAELkB,EAAA,KAAAC,WAAA,CAAA,SAAA,CAACD,EAAAA,KAAA,MAAA,CAAI,UAAU,wBACb,SAAA,CAACF,EAAAA,IAAA,MAAA,CAAI,UAAU,+BAA+B,MAAO,CAAEI,gBAAiBlB,CAAAA,EAAc,EACrFc,EAAAA,IAAA,MAAA,CACC,UAAU,gCACV,MAAO,CAAEK,MAAO,GAAGP,CAAY,IAAKM,gBAAiBhB,CAAAA,EAAe,EAEtEY,MAAC,MACC,CAAA,UAAWC,EAAG,CAAC,+BAAgCF,GAAgB,wCAAwC,CAAC,EACxG,MAAO,CAAEM,MAAO,GAAGR,CAAW,IAAKO,gBAAiBL,EAAeO,OAAYhB,CAAAA,CAAc,CAAA,CAAA,EAEjG,EACAU,EAAAA,IAAC,OAAI,UAAU,+BACb,eAAC,MAAI,CAAA,UAAU,mCAAmC,MAAO,CAAEK,MAAO,GAAGV,CAAgB,KAAM,CAC7F,CAAA,CAAA,CAAA,CACF,CAEJ,CAAA,CAEJ"}
1
+ {"version":3,"file":"MultiPartProgressBar-BlLJNQ0D.js","sources":["../../src/common/components/multi-part-progress-bar/MultiPartProgressBar.tsx"],"sourcesContent":["import { MaybeNumber } from 'ontime-types';\n\nimport { getProgress } from '../../utils/getProgress';\nimport { cx } from '../../utils/styleUtils';\n\nimport './MultiPartProgressBar.scss';\n\ninterface MultiPartProgressBar {\n now: MaybeNumber;\n complete: MaybeNumber;\n normalColor: string;\n warning?: MaybeNumber;\n warningColor: string;\n danger?: MaybeNumber;\n dangerColor: string;\n hidden?: boolean;\n hideOvertime?: boolean;\n ignoreCssOverride?: boolean;\n className?: string;\n}\n\nexport default function MultiPartProgressBar(props: MultiPartProgressBar) {\n const {\n now,\n complete,\n normalColor,\n warning,\n warningColor,\n danger,\n dangerColor,\n hidden,\n hideOvertime,\n ignoreCssOverride,\n className = '',\n } = props;\n\n const percentRemaining = 100 - getProgress(now, complete);\n const dangerWidth = danger ? 100 - getProgress(danger, complete) : 0;\n const warningWidth = warning ? 100 - dangerWidth - getProgress(warning, complete) : 0;\n const isOvertime = now !== null && now < 0;\n const showOvertime = isOvertime && !hideOvertime;\n\n return (\n <div\n className={cx([\n 'multiprogress-bar',\n hidden && 'multiprogress-bar--hidden',\n ignoreCssOverride && 'multiprogress-bar--ignore-css-override',\n className,\n ])}\n >\n {now !== null && (\n <>\n <div className='multiprogress-bar__bg'>\n <div className='multiprogress-bar__bg-normal' style={{ backgroundColor: normalColor }} />\n <div\n className='multiprogress-bar__bg-warning'\n style={{ width: `${warningWidth}%`, backgroundColor: warningColor }}\n />\n <div\n className={cx(['multiprogress-bar__bg-danger', showOvertime && 'multiprogress-bar__bg-danger--overtime'])}\n style={{ width: `${dangerWidth}%`, backgroundColor: showOvertime ? undefined : dangerColor }}\n />\n </div>\n <div className='multiprogress-bar__indicator'>\n <div className='multiprogress-bar__indicator-bar' style={{ width: `${percentRemaining}%` }} />\n </div>\n </>\n )}\n </div>\n );\n}\n"],"names":["MultiPartProgressBar","props","now","complete","normalColor","warning","warningColor","danger","dangerColor","hidden","hideOvertime","ignoreCssOverride","className","percentRemaining","getProgress","dangerWidth","warningWidth","showOvertime","jsx","cx","jsxs","Fragment","backgroundColor","width","undefined"],"mappings":"ydAqBA,SAAwBA,EAAqBC,EAA6B,CAClE,KAAA,CACJC,IAAAA,EACAC,SAAAA,EACAC,YAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,OAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,aAAAA,EACAC,kBAAAA,EACAC,UAAAA,EAAY,EAAA,EACVX,EAEEY,EAAmB,IAAMC,EAAYZ,EAAKC,CAAQ,EAClDY,EAAcR,EAAS,IAAMO,EAAYP,EAAQJ,CAAQ,EAAI,EAC7Da,EAAeX,EAAU,IAAMU,EAAcD,EAAYT,EAASF,CAAQ,EAAI,EAE9Ec,EADaf,IAAQ,MAAQA,EAAM,GACN,CAACQ,EAEpC,OACGQ,EAAA,IAAA,MAAA,CACC,UAAWC,EAAG,CACZ,oBACAV,GAAU,4BACVE,GAAqB,yCACrBC,CAAS,CACV,EAEAV,SAAAA,IAAQ,MAELkB,EAAA,KAAAC,WAAA,CAAA,SAAA,CAACD,EAAAA,KAAA,MAAA,CAAI,UAAU,wBACb,SAAA,CAACF,EAAAA,IAAA,MAAA,CAAI,UAAU,+BAA+B,MAAO,CAAEI,gBAAiBlB,CAAAA,EAAc,EACrFc,EAAAA,IAAA,MAAA,CACC,UAAU,gCACV,MAAO,CAAEK,MAAO,GAAGP,CAAY,IAAKM,gBAAiBhB,CAAAA,EAAe,EAEtEY,MAAC,MACC,CAAA,UAAWC,EAAG,CAAC,+BAAgCF,GAAgB,wCAAwC,CAAC,EACxG,MAAO,CAAEM,MAAO,GAAGR,CAAW,IAAKO,gBAAiBL,EAAeO,OAAYhB,CAAAA,CAAc,CAAA,CAAA,EAEjG,EACAU,EAAAA,IAAC,OAAI,UAAU,+BACb,eAAC,MAAI,CAAA,UAAU,mCAAmC,MAAO,CAAEK,MAAO,GAAGV,CAAgB,KAAM,CAC7F,CAAA,CAAA,CAAA,CACF,CAEJ,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{h as c,j as e,D as ae,q as le,t as ce,v as ue,l as de}from"./vendor-BKUJ0_Du.js";import{P as me}from"./ProtectRoute-Bxq6q7ba.js";import{ak as pe,B as z,t as te,r as fe,bg as he,aD as ge,e as T,f as _e,b7 as ve,k as be,M as ye,b8 as xe,bb as je,a as Se,P as Ee,b as we,L as Oe,o as Ce,g as Te,O as Pe,bh as Ne}from"./index-Dm-4OTmY.js";import{t as Fe,i as q,j as De}from"./useRundown-DAo6huE4.js";import{E as Le}from"./EmptyPage-CYVrjOvI.js";import{m as Me,b as ke,O as $,V as Re}from"./ViewParamsEditor-BX2RM8sx.js";import{u as Ie,F as Ue}from"./FollowButton-DcSbb4R_.js";import{u as Be}from"./useWindowTitle-DM8dIp8L.js";import{T as Ae}from"./editorSettings-_x6YKRfR.js";import{u as We,D as Ve}from"./DelayIndicator-DKS6mZdB.js";import{f as $e,T as Ge,C as He}from"./TimeElements-CYIgGk0T.js";import{S as Ze}from"./SuperscriptPeriod-EEedc9rG.js";import{M as ze}from"./MultiPartProgressBar-W2a-JWPY.js";import{g as qe,a as Qe}from"./viewLoader.utils-4lL4PiNI.js";import{i as G,b as Q}from"./viewUtils-29a3Mmiu.js";import{u as Je}from"./useCustomFields-BBE4LBBr.js";import"./SwatchPicker-Ckpchvjo.js";import"./Select-BnGTAeXJ.js";import"./validateEvent-GnPt-e9-.js";import"./rundownUtils-CXZRD6yP.js";import"./parseUserTime-sZbEBi61.js";import"./Tooltip-DZJ7u9gm.js";import"./offset-VthsmtrO.js";import"./playbackstate-Dl_ZJABT.js";/* empty css */import"./getProgress-ZUTmCn_v.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="b951b061-89ec-4279-a14f-f9be79b19f0c",t._sentryDebugIdIdentifier="sentry-dbid-b951b061-89ec-4279-a14f-f9be79b19f0c")}catch{}})();const Ke="_editModal_1k6b9_17",Xe="_title_1k6b9_31",Ye="_body_1k6b9_39",et="_label_1k6b9_48",tt="_footer_1k6b9_54",C={editModal:Ke,title:Xe,body:Ye,label:et,footer:tt};function st(t){const{event:s,onClose:o}=t,{updateEntry:r}=We(),[n,i]=c.useState(!1),d=c.useRef(new Array),g=async()=>{if(!d.current)return;i(!0);const a={id:s.id};d.current.forEach(l=>{l.dataset.field&&l.defaultValue!=l.value&&(a.custom?a.custom[l.dataset.field]=l.value:Object.assign(a,{custom:{[l.dataset.field]:l.value}}))}),a.custom&&await r(a),i(!1),o()};return e.jsx(ae,{open:!0,onOpenChange:a=>{a||o()},children:e.jsx(le,{children:e.jsxs(ce,{className:C.editModal,children:[e.jsxs("div",{className:C.title,children:[`Editing fields in cue ${s.cue}`,e.jsx(pe,{variant:"subtle-white",onClick:o,disabled:n,children:e.jsx(ue,{})})]}),e.jsx("div",{className:C.body,children:s.subscriptions.map(a=>e.jsxs(c.Fragment,{children:[e.jsx("label",{htmlFor:a.id,className:C.label,style:{"--user-bg":a.colour},children:a.label}),e.jsx(Ae,{name:a.id,ref:l=>{l&&d.current.push(l)},placeholder:`Add value for ${a.label} field`,defaultValue:a.value,"data-field":a.id,disabled:n,rows:5})]},a.id))}),e.jsxs("div",{className:C.footer,children:[e.jsx(z,{variant:"subtle",size:"large",onClick:o,disabled:n,children:"Cancel"}),e.jsx(z,{variant:"primary",size:"large",onClick:g,disabled:n,children:"Save"})]})]})})})}function ot(t,s={}){const{threshold:o=700,onStart:r,onFinish:n,onCancel:i}=s,d=c.useRef(!1),g=c.useRef(!1),a=c.useRef(-1);return c.useEffect(()=>()=>window.clearTimeout(a.current),[]),c.useMemo(()=>{if(typeof t!="function")return{};const l=m=>{!K(m)&&!J(m)||(r&&r(m),g.current=!0,a.current=window.setTimeout(()=>{t(m),d.current=!0},o))},h=m=>{!K(m)&&!J(m)||(d.current?n==null||n(m):g.current&&(i==null||i(m)),d.current=!1,g.current=!1,a.current&&window.clearTimeout(a.current))};return{onMouseDown:l,onMouseUp:h,onMouseLeave:h,onTouchStart:l,onTouchEnd:h,onTouchMove:te(h,150)}},[t,o,i,n,r])}function J(t){return window.TouchEvent?t.nativeEvent instanceof TouchEvent:"touches"in t.nativeEvent}function K(t){return t.nativeEvent instanceof MouseEvent}function nt(t){const{value:s,hideSeconds:o,hideLeadingZero:r,className:n}=t;let i=$e(s,o||r?2:3);return r&&(i=fe(i)),o&&(i=he(i)),e.jsx("div",{className:n,children:i})}const rt="_event_9py1c_21",it="_running_9py1c_38",at="_past_9py1c_42",lt="_binder_9py1c_47",ct="_cue_9py1c_57",ut="_mainField_9py1c_67",dt="_secondaryField_9py1c_76",mt="_plannedStart_9py1c_83",pt="_timeUntil_9py1c_84",ft="_runningTime_9py1c_85",ht="_fields_9py1c_114",gt="_field_9py1c_114",_t="_noColour_9py1c_123",vt="_value_9py1c_129",bt="_fieldsWithContent_9py1c_136",p={event:rt,running:it,past:at,binder:lt,cue:ct,mainField:ut,secondaryField:dt,plannedStart:mt,timeUntil:pt,runningTime:ft,fields:ht,field:gt,noColour:_t,value:vt,fieldsWithContent:bt},X=c.memo(yt);function yt({id:t,colour:s,cue:o,main:r,secondary:n,timeStart:i,duration:d,delay:g,dayOffset:a,isLinkedToLoaded:l,isSelected:h,isPast:m,selectedRef:N,showStart:F,subscribed:x,totalGap:j,onLongPress:D}){const v=f=>{f&&f.cancelable&&f.preventDefault(),x&&D({id:t,cue:o,subscriptions:x})},b=ot(v),R=s&&ge(s),E=T([p.event,h&&p.running,m&&p.past]),I=x.some(f=>f.value),U=x.length?Math.min(x.length,4):0,B=U>0?{gridTemplateColumns:`repeat(${U}, minmax(12rem, 1fr))`}:void 0;return e.jsxs("div",{className:E,"data-testid":o,ref:N,onContextMenu:v,...b,children:[e.jsx("div",{className:p.binder,style:{...R},children:e.jsx("span",{className:p.cue,children:o})}),e.jsxs("span",{className:p.mainField,children:[F&&e.jsx(Ze,{className:p.plannedStart,time:_e(i)}),r]}),e.jsx("span",{className:p.secondaryField,children:n}),e.jsx(xt,{timeStart:i,isPast:m,isSelected:h,delay:g,dayOffset:a,totalGap:j,isLinkedToLoaded:l}),e.jsxs("span",{className:p.runningTime,children:[e.jsx(Ve,{delayValue:g}),e.jsx(nt,{className:T([h&&p.muted]),value:d,hideLeadingZero:!0})]}),e.jsx("div",{className:T([p.fields,I&&p.fieldsWithContent]),style:B,children:x.map(f=>f.value?e.jsxs("div",{children:[e.jsx("span",{className:T([p.field,!f.colour&&p.noColour]),style:{backgroundColor:f.colour},children:f.label}),e.jsx("span",{className:p.value,style:{color:f.colour},children:f.value})]},f.id):e.jsx("div",{},f.id))})]})}function xt({timeStart:t,isPast:s,isSelected:o,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:d}){return s?e.jsx("span",{className:p.timeUntil,children:"DONE"}):o?e.jsx("span",{className:p.timeUntil,children:"LIVE"}):e.jsx(jt,{timeStart:t,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:d})}function jt({timeStart:t,delay:s,dayOffset:o,totalGap:r,isLinkedToLoaded:n}){const i=ve({timeStart:t,delay:s,dayOffset:o},{totalGap:r,isLinkedToLoaded:n}),g=i<xe?"DUE":`${be(Math.abs(i),i>2*ye)}`;return e.jsx("span",{className:p.timeUntil,"data-testid":"time-until",children:g})}const St="_group_c6uj3_17",Et={group:St},wt=c.memo(Ot);function Ot({title:t}){return e.jsx("div",{className:Et.group,children:t})}const Ct="_statusBar_1va40_17",Tt="_timers_1va40_25",Pt="_runningTimer_1va40_33",Nt="_timeNow_1va40_42",Ft="_progressOverride_1va40_51",P={statusBar:Ct,timers:Tt,runningTimer:Pt,timeNow:Nt,progressOverride:Ft};function Dt({viewSettings:t}){const{current:s,duration:o,timeWarning:r,timeDanger:n}=je();return e.jsx(ze,{now:s,complete:o,normalColor:t.normalColor,warning:r,warningColor:t.warningColor,danger:n,dangerColor:t.dangerColor,className:P.progressOverride,ignoreCssOverride:!0})}function Lt(){return e.jsxs("div",{className:P.timers,children:[e.jsx(Ge,{className:P.runningTimer}),e.jsx(He,{className:P.timeNow,shouldFormat:!0})]})}function Mt(){const{data:t}=Se();return e.jsxs("div",{className:P.statusBar,children:[e.jsx(Lt,{}),t&&e.jsx(Dt,{viewSettings:t})]})}const kt=(t,s)=>{const o=Me(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),r=ke(t);return[{title:$.ClockOptions,collapsible:!0,options:[qe(s)]},{title:$.DataSources,collapsible:!0,options:[{id:"main",title:"Main data field",description:"Field to be shown in the first line of text",type:"option",values:o,defaultValue:"title"},{id:"secondary-src",title:"Secondary data field",description:"Field to be shown in the second line of text",type:"option",values:o,defaultValue:"none"},{id:"subscribe",title:"Highlight Fields",description:"Choose custom fields to highlight",type:"multi-option",values:r},{id:"shouldEdit",title:"Edit custom field",description:"Allows editing an highlighted custom field by long pressing",type:"boolean",defaultValue:!1}]},{title:$.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1},{id:"showStart",title:"Show planned start",description:"Whether to prepend the planned start to the items",type:"boolean",defaultValue:!1}]}]};function Rt(t,s){const o=n=>(s==null?void 0:s.get(n))??t.get(n),r=n=>s!=null&&s.has(n)?s.getAll(n):t.getAll(n);return{mainSource:o("main"),secondarySource:o("secondary-src"),subscribe:r("subscribe"),shouldEdit:G(o("shouldEdit")),hidePast:G(o("hidePast")),showStart:G(o("showStart"))}}function It(){const[t]=de(),s=c.use(Ee);return c.useMemo(()=>{const r=s?new URLSearchParams(s.search):void 0;return Rt(t,r)},[s,t])}function Y(t,s,o,r,n){const i=s?Q(t,s)??"":t.title,d=Q(t,o)??"",a=r.filter(l=>Object.hasOwn(n,l)).reduce((l,h)=>{const m=n[h];return m&&l.push({id:h,label:m.label,colour:m.colour,value:t.custom[h]}),l},[]);return{mainField:i,secondaryField:d,subscribedData:a}}function Ut(){const{data:t,rundownMetadata:s,status:o}=Fe(),{data:r,status:n}=Je(),{data:i,status:d}=we();return{data:{rundown:t,rundownMetadata:s,customFields:r,settings:i},status:Qe([o,n,d])}}const Bt="_operatorContainer_1o5o0_17",At="_operatorEvents_1o5o0_24",Wt="_editPrompt_1o5o0_35",Vt="_show_1o5o0_49",k={operatorContainer:Bt,operatorEvents:At,editPrompt:Wt,show:Vt},ee=50;function $t(){const{data:t,status:s}=Ut();return Be("Operator"),s==="pending"?e.jsx(Oe,{}):s==="error"?e.jsx(Le,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Gt,{...t})}function Gt({rundown:t,rundownMetadata:s,customFields:o,settings:r}){const n=Ce(),{subscribe:i,mainSource:d,secondarySource:g,shouldEdit:a,hidePast:l,showStart:h}=It(),[m,N]=c.useState(!1),[F,x]=c.useState(null),[j,D]=c.useState(!1),v=c.useRef(null),b=c.useRef(null),R=Ie({followRef:v,scrollRef:b,doFollow:!j,topOffset:ee,followTrigger:n}),E=c.useRef(null);c.useEffect(()=>{var y;n||j||(y=b.current)==null||y.scrollTo(0,0)},[n,j,b]);const I=()=>{n&&R(),D(!1)},B=te(()=>{if(v!=null&&v.current&&(b!=null&&b.current)){const y=v.current.getBoundingClientRect(),u=b.current.getBoundingClientRect();if(y&&u){const w=y.top-u.top,S=w<-8||w>ee;D(S)}}},1e3),f=()=>{E.current&&clearTimeout(E.current),E.current=setTimeout(()=>{N(!1)},700),N(!0),B()},H=c.useCallback(y=>{x({...y})},[]),Z=Te(r==null?void 0:r.timeFormat),se=c.useMemo(()=>kt(o,Z),[o,Z]),A=a&&i.length;return e.jsxs("div",{className:k.operatorContainer,"data-testid":"operator-view",children:[e.jsx(Re,{target:Pe.Operator,viewOptions:se}),F&&e.jsx(st,{event:F,onClose:()=>x(null)}),e.jsx(Mt,{}),A&&e.jsx("div",{className:T([k.editPrompt,m&&k.show]),children:Ne?"Press and hold to edit user field":"Right click to edit user field"}),e.jsx("div",{className:k.operatorEvents,onWheel:f,onTouchMove:f,ref:b,children:t.order.map(y=>{var w;const u=t.entries[y];if(q(u)){const{isPast:S,isLinkedToLoaded:W,isLoaded:O,totalGap:_}=s[y];if(l&&S||u.skip)return null;const{mainField:L,secondaryField:M,subscribedData:V}=Y(u,d,g,i,o);return e.jsx(X,{id:u.id,colour:u.colour,cue:u.cue,main:L,secondary:M,timeStart:u.timeStart,duration:u.duration,delay:u.delay,dayOffset:u.dayOffset,isLinkedToLoaded:W,isSelected:O,isPast:S,selectedRef:O?v:void 0,showStart:h,subscribed:V,totalGap:_,onLongPress:A?H:()=>{}},u.id)}if(De(u)){const{isPast:S}=s[u.id],W=n?((w=s[n])==null?void 0:w.groupId)===u.id:!1;return l&&S&&!W?null:e.jsxs(c.Fragment,{children:[e.jsx(wt,{title:u.title},u.id),u.entries.map(O=>{const _=t.entries[O];if(!q(_))return null;const{isPast:L,isLoaded:M,isLinkedToLoaded:V,totalGap:oe}=s[O];if(l&&L||_.skip)return null;const{mainField:ne,secondaryField:re,subscribedData:ie}=Y(_,d,g,i,o);return e.jsx(X,{id:_.id,colour:_.colour,cue:_.cue,main:ne,secondary:re,timeStart:_.timeStart,duration:_.duration,delay:_.delay,dayOffset:_.dayOffset,isLinkedToLoaded:V,isSelected:M,isPast:L,selectedRef:M?v:void 0,showStart:h,subscribed:ie,totalGap:oe,onLongPress:A?H:()=>{}},_.id)})]},u.id)}return null})}),e.jsx(Ue,{isVisible:j,onClickHandler:I})]})}function _s(){return e.jsx(me,{permission:"operator",children:e.jsx($t,{})})}export{_s as default};
2
- //# sourceMappingURL=OperatorExport-CbWojpp6.js.map
1
+ import{h as c,j as e,D as ae,q as le,t as ce,v as de,l as ue}from"./vendor-Dt3_Fdfs.js";import{P as me}from"./ProtectRoute-DSilyhst.js";import{ak as pe,B as z,t as te,r as fe,bj as he,aE as ge,e as T,f as _e,ba as ve,k as be,M as ye,bb as xe,be as je,a as Se,P as Ee,b as we,L as Oe,o as Ce,g as Te,O as Pe,bk as Ne}from"./index-3aosT33y.js";import{t as Fe,i as q,j as De}from"./useRundown-C6stroSA.js";import{E as Le}from"./EmptyPage-aTb22KTq.js";import{m as Me,b as ke,O as $,V as Re}from"./ViewParamsEditor-DeMdkxxC.js";import{u as Ie,F as Ue}from"./FollowButton--Bj9S6jO.js";import{u as Be}from"./useWindowTitle-CQ8nEeel.js";import{T as Ae}from"./editorSettings-xk5GwlLv.js";import{u as We,D as Ve}from"./DelayIndicator-B0cudY9N.js";import{f as $e,T as Ge,C as He}from"./TimeElements-BfxdLkpO.js";import{S as Ze}from"./SuperscriptPeriod-CSX8zFgq.js";import{M as ze}from"./MultiPartProgressBar-BlLJNQ0D.js";import{g as qe,a as Qe}from"./viewLoader.utils-H7r-zNPP.js";import{i as G,b as Q}from"./viewUtils-k0tARVDN.js";import{u as Je}from"./useCustomFields-kBD1jvDA.js";import"./SwatchPicker-DuWAohyD.js";import"./Select-CvUrsmYI.js";import"./validateEvent-BnwPmDph.js";import"./rundownUtils-XX_c4Pcl.js";import"./parseUserTime-wAKk9aCJ.js";import"./Tooltip-C5iPq6NR.js";import"./offset-yVqq_CB1.js";import"./playbackstate-BZ9WYn2k.js";/* empty css */import"./getProgress-CWSCZOIN.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]="6088db20-69de-47be-870c-7000ef8df1b7",t._sentryDebugIdIdentifier="sentry-dbid-6088db20-69de-47be-870c-7000ef8df1b7")}catch{}})();const Ke="_editModal_1k6b9_17",Xe="_title_1k6b9_31",Ye="_body_1k6b9_39",et="_label_1k6b9_48",tt="_footer_1k6b9_54",C={editModal:Ke,title:Xe,body:Ye,label:et,footer:tt};function st(t){const{event:s,onClose:o}=t,{updateEntry:r}=We(),[n,i]=c.useState(!1),u=c.useRef(new Array),g=async()=>{if(!u.current)return;i(!0);const a={id:s.id};u.current.forEach(l=>{l.dataset.field&&l.defaultValue!=l.value&&(a.custom?a.custom[l.dataset.field]=l.value:Object.assign(a,{custom:{[l.dataset.field]:l.value}}))}),a.custom&&await r(a),i(!1),o()};return e.jsx(ae,{open:!0,onOpenChange:a=>{a||o()},children:e.jsx(le,{children:e.jsxs(ce,{className:C.editModal,children:[e.jsxs("div",{className:C.title,children:[`Editing fields in cue ${s.cue}`,e.jsx(pe,{variant:"subtle-white",onClick:o,disabled:n,children:e.jsx(de,{})})]}),e.jsx("div",{className:C.body,children:s.subscriptions.map(a=>e.jsxs(c.Fragment,{children:[e.jsx("label",{htmlFor:a.id,className:C.label,style:{"--user-bg":a.colour},children:a.label}),e.jsx(Ae,{name:a.id,ref:l=>{l&&u.current.push(l)},placeholder:`Add value for ${a.label} field`,defaultValue:a.value,"data-field":a.id,disabled:n,rows:5})]},a.id))}),e.jsxs("div",{className:C.footer,children:[e.jsx(z,{variant:"subtle",size:"large",onClick:o,disabled:n,children:"Cancel"}),e.jsx(z,{variant:"primary",size:"large",onClick:g,disabled:n,children:"Save"})]})]})})})}function ot(t,s={}){const{threshold:o=700,onStart:r,onFinish:n,onCancel:i}=s,u=c.useRef(!1),g=c.useRef(!1),a=c.useRef(-1);return c.useEffect(()=>()=>window.clearTimeout(a.current),[]),c.useMemo(()=>{if(typeof t!="function")return{};const l=m=>{!K(m)&&!J(m)||(r&&r(m),g.current=!0,a.current=window.setTimeout(()=>{t(m),u.current=!0},o))},h=m=>{!K(m)&&!J(m)||(u.current?n==null||n(m):g.current&&(i==null||i(m)),u.current=!1,g.current=!1,a.current&&window.clearTimeout(a.current))};return{onMouseDown:l,onMouseUp:h,onMouseLeave:h,onTouchStart:l,onTouchEnd:h,onTouchMove:te(h,150)}},[t,o,i,n,r])}function J(t){return window.TouchEvent?t.nativeEvent instanceof TouchEvent:"touches"in t.nativeEvent}function K(t){return t.nativeEvent instanceof MouseEvent}function nt(t){const{value:s,hideSeconds:o,hideLeadingZero:r,className:n}=t;let i=$e(s,o||r?2:3);return r&&(i=fe(i)),o&&(i=he(i)),e.jsx("div",{className:n,children:i})}const rt="_event_9py1c_21",it="_running_9py1c_38",at="_past_9py1c_42",lt="_binder_9py1c_47",ct="_cue_9py1c_57",dt="_mainField_9py1c_67",ut="_secondaryField_9py1c_76",mt="_plannedStart_9py1c_83",pt="_timeUntil_9py1c_84",ft="_runningTime_9py1c_85",ht="_fields_9py1c_114",gt="_field_9py1c_114",_t="_noColour_9py1c_123",vt="_value_9py1c_129",bt="_fieldsWithContent_9py1c_136",p={event:rt,running:it,past:at,binder:lt,cue:ct,mainField:dt,secondaryField:ut,plannedStart:mt,timeUntil:pt,runningTime:ft,fields:ht,field:gt,noColour:_t,value:vt,fieldsWithContent:bt},X=c.memo(yt);function yt({id:t,colour:s,cue:o,main:r,secondary:n,timeStart:i,duration:u,delay:g,dayOffset:a,isLinkedToLoaded:l,isSelected:h,isPast:m,selectedRef:N,showStart:F,subscribed:x,totalGap:j,onLongPress:D}){const v=f=>{f&&f.cancelable&&f.preventDefault(),x&&D({id:t,cue:o,subscriptions:x})},b=ot(v),R=s&&ge(s),E=T([p.event,h&&p.running,m&&p.past]),I=x.some(f=>f.value),U=x.length?Math.min(x.length,4):0,B=U>0?{gridTemplateColumns:`repeat(${U}, minmax(12rem, 1fr))`}:void 0;return e.jsxs("div",{className:E,"data-testid":o,ref:N,onContextMenu:v,...b,children:[e.jsx("div",{className:p.binder,style:{...R},children:e.jsx("span",{className:p.cue,children:o})}),e.jsxs("span",{className:p.mainField,children:[F&&e.jsx(Ze,{className:p.plannedStart,time:_e(i)}),r]}),e.jsx("span",{className:p.secondaryField,children:n}),e.jsx(xt,{timeStart:i,isPast:m,isSelected:h,delay:g,dayOffset:a,totalGap:j,isLinkedToLoaded:l}),e.jsxs("span",{className:p.runningTime,children:[e.jsx(Ve,{delayValue:g}),e.jsx(nt,{className:T([h&&p.muted]),value:u,hideLeadingZero:!0})]}),e.jsx("div",{className:T([p.fields,I&&p.fieldsWithContent]),style:B,children:x.map(f=>f.value?e.jsxs("div",{children:[e.jsx("span",{className:T([p.field,!f.colour&&p.noColour]),style:{backgroundColor:f.colour},children:f.label}),e.jsx("span",{className:p.value,style:{color:f.colour},children:f.value})]},f.id):e.jsx("div",{},f.id))})]})}function xt({timeStart:t,isPast:s,isSelected:o,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:u}){return s?e.jsx("span",{className:p.timeUntil,children:"DONE"}):o?e.jsx("span",{className:p.timeUntil,children:"LIVE"}):e.jsx(jt,{timeStart:t,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:u})}function jt({timeStart:t,delay:s,dayOffset:o,totalGap:r,isLinkedToLoaded:n}){const i=ve({timeStart:t,delay:s,dayOffset:o},{totalGap:r,isLinkedToLoaded:n}),g=i<xe?"DUE":`${be(Math.abs(i),i>2*ye)}`;return e.jsx("span",{className:p.timeUntil,"data-testid":"time-until",children:g})}const St="_group_c6uj3_17",Et={group:St},wt=c.memo(Ot);function Ot({title:t}){return e.jsx("div",{className:Et.group,children:t})}const Ct="_statusBar_1va40_17",Tt="_timers_1va40_25",Pt="_runningTimer_1va40_33",Nt="_timeNow_1va40_42",Ft="_progressOverride_1va40_51",P={statusBar:Ct,timers:Tt,runningTimer:Pt,timeNow:Nt,progressOverride:Ft};function Dt({viewSettings:t}){const{current:s,duration:o,timeWarning:r,timeDanger:n}=je();return e.jsx(ze,{now:s,complete:o,normalColor:t.normalColor,warning:r,warningColor:t.warningColor,danger:n,dangerColor:t.dangerColor,className:P.progressOverride,ignoreCssOverride:!0})}function Lt(){return e.jsxs("div",{className:P.timers,children:[e.jsx(Ge,{className:P.runningTimer}),e.jsx(He,{className:P.timeNow,shouldFormat:!0})]})}function Mt(){const{data:t}=Se();return e.jsxs("div",{className:P.statusBar,children:[e.jsx(Lt,{}),t&&e.jsx(Dt,{viewSettings:t})]})}const kt=(t,s)=>{const o=Me(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),r=ke(t);return[{title:$.ClockOptions,collapsible:!0,options:[qe(s)]},{title:$.DataSources,collapsible:!0,options:[{id:"main",title:"Main data field",description:"Field to be shown in the first line of text",type:"option",values:o,defaultValue:"title"},{id:"secondary-src",title:"Secondary data field",description:"Field to be shown in the second line of text",type:"option",values:o,defaultValue:"none"},{id:"subscribe",title:"Highlight Fields",description:"Choose custom fields to highlight",type:"multi-option",values:r},{id:"shouldEdit",title:"Edit custom field",description:"Allows editing an highlighted custom field by long pressing",type:"boolean",defaultValue:!1}]},{title:$.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1},{id:"showStart",title:"Show planned start",description:"Whether to prepend the planned start to the items",type:"boolean",defaultValue:!1}]}]};function Rt(t,s){const o=n=>(s==null?void 0:s.get(n))??t.get(n),r=n=>s!=null&&s.has(n)?s.getAll(n):t.getAll(n);return{mainSource:o("main"),secondarySource:o("secondary-src"),subscribe:r("subscribe"),shouldEdit:G(o("shouldEdit")),hidePast:G(o("hidePast")),showStart:G(o("showStart"))}}function It(){const[t]=ue(),s=c.use(Ee);return c.useMemo(()=>{const r=s?new URLSearchParams(s.search):void 0;return Rt(t,r)},[s,t])}function Y(t,s,o,r,n){const i=s?Q(t,s)??"":t.title,u=Q(t,o)??"",a=r.filter(l=>Object.hasOwn(n,l)).reduce((l,h)=>{const m=n[h];return m&&l.push({id:h,label:m.label,colour:m.colour,value:t.custom[h]}),l},[]);return{mainField:i,secondaryField:u,subscribedData:a}}function Ut(){const{data:t,rundownMetadata:s,status:o}=Fe(),{data:r,status:n}=Je(),{data:i,status:u}=we();return{data:{rundown:t,rundownMetadata:s,customFields:r,settings:i},status:Qe([o,n,u])}}const Bt="_operatorContainer_1o5o0_17",At="_operatorEvents_1o5o0_24",Wt="_editPrompt_1o5o0_35",Vt="_show_1o5o0_49",k={operatorContainer:Bt,operatorEvents:At,editPrompt:Wt,show:Vt},ee=50;function $t(){const{data:t,status:s}=Ut();return Be("Operator"),s==="pending"?e.jsx(Oe,{}):s==="error"?e.jsx(Le,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Gt,{...t})}function Gt({rundown:t,rundownMetadata:s,customFields:o,settings:r}){const n=Ce(),{subscribe:i,mainSource:u,secondarySource:g,shouldEdit:a,hidePast:l,showStart:h}=It(),[m,N]=c.useState(!1),[F,x]=c.useState(null),[j,D]=c.useState(!1),v=c.useRef(null),b=c.useRef(null),R=Ie({followRef:v,scrollRef:b,doFollow:!j,topOffset:ee,followTrigger:n}),E=c.useRef(null);c.useEffect(()=>{var y;n||j||(y=b.current)==null||y.scrollTo(0,0)},[n,j,b]);const I=()=>{n&&R(),D(!1)},B=te(()=>{if(v!=null&&v.current&&(b!=null&&b.current)){const y=v.current.getBoundingClientRect(),d=b.current.getBoundingClientRect();if(y&&d){const w=y.top-d.top,S=w<-8||w>ee;D(S)}}},1e3),f=()=>{E.current&&clearTimeout(E.current),E.current=setTimeout(()=>{N(!1)},700),N(!0),B()},H=c.useCallback(y=>{x({...y})},[]),Z=Te(r==null?void 0:r.timeFormat),se=c.useMemo(()=>kt(o,Z),[o,Z]),A=a&&i.length;return e.jsxs("div",{className:k.operatorContainer,"data-testid":"operator-view",children:[e.jsx(Re,{target:Pe.Operator,viewOptions:se}),F&&e.jsx(st,{event:F,onClose:()=>x(null)}),e.jsx(Mt,{}),A&&e.jsx("div",{className:T([k.editPrompt,m&&k.show]),children:Ne?"Press and hold to edit user field":"Right click to edit user field"}),e.jsx("div",{className:k.operatorEvents,onWheel:f,onTouchMove:f,ref:b,children:t.order.map(y=>{var w;const d=t.entries[y];if(q(d)){const{isPast:S,isLinkedToLoaded:W,isLoaded:O,totalGap:_}=s[y];if(l&&S||d.skip)return null;const{mainField:L,secondaryField:M,subscribedData:V}=Y(d,u,g,i,o);return e.jsx(X,{id:d.id,colour:d.colour,cue:d.cue,main:L,secondary:M,timeStart:d.timeStart,duration:d.duration,delay:d.delay,dayOffset:d.dayOffset,isLinkedToLoaded:W,isSelected:O,isPast:S,selectedRef:O?v:void 0,showStart:h,subscribed:V,totalGap:_,onLongPress:A?H:()=>{}},d.id)}if(De(d)){const{isPast:S}=s[d.id],W=n?((w=s[n])==null?void 0:w.groupId)===d.id:!1;return l&&S&&!W?null:e.jsxs(c.Fragment,{children:[e.jsx(wt,{title:d.title},d.id),d.entries.map(O=>{const _=t.entries[O];if(!q(_))return null;const{isPast:L,isLoaded:M,isLinkedToLoaded:V,totalGap:oe}=s[O];if(l&&L||_.skip)return null;const{mainField:ne,secondaryField:re,subscribedData:ie}=Y(_,u,g,i,o);return e.jsx(X,{id:_.id,colour:_.colour,cue:_.cue,main:ne,secondary:re,timeStart:_.timeStart,duration:_.duration,delay:_.delay,dayOffset:_.dayOffset,isLinkedToLoaded:V,isSelected:M,isPast:L,selectedRef:M?v:void 0,showStart:h,subscribed:ie,totalGap:oe,onLongPress:A?H:()=>{}},_.id)})]},d.id)}return null})}),e.jsx(Ue,{isVisible:j,onClickHandler:I})]})}function _s(){return e.jsx(me,{permission:"operator",children:e.jsx($t,{})})}export{_s as default};
2
+ //# sourceMappingURL=OperatorExport-CmgIl1lz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorExport-CmgIl1lz.js","sources":["../../src/features/operator/custom-field-edit-modal/CustomFieldEditModal.tsx","../../src/common/hooks/useLongPress.ts","../../src/views/common/running-time/RunningTime.tsx","../../src/features/operator/operator-event/OperatorEvent.tsx","../../src/features/operator/operator-group/OperatorGroup.tsx","../../src/features/operator/status-bar/StatusBarProgress.tsx","../../src/features/operator/status-bar/StatusBarTimers.tsx","../../src/features/operator/status-bar/StatusBar.tsx","../../src/features/operator/operator.options.tsx","../../src/features/operator/operator.utils.ts","../../src/features/operator/useOperatorData.ts","../../src/features/operator/Operator.tsx","../../src/features/operator/OperatorExport.tsx"],"sourcesContent":["import { Fragment, useRef, useState } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog } from '@base-ui/react/dialog';\nimport { OntimeEvent } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport Textarea from '../../../common/components/input/textarea/Textarea';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { EditEvent } from '../operator.types';\n\nimport style from './CustomFieldEditModal.module.scss';\n\ninterface CustomFieldEditModalProps {\n event: EditEvent;\n onClose: () => void;\n}\n\nexport default function CustomFieldEditModal(props: CustomFieldEditModalProps) {\n const { event, onClose } = props;\n\n const { updateEntry } = useEntryActions();\n const [loading, setLoading] = useState(false);\n const inputRef = useRef<HTMLTextAreaElement[]>(new Array<HTMLTextAreaElement>());\n\n const handleSave = async () => {\n if (!inputRef.current) return;\n setLoading(true);\n\n const patchObject: Partial<OntimeEvent> = { id: event.id };\n\n inputRef.current.forEach((element) => {\n if (element.dataset.field && element.defaultValue != element.value) {\n if (patchObject.custom) {\n patchObject.custom[element.dataset.field] = element.value;\n } else {\n Object.assign(patchObject, { custom: { [element.dataset.field]: element.value } });\n }\n }\n });\n\n if (patchObject.custom) {\n await updateEntry(patchObject);\n }\n\n setLoading(false);\n onClose();\n };\n\n return (\n <Dialog.Root\n open\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n >\n <Dialog.Portal>\n <Dialog.Popup className={style.editModal}>\n <div className={style.title}>\n {`Editing fields in cue ${event.cue}`}\n <IconButton variant='subtle-white' onClick={onClose} disabled={loading}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {event.subscriptions.map((field) => {\n return (\n <Fragment key={field.id}>\n <label htmlFor={field.id} className={style.label} style={{ '--user-bg': field.colour }}>\n {field.label}\n </label>\n <Textarea\n name={field.id}\n ref={(element) => {\n if (element) inputRef.current.push(element);\n }}\n placeholder={`Add value for ${field.label} field`}\n defaultValue={field.value}\n data-field={field.id}\n disabled={loading}\n rows={5}\n />\n </Fragment>\n );\n })}\n </div>\n\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n <Button variant='primary' size='large' onClick={handleSave} disabled={loading}>\n Save\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import React, { useEffect, useMemo, useRef } from 'react';\n\nimport { throttle } from '../utils/throttle';\n\nexport interface UseLongPressOptions {\n /** Time in milliseconds to trigger the long press, default is 400ms */\n threshold?: number;\n\n /** Callback triggered when the long press starts */\n onStart?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press finishes */\n onFinish?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press is canceled */\n onCancel?: (event: React.MouseEvent | React.TouchEvent) => void;\n}\n\nexport interface UseLongPressReturnValue {\n onMouseDown: (event: React.MouseEvent) => void;\n onMouseUp: (event: React.MouseEvent) => void;\n onMouseLeave: (event: React.MouseEvent) => void;\n onTouchStart: (event: React.TouchEvent) => void;\n onTouchEnd: (event: React.TouchEvent) => void;\n}\n\nexport function useLongPress(\n onLongPress: (event: React.MouseEvent | React.TouchEvent) => void,\n options: UseLongPressOptions = {},\n): UseLongPressReturnValue {\n const { threshold = 700, onStart, onFinish, onCancel } = options;\n const isLongPressActive = useRef(false);\n const isPressed = useRef(false);\n const timeout = useRef<number>(-1);\n\n useEffect(() => () => window.clearTimeout(timeout.current), []);\n\n return useMemo(() => {\n if (typeof onLongPress !== 'function') {\n return {} as UseLongPressReturnValue;\n }\n\n const start = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (onStart) {\n onStart(event);\n }\n\n isPressed.current = true;\n timeout.current = window.setTimeout(() => {\n onLongPress(event);\n isLongPressActive.current = true;\n }, threshold);\n };\n\n const cancel = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (isLongPressActive.current) {\n onFinish?.(event);\n } else if (isPressed.current) {\n onCancel?.(event);\n }\n\n isLongPressActive.current = false;\n isPressed.current = false;\n\n if (timeout.current) {\n window.clearTimeout(timeout.current);\n }\n };\n\n return {\n onMouseDown: start,\n onMouseUp: cancel,\n onMouseLeave: cancel,\n onTouchStart: start,\n onTouchEnd: cancel,\n onTouchMove: throttle(cancel, 150),\n };\n }, [onLongPress, threshold, onCancel, onFinish, onStart]);\n}\n\nfunction isTouchEvent(event: React.MouseEvent | React.TouchEvent): event is React.TouchEvent {\n return window.TouchEvent ? event.nativeEvent instanceof TouchEvent : 'touches' in event.nativeEvent;\n}\n\nfunction isMouseEvent(event: React.MouseEvent | React.TouchEvent): event is React.MouseEvent {\n return event.nativeEvent instanceof MouseEvent;\n}\n","/**\n * encapsulate logic related to showing a running timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\nimport { removeLeadingZero, removeSeconds } from 'ontime-utils';\n\nimport { formattedTime } from '../../../features/overview/overview.utils';\n\ninterface RunningTimeProps {\n value: MaybeNumber;\n hideSeconds?: boolean;\n hideLeadingZero?: boolean;\n className?: string;\n}\n\nexport default function RunningTime(props: RunningTimeProps) {\n const { value, hideSeconds, hideLeadingZero, className } = props;\n let display = formattedTime(value, hideSeconds || hideLeadingZero ? 2 : 3);\n\n if (hideLeadingZero) {\n display = removeLeadingZero(display);\n }\n\n if (hideSeconds) {\n display = removeSeconds(display);\n }\n\n return <div className={className}>{display}</div>;\n}\n","import { CSSProperties, memo, RefObject, SyntheticEvent } from 'react';\nimport { Day } from 'ontime-types';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND } from 'ontime-utils';\n\nimport DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator';\nimport { useLongPress } from '../../../common/hooks/useLongPress';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, formatTime, useTimeUntilExpectedStart } from '../../../common/utils/time';\nimport RunningTime from '../../../views/common/running-time/RunningTime';\nimport SuperscriptPeriod from '../../../views/common/superscript-time/SuperscriptPeriod';\nimport type { EditEvent, Subscribed } from '../operator.types';\n\nimport style from './OperatorEvent.module.scss';\n\ninterface OperatorEventProps {\n id: string;\n colour: string;\n cue: string;\n main: string;\n secondary: string;\n timeStart: number;\n duration: number;\n delay: number;\n dayOffset: Day;\n isLinkedToLoaded: boolean;\n isSelected: boolean;\n isPast: boolean;\n selectedRef?: RefObject<HTMLDivElement | null>;\n showStart: boolean;\n subscribed: Subscribed;\n totalGap: number;\n onLongPress: (event: EditEvent) => void;\n}\n\nexport default memo(OperatorEvent);\nfunction OperatorEvent({\n id,\n colour,\n cue,\n main,\n secondary,\n timeStart,\n duration,\n delay,\n dayOffset,\n isLinkedToLoaded,\n isSelected,\n isPast,\n selectedRef,\n showStart,\n subscribed,\n totalGap,\n onLongPress,\n}: OperatorEventProps) {\n /**\n * gather behaviour for long press and context menu\n */\n const handleLongPress = (event?: SyntheticEvent) => {\n // prevent default if the event is cancelable to avoid browser intervention warnings\n if (event && event.cancelable) {\n event.preventDefault();\n }\n if (subscribed) {\n onLongPress({ id, cue, subscriptions: subscribed });\n }\n };\n\n const mouseHandlers = useLongPress(handleLongPress);\n const cueColours = colour && getAccessibleColour(colour);\n\n const operatorClasses = cx([style.event, isSelected && style.running, isPast && style.past]);\n\n const hasFields = subscribed.some((field) => field.value);\n const columnCount = subscribed.length ? Math.min(subscribed.length, 4) : 0;\n const fieldGridStyle =\n columnCount > 0\n ? ({\n gridTemplateColumns: `repeat(${columnCount}, minmax(12rem, 1fr))`,\n } satisfies CSSProperties)\n : undefined;\n\n return (\n <div\n className={operatorClasses}\n data-testid={cue}\n ref={selectedRef}\n onContextMenu={handleLongPress}\n {...mouseHandlers}\n >\n <div className={style.binder} style={{ ...cueColours }}>\n <span className={style.cue}>{cue}</span>\n </div>\n\n <span className={style.mainField}>\n {showStart && <SuperscriptPeriod className={style.plannedStart} time={formatTime(timeStart)} />}\n {main}\n </span>\n <span className={style.secondaryField}>{secondary}</span>\n <OperatorEventSchedule\n timeStart={timeStart}\n isPast={isPast}\n isSelected={isSelected}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n <span className={style.runningTime}>\n <DelayIndicator delayValue={delay} />\n <RunningTime className={cx([isSelected && style.muted])} value={duration} hideLeadingZero />\n </span>\n\n <div className={cx([style.fields, hasFields && style.fieldsWithContent])} style={fieldGridStyle}>\n {subscribed.map((field) => {\n if (!field.value) {\n return <div key={field.id} />;\n }\n return (\n <div key={field.id}>\n <span\n className={cx([style.field, !field.colour && style.noColour])}\n style={{ backgroundColor: field.colour }}\n >\n {field.label}\n </span>\n <span className={style.value} style={{ color: field.colour }}>\n {field.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface OperatorEventScheduleProps {\n timeStart: number;\n isPast: boolean;\n isSelected: boolean;\n delay: number;\n dayOffset: Day;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction OperatorEventSchedule({\n timeStart,\n isPast,\n isSelected,\n delay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n}: OperatorEventScheduleProps) {\n if (isPast) {\n return <span className={style.timeUntil}>DONE</span>;\n }\n\n if (isSelected) {\n return <span className={style.timeUntil}>LIVE</span>;\n }\n\n return (\n <TimeUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n );\n}\n\ninterface TimeUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: Day;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction TimeUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: TimeUntilProps) {\n // we isolate this to avoid unnecessary re-renders\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n\n const isDue = timeUntil < MILLIS_PER_SECOND;\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return (\n <span className={style.timeUntil} data-testid='time-until'>\n {timeUntilString}\n </span>\n );\n}\n","import { memo } from 'react';\n\nimport style from './OperatorGroup.module.scss';\n\ninterface OperatorGroup {\n title: string;\n}\n\nexport default memo(OperatorGroup);\nfunction OperatorGroup({ title }: OperatorGroup) {\n return <div className={style.group}>{title}</div>;\n}\n","import { ViewSettings } from 'ontime-types';\n\nimport MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport { useProgressData } from '../../../common/hooks/useSocket';\n\nimport styles from './StatusBar.module.scss';\n\ninterface StatusBarProgressProps {\n viewSettings: ViewSettings;\n}\n\nexport default function StatusBarProgress({ viewSettings }: StatusBarProgressProps) {\n const { current, duration, timeWarning, timeDanger } = useProgressData();\n\n return (\n <MultiPartProgressBar\n now={current}\n complete={duration}\n normalColor={viewSettings.normalColor}\n warning={timeWarning}\n warningColor={viewSettings.warningColor}\n danger={timeDanger}\n dangerColor={viewSettings.dangerColor}\n className={styles.progressOverride}\n ignoreCssOverride\n />\n );\n}\n","import { ClockOverview, TimerOverview } from '../../overview/composite/TimeElements';\n\nimport style from './StatusBar.module.scss';\n\nexport default function StatusBarTimers() {\n return (\n <div className={style.timers}>\n <TimerOverview className={style.runningTimer} />\n <ClockOverview className={style.timeNow} shouldFormat />\n </div>\n );\n}\n","import useViewSettings from '../../../common/hooks-query/useViewSettings';\n\nimport StatusBarProgress from './StatusBarProgress';\nimport StatusBarTimers from './StatusBarTimers';\n\nimport styles from './StatusBar.module.scss';\n\nexport default function StatusBar() {\n const { data } = useViewSettings();\n\n return (\n <div className={styles.statusBar}>\n <StatusBarTimers />\n {data && <StatusBarProgress viewSettings={data} />}\n </div>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, EntryId, OntimeEvent } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport {\n makeCustomFieldSelectOptions,\n makeOptionsFromCustomFields,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../views/common/viewUtils';\n\nexport const getOperatorOptions = (customFields: CustomFields, timeFormat: string): ViewOption[] => {\n const fieldOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const customFieldSelect = makeCustomFieldSelectOptions(customFields);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main data field',\n description: 'Field to be shown in the first line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary data field',\n description: 'Field to be shown in the second line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'subscribe',\n title: 'Highlight Fields',\n description: 'Choose custom fields to highlight',\n type: 'multi-option',\n values: customFieldSelect,\n },\n {\n id: 'shouldEdit',\n title: 'Edit custom field',\n description: 'Allows editing an highlighted custom field by long pressing',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hidePast',\n title: 'Hide Past Events',\n description: 'Whether to hide events that have passed',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'showStart',\n title: 'Show planned start',\n description: 'Whether to prepend the planned start to the items',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n ];\n};\n\ntype OperatorOptions = {\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n subscribe: string[];\n shouldEdit: boolean;\n hidePast: boolean;\n showStart: boolean;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): OperatorOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Helper to get array values from either source\n const getArrayValues = (key: string): EntryId[] => {\n if (defaultValues?.has(key)) {\n return defaultValues.getAll(key) as EntryId[];\n }\n return searchParams.getAll(key) as EntryId[];\n };\n\n // we manually make an object that matches the key above\n return {\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n subscribe: getArrayValues('subscribe'),\n shouldEdit: isStringBoolean(getValue('shouldEdit')),\n hidePast: isStringBoolean(getValue('hidePast')),\n showStart: isStringBoolean(getValue('showStart')),\n };\n}\n\n/**\n * Hook exposes the operator view options\n */\nexport function useOperatorOptions(): OperatorOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { CustomFields, MaybeString, OntimeEvent } from 'ontime-types';\r\n\r\nimport { getPropertyValue } from '../../views/common/viewUtils';\r\n\r\nimport type { Subscribed } from './operator.types';\r\n\r\nexport function getEventData(\r\n event: OntimeEvent,\r\n main: MaybeString,\r\n secondary: MaybeString,\r\n subscriptions: string[],\r\n customFields: CustomFields,\r\n) {\r\n const mainField = main ? getPropertyValue(event, main) ?? '' : event.title;\r\n const secondaryField = getPropertyValue(event, secondary) ?? '';\r\n\r\n // remove subscriptions that are not in customFields\r\n const sanitisedSubscriptions = subscriptions.filter((field) => Object.hasOwn(customFields, field));\r\n const subscribedData = sanitisedSubscriptions.reduce<Subscribed>((acc, id) => {\r\n const field = customFields[id];\r\n if (field) {\r\n acc.push({\r\n id,\r\n label: field.label,\r\n colour: field.colour,\r\n value: event.custom[id],\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return { mainField, secondaryField, subscribedData };\r\n}\r\n","import { CustomFields, Rundown, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport { useRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { RundownMetadataObject } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../../views/utils/viewLoader.utils';\n\nexport interface OperatorData {\n rundown: Rundown;\n rundownMetadata: RundownMetadataObject;\n customFields: CustomFields;\n settings: Settings;\n}\n\nexport function useOperatorData(): ViewData<OperatorData> {\n const { data: rundown, rundownMetadata, status: rundownStatus } = useRundownWithMetadata();\n const { data: customFields, status: customFieldStatus } = useCustomFields();\n const { data: settings, status: settingsStatus } = useSettings();\n\n return {\n data: {\n rundown,\n rundownMetadata,\n customFields,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, customFieldStatus, settingsStatus]),\n };\n}\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isOntimeEvent, isOntimeGroup, OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useSelectedEventId } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport { getDefaultFormat } from '../../common/utils/time';\nimport { isTouchDevice } from '../../externals';\nimport Loader from '../../views/common/loader/Loader';\n\nimport CustomFieldEditModal from './custom-field-edit-modal/CustomFieldEditModal';\nimport FollowButton from './follow-button/FollowButton';\nimport OperatorEvent from './operator-event/OperatorEvent';\nimport OperatorGroup from './operator-group/OperatorGroup';\nimport StatusBar from './status-bar/StatusBar';\nimport { getOperatorOptions, useOperatorOptions } from './operator.options';\nimport type { EditEvent } from './operator.types';\nimport { getEventData } from './operator.utils';\nimport { OperatorData, useOperatorData } from './useOperatorData';\n\nimport style from './Operator.module.scss';\n\nconst selectedOffset = 50;\n\nexport default function OperatorLoader() {\n const { data, status } = useOperatorData();\n\n useWindowTitle('Operator');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Operator {...data} />;\n}\n\nfunction Operator({ rundown, rundownMetadata, customFields, settings }: OperatorData) {\n const selectedEventId = useSelectedEventId();\n const { subscribe, mainSource, secondarySource, shouldEdit, hidePast, showStart } = useOperatorOptions();\n\n const [showEditPrompt, setShowEditPrompt] = useState(false);\n const [editEvent, setEditEvent] = useState<EditEvent | null>(null);\n\n const [lockAutoScroll, setLockAutoScroll] = useState(false);\n const selectedRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const scrollToComponent = useFollowComponent({\n followRef: selectedRef,\n scrollRef,\n doFollow: !lockAutoScroll,\n topOffset: selectedOffset,\n followTrigger: selectedEventId,\n });\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n\n // reset scroll if nothing is selected\n useEffect(() => {\n if (!selectedEventId) {\n if (!lockAutoScroll) {\n scrollRef.current?.scrollTo(0, 0);\n }\n }\n }, [selectedEventId, lockAutoScroll, scrollRef]);\n\n const handleOffset = () => {\n if (selectedEventId) {\n scrollToComponent();\n }\n setLockAutoScroll(false);\n };\n\n // prevent considering automated scrolls as user scrolls\n const handleUserScroll = () => {\n if (selectedRef?.current && scrollRef?.current) {\n const selectedRect = selectedRef.current.getBoundingClientRect();\n const scrollerRect = scrollRef.current.getBoundingClientRect();\n if (selectedRect && scrollerRect) {\n const distanceFromTop = selectedRect.top - scrollerRect.top;\n const hasScrolledOutOfThreshold = distanceFromTop < -8 || distanceFromTop > selectedOffset;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n timeoutId.current = setTimeout(() => {\n setShowEditPrompt(false);\n }, 700);\n\n setShowEditPrompt(true);\n\n throttledHandleScroll();\n };\n\n const handleEdit = useCallback((event: EditEvent) => {\n setEditEvent({ ...event });\n }, []);\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const operatorOptions = useMemo(() => getOperatorOptions(customFields, defaultFormat), [customFields, defaultFormat]);\n\n const canEdit = shouldEdit && subscribe.length;\n\n return (\n <div className={style.operatorContainer} data-testid='operator-view'>\n <ViewParamsEditor target={OntimeView.Operator} viewOptions={operatorOptions} />\n {editEvent && <CustomFieldEditModal event={editEvent} onClose={() => setEditEvent(null)} />}\n\n <StatusBar />\n\n {canEdit && (\n <div className={cx([style.editPrompt, showEditPrompt && style.show])}>\n {isTouchDevice ? 'Press and hold to edit user field' : 'Right click to edit user field'}\n </div>\n )}\n\n <div className={style.operatorEvents} onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {rundown.order.map((entryId) => {\n const entry = rundown.entries[entryId];\n if (isOntimeEvent(entry)) {\n const { isPast, isLinkedToLoaded, isLoaded, totalGap } = rundownMetadata[entryId];\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || entry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n entry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={entry.id}\n id={entry.id}\n colour={entry.colour}\n cue={entry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={entry.timeStart}\n duration={entry.duration}\n delay={entry.delay}\n dayOffset={entry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n }\n\n if (isOntimeGroup(entry)) {\n const { isPast } = rundownMetadata[entry.id];\n\n const isCurrentParent = selectedEventId ? rundownMetadata[selectedEventId]?.groupId === entry.id : false;\n\n if (hidePast && isPast && !isCurrentParent) {\n return null;\n }\n\n return (\n <Fragment key={entry.id}>\n <OperatorGroup key={entry.id} title={entry.title} />\n {entry.entries.map((nestedEntryId) => {\n const nestedEntry = rundown.entries[nestedEntryId];\n if (!isOntimeEvent(nestedEntry)) {\n return null;\n }\n\n const { isPast, isLoaded, isLinkedToLoaded, totalGap } = rundownMetadata[nestedEntryId];\n\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || nestedEntry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n nestedEntry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={nestedEntry.id}\n id={nestedEntry.id}\n colour={nestedEntry.colour}\n cue={nestedEntry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={nestedEntry.timeStart}\n duration={nestedEntry.duration}\n delay={nestedEntry.delay}\n dayOffset={nestedEntry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n })}\n </Fragment>\n );\n }\n return null;\n })}\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n","import ProtectRoute from '../../common/components/protect-route/ProtectRoute';\n\nimport Operator from './Operator';\n\nexport default function OperatorExport() {\n return (\n <ProtectRoute permission='operator'>\n <Operator />\n </ProtectRoute>\n );\n}\n"],"names":["CustomFieldEditModal","props","event","onClose","updateEntry","useEntryActions","loading","setLoading","useState","inputRef","useRef","Array","handleSave","current","patchObject","id","forEach","element","dataset","field","defaultValue","value","custom","Object","assign","Dialog.Root","isOpen","jsx","Dialog.Portal","jsxs","Dialog.Popup","style","editModal","title","cue","IconButton","IoClose","body","subscriptions","map","Fragment","label","colour","Textarea","push","footer","Button","useLongPress","onLongPress","options","threshold","onStart","onFinish","onCancel","isLongPressActive","isPressed","timeout","useEffect","window","clearTimeout","useMemo","start","isMouseEvent","isTouchEvent","setTimeout","cancel","onMouseDown","onMouseUp","onMouseLeave","onTouchStart","onTouchEnd","onTouchMove","throttle","TouchEvent","nativeEvent","MouseEvent","RunningTime","hideSeconds","hideLeadingZero","className","display","formattedTime","removeLeadingZero","removeSeconds","memo","OperatorEvent","main","secondary","timeStart","duration","delay","dayOffset","isLinkedToLoaded","isSelected","isPast","selectedRef","showStart","subscribed","totalGap","handleLongPress","cancelable","preventDefault","mouseHandlers","cueColours","getAccessibleColour","operatorClasses","cx","running","past","hasFields","some","columnCount","length","Math","min","fieldGridStyle","gridTemplateColumns","undefined","binder","mainField","SuperscriptPeriod","plannedStart","formatTime","secondaryField","OperatorEventSchedule","runningTime","DelayIndicator","muted","fields","fieldsWithContent","noColour","backgroundColor","color","timeUntil","TimeUntil","useTimeUntilExpectedStart","timeUntilString","MILLIS_PER_SECOND","formatDuration","abs","MILLIS_PER_MINUTE","OperatorGroup","group","StatusBarProgress","viewSettings","timeWarning","timeDanger","useProgressData","MultiPartProgressBar","normalColor","warningColor","dangerColor","styles","progressOverride","StatusBarTimers","timers","TimerOverview","runningTimer","ClockOverview","timeNow","StatusBar","data","useViewSettings","statusBar","getOperatorOptions","customFields","timeFormat","fieldOptions","makeOptionsFromCustomFields","customFieldSelect","makeCustomFieldSelectOptions","OptionTitle","ClockOptions","collapsible","getTimeOption","DataSources","description","type","values","ElementVisibility","getOptionsFromParams","searchParams","defaultValues","getValue","key","get","getArrayValues","has","getAll","mainSource","secondarySource","subscribe","shouldEdit","isStringBoolean","hidePast","useOperatorOptions","useSearchParams","maybePreset","use","PresetContext","URLSearchParams","search","getEventData","getPropertyValue","subscribedData","filter","hasOwn","reduce","acc","useOperatorData","rundown","rundownMetadata","status","rundownStatus","useRundownWithMetadata","customFieldStatus","useCustomFields","settings","settingsStatus","useSettings","aggregateQueryStatus","selectedOffset","OperatorLoader","useWindowTitle","Loader","EmptyPage","Operator","selectedEventId","useSelectedEventId","showEditPrompt","setShowEditPrompt","editEvent","setEditEvent","lockAutoScroll","setLockAutoScroll","scrollRef","scrollToComponent","useFollowComponent","followRef","doFollow","topOffset","followTrigger","timeoutId","scrollTo","handleOffset","throttledHandleScroll","handleUserScroll","selectedRect","getBoundingClientRect","scrollerRect","distanceFromTop","top","hasScrolledOutOfThreshold","handleScroll","handleEdit","useCallback","defaultFormat","getDefaultFormat","operatorOptions","canEdit","operatorContainer","ViewParamsEditor","OntimeView","editPrompt","show","isTouchDevice","operatorEvents","order","entryId","entry","entries","isOntimeEvent","isLoaded","skip","isOntimeGroup","isCurrentParent","groupId","nestedEntryId","nestedEntry","FollowButton","OperatorExport","ProtectRoute"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as s,aH as _,aI as v,aJ as u,aK as y,aL as m,ax as b}from"./vendor-Dt3_Fdfs.js";import{u as p}from"./useProjectData-gGT2eczr.js";import{e as r,bi as h}from"./index-3aosT33y.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5f25ab1c-f1c3-464c-9088-c3ef96011565",e._sentryDebugIdIdentifier="sentry-dbid-5f25ab1c-f1c3-464c-9088-c3ef96011565")}catch{}})();const x="_title_1kaxc_17",w="_description_1kaxc_27",l={title:x,description:w};function $(){const{data:e}=p();return!e.title&&!e.description?null:s.jsxs("div",{children:[s.jsx("div",{className:l.title,children:e.title}),s.jsx("div",{className:l.description,children:e.description})]})}const j="_root_1e8vy_17",S="_viewport_1e8vy_22",N="_scrollbar_1e8vy_32",O="_thumb_1e8vy_55",i={root:j,viewport:S,scrollbar:N,thumb:O};function g({className:e,viewportClassName:n,contentClassName:t,contentStyle:a,children:c,ref:d,orientation:f="vertical"}){return s.jsxs(_,{className:r([i.root,e]),children:[s.jsx(v,{ref:d,className:r([i.viewport,n]),children:s.jsx(u,{className:t,style:a,children:c})}),s.jsx(y,{className:i.scrollbar,orientation:f,children:s.jsx(m,{className:i.thumb})})]})}const I="_overview_12a2y_17",A="_isOffline_12a2y_24",D="_info_12a2y_24",T="_nav_12a2y_39",k="_infoScroll_12a2y_54",E="_inline_12a2y_60",o={overview:I,isOffline:A,info:D,nav:T,infoScroll:k,inline:E};function z({navElements:e,children:n}){const t=h();return s.jsx("div",{className:r([o.overview,!t&&o.isOffline]),children:s.jsxs(b,{children:[s.jsx("div",{className:o.nav,children:e}),s.jsx(g,{className:o.infoScroll,contentClassName:o.info,contentStyle:{minWidth:"100%"},orientation:"horizontal",children:n})]})})}export{z as O,g as S,$ as T,o as s};
2
+ //# sourceMappingURL=OverviewWrapper-B4nU68Eq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OverviewWrapper-B2i8d3rt.js","sources":["../../src/features/overview/composite/TitleOverview.tsx","../../src/common/components/scroll-area/ScrollArea.tsx","../../src/features/overview/OverviewWrapper.tsx"],"sourcesContent":["import useProjectData from '../../../common/hooks-query/useProjectData';\n\nimport style from './TitleOverview.module.scss';\n\nexport default function TitleOverview() {\n const { data } = useProjectData();\n\n if (!data.title && !data.description) {\n return null;\n }\n\n return (\n <div>\n <div className={style.title}>{data.title}</div>\n <div className={style.description}>{data.description}</div>\n </div>\n );\n}\n","import { CSSProperties, PropsWithChildren, Ref } from 'react';\nimport { ScrollArea } from '@base-ui/react/scroll-area';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './ScrollArea.module.scss';\n\ninterface ScrollAreaProps {\n className?: string;\n viewportClassName?: string;\n contentClassName?: string;\n contentStyle?: CSSProperties;\n ref?: Ref<HTMLDivElement>;\n orientation?: 'vertical' | 'horizontal';\n}\n\nexport default function StyledScrollArea({\n className,\n viewportClassName,\n contentClassName,\n contentStyle,\n children,\n ref,\n orientation = 'vertical',\n}: PropsWithChildren<ScrollAreaProps>) {\n return (\n <ScrollArea.Root className={cx([style.root, className])}>\n <ScrollArea.Viewport ref={ref} className={cx([style.viewport, viewportClassName])}>\n <ScrollArea.Content className={contentClassName} style={contentStyle}>\n {children}\n </ScrollArea.Content>\n </ScrollArea.Viewport>\n <ScrollArea.Scrollbar className={style.scrollbar} orientation={orientation}>\n <ScrollArea.Thumb className={style.thumb} />\n </ScrollArea.Scrollbar>\n </ScrollArea.Root>\n );\n}\n","import { PropsWithChildren, ReactNode } from 'react';\nimport { ErrorBoundary } from '@sentry/react';\n\nimport ScrollArea from '../../common/components/scroll-area/ScrollArea';\nimport { useIsOnline } from '../../common/hooks/useSocket';\nimport { cx } from '../../common/utils/styleUtils';\n\nimport style from './Overview.module.scss';\n\ninterface OverviewWrapperProps {\n navElements: ReactNode;\n}\n\nexport function OverviewWrapper({ navElements, children }: PropsWithChildren<OverviewWrapperProps>) {\n const isOnline = useIsOnline();\n\n return (\n <div className={cx([style.overview, !isOnline && style.isOffline])}>\n <ErrorBoundary>\n <div className={style.nav}>{navElements}</div>\n <ScrollArea\n className={style.infoScroll}\n contentClassName={style.info}\n contentStyle={{ minWidth: '100%' }}\n orientation='horizontal'\n >\n {children}\n </ScrollArea>\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["TitleOverview","data","useProjectData","title","description","jsx","style","StyledScrollArea","className","viewportClassName","contentClassName","contentStyle","children","ref","orientation","jsxs","ScrollArea.Root","cx","root","ScrollArea.Viewport","viewport","ScrollArea.Content","ScrollArea.Scrollbar","scrollbar","ScrollArea.Thumb","thumb","OverviewWrapper","navElements","isOnline","useIsOnline","overview","isOffline","ErrorBoundary","nav","ScrollArea","infoScroll","info","minWidth"],"mappings":"kmBAIA,SAAwBA,GAAgB,CAChC,KAAA,CAAEC,KAAAA,GAASC,EAAe,EAEhC,MAAI,CAACD,EAAKE,OAAS,CAACF,EAAKG,YAChB,YAIN,MACC,CAAA,SAAA,CAAAC,MAAC,MAAI,CAAA,UAAWC,EAAMH,MAAQF,WAAKE,MAAM,QACxC,MAAI,CAAA,UAAWG,EAAMF,YAAcH,WAAKG,WAAY,CAAA,CAAA,EACvD,CAEJ,uICDA,SAAwBG,EAAiB,CACvCC,UAAAA,EACAC,kBAAAA,EACAC,iBAAAA,EACAC,aAAAA,EACAC,SAAAA,EACAC,IAAAA,EACAC,YAAAA,EAAc,UACoB,EAAG,CAEnC,OAAAC,OAACC,EAAA,CAAgB,UAAWC,EAAG,CAACX,EAAMY,KAAMV,CAAS,CAAC,EACpD,SAAA,CAACH,MAAAc,EAAA,CAAoB,IAAAN,EAAU,UAAWI,EAAG,CAACX,EAAMc,SAAUX,CAAiB,CAAC,EAC9E,SAAAJ,EAAA,IAACgB,EAAA,CAAmB,UAAWX,EAAkB,MAAOC,EACrDC,SAAAA,CACH,CAAA,EACF,EACCP,EAAAA,IAAAiB,EAAA,CAAqB,UAAWhB,EAAMiB,UAAW,YAAAT,EAChD,SAAAT,EAAA,IAACmB,EAAA,CAAiB,UAAWlB,EAAMmB,KAAM,CAAA,CAC3C,CAAA,CAAA,EACF,CAEJ,uMCxBO,SAASC,EAAgB,CAAEC,YAAAA,EAAaf,SAAAA,CAAkD,EAAG,CAClG,MAAMgB,EAAWC,EAAY,EAE7B,OACGxB,EAAAA,IAAA,MAAA,CAAI,UAAWY,EAAG,CAACX,EAAMwB,SAAU,CAACF,GAAYtB,EAAMyB,SAAS,CAAC,EAC/D,gBAACC,EACC,CAAA,SAAA,CAAA3B,EAAA,IAAC,MAAI,CAAA,UAAWC,EAAM2B,IAAMN,SAAYA,EAAA,EACxCtB,MAAC6B,GACC,UAAW5B,EAAM6B,WACjB,iBAAkB7B,EAAM8B,KACxB,aAAc,CAAEC,SAAU,MAAA,EAC1B,YAAY,aAEXzB,SAAAA,CACH,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ"}
1
+ {"version":3,"file":"OverviewWrapper-B4nU68Eq.js","sources":["../../src/features/overview/composite/TitleOverview.tsx","../../src/common/components/scroll-area/ScrollArea.tsx","../../src/features/overview/OverviewWrapper.tsx"],"sourcesContent":["import useProjectData from '../../../common/hooks-query/useProjectData';\n\nimport style from './TitleOverview.module.scss';\n\nexport default function TitleOverview() {\n const { data } = useProjectData();\n\n if (!data.title && !data.description) {\n return null;\n }\n\n return (\n <div>\n <div className={style.title}>{data.title}</div>\n <div className={style.description}>{data.description}</div>\n </div>\n );\n}\n","import { CSSProperties, PropsWithChildren, Ref } from 'react';\nimport { ScrollArea } from '@base-ui/react/scroll-area';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './ScrollArea.module.scss';\n\ninterface ScrollAreaProps {\n className?: string;\n viewportClassName?: string;\n contentClassName?: string;\n contentStyle?: CSSProperties;\n ref?: Ref<HTMLDivElement>;\n orientation?: 'vertical' | 'horizontal';\n}\n\nexport default function StyledScrollArea({\n className,\n viewportClassName,\n contentClassName,\n contentStyle,\n children,\n ref,\n orientation = 'vertical',\n}: PropsWithChildren<ScrollAreaProps>) {\n return (\n <ScrollArea.Root className={cx([style.root, className])}>\n <ScrollArea.Viewport ref={ref} className={cx([style.viewport, viewportClassName])}>\n <ScrollArea.Content className={contentClassName} style={contentStyle}>\n {children}\n </ScrollArea.Content>\n </ScrollArea.Viewport>\n <ScrollArea.Scrollbar className={style.scrollbar} orientation={orientation}>\n <ScrollArea.Thumb className={style.thumb} />\n </ScrollArea.Scrollbar>\n </ScrollArea.Root>\n );\n}\n","import { PropsWithChildren, ReactNode } from 'react';\nimport { ErrorBoundary } from '@sentry/react';\n\nimport ScrollArea from '../../common/components/scroll-area/ScrollArea';\nimport { useIsOnline } from '../../common/hooks/useSocket';\nimport { cx } from '../../common/utils/styleUtils';\n\nimport style from './Overview.module.scss';\n\ninterface OverviewWrapperProps {\n navElements: ReactNode;\n}\n\nexport function OverviewWrapper({ navElements, children }: PropsWithChildren<OverviewWrapperProps>) {\n const isOnline = useIsOnline();\n\n return (\n <div className={cx([style.overview, !isOnline && style.isOffline])}>\n <ErrorBoundary>\n <div className={style.nav}>{navElements}</div>\n <ScrollArea\n className={style.infoScroll}\n contentClassName={style.info}\n contentStyle={{ minWidth: '100%' }}\n orientation='horizontal'\n >\n {children}\n </ScrollArea>\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["TitleOverview","data","useProjectData","title","description","jsx","style","StyledScrollArea","className","viewportClassName","contentClassName","contentStyle","children","ref","orientation","jsxs","ScrollArea.Root","cx","root","ScrollArea.Viewport","viewport","ScrollArea.Content","ScrollArea.Scrollbar","scrollbar","ScrollArea.Thumb","thumb","OverviewWrapper","navElements","isOnline","useIsOnline","overview","isOffline","ErrorBoundary","nav","ScrollArea","infoScroll","info","minWidth"],"mappings":"kmBAIA,SAAwBA,GAAgB,CAChC,KAAA,CAAEC,KAAAA,GAASC,EAAe,EAEhC,MAAI,CAACD,EAAKE,OAAS,CAACF,EAAKG,YAChB,YAIN,MACC,CAAA,SAAA,CAAAC,MAAC,MAAI,CAAA,UAAWC,EAAMH,MAAQF,WAAKE,MAAM,QACxC,MAAI,CAAA,UAAWG,EAAMF,YAAcH,WAAKG,WAAY,CAAA,CAAA,EACvD,CAEJ,uICDA,SAAwBG,EAAiB,CACvCC,UAAAA,EACAC,kBAAAA,EACAC,iBAAAA,EACAC,aAAAA,EACAC,SAAAA,EACAC,IAAAA,EACAC,YAAAA,EAAc,UACoB,EAAG,CAEnC,OAAAC,OAACC,EAAA,CAAgB,UAAWC,EAAG,CAACX,EAAMY,KAAMV,CAAS,CAAC,EACpD,SAAA,CAACH,MAAAc,EAAA,CAAoB,IAAAN,EAAU,UAAWI,EAAG,CAACX,EAAMc,SAAUX,CAAiB,CAAC,EAC9E,SAAAJ,EAAA,IAACgB,EAAA,CAAmB,UAAWX,EAAkB,MAAOC,EACrDC,SAAAA,CACH,CAAA,EACF,EACCP,EAAAA,IAAAiB,EAAA,CAAqB,UAAWhB,EAAMiB,UAAW,YAAAT,EAChD,SAAAT,EAAA,IAACmB,EAAA,CAAiB,UAAWlB,EAAMmB,KAAM,CAAA,CAC3C,CAAA,CAAA,EACF,CAEJ,uMCxBO,SAASC,EAAgB,CAAEC,YAAAA,EAAaf,SAAAA,CAAkD,EAAG,CAClG,MAAMgB,EAAWC,EAAY,EAE7B,OACGxB,EAAAA,IAAA,MAAA,CAAI,UAAWY,EAAG,CAACX,EAAMwB,SAAU,CAACF,GAAYtB,EAAMyB,SAAS,CAAC,EAC/D,gBAACC,EACC,CAAA,SAAA,CAAA3B,EAAA,IAAC,MAAI,CAAA,UAAWC,EAAM2B,IAAMN,SAAYA,EAAA,EACxCtB,MAAC6B,GACC,UAAW5B,EAAM6B,WACjB,iBAAkB7B,EAAM8B,KACxB,aAAc,CAAEC,SAAU,MAAA,EAC1B,YAAY,aAEXzB,SAAAA,CACH,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ"}
@@ -0,0 +1 @@
1
+ ._blink_1kaxc_1{animation:_blink_1kaxc_1 1s step-start infinite}@keyframes _blink_1kaxc_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1kaxc_13{transform:rotate(45deg)}._title_1kaxc_17{font-size:1.75rem;font-weight:600;color:#f6f6f6;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._description_1kaxc_27{font-size:1rem;color:#b1b1b1;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._blink_1e8vy_1{animation:_blink_1e8vy_1 1s step-start infinite}@keyframes _blink_1e8vy_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1e8vy_13{transform:rotate(45deg)}._root_1e8vy_17{position:relative;overflow:hidden}._viewport_1e8vy_22{height:100%;width:100%;overscroll-behavior:contain}._viewport_1e8vy_22:focus-visible{outline:2px solid #578AF4;outline-offset:-2px}._scrollbar_1e8vy_32{background:transparent;opacity:0;transition:opacity .15s}._scrollbar_1e8vy_32[data-orientation=vertical]{width:6px}._scrollbar_1e8vy_32[data-orientation=horizontal]{height:6px}._scrollbar_1e8vy_32[data-orientation=horizontal][data-has-overflow-x]{opacity:1;pointer-events:auto}._scrollbar_1e8vy_32[data-scrolling]{transition-duration:0ms}._scrollbar_1e8vy_32[data-hovering],._scrollbar_1e8vy_32[data-scrolling]{opacity:1;pointer-events:auto}._thumb_1e8vy_55{background:#fff3;border-radius:2px}._thumb_1e8vy_55:hover{background:#fff9}._blink_12a2y_1{animation:_blink_12a2y_1 1s step-start infinite}@keyframes _blink_12a2y_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_12a2y_13{transform:rotate(45deg)}._overview_12a2y_17{grid-area:overview;font-size:calc(1rem - 2px);display:flex;overflow:hidden}._isOffline_12a2y_24 ._info_12a2y_24{opacity:.4}._isOffline_12a2y_24:after{content:"Disconnected";position:absolute;padding-inline:.5rem;bottom:.5rem;right:.5rem;background-color:#d20300;border-radius:2px;font-size:calc(1rem - 2px);z-index:1000}._nav_12a2y_39{display:flex;align-items:center;gap:.5rem}._info_12a2y_24{padding-left:1rem;display:flex;align-items:center;justify-content:space-between;width:max-content;height:100%}._infoScroll_12a2y_54{flex:1;min-width:0;height:100%}._inline_12a2y_60{display:flex;align-items:center;gap:1rem}
@@ -1,2 +1,2 @@
1
- import{j as n,a7 as E,ax as j}from"./vendor-BKUJ0_Du.js";import{b as S}from"./EditorUtils-BLcTuWz1.js";import{c as I,e as c,a as k}from"./index-Dm-4OTmY.js";import{g as D,a as B,b as F,d as _,f as N,h as R,i as M,F as h}from"./timer.utils-B4bvsns3.js";import{M as W}from"./MultiPartProgressBar-W2a-JWPY.js";import{g as z,a as A}from"./viewUtils-29a3Mmiu.js";import{g as L}from"./presentation.utils-Z61KykAH.js";import"./playbackstate-Dl_ZJABT.js";import"./getProgress-ZUTmCn_v.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="9127ad70-3931-4feb-8f99-b7bc6e63b7c2",t._sentryDebugIdIdentifier="sentry-dbid-9127ad70-3931-4feb-8f99-b7bc6e63b7c2")}catch{}})();function O({viewSettings:t}){const{eventNow:s,message:i,time:e,clock:d,timerTypeNow:a,countToEndNow:o,auxTimer:r}=I(),l=D(i.timer),{showFinished:m,showWarning:y,showDanger:x}=B(a,o,e.phase,!1,"",!1),p=F(e.playback),b=_(a),w=N(e.duration,e.addedTime),T=z(!1,a,d,e,a),f=A(T,a,"min",{removeSeconds:!1,removeLeadingZero:!1}),v=i.timer.secondarySource==="aux1"?r.aux1:i.timer.secondarySource==="aux2"?r.aux2:i.timer.secondarySource==="aux3"?r.aux3:null,u=R(i,v,"min",!1,!0,!1),g=L(t,void 0,y,x),P=M(f,u),C={...g&&{"--timer-colour":g}};return n.jsxs("div",{className:c(["pip-timer",m&&"pip-timer--finished"]),style:C,children:[n.jsx("div",{className:c(["message-overlay",l&&"message-overlay--active"]),children:n.jsx(h,{mode:"multi",min:12,max:256,className:c(["message",i.timer.blink&&"blink"]),children:i.timer.text})}),n.jsxs("div",{className:"timer-container",children:[n.jsx("div",{className:c(["timer",!p&&"timer--paused",m&&"timer--finished"]),style:{fontSize:`${P}vw`},"data-phase":e.phase,children:f}),n.jsx("div",{className:c(["secondary",!u&&"secondary--hidden"]),children:n.jsx(h,{mode:"multi",min:12,max:256,children:u})})]}),b&&n.jsx(W,{className:c(["progress-container",!p&&"progress-container--paused"]),now:e.current,complete:w,normalColor:t.normalColor,warning:s==null?void 0:s.timeWarning,warningColor:t.warningColor,danger:s==null?void 0:s.timeDanger,dangerColor:t.dangerColor,hideOvertime:!m})]})}function Q(){const{data:t,status:s}=k(),i=async()=>{if(window.documentPictureInPicture.window)return;let e;try{e=await window.documentPictureInPicture.requestWindow()}catch(o){console.error("Failed to open Picture-in-Picture:",o);return}[...document.styleSheets].forEach(o=>{try{if(o.href){const r=e.document.createElement("link");r.rel="stylesheet",r.href=o.href,e.document.head.appendChild(r)}else if(o.cssRules){const r=e.document.createElement("style");r.textContent=[...o.cssRules].map(l=>l.cssText).join(""),e.document.head.appendChild(r)}}catch(r){console.warn("Stylesheet copy blocked:",r)}});const d=e.document.createElement("div");d.setAttribute("id","pip-root"),d.style.height="100vh",e.document.body.append(d);const a=E.createRoot(e.document.getElementById("pip-root"),{onCaughtError:(o,r)=>console.error(o),onUncaughtError:(o,r)=>console.error(o),onRecoverableError:(o,r)=>console.error(o)});e.addEventListener("pagehide",()=>{a.unmount()}),a.render(n.jsx(j,{children:n.jsx(O,{viewSettings:t})}))};return n.jsx(S,{onClick:s==="success"?i:void 0})}export{Q as default};
2
- //# sourceMappingURL=PipHost-Dz2oy7XG.js.map
1
+ import{j as n,a7 as E,ax as j}from"./vendor-Dt3_Fdfs.js";import{b as S}from"./EditorUtils-k5KpETPG.js";import{c as I,e as c,a as k}from"./index-3aosT33y.js";import{g as D,a as B,b as F,d as _,f as N,h as R,i as M,F as h}from"./timer.utils-CWHFVz06.js";import{M as W}from"./MultiPartProgressBar-BlLJNQ0D.js";import{g as z,a as A}from"./viewUtils-k0tARVDN.js";import{g as L}from"./presentation.utils-lyuuD4A5.js";import"./playbackstate-BZ9WYn2k.js";import"./getProgress-CWSCZOIN.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="9127ad70-3931-4feb-8f99-b7bc6e63b7c2",t._sentryDebugIdIdentifier="sentry-dbid-9127ad70-3931-4feb-8f99-b7bc6e63b7c2")}catch{}})();function O({viewSettings:t}){const{eventNow:s,message:i,time:e,clock:d,timerTypeNow:a,countToEndNow:o,auxTimer:r}=I(),l=D(i.timer),{showFinished:m,showWarning:y,showDanger:x}=B(a,o,e.phase,!1,"",!1),p=F(e.playback),b=_(a),w=N(e.duration,e.addedTime),T=z(!1,a,d,e,a),f=A(T,a,"min",{removeSeconds:!1,removeLeadingZero:!1}),v=i.timer.secondarySource==="aux1"?r.aux1:i.timer.secondarySource==="aux2"?r.aux2:i.timer.secondarySource==="aux3"?r.aux3:null,u=R(i,v,"min",!1,!0,!1),g=L(t,void 0,y,x),P=M(f,u),C={...g&&{"--timer-colour":g}};return n.jsxs("div",{className:c(["pip-timer",m&&"pip-timer--finished"]),style:C,children:[n.jsx("div",{className:c(["message-overlay",l&&"message-overlay--active"]),children:n.jsx(h,{mode:"multi",min:12,max:256,className:c(["message",i.timer.blink&&"blink"]),children:i.timer.text})}),n.jsxs("div",{className:"timer-container",children:[n.jsx("div",{className:c(["timer",!p&&"timer--paused",m&&"timer--finished"]),style:{fontSize:`${P}vw`},"data-phase":e.phase,children:f}),n.jsx("div",{className:c(["secondary",!u&&"secondary--hidden"]),children:n.jsx(h,{mode:"multi",min:12,max:256,children:u})})]}),b&&n.jsx(W,{className:c(["progress-container",!p&&"progress-container--paused"]),now:e.current,complete:w,normalColor:t.normalColor,warning:s==null?void 0:s.timeWarning,warningColor:t.warningColor,danger:s==null?void 0:s.timeDanger,dangerColor:t.dangerColor,hideOvertime:!m})]})}function Q(){const{data:t,status:s}=k(),i=async()=>{if(window.documentPictureInPicture.window)return;let e;try{e=await window.documentPictureInPicture.requestWindow()}catch(o){console.error("Failed to open Picture-in-Picture:",o);return}[...document.styleSheets].forEach(o=>{try{if(o.href){const r=e.document.createElement("link");r.rel="stylesheet",r.href=o.href,e.document.head.appendChild(r)}else if(o.cssRules){const r=e.document.createElement("style");r.textContent=[...o.cssRules].map(l=>l.cssText).join(""),e.document.head.appendChild(r)}}catch(r){console.warn("Stylesheet copy blocked:",r)}});const d=e.document.createElement("div");d.setAttribute("id","pip-root"),d.style.height="100vh",e.document.body.append(d);const a=E.createRoot(e.document.getElementById("pip-root"),{onCaughtError:(o,r)=>console.error(o),onUncaughtError:(o,r)=>console.error(o),onRecoverableError:(o,r)=>console.error(o)});e.addEventListener("pagehide",()=>{a.unmount()}),a.render(n.jsx(j,{children:n.jsx(O,{viewSettings:t})}))};return n.jsx(S,{onClick:s==="success"?i:void 0})}export{Q as default};
2
+ //# sourceMappingURL=PipHost-BZy7ouDv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PipHost-Dz2oy7XG.js","sources":["../../src/views/editor/pip-timer/PipTimer.tsx","../../src/views/editor/pip-timer/PipHost.tsx"],"sourcesContent":["import { ViewSettings } from 'ontime-types';\n\nimport { FitText } from '../../../common/components/fit-text/FitText';\nimport MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport { useTimerSocket } from '../../../common/hooks/useSocket';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { getFormattedTimer, getTimerByType } from '../../common/viewUtils';\nimport {\n getEstimatedFontSize,\n getIsPlaying,\n getSecondaryDisplay,\n getShowMessage,\n getShowModifiers,\n getShowProgressBar,\n getTotalTime,\n} from '../../timer/timer.utils';\nimport { getTimerColour } from '../../utils/presentation.utils';\n\nimport './PipTimer.scss';\n\ninterface PipTimerProps {\n viewSettings: ViewSettings;\n}\n\nexport function PipTimer({ viewSettings }: PipTimerProps) {\n const { eventNow, message, time, clock, timerTypeNow, countToEndNow, auxTimer } = useTimerSocket();\n\n // gather modifiers\n const showOverlay = getShowMessage(message.timer);\n const { showFinished, showWarning, showDanger } = getShowModifiers(\n timerTypeNow,\n countToEndNow,\n time.phase,\n false,\n '',\n false,\n );\n const isPlaying = getIsPlaying(time.playback);\n const showProgressBar = getShowProgressBar(timerTypeNow);\n\n // gather timer data\n const totalTime = getTotalTime(time.duration, time.addedTime);\n const stageTimer = getTimerByType(false, timerTypeNow, clock, time, timerTypeNow);\n const display = getFormattedTimer(stageTimer, timerTypeNow, 'min', {\n removeSeconds: false,\n removeLeadingZero: false,\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(message, currentAux, 'min', false, true, false);\n\n // gather presentation styles\n const resolvedTimerColour = getTimerColour(viewSettings, undefined, showWarning, showDanger);\n const timerFontSize = getEstimatedFontSize(display, secondaryContent);\n const userStyles = {\n ...(resolvedTimerColour && { '--timer-colour': resolvedTimerColour }),\n };\n\n return (\n <div className={cx(['pip-timer', showFinished && 'pip-timer--finished'])} style={userStyles}>\n <div className={cx(['message-overlay', showOverlay && 'message-overlay--active'])}>\n <FitText mode='multi' min={12} max={256} className={cx(['message', message.timer.blink && 'blink'])}>\n {message.timer.text}\n </FitText>\n </div>\n\n <div className='timer-container'>\n <div\n className={cx(['timer', !isPlaying && 'timer--paused', showFinished && 'timer--finished'])}\n style={{ fontSize: `${timerFontSize}vw` }}\n data-phase={time.phase}\n >\n {display}\n </div>\n <div className={cx(['secondary', !secondaryContent && 'secondary--hidden'])}>\n <FitText mode='multi' min={12} 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 </div>\n );\n}\n","import { createRoot } from 'react-dom/client';\nimport { ErrorBoundary } from '@sentry/react';\n\nimport { CornerPipButton } from '../../../common/components/editor-utils/EditorUtils';\nimport useViewSettings from '../../../common/hooks-query/useViewSettings';\n\nimport { PipTimer } from './PipTimer';\n\nexport default function PipTimerHost() {\n const { data, status } = useViewSettings();\n\n const openPictureInPicture = async () => {\n if (window.documentPictureInPicture.window) {\n return;\n }\n\n let pipWindow: Window;\n try {\n pipWindow = await window.documentPictureInPicture.requestWindow();\n } catch (err) {\n console.error('Failed to open Picture-in-Picture:', err);\n return;\n }\n\n [...document.styleSheets].forEach((sheet) => {\n try {\n if (sheet.href) {\n const link = pipWindow.document.createElement('link');\n link.rel = 'stylesheet';\n link.href = sheet.href;\n pipWindow.document.head.appendChild(link);\n } else if (sheet.cssRules) {\n const style = pipWindow.document.createElement('style');\n style.textContent = [...sheet.cssRules].map((rule) => rule.cssText).join('');\n pipWindow.document.head.appendChild(style);\n }\n } catch (e) {\n console.warn('Stylesheet copy blocked:', e);\n }\n });\n\n const pipDiv = pipWindow.document.createElement('div');\n pipDiv.setAttribute('id', 'pip-root');\n pipDiv.style.height = '100vh';\n pipWindow.document.body.append(pipDiv);\n\n const pipRoot = createRoot(pipWindow.document.getElementById('pip-root') as Element, {\n onCaughtError: (err, _errInfo) => console.error(err),\n onUncaughtError: (err, _errInfo) => console.error(err),\n onRecoverableError: (err, _errInfo) => console.error(err),\n });\n\n pipWindow.addEventListener('pagehide', () => {\n pipRoot.unmount();\n });\n\n pipRoot.render(\n <ErrorBoundary>\n <PipTimer viewSettings={data} />\n </ErrorBoundary>,\n );\n };\n\n return <CornerPipButton onClick={status === 'success' ? openPictureInPicture : undefined} />;\n}\n"],"names":["PipTimer","viewSettings","eventNow","message","time","clock","timerTypeNow","countToEndNow","auxTimer","useTimerSocket","showOverlay","getShowMessage","timer","showFinished","showWarning","showDanger","getShowModifiers","phase","isPlaying","getIsPlaying","playback","showProgressBar","getShowProgressBar","totalTime","getTotalTime","duration","addedTime","stageTimer","getTimerByType","display","getFormattedTimer","removeSeconds","removeLeadingZero","currentAux","secondarySource","aux1","aux2","aux3","secondaryContent","getSecondaryDisplay","resolvedTimerColour","getTimerColour","undefined","timerFontSize","getEstimatedFontSize","userStyles","jsxs","cx","jsx","FitText","blink","text","fontSize","MultiPartProgressBar","current","normalColor","timeWarning","warningColor","timeDanger","dangerColor","PipTimerHost","data","status","useViewSettings","openPictureInPicture","window","documentPictureInPicture","pipWindow","requestWindow","err","error","document","styleSheets","forEach","sheet","href","link","createElement","rel","head","appendChild","cssRules","style","textContent","map","rule","cssText","join","e","warn","pipDiv","setAttribute","height","body","append","pipRoot","createRoot","getElementById","onCaughtError","_errInfo","console","onUncaughtError","onRecoverableError","addEventListener","unmount","render","ErrorBoundary","CornerPipButton"],"mappings":"2zBAwBO,SAASA,EAAS,CAAEC,aAAAA,CAA4B,EAAG,CAClD,KAAA,CAAEC,SAAAA,EAAUC,QAAAA,EAASC,KAAAA,EAAMC,MAAAA,EAAOC,aAAAA,EAAcC,cAAAA,EAAeC,SAAAA,GAAaC,EAAe,EAG3FC,EAAcC,EAAeR,EAAQS,KAAK,EAC1C,CAAEC,aAAAA,EAAcC,YAAAA,EAAaC,WAAAA,CAAAA,EAAeC,EAChDV,EACAC,EACAH,EAAKa,MACL,GACA,GACA,EACF,EACMC,EAAYC,EAAaf,EAAKgB,QAAQ,EACtCC,EAAkBC,EAAmBhB,CAAY,EAGjDiB,EAAYC,EAAapB,EAAKqB,SAAUrB,EAAKsB,SAAS,EACtDC,EAAaC,EAAe,GAAOtB,EAAcD,EAAOD,EAAME,CAAY,EAC1EuB,EAAUC,EAAkBH,EAAYrB,EAAc,MAAO,CACjEyB,cAAe,GACfC,kBAAmB,EAAA,CACpB,EAEKC,EACA9B,EAAQS,MAAMsB,kBAAoB,OAC7B1B,EAAS2B,KAEdhC,EAAQS,MAAMsB,kBAAoB,OAC7B1B,EAAS4B,KAEdjC,EAAQS,MAAMsB,kBAAoB,OAC7B1B,EAAS6B,KAEX,KAGHC,EAAmBC,EAAoBpC,EAAS8B,EAAY,MAAO,GAAO,GAAM,EAAK,EAGrFO,EAAsBC,EAAexC,EAAcyC,OAAW5B,EAAaC,CAAU,EACrF4B,EAAgBC,EAAqBf,EAASS,CAAgB,EAC9DO,EAAa,CACjB,GAAIL,GAAuB,CAAE,iBAAkBA,CAAAA,CACjD,EAGE,OAAAM,EAAA,KAAC,MAAI,CAAA,UAAWC,EAAG,CAAC,YAAalC,GAAgB,qBAAqB,CAAC,EAAG,MAAOgC,EAC/E,SAAA,CAAAG,EAAA,IAAC,MAAI,CAAA,UAAWD,EAAG,CAAC,kBAAmBrC,GAAe,yBAAyB,CAAC,EAC9E,SAAAsC,EAAAA,IAACC,EAAQ,CAAA,KAAK,QAAQ,IAAK,GAAI,IAAK,IAAK,UAAWF,EAAG,CAAC,UAAW5C,EAAQS,MAAMsC,OAAS,OAAO,CAAC,EAC/F/C,SAAQS,EAAAA,MAAMuC,IACjB,CAAA,EACF,EAEAL,EAAAA,KAAC,MAAI,CAAA,UAAU,kBACb,SAAA,CAAAE,EAAAA,IAAC,MACC,CAAA,UAAWD,EAAG,CAAC,QAAS,CAAC7B,GAAa,gBAAiBL,GAAgB,iBAAiB,CAAC,EACzF,MAAO,CAAEuC,SAAU,GAAGT,CAAa,IACnC,EAAA,aAAYvC,EAAKa,MAEhBY,SACHA,CAAA,CAAA,EACAmB,MAAC,OAAI,UAAWD,EAAG,CAAC,YAAa,CAACT,GAAoB,mBAAmB,CAAC,EACxE,SAACU,MAAAC,EAAA,CAAQ,KAAK,QAAQ,IAAK,GAAI,IAAK,IACjCX,WACH,CACF,CAAA,CAAA,EACF,EAECjB,GACC2B,EAAA,IAACK,EACC,CAAA,UAAWN,EAAG,CAAC,qBAAsB,CAAC7B,GAAa,4BAA4B,CAAC,EAChF,IAAKd,EAAKkD,QACV,SAAU/B,EACV,YAAatB,EAAasD,YAC1B,QAASrD,GAAAA,YAAAA,EAAUsD,YACnB,aAAcvD,EAAawD,aAC3B,OAAQvD,GAAAA,YAAAA,EAAUwD,WAClB,YAAazD,EAAa0D,YAC1B,aAAc,CAAC9C,CAElB,CAAA,CAAA,EACH,CAEJ,CCpGA,SAAwB+C,GAAe,CAC/B,KAAA,CAAEC,KAAAA,EAAMC,OAAAA,GAAWC,EAAgB,EAEnCC,EAAuB,SAAY,CACnCC,GAAAA,OAAOC,yBAAyBD,OAClC,OAGEE,IAAAA,EACA,GAAA,CACUA,EAAA,MAAMF,OAAOC,yBAAyBE,cAAc,QACzDC,EAAK,CACJC,QAAAA,MAAM,qCAAsCD,CAAG,EACvD,MAAA,CAGF,CAAC,GAAGE,SAASC,WAAW,EAAEC,QAAmBC,GAAA,CACvC,GAAA,CACF,GAAIA,EAAMC,KAAM,CACd,MAAMC,EAAOT,EAAUI,SAASM,cAAc,MAAM,EACpDD,EAAKE,IAAM,aACXF,EAAKD,KAAOD,EAAMC,KACRJ,EAAAA,SAASQ,KAAKC,YAAYJ,CAAI,CAAA,SAC/BF,EAAMO,SAAU,CACzB,MAAMC,EAAQf,EAAUI,SAASM,cAAc,OAAO,EACtDK,EAAMC,YAAc,CAAC,GAAGT,EAAMO,QAAQ,EAAEG,IAAKC,GAASA,EAAKC,OAAO,EAAEC,KAAK,EAAE,EACjEhB,EAAAA,SAASQ,KAAKC,YAAYE,CAAK,CAAA,QAEpCM,EAAG,CACFC,QAAAA,KAAK,2BAA4BD,CAAC,CAAA,CAC5C,CACD,EAED,MAAME,EAASvB,EAAUI,SAASM,cAAc,KAAK,EAC9Cc,EAAAA,aAAa,KAAM,UAAU,EACpCD,EAAOR,MAAMU,OAAS,QACZrB,EAAAA,SAASsB,KAAKC,OAAOJ,CAAM,EAErC,MAAMK,EAAUC,EAAAA,WAAW7B,EAAUI,SAAS0B,eAAe,UAAU,EAAc,CACnFC,cAAeA,CAAC7B,EAAK8B,IAAaC,QAAQ9B,MAAMD,CAAG,EACnDgC,gBAAiBA,CAAChC,EAAK8B,IAAaC,QAAQ9B,MAAMD,CAAG,EACrDiC,mBAAoBA,CAACjC,EAAK8B,IAAaC,QAAQ9B,MAAMD,CAAG,CAAA,CACzD,EAESkC,EAAAA,iBAAiB,WAAY,IAAM,CAC3CR,EAAQS,QAAQ,CAAA,CACjB,EAEOC,EAAAA,aACLC,EACC,CAAA,SAAA1D,MAAChD,GAAS,aAAc6D,CAAK,CAAA,CAC/B,CAAA,CACF,CACF,EAEA,aAAQ8C,EAAgB,CAAA,QAAS7C,IAAW,UAAYE,EAAuBtB,OAAa,CAC9F"}
1
+ {"version":3,"file":"PipHost-BZy7ouDv.js","sources":["../../src/views/editor/pip-timer/PipTimer.tsx","../../src/views/editor/pip-timer/PipHost.tsx"],"sourcesContent":["import { ViewSettings } from 'ontime-types';\n\nimport { FitText } from '../../../common/components/fit-text/FitText';\nimport MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport { useTimerSocket } from '../../../common/hooks/useSocket';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { getFormattedTimer, getTimerByType } from '../../common/viewUtils';\nimport {\n getEstimatedFontSize,\n getIsPlaying,\n getSecondaryDisplay,\n getShowMessage,\n getShowModifiers,\n getShowProgressBar,\n getTotalTime,\n} from '../../timer/timer.utils';\nimport { getTimerColour } from '../../utils/presentation.utils';\n\nimport './PipTimer.scss';\n\ninterface PipTimerProps {\n viewSettings: ViewSettings;\n}\n\nexport function PipTimer({ viewSettings }: PipTimerProps) {\n const { eventNow, message, time, clock, timerTypeNow, countToEndNow, auxTimer } = useTimerSocket();\n\n // gather modifiers\n const showOverlay = getShowMessage(message.timer);\n const { showFinished, showWarning, showDanger } = getShowModifiers(\n timerTypeNow,\n countToEndNow,\n time.phase,\n false,\n '',\n false,\n );\n const isPlaying = getIsPlaying(time.playback);\n const showProgressBar = getShowProgressBar(timerTypeNow);\n\n // gather timer data\n const totalTime = getTotalTime(time.duration, time.addedTime);\n const stageTimer = getTimerByType(false, timerTypeNow, clock, time, timerTypeNow);\n const display = getFormattedTimer(stageTimer, timerTypeNow, 'min', {\n removeSeconds: false,\n removeLeadingZero: false,\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(message, currentAux, 'min', false, true, false);\n\n // gather presentation styles\n const resolvedTimerColour = getTimerColour(viewSettings, undefined, showWarning, showDanger);\n const timerFontSize = getEstimatedFontSize(display, secondaryContent);\n const userStyles = {\n ...(resolvedTimerColour && { '--timer-colour': resolvedTimerColour }),\n };\n\n return (\n <div className={cx(['pip-timer', showFinished && 'pip-timer--finished'])} style={userStyles}>\n <div className={cx(['message-overlay', showOverlay && 'message-overlay--active'])}>\n <FitText mode='multi' min={12} max={256} className={cx(['message', message.timer.blink && 'blink'])}>\n {message.timer.text}\n </FitText>\n </div>\n\n <div className='timer-container'>\n <div\n className={cx(['timer', !isPlaying && 'timer--paused', showFinished && 'timer--finished'])}\n style={{ fontSize: `${timerFontSize}vw` }}\n data-phase={time.phase}\n >\n {display}\n </div>\n <div className={cx(['secondary', !secondaryContent && 'secondary--hidden'])}>\n <FitText mode='multi' min={12} 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 </div>\n );\n}\n","import { createRoot } from 'react-dom/client';\nimport { ErrorBoundary } from '@sentry/react';\n\nimport { CornerPipButton } from '../../../common/components/editor-utils/EditorUtils';\nimport useViewSettings from '../../../common/hooks-query/useViewSettings';\n\nimport { PipTimer } from './PipTimer';\n\nexport default function PipTimerHost() {\n const { data, status } = useViewSettings();\n\n const openPictureInPicture = async () => {\n if (window.documentPictureInPicture.window) {\n return;\n }\n\n let pipWindow: Window;\n try {\n pipWindow = await window.documentPictureInPicture.requestWindow();\n } catch (err) {\n console.error('Failed to open Picture-in-Picture:', err);\n return;\n }\n\n [...document.styleSheets].forEach((sheet) => {\n try {\n if (sheet.href) {\n const link = pipWindow.document.createElement('link');\n link.rel = 'stylesheet';\n link.href = sheet.href;\n pipWindow.document.head.appendChild(link);\n } else if (sheet.cssRules) {\n const style = pipWindow.document.createElement('style');\n style.textContent = [...sheet.cssRules].map((rule) => rule.cssText).join('');\n pipWindow.document.head.appendChild(style);\n }\n } catch (e) {\n console.warn('Stylesheet copy blocked:', e);\n }\n });\n\n const pipDiv = pipWindow.document.createElement('div');\n pipDiv.setAttribute('id', 'pip-root');\n pipDiv.style.height = '100vh';\n pipWindow.document.body.append(pipDiv);\n\n const pipRoot = createRoot(pipWindow.document.getElementById('pip-root') as Element, {\n onCaughtError: (err, _errInfo) => console.error(err),\n onUncaughtError: (err, _errInfo) => console.error(err),\n onRecoverableError: (err, _errInfo) => console.error(err),\n });\n\n pipWindow.addEventListener('pagehide', () => {\n pipRoot.unmount();\n });\n\n pipRoot.render(\n <ErrorBoundary>\n <PipTimer viewSettings={data} />\n </ErrorBoundary>,\n );\n };\n\n return <CornerPipButton onClick={status === 'success' ? openPictureInPicture : undefined} />;\n}\n"],"names":["PipTimer","viewSettings","eventNow","message","time","clock","timerTypeNow","countToEndNow","auxTimer","useTimerSocket","showOverlay","getShowMessage","timer","showFinished","showWarning","showDanger","getShowModifiers","phase","isPlaying","getIsPlaying","playback","showProgressBar","getShowProgressBar","totalTime","getTotalTime","duration","addedTime","stageTimer","getTimerByType","display","getFormattedTimer","removeSeconds","removeLeadingZero","currentAux","secondarySource","aux1","aux2","aux3","secondaryContent","getSecondaryDisplay","resolvedTimerColour","getTimerColour","undefined","timerFontSize","getEstimatedFontSize","userStyles","jsxs","cx","jsx","FitText","blink","text","fontSize","MultiPartProgressBar","current","normalColor","timeWarning","warningColor","timeDanger","dangerColor","PipTimerHost","data","status","useViewSettings","openPictureInPicture","window","documentPictureInPicture","pipWindow","requestWindow","err","error","document","styleSheets","forEach","sheet","href","link","createElement","rel","head","appendChild","cssRules","style","textContent","map","rule","cssText","join","e","warn","pipDiv","setAttribute","height","body","append","pipRoot","createRoot","getElementById","onCaughtError","_errInfo","console","onUncaughtError","onRecoverableError","addEventListener","unmount","render","ErrorBoundary","CornerPipButton"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e,ac as f}from"./vendor-BKUJ0_Du.js";import{u as m,L as u,d as j,O as o}from"./index-Dm-4OTmY.js";import{E as l}from"./EmptyPage-CYVrjOvI.js";import{V as x}from"./ViewLogo-2I7w5Yms.js";import{V as a}from"./ViewParamsEditor-BX2RM8sx.js";import{u as _}from"./useWindowTitle-DM8dIp8L.js";import{u as h}from"./useProjectData-C110zIXC.js";import"./SwatchPicker-Ckpchvjo.js";import"./viewUtils-29a3Mmiu.js";import"./Select-BnGTAeXJ.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new s.Error().stack;r&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[r]="a2812b94-5c27-4f42-92d5-b4da83da3a44",s._sentryDebugIdIdentifier="sentry-dbid-a2812b94-5c27-4f42-92d5-b4da83da3a44")}catch{}})();function g(){const s=m(t=>t.mirror),{data:r,status:n}=h();return{data:{projectData:r,isMirrored:s},status:n}}function L(){const{data:s,status:r}=g();return _("Project info"),r==="pending"?e.jsx(u,{}):r==="error"?e.jsx(l,{text:"There was an error fetching data, please refresh the page."}):e.jsx(v,{...s})}function v({projectData:s,isMirrored:r}){const{getLocalizedString:n}=j();return!s||Object.values(s).every(i=>!i||i&&Array.isArray(i)&&i.length===0)?e.jsxs(e.Fragment,{children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),e.jsx(l,{text:n("common.no_data")}),";"]}):e.jsxs("div",{className:`project ${r?"mirror":""}`,"data-testid":"project-view",children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),s.logo&&e.jsx(x,{name:s.logo,className:"logo"}),e.jsxs("div",{className:"info",children:[s.title&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.title")}),e.jsx("div",{className:"info__value",children:s.title})]}),s.description&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.description")}),e.jsx("div",{className:"info__value",children:s.description})]}),s.info&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.info")}),e.jsx("div",{className:"info__value",children:s.info})]}),s.url&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.url")}),e.jsxs("a",{href:s.url,target:"_blank",rel:"noreferrer",className:"info__value link",children:[s.url," ",e.jsx(f,{style:{fontSize:"1em"}})]})]}),s.custom.map((i,d)=>{const c=!!i.url;return e.jsxs("div",{className:"info__custom",children:[c&&e.jsx("div",{className:"info__image-container",children:e.jsx("img",{className:"info__image",src:i.url,loading:"lazy"})}),e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:i.title}),e.jsx("div",{className:"info__value",children:i.value})]})]},`${i.title}-${d}`)})]})]})}export{L as default};
2
- //# sourceMappingURL=ProjectInfo-BR_7Hp5u.js.map
1
+ import{j as e,ac as f}from"./vendor-Dt3_Fdfs.js";import{u as m,L as u,d as j,O as o}from"./index-3aosT33y.js";import{E as l}from"./EmptyPage-aTb22KTq.js";import{V as x}from"./ViewLogo-DcDhyyIF.js";import{V as a}from"./ViewParamsEditor-DeMdkxxC.js";import{u as _}from"./useWindowTitle-CQ8nEeel.js";import{u as h}from"./useProjectData-gGT2eczr.js";import"./SwatchPicker-DuWAohyD.js";import"./viewUtils-k0tARVDN.js";import"./Select-CvUrsmYI.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new s.Error().stack;r&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[r]="a2812b94-5c27-4f42-92d5-b4da83da3a44",s._sentryDebugIdIdentifier="sentry-dbid-a2812b94-5c27-4f42-92d5-b4da83da3a44")}catch{}})();function g(){const s=m(t=>t.mirror),{data:r,status:n}=h();return{data:{projectData:r,isMirrored:s},status:n}}function L(){const{data:s,status:r}=g();return _("Project info"),r==="pending"?e.jsx(u,{}):r==="error"?e.jsx(l,{text:"There was an error fetching data, please refresh the page."}):e.jsx(v,{...s})}function v({projectData:s,isMirrored:r}){const{getLocalizedString:n}=j();return!s||Object.values(s).every(i=>!i||i&&Array.isArray(i)&&i.length===0)?e.jsxs(e.Fragment,{children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),e.jsx(l,{text:n("common.no_data")}),";"]}):e.jsxs("div",{className:`project ${r?"mirror":""}`,"data-testid":"project-view",children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),s.logo&&e.jsx(x,{name:s.logo,className:"logo"}),e.jsxs("div",{className:"info",children:[s.title&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.title")}),e.jsx("div",{className:"info__value",children:s.title})]}),s.description&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.description")}),e.jsx("div",{className:"info__value",children:s.description})]}),s.info&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.info")}),e.jsx("div",{className:"info__value",children:s.info})]}),s.url&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.url")}),e.jsxs("a",{href:s.url,target:"_blank",rel:"noreferrer",className:"info__value link",children:[s.url," ",e.jsx(f,{style:{fontSize:"1em"}})]})]}),s.custom.map((i,d)=>{const c=!!i.url;return e.jsxs("div",{className:"info__custom",children:[c&&e.jsx("div",{className:"info__image-container",children:e.jsx("img",{className:"info__image",src:i.url,loading:"lazy"})}),e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:i.title}),e.jsx("div",{className:"info__value",children:i.value})]})]},`${i.title}-${d}`)})]})]})}export{L as default};
2
+ //# sourceMappingURL=ProjectInfo-D0X9vdIX.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectInfo-BR_7Hp5u.js","sources":["../../src/views/project-info/useProjectInfoData.ts","../../src/views/project-info/ProjectInfo.tsx"],"sourcesContent":["import { ProjectData } from 'ontime-types';\n\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { ViewData } from '../utils/viewLoader.utils';\n\nexport interface ProjectInfoData {\n projectData: ProjectData;\n isMirrored: boolean;\n}\n\nexport function useProjectInfoData(): ViewData<ProjectInfoData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n\n return {\n data: {\n projectData,\n isMirrored,\n },\n status: projectDataStatus,\n };\n}\n","import { IoOpenOutline } from 'react-icons/io5';\nimport { OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\n\nimport { ProjectInfoData, useProjectInfoData } from './useProjectInfoData';\n\nimport './ProjectInfo.scss';\n\nexport default function ProjectInfoLoader() {\n const { data, status } = useProjectInfoData();\n\n useWindowTitle('Project info');\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 <ProjectInfo {...data} />;\n}\n\nfunction ProjectInfo({ projectData, isMirrored }: ProjectInfoData) {\n const { getLocalizedString } = useTranslation();\n\n /**\n * Check if there is data to show at all\n * We need a special check for the project fields which can be an empty array\n */\n const isEmpty =\n !projectData ||\n Object.values(projectData).every((value) => !value || (value && Array.isArray(value) && value.length === 0));\n if (isEmpty) {\n return (\n <>\n <ViewParamsEditor target={OntimeView.ProjectInfo} viewOptions={[]} />\n <EmptyPage text={getLocalizedString('common.no_data')} />;\n </>\n );\n }\n\n return (\n <div className={`project ${isMirrored ? 'mirror' : ''}`} data-testid='project-view'>\n <ViewParamsEditor target={OntimeView.ProjectInfo} viewOptions={[]} />\n {projectData.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='info'>\n {projectData.title && (\n <div>\n <div className='info__label'>{getLocalizedString('project.title')}</div>\n <div className='info__value'>{projectData.title}</div>\n </div>\n )}\n {projectData.description && (\n <div>\n <div className='info__label'>{getLocalizedString('project.description')}</div>\n <div className='info__value'>{projectData.description}</div>\n </div>\n )}\n {projectData.info && (\n <div>\n <div className='info__label'>{getLocalizedString('project.info')}</div>\n <div className='info__value'>{projectData.info}</div>\n </div>\n )}\n {projectData.url && (\n <div>\n <div className='info__label'>{getLocalizedString('project.url')}</div>\n <a href={projectData.url} target='_blank' rel='noreferrer' className='info__value link'>\n {projectData.url} <IoOpenOutline style={{ fontSize: '1em' }} />\n </a>\n </div>\n )}\n {projectData.custom.map((info, idx) => {\n const hasUrl = Boolean(info.url);\n return (\n <div key={`${info.title}-${idx}`} className='info__custom'>\n {hasUrl && (\n <div className='info__image-container'>\n <img className='info__image' src={info.url} loading='lazy' />\n </div>\n )}\n <div>\n <div className='info__label'>{info.title}</div>\n <div className='info__value'>{info.value}</div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":["useProjectInfoData","isMirrored","useViewOptionsStore","state","mirror","data","projectData","status","projectDataStatus","useProjectData","ProjectInfoLoader","useWindowTitle","Loader","jsx","EmptyPage","ProjectInfo","getLocalizedString","useTranslation","Object","values","every","value","Array","isArray","length","jsxs","Fragment","ViewParamsEditor","OntimeView","logo","ViewLogo","title","description","info","url","IoOpenOutline","fontSize","custom","map","idx","hasUrl","Boolean"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectInfo-D0X9vdIX.js","sources":["../../src/views/project-info/useProjectInfoData.ts","../../src/views/project-info/ProjectInfo.tsx"],"sourcesContent":["import { ProjectData } from 'ontime-types';\n\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { ViewData } from '../utils/viewLoader.utils';\n\nexport interface ProjectInfoData {\n projectData: ProjectData;\n isMirrored: boolean;\n}\n\nexport function useProjectInfoData(): ViewData<ProjectInfoData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n\n return {\n data: {\n projectData,\n isMirrored,\n },\n status: projectDataStatus,\n };\n}\n","import { IoOpenOutline } from 'react-icons/io5';\nimport { OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\n\nimport { ProjectInfoData, useProjectInfoData } from './useProjectInfoData';\n\nimport './ProjectInfo.scss';\n\nexport default function ProjectInfoLoader() {\n const { data, status } = useProjectInfoData();\n\n useWindowTitle('Project info');\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 <ProjectInfo {...data} />;\n}\n\nfunction ProjectInfo({ projectData, isMirrored }: ProjectInfoData) {\n const { getLocalizedString } = useTranslation();\n\n /**\n * Check if there is data to show at all\n * We need a special check for the project fields which can be an empty array\n */\n const isEmpty =\n !projectData ||\n Object.values(projectData).every((value) => !value || (value && Array.isArray(value) && value.length === 0));\n if (isEmpty) {\n return (\n <>\n <ViewParamsEditor target={OntimeView.ProjectInfo} viewOptions={[]} />\n <EmptyPage text={getLocalizedString('common.no_data')} />;\n </>\n );\n }\n\n return (\n <div className={`project ${isMirrored ? 'mirror' : ''}`} data-testid='project-view'>\n <ViewParamsEditor target={OntimeView.ProjectInfo} viewOptions={[]} />\n {projectData.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='info'>\n {projectData.title && (\n <div>\n <div className='info__label'>{getLocalizedString('project.title')}</div>\n <div className='info__value'>{projectData.title}</div>\n </div>\n )}\n {projectData.description && (\n <div>\n <div className='info__label'>{getLocalizedString('project.description')}</div>\n <div className='info__value'>{projectData.description}</div>\n </div>\n )}\n {projectData.info && (\n <div>\n <div className='info__label'>{getLocalizedString('project.info')}</div>\n <div className='info__value'>{projectData.info}</div>\n </div>\n )}\n {projectData.url && (\n <div>\n <div className='info__label'>{getLocalizedString('project.url')}</div>\n <a href={projectData.url} target='_blank' rel='noreferrer' className='info__value link'>\n {projectData.url} <IoOpenOutline style={{ fontSize: '1em' }} />\n </a>\n </div>\n )}\n {projectData.custom.map((info, idx) => {\n const hasUrl = Boolean(info.url);\n return (\n <div key={`${info.title}-${idx}`} className='info__custom'>\n {hasUrl && (\n <div className='info__image-container'>\n <img className='info__image' src={info.url} loading='lazy' />\n </div>\n )}\n <div>\n <div className='info__label'>{info.title}</div>\n <div className='info__value'>{info.value}</div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":["useProjectInfoData","isMirrored","useViewOptionsStore","state","mirror","data","projectData","status","projectDataStatus","useProjectData","ProjectInfoLoader","useWindowTitle","Loader","jsx","EmptyPage","ProjectInfo","getLocalizedString","useTranslation","Object","values","every","value","Array","isArray","length","jsxs","Fragment","ViewParamsEditor","OntimeView","logo","ViewLogo","title","description","info","url","IoOpenOutline","fontSize","custom","map","idx","hasUrl","Boolean"],"mappings":"oxBAWO,SAASA,GAAgD,CAE9D,MAAMC,EAAaC,EAA+BC,GAAAA,EAAMC,MAAM,EAGxD,CAAEC,KAAMC,EAAaC,OAAQC,GAAsBC,EAAe,EAEjE,MAAA,CACLJ,KAAM,CACJC,YAAAA,EACAL,WAAAA,CACF,EACAM,OAAQC,CACV,CACF,CCXA,SAAwBE,GAAoB,CACpC,KAAA,CAAEL,KAAAA,EAAME,OAAAA,GAAWP,EAAmB,EAI5C,OAFAW,EAAe,cAAc,EAEzBJ,IAAW,gBACLK,EAAS,EAAA,EAGfL,IAAW,QACNM,EAAA,IAACC,EAAU,CAAA,KAAK,4DAA+D,CAAA,EAGjFD,MAACE,EAAgBV,CAAAA,GAAAA,CAAQ,CAAA,CAClC,CAEA,SAASU,EAAY,CAAET,YAAAA,EAAaL,WAAAA,CAA4B,EAAG,CAC3D,KAAA,CAAEe,mBAAAA,GAAuBC,EAAe,EAS9C,MAFE,CAACX,GACDY,OAAOC,OAAOb,CAAW,EAAEc,MAAOC,GAAU,CAACA,GAAUA,GAASC,MAAMC,QAAQF,CAAK,GAAKA,EAAMG,SAAW,CAAE,EAIvGC,EAAA,KAAAC,WAAA,CAAA,SAAA,CAAAb,EAAA,IAACc,GAAiB,OAAQC,EAAWb,YAAa,YAAa,CAAA,EAAG,EACjEF,EAAA,IAAAC,EAAA,CAAU,KAAME,EAAmB,gBAAgB,CAAK,CAAA,EAAA,GAAA,EAC3D,EAKFS,EAAA,KAAC,OAAI,UAAW,WAAWxB,EAAa,SAAW,EAAE,GAAI,cAAY,eACnE,SAAA,CAAAY,EAAA,IAACc,GAAiB,OAAQC,EAAWb,YAAa,YAAa,CAAA,EAAG,EACjET,EAAYuB,MAAShB,EAAA,IAAAiB,EAAA,CAAS,KAAMxB,EAAYuB,KAAM,UAAU,OAAS,EAC1EJ,EAAAA,KAAC,MAAI,CAAA,UAAU,OACZnB,SAAAA,CAAYyB,EAAAA,cACV,MACC,CAAA,SAAA,CAAAlB,MAAC,MAAI,CAAA,UAAU,cAAeG,SAAAA,EAAmB,eAAe,EAAE,EACjEH,EAAA,IAAA,MAAA,CAAI,UAAU,cAAeP,WAAYyB,KAAM,CAAA,CAAA,EAClD,EAEDzB,EAAY0B,aACXP,EAAAA,KAAC,MACC,CAAA,SAAA,CAAAZ,MAAC,MAAI,CAAA,UAAU,cAAeG,SAAAA,EAAmB,qBAAqB,EAAE,EACvEH,EAAA,IAAA,MAAA,CAAI,UAAU,cAAeP,WAAY0B,WAAY,CAAA,CAAA,EACxD,EAED1B,EAAY2B,MACXR,EAAAA,KAAC,MACC,CAAA,SAAA,CAAAZ,MAAC,MAAI,CAAA,UAAU,cAAeG,SAAAA,EAAmB,cAAc,EAAE,EAChEH,EAAA,IAAA,MAAA,CAAI,UAAU,cAAeP,WAAY2B,IAAK,CAAA,CAAA,EACjD,EAED3B,EAAY4B,KACXT,EAAAA,KAAC,MACC,CAAA,SAAA,CAAAZ,MAAC,MAAI,CAAA,UAAU,cAAeG,SAAAA,EAAmB,aAAa,EAAE,EAChES,EAAAA,KAAC,IAAE,CAAA,KAAMnB,EAAY4B,IAAK,OAAO,SAAS,IAAI,aAAa,UAAU,mBAClE5B,SAAAA,CAAY4B,EAAAA,IAAI,IAACrB,MAACsB,GAAc,MAAO,CAAEC,SAAU,KAAA,CAAQ,CAAA,CAAA,CAC9D,CAAA,CAAA,EACF,EAED9B,EAAY+B,OAAOC,IAAI,CAACL,EAAMM,IAAQ,CAC/BC,MAAAA,EAASC,EAAQR,EAAKC,IAE1B,OAAAT,EAAA,KAAC,MAAiC,CAAA,UAAU,eACzCe,SAAAA,CAAAA,GACE3B,EAAA,IAAA,MAAA,CAAI,UAAU,wBACb,SAACA,EAAAA,IAAA,MAAA,CAAI,UAAU,cAAc,IAAKoB,EAAKC,IAAK,QAAQ,MAAM,CAAA,EAC5D,SAED,MACC,CAAA,SAAA,CAAArB,EAAA,IAAC,MAAI,CAAA,UAAU,cAAeoB,SAAAA,EAAKF,MAAM,EACxClB,EAAA,IAAA,MAAA,CAAI,UAAU,cAAeoB,WAAKZ,KAAM,CAAA,CAAA,CAC3C,CAAA,CAAA,CAAA,EATQ,GAAGY,EAAKF,KAAK,IAAIQ,CAAG,EAU9B,CAEH,CAAA,CAAA,CACH,CAAA,CAAA,EACF,CAEJ"}