@getontime/cli 4.0.2 → 4.1.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 (339) hide show
  1. package/client/assets/{Backstage-CAjkmeJm.js → Backstage-BhtXVpms.js} +2 -2
  2. package/client/assets/Backstage-BhtXVpms.js.br +0 -0
  3. package/client/assets/Backstage-BhtXVpms.js.gz +0 -0
  4. package/client/assets/{Backstage-CAjkmeJm.js.map → Backstage-BhtXVpms.js.map} +1 -1
  5. package/client/assets/{Countdown-ChuA9az_.js → Countdown-NmGi1KMx.js} +2 -2
  6. package/client/assets/Countdown-NmGi1KMx.js.br +0 -0
  7. package/client/assets/Countdown-NmGi1KMx.js.gz +0 -0
  8. package/client/assets/Countdown-NmGi1KMx.js.map +1 -0
  9. package/client/assets/{CustomTranslationModal-C3R_2T5s.js → CustomTranslationModal-BBNxpds0.js} +2 -2
  10. package/client/assets/CustomTranslationModal-BBNxpds0.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-BBNxpds0.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-C3R_2T5s.js.map → CustomTranslationModal-BBNxpds0.js.map} +1 -1
  13. package/client/assets/{DelayIndicator-vT7n8ypf.js → DelayIndicator-CFCDQ7FN.js} +2 -2
  14. package/client/assets/DelayIndicator-CFCDQ7FN.js.br +0 -0
  15. package/client/assets/DelayIndicator-CFCDQ7FN.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-vT7n8ypf.js.map → DelayIndicator-CFCDQ7FN.js.map} +1 -1
  17. package/client/assets/{EditorFeatureWrapper-DHfuO3EA.js → EditorFeatureWrapper-D55c8JBz.js} +2 -2
  18. package/client/assets/EditorFeatureWrapper-D55c8JBz.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-D55c8JBz.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-DHfuO3EA.js.map → EditorFeatureWrapper-D55c8JBz.js.map} +1 -1
  21. package/client/assets/{EditorUtils-Da5ALK1P.js → EditorUtils-CFE106qQ.js} +2 -2
  22. package/client/assets/EditorUtils-CFE106qQ.js.br +0 -0
  23. package/client/assets/EditorUtils-CFE106qQ.js.gz +0 -0
  24. package/client/assets/{EditorUtils-Da5ALK1P.js.map → EditorUtils-CFE106qQ.js.map} +1 -1
  25. package/client/assets/{Empty-gWT_HMeu.js → Empty-C-JO_XAr.js} +2 -2
  26. package/client/assets/Empty-C-JO_XAr.js.br +2 -0
  27. package/client/assets/Empty-C-JO_XAr.js.gz +0 -0
  28. package/client/assets/{Empty-gWT_HMeu.js.map → Empty-C-JO_XAr.js.map} +1 -1
  29. package/client/assets/{EmptyPage-Dcbg6rmF.js → EmptyPage-BSzsxpGg.js} +2 -2
  30. package/client/assets/EmptyPage-BSzsxpGg.js.br +1 -0
  31. package/client/assets/EmptyPage-BSzsxpGg.js.gz +0 -0
  32. package/client/assets/{EmptyPage-Dcbg6rmF.js.map → EmptyPage-BSzsxpGg.js.map} +1 -1
  33. package/client/assets/{FollowButton-CSqJSvix.js → FollowButton-Mox6N4JW.js} +2 -2
  34. package/client/assets/FollowButton-Mox6N4JW.js.br +0 -0
  35. package/client/assets/FollowButton-Mox6N4JW.js.gz +0 -0
  36. package/client/assets/{FollowButton-CSqJSvix.js.map → FollowButton-Mox6N4JW.js.map} +1 -1
  37. package/client/assets/MessageControlExport-BL2ip9qN.js +2 -0
  38. package/client/assets/MessageControlExport-BL2ip9qN.js.br +0 -0
  39. package/client/assets/MessageControlExport-BL2ip9qN.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-lXK21piH.js.map → MessageControlExport-BL2ip9qN.js.map} +1 -1
  41. package/client/assets/{MilestoneEditor-Bge8xLrV.js → MilestoneEditor-DcWPGKNK.js} +2 -2
  42. package/client/assets/MilestoneEditor-DcWPGKNK.js.br +0 -0
  43. package/client/assets/MilestoneEditor-DcWPGKNK.js.gz +0 -0
  44. package/client/assets/{MilestoneEditor-Bge8xLrV.js.map → MilestoneEditor-DcWPGKNK.js.map} +1 -1
  45. package/client/assets/Modal-D3tAPV2u.css +1 -0
  46. package/client/assets/Modal-D3tAPV2u.css.br +0 -0
  47. package/client/assets/Modal-D3tAPV2u.css.gz +0 -0
  48. package/client/assets/Modal-krcwDRb-.js +2 -0
  49. package/client/assets/Modal-krcwDRb-.js.br +0 -0
  50. package/client/assets/Modal-krcwDRb-.js.gz +0 -0
  51. package/client/assets/Modal-krcwDRb-.js.map +1 -0
  52. package/client/assets/{MultiPartProgressBar-D3jJZjb5.js → MultiPartProgressBar-BXQbpM-j.js} +2 -2
  53. package/client/assets/MultiPartProgressBar-BXQbpM-j.js.br +0 -0
  54. package/client/assets/MultiPartProgressBar-BXQbpM-j.js.gz +0 -0
  55. package/client/assets/{MultiPartProgressBar-D3jJZjb5.js.map → MultiPartProgressBar-BXQbpM-j.js.map} +1 -1
  56. package/client/assets/{OperatorExport-BUhxjLUx.js → OperatorExport-C50KHBrD.js} +2 -2
  57. package/client/assets/OperatorExport-C50KHBrD.js.br +0 -0
  58. package/client/assets/OperatorExport-C50KHBrD.js.gz +0 -0
  59. package/client/assets/{OperatorExport-BUhxjLUx.js.map → OperatorExport-C50KHBrD.js.map} +1 -1
  60. package/client/assets/OverviewWrapper-MGJ1uE5W.js +2 -0
  61. package/client/assets/OverviewWrapper-MGJ1uE5W.js.br +0 -0
  62. package/client/assets/OverviewWrapper-MGJ1uE5W.js.gz +0 -0
  63. package/client/assets/OverviewWrapper-MGJ1uE5W.js.map +1 -0
  64. package/client/assets/{ProjectInfo-z4k3cipS.js → ProjectInfo-CJ-GLvVG.js} +2 -2
  65. package/client/assets/ProjectInfo-CJ-GLvVG.js.br +0 -0
  66. package/client/assets/ProjectInfo-CJ-GLvVG.js.gz +0 -0
  67. package/client/assets/{ProjectInfo-z4k3cipS.js.map → ProjectInfo-CJ-GLvVG.js.map} +1 -1
  68. package/client/assets/{ProtectRoute-CrcWfOlG.js → ProtectRoute-DJ9xZnPI.js} +2 -2
  69. package/client/assets/ProtectRoute-DJ9xZnPI.js.br +0 -0
  70. package/client/assets/ProtectRoute-DJ9xZnPI.js.gz +0 -0
  71. package/client/assets/{ProtectRoute-CrcWfOlG.js.map → ProtectRoute-DJ9xZnPI.js.map} +1 -1
  72. package/client/assets/{ProtectedCuesheet-Deo4Aw6f.js → ProtectedCuesheet-B8tg6Mmo.js} +2 -2
  73. package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.br +0 -0
  74. package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.gz +0 -0
  75. package/client/assets/{ProtectedCuesheet-Deo4Aw6f.js.map → ProtectedCuesheet-B8tg6Mmo.js.map} +1 -1
  76. package/client/assets/ProtectedEditor-Bl4wV72N.js +3 -0
  77. package/client/assets/ProtectedEditor-Bl4wV72N.js.br +0 -0
  78. package/client/assets/ProtectedEditor-Bl4wV72N.js.gz +0 -0
  79. package/client/assets/ProtectedEditor-Bl4wV72N.js.map +1 -0
  80. package/client/assets/{RundownEntry-D61IqkXb.js → RundownEntry-D9tXNXPy.js} +2 -2
  81. package/client/assets/RundownEntry-D9tXNXPy.js.br +0 -0
  82. package/client/assets/RundownEntry-D9tXNXPy.js.gz +0 -0
  83. package/client/assets/{RundownEntry-D61IqkXb.js.map → RundownEntry-D9tXNXPy.js.map} +1 -1
  84. package/client/assets/RundownExport-D6uAmFbb.js +3 -0
  85. package/client/assets/RundownExport-D6uAmFbb.js.br +0 -0
  86. package/client/assets/RundownExport-D6uAmFbb.js.gz +0 -0
  87. package/client/assets/RundownExport-D6uAmFbb.js.map +1 -0
  88. package/client/assets/{Select-CedN80WS.js → Select-BLA-yQMq.js} +2 -2
  89. package/client/assets/Select-BLA-yQMq.js.br +0 -0
  90. package/client/assets/Select-BLA-yQMq.js.gz +0 -0
  91. package/client/assets/{Select-CedN80WS.js.map → Select-BLA-yQMq.js.map} +1 -1
  92. package/client/assets/{Studio-DUzPBS6P.js → Studio-DbP92DTf.js} +2 -2
  93. package/client/assets/Studio-DbP92DTf.js.br +0 -0
  94. package/client/assets/Studio-DbP92DTf.js.gz +0 -0
  95. package/client/assets/{Studio-DUzPBS6P.js.map → Studio-DbP92DTf.js.map} +1 -1
  96. package/client/assets/{StyleEditor-D2z65PB7.js → StyleEditor-DNjZ46Qf.js} +2 -2
  97. package/client/assets/StyleEditor-DNjZ46Qf.js.br +0 -0
  98. package/client/assets/StyleEditor-DNjZ46Qf.js.gz +0 -0
  99. package/client/assets/{StyleEditor-D2z65PB7.js.map → StyleEditor-DNjZ46Qf.js.map} +1 -1
  100. package/client/assets/{SuperscriptTime-CIrcMcyg.js → SuperscriptTime-C8ypTVpH.js} +2 -2
  101. package/client/assets/SuperscriptTime-C8ypTVpH.js.br +0 -0
  102. package/client/assets/SuperscriptTime-C8ypTVpH.js.gz +0 -0
  103. package/client/assets/{SuperscriptTime-CIrcMcyg.js.map → SuperscriptTime-C8ypTVpH.js.map} +1 -1
  104. package/client/assets/{TimeElements-CALNfv6u.js → TimeElements-DlEBhXe0.js} +2 -2
  105. package/client/assets/TimeElements-DlEBhXe0.js.br +0 -0
  106. package/client/assets/TimeElements-DlEBhXe0.js.gz +0 -0
  107. package/client/assets/{TimeElements-CALNfv6u.js.map → TimeElements-DlEBhXe0.js.map} +1 -1
  108. package/client/assets/{TimeInput-Dg1naiy3.js → TimeInput-DU09ewqh.js} +2 -2
  109. package/client/assets/TimeInput-DU09ewqh.js.br +0 -0
  110. package/client/assets/TimeInput-DU09ewqh.js.gz +0 -0
  111. package/client/assets/{TimeInput-Dg1naiy3.js.map → TimeInput-DU09ewqh.js.map} +1 -1
  112. package/client/assets/{TimelinePage-Cwm0svjN.js → TimelinePage-DTwqRihn.js} +2 -2
  113. package/client/assets/TimelinePage-DTwqRihn.js.br +0 -0
  114. package/client/assets/TimelinePage-DTwqRihn.js.gz +0 -0
  115. package/client/assets/{TimelinePage-Cwm0svjN.js.map → TimelinePage-DTwqRihn.js.map} +1 -1
  116. package/client/assets/{Timer-BvEmZbmF.css → Timer-B7nk3TMf.css} +1 -1
  117. package/client/assets/Timer-B7nk3TMf.css.br +0 -0
  118. package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
  119. package/client/assets/{Timer-BVXskRjc.js → Timer-jjWAunJc.js} +2 -2
  120. package/client/assets/Timer-jjWAunJc.js.br +0 -0
  121. package/client/assets/Timer-jjWAunJc.js.gz +0 -0
  122. package/client/assets/{Timer-BVXskRjc.js.map → Timer-jjWAunJc.js.map} +1 -1
  123. package/client/assets/TimerControlExport-i0ZDpUx7.js +2 -0
  124. package/client/assets/TimerControlExport-i0ZDpUx7.js.br +0 -0
  125. package/client/assets/TimerControlExport-i0ZDpUx7.js.gz +0 -0
  126. package/client/assets/{TimerControlExport-C8ECtLBd.js.map → TimerControlExport-i0ZDpUx7.js.map} +1 -1
  127. package/client/assets/{TitleCard-CZl9wSHS.js → TitleCard-BgOtucv6.js} +2 -2
  128. package/client/assets/TitleCard-BgOtucv6.js.br +0 -0
  129. package/client/assets/TitleCard-BgOtucv6.js.gz +0 -0
  130. package/client/assets/{TitleCard-CZl9wSHS.js.map → TitleCard-BgOtucv6.js.map} +1 -1
  131. package/client/assets/{Tooltip-D9XRnwOW.js → Tooltip-C0rGHLsB.js} +2 -2
  132. package/client/assets/Tooltip-C0rGHLsB.js.br +0 -0
  133. package/client/assets/Tooltip-C0rGHLsB.js.gz +0 -0
  134. package/client/assets/{Tooltip-D9XRnwOW.js.map → Tooltip-C0rGHLsB.js.map} +1 -1
  135. package/client/assets/{ViewLogo-_3Z1hIHi.js → ViewLogo--9miplQv.js} +2 -2
  136. package/client/assets/ViewLogo--9miplQv.js.br +0 -0
  137. package/client/assets/ViewLogo--9miplQv.js.gz +0 -0
  138. package/client/assets/{ViewLogo-_3Z1hIHi.js.map → ViewLogo--9miplQv.js.map} +1 -1
  139. package/client/assets/{ViewParamsEditor-Bca1TIDW.js → ViewParamsEditor-BFu_0oIb.js} +2 -2
  140. package/client/assets/ViewParamsEditor-BFu_0oIb.js.br +0 -0
  141. package/client/assets/ViewParamsEditor-BFu_0oIb.js.gz +0 -0
  142. package/client/assets/{ViewParamsEditor-Bca1TIDW.js.map → ViewParamsEditor-BFu_0oIb.js.map} +1 -1
  143. package/client/assets/{dateConfig-DRQGMWDF.js → dateConfig-WYqMzV9D.js} +2 -2
  144. package/client/assets/dateConfig-WYqMzV9D.js.br +0 -0
  145. package/client/assets/dateConfig-WYqMzV9D.js.gz +0 -0
  146. package/client/assets/{dateConfig-DRQGMWDF.js.map → dateConfig-WYqMzV9D.js.map} +1 -1
  147. package/client/assets/{editorSettings-BU0pTMSY.js → editorSettings-CCHx-wCx.js} +2 -2
  148. package/client/assets/editorSettings-CCHx-wCx.js.br +0 -0
  149. package/client/assets/editorSettings-CCHx-wCx.js.gz +0 -0
  150. package/client/assets/{editorSettings-BU0pTMSY.js.map → editorSettings-CCHx-wCx.js.map} +1 -1
  151. package/client/assets/{getProgress-Cw79NL_O.js → getProgress-B94Ieskb.js} +2 -2
  152. package/client/assets/getProgress-B94Ieskb.js.br +0 -0
  153. package/client/assets/getProgress-B94Ieskb.js.gz +0 -0
  154. package/client/assets/{getProgress-Cw79NL_O.js.map → getProgress-B94Ieskb.js.map} +1 -1
  155. package/client/assets/{index-BQEUaoAf.js → index-njXwwjfn.js} +3 -3
  156. package/client/assets/index-njXwwjfn.js.br +0 -0
  157. package/client/assets/index-njXwwjfn.js.gz +0 -0
  158. package/client/assets/{index-BQEUaoAf.js.map → index-njXwwjfn.js.map} +1 -1
  159. package/client/assets/{offset-DJAHqjFW.js → offset-D1q-72D-.js} +2 -2
  160. package/client/assets/offset-D1q-72D-.js.br +0 -0
  161. package/client/assets/offset-D1q-72D-.js.gz +0 -0
  162. package/client/assets/{offset-DJAHqjFW.js.map → offset-D1q-72D-.js.map} +1 -1
  163. package/client/assets/{parseUserTime-BeTKj08M.js → parseUserTime-Bc1pSJR2.js} +2 -2
  164. package/client/assets/parseUserTime-Bc1pSJR2.js.br +0 -0
  165. package/client/assets/parseUserTime-Bc1pSJR2.js.gz +0 -0
  166. package/client/assets/{parseUserTime-BeTKj08M.js.map → parseUserTime-Bc1pSJR2.js.map} +1 -1
  167. package/client/assets/{playbackstate-B_khF6xU.js → playbackstate-BpzbtG9F.js} +2 -2
  168. package/client/assets/playbackstate-BpzbtG9F.js.br +0 -0
  169. package/client/assets/playbackstate-BpzbtG9F.js.gz +0 -0
  170. package/client/assets/{playbackstate-B_khF6xU.js.map → playbackstate-BpzbtG9F.js.map} +1 -1
  171. package/client/assets/{presentation.utils-KwY-ACf7.js → presentation.utils-B2baBe3j.js} +2 -2
  172. package/client/assets/presentation.utils-B2baBe3j.js.br +0 -0
  173. package/client/assets/presentation.utils-B2baBe3j.js.gz +0 -0
  174. package/client/assets/{presentation.utils-KwY-ACf7.js.map → presentation.utils-B2baBe3j.js.map} +1 -1
  175. package/client/assets/{rundownUtils-BZHazkXR.js → rundownUtils-H6xvQyre.js} +2 -2
  176. package/client/assets/rundownUtils-H6xvQyre.js.br +0 -0
  177. package/client/assets/rundownUtils-H6xvQyre.js.gz +0 -0
  178. package/client/assets/{rundownUtils-BZHazkXR.js.map → rundownUtils-H6xvQyre.js.map} +1 -1
  179. package/client/assets/{useCustomFields-DqCYz8Kt.js → useCustomFields-Da0Li7nQ.js} +2 -2
  180. package/client/assets/useCustomFields-Da0Li7nQ.js.br +0 -0
  181. package/client/assets/useCustomFields-Da0Li7nQ.js.gz +0 -0
  182. package/client/assets/{useCustomFields-DqCYz8Kt.js.map → useCustomFields-Da0Li7nQ.js.map} +1 -1
  183. package/client/assets/{useFollowComponent-Ctfhf2or.js → useFollowComponent-Qo3FobyV.js} +2 -2
  184. package/client/assets/useFollowComponent-Qo3FobyV.js.br +0 -0
  185. package/client/assets/useFollowComponent-Qo3FobyV.js.gz +0 -0
  186. package/client/assets/{useFollowComponent-Ctfhf2or.js.map → useFollowComponent-Qo3FobyV.js.map} +1 -1
  187. package/client/assets/{useProjectData-C1hVamxc.js → useProjectData-DW06zQvF.js} +2 -2
  188. package/client/assets/useProjectData-DW06zQvF.js.br +0 -0
  189. package/client/assets/useProjectData-DW06zQvF.js.gz +0 -0
  190. package/client/assets/{useProjectData-C1hVamxc.js.map → useProjectData-DW06zQvF.js.map} +1 -1
  191. package/client/assets/{useReport-B4dMYcNL.js → useReport-DhFY2L8v.js} +2 -2
  192. package/client/assets/useReport-DhFY2L8v.js.br +0 -0
  193. package/client/assets/useReport-DhFY2L8v.js.gz +0 -0
  194. package/client/assets/{useReport-B4dMYcNL.js.map → useReport-DhFY2L8v.js.map} +1 -1
  195. package/client/assets/useRundown-ihoU8qBi.js +2 -0
  196. package/client/assets/useRundown-ihoU8qBi.js.br +0 -0
  197. package/client/assets/useRundown-ihoU8qBi.js.gz +0 -0
  198. package/client/assets/useRundown-ihoU8qBi.js.map +1 -0
  199. package/client/assets/{useWindowTitle-DqdFTWns.js → useWindowTitle-B2UzPuki.js} +2 -2
  200. package/client/assets/useWindowTitle-B2UzPuki.js.br +0 -0
  201. package/client/assets/useWindowTitle-B2UzPuki.js.gz +0 -0
  202. package/client/assets/{useWindowTitle-DqdFTWns.js.map → useWindowTitle-B2UzPuki.js.map} +1 -1
  203. package/client/assets/{validateEvent-P9sf7C10.js → validateEvent-BJMwP_mq.js} +2 -2
  204. package/client/assets/validateEvent-BJMwP_mq.js.br +0 -0
  205. package/client/assets/validateEvent-BJMwP_mq.js.gz +0 -0
  206. package/client/assets/{validateEvent-P9sf7C10.js.map → validateEvent-BJMwP_mq.js.map} +1 -1
  207. package/client/assets/{vendor-CCiSQ9k9.js → vendor-9UkPSc5K.js} +3 -3
  208. package/client/assets/vendor-9UkPSc5K.js.br +0 -0
  209. package/client/assets/vendor-9UkPSc5K.js.gz +0 -0
  210. package/client/assets/{vendor-CCiSQ9k9.js.map → vendor-9UkPSc5K.js.map} +1 -1
  211. package/client/assets/{viewLoader.utils-CmM-4-pk.js → viewLoader.utils-DQGhrjSp.js} +2 -2
  212. package/client/assets/viewLoader.utils-DQGhrjSp.js.br +0 -0
  213. package/client/assets/viewLoader.utils-DQGhrjSp.js.gz +0 -0
  214. package/client/assets/{viewLoader.utils-CmM-4-pk.js.map → viewLoader.utils-DQGhrjSp.js.map} +1 -1
  215. package/client/index.html +2 -2
  216. package/package.json +1 -1
  217. package/server/index.cjs +82 -82
  218. package/client/assets/Backstage-CAjkmeJm.js.br +0 -0
  219. package/client/assets/Backstage-CAjkmeJm.js.gz +0 -0
  220. package/client/assets/Countdown-ChuA9az_.js.br +0 -0
  221. package/client/assets/Countdown-ChuA9az_.js.gz +0 -0
  222. package/client/assets/Countdown-ChuA9az_.js.map +0 -1
  223. package/client/assets/CustomTranslationModal-C3R_2T5s.js.br +0 -0
  224. package/client/assets/CustomTranslationModal-C3R_2T5s.js.gz +0 -0
  225. package/client/assets/DelayIndicator-vT7n8ypf.js.br +0 -0
  226. package/client/assets/DelayIndicator-vT7n8ypf.js.gz +0 -0
  227. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.br +0 -0
  228. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.gz +0 -0
  229. package/client/assets/EditorUtils-Da5ALK1P.js.br +0 -0
  230. package/client/assets/EditorUtils-Da5ALK1P.js.gz +0 -0
  231. package/client/assets/Empty-gWT_HMeu.js.br +0 -0
  232. package/client/assets/Empty-gWT_HMeu.js.gz +0 -0
  233. package/client/assets/EmptyPage-Dcbg6rmF.js.br +0 -0
  234. package/client/assets/EmptyPage-Dcbg6rmF.js.gz +0 -0
  235. package/client/assets/FollowButton-CSqJSvix.js.br +0 -0
  236. package/client/assets/FollowButton-CSqJSvix.js.gz +0 -0
  237. package/client/assets/MessageControlExport-lXK21piH.js +0 -2
  238. package/client/assets/MessageControlExport-lXK21piH.js.br +0 -0
  239. package/client/assets/MessageControlExport-lXK21piH.js.gz +0 -0
  240. package/client/assets/MilestoneEditor-Bge8xLrV.js.br +0 -0
  241. package/client/assets/MilestoneEditor-Bge8xLrV.js.gz +0 -0
  242. package/client/assets/Modal-BgJx3SNK.css +0 -1
  243. package/client/assets/Modal-BgJx3SNK.css.br +0 -0
  244. package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
  245. package/client/assets/Modal-C2sFA0zf.js +0 -2
  246. package/client/assets/Modal-C2sFA0zf.js.br +0 -0
  247. package/client/assets/Modal-C2sFA0zf.js.gz +0 -0
  248. package/client/assets/Modal-C2sFA0zf.js.map +0 -1
  249. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.br +0 -0
  250. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.gz +0 -0
  251. package/client/assets/OperatorExport-BUhxjLUx.js.br +0 -0
  252. package/client/assets/OperatorExport-BUhxjLUx.js.gz +0 -0
  253. package/client/assets/OverviewWrapper-BveJ6GjK.js +0 -2
  254. package/client/assets/OverviewWrapper-BveJ6GjK.js.br +0 -0
  255. package/client/assets/OverviewWrapper-BveJ6GjK.js.gz +0 -0
  256. package/client/assets/OverviewWrapper-BveJ6GjK.js.map +0 -1
  257. package/client/assets/ProjectInfo-z4k3cipS.js.br +0 -0
  258. package/client/assets/ProjectInfo-z4k3cipS.js.gz +0 -0
  259. package/client/assets/ProtectRoute-CrcWfOlG.js.br +0 -0
  260. package/client/assets/ProtectRoute-CrcWfOlG.js.gz +0 -0
  261. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.br +0 -0
  262. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.gz +0 -0
  263. package/client/assets/ProtectedEditor-C_SYWpL2.js +0 -3
  264. package/client/assets/ProtectedEditor-C_SYWpL2.js.br +0 -0
  265. package/client/assets/ProtectedEditor-C_SYWpL2.js.gz +0 -0
  266. package/client/assets/ProtectedEditor-C_SYWpL2.js.map +0 -1
  267. package/client/assets/RundownEntry-D61IqkXb.js.br +0 -0
  268. package/client/assets/RundownEntry-D61IqkXb.js.gz +0 -0
  269. package/client/assets/RundownExport-C6YhMGOC.js +0 -3
  270. package/client/assets/RundownExport-C6YhMGOC.js.br +0 -0
  271. package/client/assets/RundownExport-C6YhMGOC.js.gz +0 -0
  272. package/client/assets/RundownExport-C6YhMGOC.js.map +0 -1
  273. package/client/assets/Select-CedN80WS.js.br +0 -0
  274. package/client/assets/Select-CedN80WS.js.gz +0 -0
  275. package/client/assets/Studio-DUzPBS6P.js.br +0 -0
  276. package/client/assets/Studio-DUzPBS6P.js.gz +0 -0
  277. package/client/assets/StyleEditor-D2z65PB7.js.br +0 -0
  278. package/client/assets/StyleEditor-D2z65PB7.js.gz +0 -0
  279. package/client/assets/SuperscriptTime-CIrcMcyg.js.br +0 -0
  280. package/client/assets/SuperscriptTime-CIrcMcyg.js.gz +0 -0
  281. package/client/assets/TimeElements-CALNfv6u.js.br +0 -0
  282. package/client/assets/TimeElements-CALNfv6u.js.gz +0 -0
  283. package/client/assets/TimeInput-Dg1naiy3.js.br +0 -0
  284. package/client/assets/TimeInput-Dg1naiy3.js.gz +0 -0
  285. package/client/assets/TimelinePage-Cwm0svjN.js.br +0 -0
  286. package/client/assets/TimelinePage-Cwm0svjN.js.gz +0 -0
  287. package/client/assets/Timer-BVXskRjc.js.br +0 -0
  288. package/client/assets/Timer-BVXskRjc.js.gz +0 -0
  289. package/client/assets/Timer-BvEmZbmF.css.br +0 -0
  290. package/client/assets/Timer-BvEmZbmF.css.gz +0 -0
  291. package/client/assets/TimerControlExport-C8ECtLBd.js +0 -2
  292. package/client/assets/TimerControlExport-C8ECtLBd.js.br +0 -0
  293. package/client/assets/TimerControlExport-C8ECtLBd.js.gz +0 -0
  294. package/client/assets/TitleCard-CZl9wSHS.js.br +0 -0
  295. package/client/assets/TitleCard-CZl9wSHS.js.gz +0 -0
  296. package/client/assets/Tooltip-D9XRnwOW.js.br +0 -4
  297. package/client/assets/Tooltip-D9XRnwOW.js.gz +0 -0
  298. package/client/assets/ViewLogo-_3Z1hIHi.js.br +0 -0
  299. package/client/assets/ViewLogo-_3Z1hIHi.js.gz +0 -0
  300. package/client/assets/ViewParamsEditor-Bca1TIDW.js.br +0 -0
  301. package/client/assets/ViewParamsEditor-Bca1TIDW.js.gz +0 -0
  302. package/client/assets/dateConfig-DRQGMWDF.js.br +0 -0
  303. package/client/assets/dateConfig-DRQGMWDF.js.gz +0 -0
  304. package/client/assets/editorSettings-BU0pTMSY.js.br +0 -0
  305. package/client/assets/editorSettings-BU0pTMSY.js.gz +0 -0
  306. package/client/assets/getProgress-Cw79NL_O.js.br +0 -0
  307. package/client/assets/getProgress-Cw79NL_O.js.gz +0 -0
  308. package/client/assets/index-BQEUaoAf.js.br +0 -0
  309. package/client/assets/index-BQEUaoAf.js.gz +0 -0
  310. package/client/assets/offset-DJAHqjFW.js.br +0 -0
  311. package/client/assets/offset-DJAHqjFW.js.gz +0 -0
  312. package/client/assets/parseUserTime-BeTKj08M.js.br +0 -0
  313. package/client/assets/parseUserTime-BeTKj08M.js.gz +0 -0
  314. package/client/assets/playbackstate-B_khF6xU.js.br +0 -0
  315. package/client/assets/playbackstate-B_khF6xU.js.gz +0 -0
  316. package/client/assets/presentation.utils-KwY-ACf7.js.br +0 -0
  317. package/client/assets/presentation.utils-KwY-ACf7.js.gz +0 -0
  318. package/client/assets/rundownUtils-BZHazkXR.js.br +0 -0
  319. package/client/assets/rundownUtils-BZHazkXR.js.gz +0 -0
  320. package/client/assets/useCustomFields-DqCYz8Kt.js.br +0 -0
  321. package/client/assets/useCustomFields-DqCYz8Kt.js.gz +0 -0
  322. package/client/assets/useFollowComponent-Ctfhf2or.js.br +0 -0
  323. package/client/assets/useFollowComponent-Ctfhf2or.js.gz +0 -0
  324. package/client/assets/useProjectData-C1hVamxc.js.br +0 -0
  325. package/client/assets/useProjectData-C1hVamxc.js.gz +0 -0
  326. package/client/assets/useReport-B4dMYcNL.js.br +0 -0
  327. package/client/assets/useReport-B4dMYcNL.js.gz +0 -0
  328. package/client/assets/useRundown-BfpjcCEJ.js +0 -2
  329. package/client/assets/useRundown-BfpjcCEJ.js.br +0 -0
  330. package/client/assets/useRundown-BfpjcCEJ.js.gz +0 -0
  331. package/client/assets/useRundown-BfpjcCEJ.js.map +0 -1
  332. package/client/assets/useWindowTitle-DqdFTWns.js.br +0 -0
  333. package/client/assets/useWindowTitle-DqdFTWns.js.gz +0 -0
  334. package/client/assets/validateEvent-P9sf7C10.js.br +0 -3
  335. package/client/assets/validateEvent-P9sf7C10.js.gz +0 -0
  336. package/client/assets/vendor-CCiSQ9k9.js.br +0 -0
  337. package/client/assets/vendor-CCiSQ9k9.js.gz +0 -0
  338. package/client/assets/viewLoader.utils-CmM-4-pk.js.br +0 -0
  339. package/client/assets/viewLoader.utils-CmM-4-pk.js.gz +0 -0
@@ -1,2 +1,2 @@
1
- import{h as u,j as e,D as te,p as se,s as oe,t as ne,b0 as re,l as ie}from"./vendor-CCiSQ9k9.js";import{P as ae}from"./ProtectRoute-CrcWfOlG.js";import{ai as le,B as G,z as ce,bc as de,aA as ue,i as D,y as me,bd as pe,l as fe,M as he,be as ge,a_ as _e,c as be,P as ve,d as xe,L as je,o as ye,h as Se,O as Oe,t as we}from"./index-BQEUaoAf.js";import{r as Ee,i as H,j as Ce}from"./useRundown-BfpjcCEJ.js";import{E as Ne}from"./EmptyPage-Dcbg6rmF.js";import{m as Pe,e as Te,O as I,i as U,g as z,V as Fe}from"./ViewParamsEditor-Bca1TIDW.js";import{u as ke}from"./useFollowComponent-Ctfhf2or.js";import{u as De}from"./useWindowTitle-DqdFTWns.js";import{T as qe}from"./editorSettings-BU0pTMSY.js";import{u as Le}from"./dateConfig-DRQGMWDF.js";import{F as Me}from"./FollowButton-CSqJSvix.js";import{D as Re}from"./DelayIndicator-vT7n8ypf.js";import{f as Be,T as Ie,C as Ue}from"./TimeElements-CALNfv6u.js";import{M as Ae}from"./MultiPartProgressBar-D3jJZjb5.js";import{g as Ve,a as $e}from"./viewLoader.utils-CmM-4-pk.js";import{u as We}from"./useCustomFields-DqCYz8Kt.js";import"./useProjectData-C1hVamxc.js";import"./Empty-gWT_HMeu.js";import"./Select-CedN80WS.js";import"./validateEvent-P9sf7C10.js";import"./parseUserTime-BeTKj08M.js";import"./rundownUtils-BZHazkXR.js";import"./Tooltip-D9XRnwOW.js";import"./offset-DJAHqjFW.js";import"./playbackstate-B_khF6xU.js";import"./getProgress-Cw79NL_O.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]="b795dbe0-84e7-42c4-9399-fe9ef7bc3807",t._sentryDebugIdIdentifier="sentry-dbid-b795dbe0-84e7-42c4-9399-fe9ef7bc3807")}catch{}})();const Ge="_editModal_s63mb_17",He="_title_s63mb_31",ze="_body_s63mb_39",Ze="_label_s63mb_48",Qe="_footer_s63mb_54",E={editModal:Ge,title:He,body:ze,label:Ze,footer:Qe};function Je(t){const{event:s,onClose:o}=t,{updateEntry:r}=Le(),[n,i]=u.useState(!1),m=u.useRef(new Array),h=async()=>{if(!m.current)return;i(!0);const a={id:s.id};m.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(te,{open:!0,onOpenChange:a=>{a||o()},children:e.jsx(se,{children:e.jsxs(oe,{className:E.editModal,children:[e.jsxs("div",{className:E.title,children:[`Editing fields in cue ${s.cue}`,e.jsx(le,{variant:"subtle-white",onClick:o,disabled:n,children:e.jsx(ne,{})})]}),e.jsx("div",{className:E.body,children:s.subscriptions.map(a=>e.jsxs(u.Fragment,{children:[e.jsx("label",{htmlFor:a.id,className:E.label,style:{"--user-bg":a.colour},children:a.label}),e.jsx(qe,{name:a.id,ref:l=>{l&&m.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:E.footer,children:[e.jsx(G,{variant:"subtle",size:"large",onClick:o,disabled:n,children:"Cancel"}),e.jsx(G,{variant:"primary",size:"large",onClick:h,disabled:n,children:"Save"})]})]})})})}function Ke(t){const{value:s,hideSeconds:o,hideLeadingZero:r,className:n}=t;let i=Be(s,o||r?2:3);return r&&(i=ce(i)),o&&(i=de(i)),e.jsx("div",{className:n,children:i})}const Xe="_event_k7q3c_63",Ye="_running_k7q3c_80",et="_past_k7q3c_84",tt="_binder_k7q3c_89",st="_cue_k7q3c_98",ot="_mainField_k7q3c_108",nt="_secondaryField_k7q3c_117",rt="_plannedStart_k7q3c_124",it="_timeUntil_k7q3c_124",at="_runningTime_k7q3c_143",lt="_fields_k7q3c_154",ct="_field_k7q3c_154",dt="_noColour_k7q3c_170",ut="_value_k7q3c_176",d={event:Xe,running:Ye,past:et,binder:tt,cue:st,mainField:ot,secondaryField:nt,plannedStart:rt,timeUntil:it,runningTime:at,fields:lt,field:ct,noColour:dt,value:ut},Z=u.memo(mt);function mt({id:t,colour:s,cue:o,main:r,secondary:n,timeStart:i,duration:m,delay:h,dayOffset:a,isLinkedToLoaded:l,isSelected:g,isPast:x,selectedRef:N,showStart:P,subscribed:y,totalGap:S,onLongPress:T}){const _=f=>{f==null||f.preventDefault(),y&&T({id:t,cue:o,subscriptions:y})},b=re(_),q=s&&ue(s),O=D([d.event,g&&d.running,x&&d.past]);return e.jsxs("div",{className:O,"data-testid":o,ref:N,onContextMenu:_,...b,children:[e.jsx("div",{className:d.binder,style:{...q},children:e.jsx("span",{className:d.cue,children:o})}),e.jsxs("span",{className:d.mainField,children:[P&&e.jsx("span",{className:d.plannedStart,children:me(i)}),r]}),e.jsx("span",{className:d.secondaryField,children:n}),e.jsx(pt,{timeStart:i,isPast:x,isSelected:g,delay:h,dayOffset:a,totalGap:S,isLinkedToLoaded:l}),e.jsxs("span",{className:d.runningTime,children:[e.jsx(Re,{delayValue:h}),e.jsx(Ke,{className:D([g&&d.muted]),value:m,hideLeadingZero:!0})]}),e.jsx("div",{className:d.fields,children:y.filter(f=>f.value).map(f=>{const A=D([d.field,f.colour?null:d.noColour]);return e.jsxs("div",{children:[e.jsx("span",{className:A,style:{backgroundColor:f.colour},children:f.label}),e.jsx("span",{className:d.value,style:{color:f.colour},children:f.value})]},f.id)})})]})}function pt({timeStart:t,isPast:s,isSelected:o,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:m}){return s?e.jsx("span",{className:d.timeUntil,children:"DONE"}):o?e.jsx("span",{className:d.timeUntil,children:"LIVE"}):e.jsx(ft,{timeStart:t,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:m})}function ft({timeStart:t,delay:s,dayOffset:o,totalGap:r,isLinkedToLoaded:n}){const i=pe({timeStart:t,delay:s,dayOffset:o},{totalGap:r,isLinkedToLoaded:n}),h=i<ge?"DUE":`${fe(Math.abs(i),i>2*he)}`;return e.jsx("span",{className:d.timeUntil,"data-testid":"time-until",children:h})}const ht="_group_c6uj3_17",gt={group:ht},_t=u.memo(bt);function bt({title:t}){return e.jsx("div",{className:gt.group,children:t})}const vt="_statusBar_10qhq_17",xt="_timers_10qhq_25",jt="_runningTimer_10qhq_33",yt="_timeNow_10qhq_42",St="_progressOverride_10qhq_51",C={statusBar:vt,timers:xt,runningTimer:jt,timeNow:yt,progressOverride:St};function Ot({viewSettings:t}){const{current:s,duration:o,timeWarning:r,timeDanger:n}=_e();return e.jsx(Ae,{now:s,complete:o,normalColor:t.normalColor,warning:r,warningColor:t.warningColor,danger:n,dangerColor:t.dangerColor,className:C.progressOverride,ignoreCssOverride:!0})}function wt(){return e.jsxs("div",{className:C.timers,children:[e.jsx(Ie,{className:C.runningTimer}),e.jsx(Ue,{className:C.timeNow})]})}function Et(){const{data:t}=be();return e.jsxs("div",{className:C.statusBar,children:[e.jsx(wt,{}),t&&e.jsx(Ot,{viewSettings:t})]})}const Ct=(t,s)=>{const o=Pe(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),r=Te(t);return[{title:I.ClockOptions,collapsible:!0,options:[Ve(s)]},{title:I.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:I.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 Nt(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:U(o("shouldEdit")),hidePast:U(o("hidePast")),showStart:U(o("showStart"))}}function Pt(){const[t]=ie(),s=u.use(ve);return u.useMemo(()=>{const r=s?new URLSearchParams(s.search):void 0;return Nt(t,r)},[s,t])}function Q(t,s,o,r,n){const i=s?z(t,s)??"":t.title,m=z(t,o)??"",a=r.filter(l=>Object.hasOwn(n,l)).reduce((l,g)=>{const x=n[g];return x&&l.push({id:g,label:x.label,colour:x.colour,value:t.custom[g]}),l},[]);return{mainField:i,secondaryField:m,subscribedData:a}}function Tt(){const{data:t,rundownMetadata:s,status:o}=Ee(),{data:r,status:n}=We(),{data:i,status:m}=xe();return{data:{rundown:t,rundownMetadata:s,customFields:r,settings:i},status:$e([o,n,m])}}const Ft="_operatorContainer_1o5o0_17",kt="_operatorEvents_1o5o0_24",Dt="_editPrompt_1o5o0_35",qt="_show_1o5o0_49",k={operatorContainer:Ft,operatorEvents:kt,editPrompt:Dt,show:qt},J=50;function Lt(){const{data:t,status:s}=Tt();return De("Operator"),s==="pending"?e.jsx(je,{}):s==="error"?e.jsx(Ne,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Mt,{...t})}function Mt({rundown:t,rundownMetadata:s,customFields:o,settings:r}){const{selectedEventId:n}=ye(),{subscribe:i,mainSource:m,secondarySource:h,shouldEdit:a,hidePast:l,showStart:g}=Pt(),[x,N]=u.useState(!1),[P,y]=u.useState(null),[S,T]=u.useState(!1),_=u.useRef(null),b=u.useRef(null),q=ke({followRef:_,scrollRef:b,doFollow:!S,topOffset:J,followTrigger:n}),O=u.useRef(null);u.useEffect(()=>{var v;n||S||(v=b.current)==null||v.scrollTo(0,0)},[n,S,b]);const f=()=>{n&&q(),T(!1)},K=we(()=>{if(_!=null&&_.current&&(b!=null&&b.current)){const v=_.current.getBoundingClientRect(),c=b.current.getBoundingClientRect();if(v&&c){const j=v.top-c.top,p=j<-8||j>J;T(p)}}},1e3),V=()=>{O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{N(!1)},700),N(!0),K()},$=u.useCallback(v=>{y({...v})},[]),W=Se(r==null?void 0:r.timeFormat),X=u.useMemo(()=>Ct(o,W),[o,W]),L=a&&i.length;return e.jsxs("div",{className:k.operatorContainer,"data-testid":"operator-view",children:[e.jsx(Fe,{target:Oe.Operator,viewOptions:X}),P&&e.jsx(Je,{event:P,onClose:()=>y(null)}),e.jsx(Et,{}),L&&e.jsx("div",{className:D([k.editPrompt,x&&k.show]),children:"Press and hold to edit user field"}),e.jsx("div",{className:k.operatorEvents,onWheel:V,onTouchMove:V,ref:b,children:t.order.map(v=>{const c=t.entries[v];if(H(c)){const{isPast:j,isLinkedToLoaded:p,isLoaded:w,totalGap:F}=s[v];if(l&&j||c.skip)return null;const{mainField:M,secondaryField:R,subscribedData:B}=Q(c,m,h,i,o);return e.jsx(Z,{id:c.id,colour:c.colour,cue:c.cue,main:M,secondary:R,timeStart:c.timeStart,duration:c.duration,delay:c.delay,dayOffset:c.dayOffset,isLinkedToLoaded:p,isSelected:w,isPast:j,selectedRef:w?_:void 0,showStart:g,subscribed:B,totalGap:F,onLongPress:L?$:()=>{}},c.id)}return Ce(c)?e.jsxs(u.Fragment,{children:[e.jsx(_t,{title:c.title},c.id),c.entries.map(j=>{const p=t.entries[j];if(!H(p))return null;const{isPast:w,isLoaded:F,isLinkedToLoaded:M,totalGap:R}=s[j];if(l&&w||p.skip)return null;const{mainField:B,secondaryField:Y,subscribedData:ee}=Q(p,m,h,i,o);return e.jsx(Z,{id:p.id,colour:p.colour,cue:p.cue,main:B,secondary:Y,timeStart:p.timeStart,duration:p.duration,delay:p.delay,dayOffset:p.dayOffset,isLinkedToLoaded:M,isSelected:F,isPast:w,selectedRef:F?_:void 0,showStart:g,subscribed:ee,totalGap:R,onLongPress:L?$:()=>{}},p.id)})]},c.id):null})}),e.jsx(Me,{isVisible:S,onClickHandler:f})]})}function cs(){return e.jsx(ae,{permission:"operator",children:e.jsx(Lt,{})})}export{cs as default};
2
- //# sourceMappingURL=OperatorExport-BUhxjLUx.js.map
1
+ import{h as u,j as e,D as te,p as se,s as oe,t as ne,b0 as re,l as ie}from"./vendor-9UkPSc5K.js";import{P as ae}from"./ProtectRoute-DJ9xZnPI.js";import{ai as le,B as G,z as ce,bc as de,aA as ue,i as D,y as me,bd as pe,l as fe,M as he,be as ge,a_ as _e,c as be,P as ve,d as xe,L as je,o as ye,h as Se,O as Oe,t as we}from"./index-njXwwjfn.js";import{t as Ee,i as H,j as Ce}from"./useRundown-ihoU8qBi.js";import{E as Ne}from"./EmptyPage-BSzsxpGg.js";import{m as Pe,e as Te,O as I,i as U,g as z,V as Fe}from"./ViewParamsEditor-BFu_0oIb.js";import{u as ke}from"./useFollowComponent-Qo3FobyV.js";import{u as De}from"./useWindowTitle-B2UzPuki.js";import{T as qe}from"./editorSettings-CCHx-wCx.js";import{u as Le}from"./dateConfig-WYqMzV9D.js";import{F as Me}from"./FollowButton-Mox6N4JW.js";import{D as Re}from"./DelayIndicator-CFCDQ7FN.js";import{f as Be,T as Ie,C as Ue}from"./TimeElements-DlEBhXe0.js";import{M as Ae}from"./MultiPartProgressBar-BXQbpM-j.js";import{g as Ve,a as $e}from"./viewLoader.utils-DQGhrjSp.js";import{u as We}from"./useCustomFields-Da0Li7nQ.js";import"./useProjectData-DW06zQvF.js";import"./Empty-C-JO_XAr.js";import"./Select-BLA-yQMq.js";import"./validateEvent-BJMwP_mq.js";import"./parseUserTime-Bc1pSJR2.js";import"./rundownUtils-H6xvQyre.js";import"./Tooltip-C0rGHLsB.js";import"./offset-D1q-72D-.js";import"./playbackstate-BpzbtG9F.js";import"./getProgress-B94Ieskb.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]="40fb587a-8b70-4475-8ef7-61c053843665",t._sentryDebugIdIdentifier="sentry-dbid-40fb587a-8b70-4475-8ef7-61c053843665")}catch{}})();const Ge="_editModal_s63mb_17",He="_title_s63mb_31",ze="_body_s63mb_39",Ze="_label_s63mb_48",Qe="_footer_s63mb_54",E={editModal:Ge,title:He,body:ze,label:Ze,footer:Qe};function Je(t){const{event:s,onClose:o}=t,{updateEntry:r}=Le(),[n,i]=u.useState(!1),m=u.useRef(new Array),h=async()=>{if(!m.current)return;i(!0);const a={id:s.id};m.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(te,{open:!0,onOpenChange:a=>{a||o()},children:e.jsx(se,{children:e.jsxs(oe,{className:E.editModal,children:[e.jsxs("div",{className:E.title,children:[`Editing fields in cue ${s.cue}`,e.jsx(le,{variant:"subtle-white",onClick:o,disabled:n,children:e.jsx(ne,{})})]}),e.jsx("div",{className:E.body,children:s.subscriptions.map(a=>e.jsxs(u.Fragment,{children:[e.jsx("label",{htmlFor:a.id,className:E.label,style:{"--user-bg":a.colour},children:a.label}),e.jsx(qe,{name:a.id,ref:l=>{l&&m.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:E.footer,children:[e.jsx(G,{variant:"subtle",size:"large",onClick:o,disabled:n,children:"Cancel"}),e.jsx(G,{variant:"primary",size:"large",onClick:h,disabled:n,children:"Save"})]})]})})})}function Ke(t){const{value:s,hideSeconds:o,hideLeadingZero:r,className:n}=t;let i=Be(s,o||r?2:3);return r&&(i=ce(i)),o&&(i=de(i)),e.jsx("div",{className:n,children:i})}const Xe="_event_k7q3c_63",Ye="_running_k7q3c_80",et="_past_k7q3c_84",tt="_binder_k7q3c_89",st="_cue_k7q3c_98",ot="_mainField_k7q3c_108",nt="_secondaryField_k7q3c_117",rt="_plannedStart_k7q3c_124",it="_timeUntil_k7q3c_124",at="_runningTime_k7q3c_143",lt="_fields_k7q3c_154",ct="_field_k7q3c_154",dt="_noColour_k7q3c_170",ut="_value_k7q3c_176",d={event:Xe,running:Ye,past:et,binder:tt,cue:st,mainField:ot,secondaryField:nt,plannedStart:rt,timeUntil:it,runningTime:at,fields:lt,field:ct,noColour:dt,value:ut},Z=u.memo(mt);function mt({id:t,colour:s,cue:o,main:r,secondary:n,timeStart:i,duration:m,delay:h,dayOffset:a,isLinkedToLoaded:l,isSelected:g,isPast:x,selectedRef:N,showStart:P,subscribed:y,totalGap:S,onLongPress:T}){const _=f=>{f==null||f.preventDefault(),y&&T({id:t,cue:o,subscriptions:y})},b=re(_),q=s&&ue(s),O=D([d.event,g&&d.running,x&&d.past]);return e.jsxs("div",{className:O,"data-testid":o,ref:N,onContextMenu:_,...b,children:[e.jsx("div",{className:d.binder,style:{...q},children:e.jsx("span",{className:d.cue,children:o})}),e.jsxs("span",{className:d.mainField,children:[P&&e.jsx("span",{className:d.plannedStart,children:me(i)}),r]}),e.jsx("span",{className:d.secondaryField,children:n}),e.jsx(pt,{timeStart:i,isPast:x,isSelected:g,delay:h,dayOffset:a,totalGap:S,isLinkedToLoaded:l}),e.jsxs("span",{className:d.runningTime,children:[e.jsx(Re,{delayValue:h}),e.jsx(Ke,{className:D([g&&d.muted]),value:m,hideLeadingZero:!0})]}),e.jsx("div",{className:d.fields,children:y.filter(f=>f.value).map(f=>{const A=D([d.field,f.colour?null:d.noColour]);return e.jsxs("div",{children:[e.jsx("span",{className:A,style:{backgroundColor:f.colour},children:f.label}),e.jsx("span",{className:d.value,style:{color:f.colour},children:f.value})]},f.id)})})]})}function pt({timeStart:t,isPast:s,isSelected:o,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:m}){return s?e.jsx("span",{className:d.timeUntil,children:"DONE"}):o?e.jsx("span",{className:d.timeUntil,children:"LIVE"}):e.jsx(ft,{timeStart:t,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:m})}function ft({timeStart:t,delay:s,dayOffset:o,totalGap:r,isLinkedToLoaded:n}){const i=pe({timeStart:t,delay:s,dayOffset:o},{totalGap:r,isLinkedToLoaded:n}),h=i<ge?"DUE":`${fe(Math.abs(i),i>2*he)}`;return e.jsx("span",{className:d.timeUntil,"data-testid":"time-until",children:h})}const ht="_group_c6uj3_17",gt={group:ht},_t=u.memo(bt);function bt({title:t}){return e.jsx("div",{className:gt.group,children:t})}const vt="_statusBar_10qhq_17",xt="_timers_10qhq_25",jt="_runningTimer_10qhq_33",yt="_timeNow_10qhq_42",St="_progressOverride_10qhq_51",C={statusBar:vt,timers:xt,runningTimer:jt,timeNow:yt,progressOverride:St};function Ot({viewSettings:t}){const{current:s,duration:o,timeWarning:r,timeDanger:n}=_e();return e.jsx(Ae,{now:s,complete:o,normalColor:t.normalColor,warning:r,warningColor:t.warningColor,danger:n,dangerColor:t.dangerColor,className:C.progressOverride,ignoreCssOverride:!0})}function wt(){return e.jsxs("div",{className:C.timers,children:[e.jsx(Ie,{className:C.runningTimer}),e.jsx(Ue,{className:C.timeNow})]})}function Et(){const{data:t}=be();return e.jsxs("div",{className:C.statusBar,children:[e.jsx(wt,{}),t&&e.jsx(Ot,{viewSettings:t})]})}const Ct=(t,s)=>{const o=Pe(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),r=Te(t);return[{title:I.ClockOptions,collapsible:!0,options:[Ve(s)]},{title:I.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:I.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 Nt(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:U(o("shouldEdit")),hidePast:U(o("hidePast")),showStart:U(o("showStart"))}}function Pt(){const[t]=ie(),s=u.use(ve);return u.useMemo(()=>{const r=s?new URLSearchParams(s.search):void 0;return Nt(t,r)},[s,t])}function Q(t,s,o,r,n){const i=s?z(t,s)??"":t.title,m=z(t,o)??"",a=r.filter(l=>Object.hasOwn(n,l)).reduce((l,g)=>{const x=n[g];return x&&l.push({id:g,label:x.label,colour:x.colour,value:t.custom[g]}),l},[]);return{mainField:i,secondaryField:m,subscribedData:a}}function Tt(){const{data:t,rundownMetadata:s,status:o}=Ee(),{data:r,status:n}=We(),{data:i,status:m}=xe();return{data:{rundown:t,rundownMetadata:s,customFields:r,settings:i},status:$e([o,n,m])}}const Ft="_operatorContainer_1o5o0_17",kt="_operatorEvents_1o5o0_24",Dt="_editPrompt_1o5o0_35",qt="_show_1o5o0_49",k={operatorContainer:Ft,operatorEvents:kt,editPrompt:Dt,show:qt},J=50;function Lt(){const{data:t,status:s}=Tt();return De("Operator"),s==="pending"?e.jsx(je,{}):s==="error"?e.jsx(Ne,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Mt,{...t})}function Mt({rundown:t,rundownMetadata:s,customFields:o,settings:r}){const{selectedEventId:n}=ye(),{subscribe:i,mainSource:m,secondarySource:h,shouldEdit:a,hidePast:l,showStart:g}=Pt(),[x,N]=u.useState(!1),[P,y]=u.useState(null),[S,T]=u.useState(!1),_=u.useRef(null),b=u.useRef(null),q=ke({followRef:_,scrollRef:b,doFollow:!S,topOffset:J,followTrigger:n}),O=u.useRef(null);u.useEffect(()=>{var v;n||S||(v=b.current)==null||v.scrollTo(0,0)},[n,S,b]);const f=()=>{n&&q(),T(!1)},K=we(()=>{if(_!=null&&_.current&&(b!=null&&b.current)){const v=_.current.getBoundingClientRect(),c=b.current.getBoundingClientRect();if(v&&c){const j=v.top-c.top,p=j<-8||j>J;T(p)}}},1e3),V=()=>{O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{N(!1)},700),N(!0),K()},$=u.useCallback(v=>{y({...v})},[]),W=Se(r==null?void 0:r.timeFormat),X=u.useMemo(()=>Ct(o,W),[o,W]),L=a&&i.length;return e.jsxs("div",{className:k.operatorContainer,"data-testid":"operator-view",children:[e.jsx(Fe,{target:Oe.Operator,viewOptions:X}),P&&e.jsx(Je,{event:P,onClose:()=>y(null)}),e.jsx(Et,{}),L&&e.jsx("div",{className:D([k.editPrompt,x&&k.show]),children:"Press and hold to edit user field"}),e.jsx("div",{className:k.operatorEvents,onWheel:V,onTouchMove:V,ref:b,children:t.order.map(v=>{const c=t.entries[v];if(H(c)){const{isPast:j,isLinkedToLoaded:p,isLoaded:w,totalGap:F}=s[v];if(l&&j||c.skip)return null;const{mainField:M,secondaryField:R,subscribedData:B}=Q(c,m,h,i,o);return e.jsx(Z,{id:c.id,colour:c.colour,cue:c.cue,main:M,secondary:R,timeStart:c.timeStart,duration:c.duration,delay:c.delay,dayOffset:c.dayOffset,isLinkedToLoaded:p,isSelected:w,isPast:j,selectedRef:w?_:void 0,showStart:g,subscribed:B,totalGap:F,onLongPress:L?$:()=>{}},c.id)}return Ce(c)?e.jsxs(u.Fragment,{children:[e.jsx(_t,{title:c.title},c.id),c.entries.map(j=>{const p=t.entries[j];if(!H(p))return null;const{isPast:w,isLoaded:F,isLinkedToLoaded:M,totalGap:R}=s[j];if(l&&w||p.skip)return null;const{mainField:B,secondaryField:Y,subscribedData:ee}=Q(p,m,h,i,o);return e.jsx(Z,{id:p.id,colour:p.colour,cue:p.cue,main:B,secondary:Y,timeStart:p.timeStart,duration:p.duration,delay:p.delay,dayOffset:p.dayOffset,isLinkedToLoaded:M,isSelected:F,isPast:w,selectedRef:F?_:void 0,showStart:g,subscribed:ee,totalGap:R,onLongPress:L?$:()=>{}},p.id)})]},c.id):null})}),e.jsx(Me,{isVisible:S,onClickHandler:f})]})}function cs(){return e.jsx(ae,{permission:"operator",children:e.jsx(Lt,{})})}export{cs as default};
2
+ //# sourceMappingURL=OperatorExport-C50KHBrD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OperatorExport-BUhxjLUx.js","sources":["../../src/features/operator/edit-modal/EditModal.tsx","../../src/features/viewers/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-components/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 './EditModal.module.scss';\n\ninterface EditModalProps {\n event: EditEvent;\n onClose: () => void;\n}\n\nexport default function EditModal(props: EditModalProps) {\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","/**\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 '../../../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 { memo, RefObject, SyntheticEvent } from 'react';\nimport { useLongPress } from '@mantine/hooks';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString } from 'ontime-utils';\n\nimport DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, useTimeUntilExpectedStart } from '../../../common/utils/time';\nimport RunningTime from '../../viewers/common/running-time/RunningTime';\nimport type { EditEvent, Subscribed } from '../operator.types';\n\nimport style from './OperatorEvent.module.scss';\n\ninterface OperatorEventProps {\n id: string;\n colour: string;\n cue: string;\n main: string;\n secondary: string;\n timeStart: number;\n duration: number;\n delay: number;\n dayOffset: number;\n isLinkedToLoaded: boolean;\n isSelected: boolean;\n isPast: boolean;\n selectedRef?: RefObject<HTMLDivElement | null>;\n showStart: boolean;\n subscribed: Subscribed;\n totalGap: number;\n onLongPress: (event: EditEvent) => void;\n}\n\nexport default memo(OperatorEvent);\nfunction OperatorEvent({\n id,\n colour,\n cue,\n main,\n secondary,\n timeStart,\n duration,\n delay,\n dayOffset,\n isLinkedToLoaded,\n isSelected,\n isPast,\n selectedRef,\n showStart,\n subscribed,\n totalGap,\n onLongPress,\n}: OperatorEventProps) {\n /**\n * gather behaviour for long press and context menu\n */\n const handleLongPress = (event?: SyntheticEvent) => {\n // we dont have an event out of useLongPress\n event?.preventDefault();\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([\n style.event,\n isSelected && style.running,\n isPast && style.past,\n ]);\n\n return (\n <div className={operatorClasses} data-testid={cue} ref={selectedRef} onContextMenu={handleLongPress} {...mouseHandlers}>\n <div className={style.binder} style={{ ...cueColours }}>\n <span className={style.cue}>{cue}</span>\n </div>\n\n <span className={style.mainField}>\n {showStart && <span className={style.plannedStart}>{millisToString(timeStart)}</span>}\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={style.fields}>\n {subscribed\n .filter((field) => field.value)\n .map((field) => {\n const fieldClasses = cx([style.field, !field.colour ? style.noColour : null]);\n return (\n <div key={field.id}>\n <span className={fieldClasses} style={{ backgroundColor: field.colour }}>\n {field.label}\n </span>\n <span className={style.value} style={{ color: field.colour }}>\n {field.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface OperatorEventScheduleProps {\n timeStart: number;\n isPast: boolean;\n isSelected: boolean;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction OperatorEventSchedule({\n timeStart,\n isPast,\n isSelected,\n delay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n}: OperatorEventScheduleProps) {\n if (isPast) {\n return <span className={style.timeUntil}>DONE</span>;\n }\n\n if (isSelected) {\n return <span className={style.timeUntil}>LIVE</span>;\n }\n\n return (\n <TimeUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n );\n}\n\ninterface TimeUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction TimeUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: TimeUntilProps) {\n // we isolate this to avoid unnecessary re-renders\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n\n const isDue = timeUntil < MILLIS_PER_SECOND;\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return <span className={style.timeUntil} data-testid='time-until'>{timeUntilString}</span>;\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} />\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 '../viewers/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 '../viewers/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 Loader from '../../views/common/loader/Loader';\n\nimport EditModal from './edit-modal/EditModal';\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 && <EditModal event={editEvent} onClose={() => setEditEvent(null)} />}\n\n <StatusBar />\n\n {canEdit && (\n <div className={cx([style.editPrompt, showEditPrompt && style.show])}>Press and hold to edit user field</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 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":["EditModal","props","event","onClose","updateEntry","useEntryActions","loading","setLoading","useState","inputRef","useRef","handleSave","patchObject","element","jsx","Dialog.Root","isOpen","Dialog.Portal","jsxs","Dialog.Popup","style","IconButton","IoClose","field","Fragment","Textarea","Button","RunningTime","value","hideSeconds","hideLeadingZero","className","display","formattedTime","removeLeadingZero","removeSeconds","memo","OperatorEvent","id","colour","cue","main","secondary","timeStart","duration","delay","dayOffset","isLinkedToLoaded","isSelected","isPast","selectedRef","showStart","subscribed","totalGap","onLongPress","handleLongPress","mouseHandlers","useLongPress","cueColours","getAccessibleColour","operatorClasses","cx","millisToString","OperatorEventSchedule","DelayIndicator","fieldClasses","TimeUntil","timeUntil","useTimeUntilExpectedStart","timeUntilString","MILLIS_PER_SECOND","formatDuration","MILLIS_PER_MINUTE","OperatorGroup","title","StatusBarProgress","viewSettings","current","timeWarning","timeDanger","useProgressData","MultiPartProgressBar","styles","StatusBarTimers","TimerOverview","ClockOverview","StatusBar","data","useViewSettings","getOperatorOptions","customFields","timeFormat","fieldOptions","makeOptionsFromCustomFields","customFieldSelect","makeCustomFieldSelectOptions","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","getArrayValues","isStringBoolean","useOperatorOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","getEventData","subscriptions","mainField","getPropertyValue","secondaryField","subscribedData","acc","useOperatorData","rundown","rundownMetadata","rundownStatus","useRundownWithMetadata","customFieldStatus","useCustomFields","settings","settingsStatus","useSettings","aggregateQueryStatus","selectedOffset","OperatorLoader","status","useWindowTitle","Loader","EmptyPage","Operator","selectedEventId","useSelectedEventId","subscribe","mainSource","secondarySource","shouldEdit","hidePast","showEditPrompt","setShowEditPrompt","editEvent","setEditEvent","lockAutoScroll","setLockAutoScroll","scrollRef","scrollToComponent","useFollowComponent","timeoutId","useEffect","_a","handleOffset","throttledHandleScroll","throttle","selectedRect","scrollerRect","distanceFromTop","hasScrolledOutOfThreshold","handleScroll","handleEdit","useCallback","defaultFormat","getDefaultFormat","operatorOptions","canEdit","ViewParamsEditor","OntimeView","entryId","entry","isOntimeEvent","isLoaded","isOntimeGroup","nestedEntryId","nestedEntry","FollowButton","OperatorExport","ProtectRoute"],"mappings":"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"}
1
+ {"version":3,"file":"OperatorExport-C50KHBrD.js","sources":["../../src/features/operator/edit-modal/EditModal.tsx","../../src/features/viewers/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-components/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 './EditModal.module.scss';\n\ninterface EditModalProps {\n event: EditEvent;\n onClose: () => void;\n}\n\nexport default function EditModal(props: EditModalProps) {\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","/**\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 '../../../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 { memo, RefObject, SyntheticEvent } from 'react';\nimport { useLongPress } from '@mantine/hooks';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString } from 'ontime-utils';\n\nimport DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, useTimeUntilExpectedStart } from '../../../common/utils/time';\nimport RunningTime from '../../viewers/common/running-time/RunningTime';\nimport type { EditEvent, Subscribed } from '../operator.types';\n\nimport style from './OperatorEvent.module.scss';\n\ninterface OperatorEventProps {\n id: string;\n colour: string;\n cue: string;\n main: string;\n secondary: string;\n timeStart: number;\n duration: number;\n delay: number;\n dayOffset: number;\n isLinkedToLoaded: boolean;\n isSelected: boolean;\n isPast: boolean;\n selectedRef?: RefObject<HTMLDivElement | null>;\n showStart: boolean;\n subscribed: Subscribed;\n totalGap: number;\n onLongPress: (event: EditEvent) => void;\n}\n\nexport default memo(OperatorEvent);\nfunction OperatorEvent({\n id,\n colour,\n cue,\n main,\n secondary,\n timeStart,\n duration,\n delay,\n dayOffset,\n isLinkedToLoaded,\n isSelected,\n isPast,\n selectedRef,\n showStart,\n subscribed,\n totalGap,\n onLongPress,\n}: OperatorEventProps) {\n /**\n * gather behaviour for long press and context menu\n */\n const handleLongPress = (event?: SyntheticEvent) => {\n // we dont have an event out of useLongPress\n event?.preventDefault();\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([\n style.event,\n isSelected && style.running,\n isPast && style.past,\n ]);\n\n return (\n <div className={operatorClasses} data-testid={cue} ref={selectedRef} onContextMenu={handleLongPress} {...mouseHandlers}>\n <div className={style.binder} style={{ ...cueColours }}>\n <span className={style.cue}>{cue}</span>\n </div>\n\n <span className={style.mainField}>\n {showStart && <span className={style.plannedStart}>{millisToString(timeStart)}</span>}\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={style.fields}>\n {subscribed\n .filter((field) => field.value)\n .map((field) => {\n const fieldClasses = cx([style.field, !field.colour ? style.noColour : null]);\n return (\n <div key={field.id}>\n <span className={fieldClasses} style={{ backgroundColor: field.colour }}>\n {field.label}\n </span>\n <span className={style.value} style={{ color: field.colour }}>\n {field.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface OperatorEventScheduleProps {\n timeStart: number;\n isPast: boolean;\n isSelected: boolean;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction OperatorEventSchedule({\n timeStart,\n isPast,\n isSelected,\n delay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n}: OperatorEventScheduleProps) {\n if (isPast) {\n return <span className={style.timeUntil}>DONE</span>;\n }\n\n if (isSelected) {\n return <span className={style.timeUntil}>LIVE</span>;\n }\n\n return (\n <TimeUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n );\n}\n\ninterface TimeUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction TimeUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: TimeUntilProps) {\n // we isolate this to avoid unnecessary re-renders\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n\n const isDue = timeUntil < MILLIS_PER_SECOND;\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return <span className={style.timeUntil} data-testid='time-until'>{timeUntilString}</span>;\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} />\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 '../viewers/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 '../viewers/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 Loader from '../../views/common/loader/Loader';\n\nimport EditModal from './edit-modal/EditModal';\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 && <EditModal event={editEvent} onClose={() => setEditEvent(null)} />}\n\n <StatusBar />\n\n {canEdit && (\n <div className={cx([style.editPrompt, showEditPrompt && style.show])}>Press and hold to edit user field</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 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":["EditModal","props","event","onClose","updateEntry","useEntryActions","loading","setLoading","useState","inputRef","useRef","handleSave","patchObject","element","jsx","Dialog.Root","isOpen","Dialog.Portal","jsxs","Dialog.Popup","style","IconButton","IoClose","field","Fragment","Textarea","Button","RunningTime","value","hideSeconds","hideLeadingZero","className","display","formattedTime","removeLeadingZero","removeSeconds","memo","OperatorEvent","id","colour","cue","main","secondary","timeStart","duration","delay","dayOffset","isLinkedToLoaded","isSelected","isPast","selectedRef","showStart","subscribed","totalGap","onLongPress","handleLongPress","mouseHandlers","useLongPress","cueColours","getAccessibleColour","operatorClasses","cx","millisToString","OperatorEventSchedule","DelayIndicator","fieldClasses","TimeUntil","timeUntil","useTimeUntilExpectedStart","timeUntilString","MILLIS_PER_SECOND","formatDuration","MILLIS_PER_MINUTE","OperatorGroup","title","StatusBarProgress","viewSettings","current","timeWarning","timeDanger","useProgressData","MultiPartProgressBar","styles","StatusBarTimers","TimerOverview","ClockOverview","StatusBar","data","useViewSettings","getOperatorOptions","customFields","timeFormat","fieldOptions","makeOptionsFromCustomFields","customFieldSelect","makeCustomFieldSelectOptions","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","getArrayValues","isStringBoolean","useOperatorOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","getEventData","subscriptions","mainField","getPropertyValue","secondaryField","subscribedData","acc","useOperatorData","rundown","rundownMetadata","rundownStatus","useRundownWithMetadata","customFieldStatus","useCustomFields","settings","settingsStatus","useSettings","aggregateQueryStatus","selectedOffset","OperatorLoader","status","useWindowTitle","Loader","EmptyPage","Operator","selectedEventId","useSelectedEventId","subscribe","mainSource","secondarySource","shouldEdit","hidePast","showEditPrompt","setShowEditPrompt","editEvent","setEditEvent","lockAutoScroll","setLockAutoScroll","scrollRef","scrollToComponent","useFollowComponent","timeoutId","useEffect","_a","handleOffset","throttledHandleScroll","throttle","selectedRect","scrollerRect","distanceFromTop","hasScrolledOutOfThreshold","handleScroll","handleEdit","useCallback","defaultFormat","getDefaultFormat","operatorOptions","canEdit","ViewParamsEditor","OntimeView","entryId","entry","isOntimeEvent","isLoaded","isOntimeGroup","nestedEntryId","nestedEntry","FollowButton","OperatorExport","ProtectRoute"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e,aY as ee,aZ as te,a_ as ae,f as se,a$ as ie,h as d,ad as re,ab as ne,aw as le}from"./vendor-9UkPSc5K.js";import{i as X,ah as oe,ae as j,ar as g,b7 as T,b8 as ce,aq as de,O as x,a9 as ue,ac as he,Y as V,ad as S,af as fe,X as me,a7 as pe,B as ve,_ as be,an as xe,b9 as M,ba as Y,ag as je,al as ge,au as _e,bb as we}from"./index-njXwwjfn.js";import{I as Ce}from"./useWindowTitle-B2UzPuki.js";import{S as H}from"./Select-BLA-yQMq.js";import{S as _,u as ke}from"./useProjectData-DW06zQvF.js";import{u as ye}from"./useCustomFields-Da0Li7nQ.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]="9aa8078a-d67a-43a4-9130-b662c668de6f",s._sentryDebugIdIdentifier="sentry-dbid-9aa8078a-d67a-43a4-9130-b662c668de6f")}catch{}})();const st=/^\d+$/,it=/^https?:\/\//,rt=/^[a-z0-9]+$/i,Se=/^[a-zA-Z0-9_-]*$/,Oe="_blink_1cc8f_1",Re="_fourtyfive_1cc8f_13",Ne="_radioGroup_1cc8f_17",Ie="_item_1cc8f_23",$e="_horizontal_1cc8f_28",De="_vertical_1cc8f_35",Ue="_radio_1cc8f_17",We="_indicator_1cc8f_73",I={blink:Oe,fourtyfive:Re,radioGroup:Ne,item:Ie,horizontal:$e,vertical:De,radio:Ue,indicator:We};function Z({items:s,className:r,orientation:n="vertical",onValueChange:o,...h}){return e.jsx(ee,{onValueChange:l=>o==null?void 0:o(l),className:X([I.radioGroup,I[n],r]),...h,children:s.map(l=>e.jsxs("label",{className:I.item,children:[e.jsx(te,{value:l.value.toString(),className:I.radio,children:e.jsx(ae,{className:I.indicator})}),l.label]},l.value.toString()))})}const K={hideTableSeconds:!1,hideIndexColumn:!1,showDelayedTimes:!1,hideDelays:!1},nt=se()(ie(s=>({...K,setOption:(r,n)=>s(o=>({...o,[r]:n})),toggleOption:r=>s(n=>({...n,[r]:!n[r]})),resetOptions:()=>s(K)}),{name:"cuesheet-options"})),W=[{value:"flag",label:"Flag"},{value:"cue",label:"Cue"},{value:"title",label:"Title"},{value:"timeStart",label:"Time start"},{value:"timeEnd",label:"Time end"},{value:"duration",label:"Duration"},{value:"note",label:"Note"}];function Ee(s){return Object.entries(s).map(([r,n])=>({value:`custom-${r}`,label:n.label}))}const ze="_twoCols_1wch9_17",Fe="_grid_1wch9_23",G={twoCols:ze,grid:Fe};function Le({readRef:s,writeRef:r}){const{data:n}=ye(),o=d.useMemo(()=>Ee(n),[n]),[h,l]=d.useState("full"),[u,$]=d.useState("full"),[w,C]=d.useState(()=>{const t={};return[...W,...o].forEach(i=>{t[i.value]=!0}),t}),[R,D]=d.useState(()=>{const t={};return[...W,...o].forEach(i=>{t[i.value]=!0}),t}),z=t=>{l(t),C(i=>{const f={...i};return Object.keys(f).forEach(m=>{f[m]=!0}),f})},F=t=>{t==="full"&&l("full"),$(t),C(i=>{const f={...i};return D(m=>{const k={...m};return[...W,...o].forEach(N=>{f[N.value]=!0,k[N.value]=!0}),k}),f})},c=(t,i,f)=>{i==="read"?C(m=>({...m,[t]:f})):D(m=>({...m,[t]:f}))},p=()=>h==="full"||u==="full"?"full":Object.entries(w).filter(([t,i])=>i).map(([t])=>t).join(","),L=()=>u==="full"?"full":Object.entries(R).filter(([t,i])=>i).map(([t])=>t).join(",");return e.jsxs(oe,{children:[e.jsx("input",{name:"read",hidden:!0,readOnly:!0,ref:s,value:p()||"-"}),e.jsx("input",{name:"write",hidden:!0,readOnly:!0,ref:r,value:L()||"-"}),e.jsxs("div",{children:[e.jsx(j,{title:"Access mode",description:"Which parts of the data will the link give access to"}),e.jsxs("div",{children:[e.jsx(Z,{value:u,onValueChange:F,orientation:"horizontal",items:[{value:"full",label:"Full write (edit all existing and future columns)"},{value:"custom",label:"Custom write"}]}),e.jsx(Z,{value:h,onValueChange:z,orientation:"horizontal",disabled:u==="full",items:[{value:"full",label:"Full read (view all existing and future columns)"},{value:"custom",label:"Custom read"}]})]})]}),e.jsxs("div",{className:G.twoCols,children:[e.jsxs("div",{className:G.grid,children:[e.jsx(g,{children:"Ontime columns"}),e.jsx(g,{children:"Read"}),e.jsx(g,{children:"Write"}),W.map(t=>e.jsxs(d.Fragment,{children:[e.jsx("div",{children:t.label}),e.jsx(_,{checked:!!w[t.value],onCheckedChange:i=>c(t.value,"read",i),disabled:h==="full"||u==="full","data-testid":`read-${t.value}`}),e.jsx(_,{checked:!!R[t.value],onCheckedChange:i=>c(t.value,"write",i),disabled:u==="full","data-testid":`write-${t.value}`})]},t.value))]}),o.length>0&&e.jsxs("div",{className:G.grid,children:[e.jsx(g,{children:"Custom fields"}),e.jsx(g,{children:"Read"}),e.jsx(g,{children:"Write"}),o.map(t=>e.jsxs(d.Fragment,{children:[t.label,e.jsx(_,{checked:!!w[t.value],onCheckedChange:i=>c(t.value,"read",i),disabled:h==="full"||u==="full","data-testid":`read-${t.value}`}),e.jsx(_,{checked:!!R[t.value],onCheckedChange:i=>c(t.value,"write",i),disabled:u==="full","data-testid":`write-${t.value}`})]},t.value))]})]})]})}const Pe="_qrCode_kmiy6_17",Te="_column_kmiy6_23",Ge="_copiableLink_kmiy6_32",Be="_shareInline_kmiy6_39",qe="_end_kmiy6_45",O={qrCode:Pe,column:Te,copiableLink:Ge,shareInline:Be,end:qe};function Ae({hostOptions:s,pathOptions:r,presets:n,isLockedToView:o}){var B,q;const[h,l]=d.useState("pending"),[u,$]=d.useState(T),w=d.useRef(null),C=d.useRef(null),R=d.useRef(`cuesheet-${ce()}`),{addPreset:D}=de(),{handleSubmit:z,setError:F,watch:c,setValue:p,reset:L,register:t,formState:{errors:i,isDirty:f}}=re({mode:"onChange",defaultValues:{baseUrl:T,path:o?r[0].value:x.Timer,authenticate:!1,lockConfig:!1,lockNav:!1}}),m=async(a,y)=>{if(y.read==="-")throw new Error("Cannot create a share with no read permissions");return(await D({target:x.Cuesheet,enabled:!0,alias:a,search:"",options:{read:y.read,write:y.write}})).find(U=>U.alias===a)},k=async a=>{var y,P,U;try{if(l("loading"),a.path===x.Cuesheet){const v=await m(a.alias,{read:((y=w.current)==null?void 0:y.value)??"full",write:((P=C.current)==null?void 0:P.value)??"full"});if(!v)throw new Error("Failed to create URL preset for Cuesheet");const b=await M({baseUrl:a.baseUrl,path:a.path,authenticate:a.authenticate,lockConfig:a.lockConfig,lockNav:a.lockNav,preset:v.alias});await Y(b),$(b)}else{const v=a.path.startsWith("preset-")?a.path.replace("preset-",""):void 0,b=v?(U=n.find(J=>J.alias===v))==null?void 0:U.target:a.path;if(!b)throw new Error(`Could not resolve preset: ${b}`);const A=await M({baseUrl:a.baseUrl,path:b,authenticate:a.authenticate,lockConfig:a.lockConfig,lockNav:a.lockNav,preset:v});await Y(A),$(A)}L(a,{keepValues:!0,keepDirty:!1}),l("success")}catch(v){const b=je(v);F("root",{message:b}),l("error")}},N=f||h!=="success";return e.jsxs("form",{onSubmit:z(k),onKeyDown:a=>ue(a),children:[!o&&e.jsx(Ce,{children:"You can generate a link to share with your team or to use in automation (such as companion)."}),e.jsxs("div",{className:O.shareInline,children:[e.jsxs("div",{className:O.column,children:[e.jsxs(he,{children:[V?e.jsx("input",{hidden:!0,readOnly:!0,name:"baseUrl",value:T}):e.jsxs(S,{children:[e.jsx(j,{title:"Host IP",description:`Which IP address will be used${V?" (not applicable in Ontime Cloud)":""}`}),e.jsx(H,{options:s,value:c("baseUrl"),onValueChange:a=>p("baseUrl",a)})]}),o?e.jsx("input",{type:"hidden",value:c("path")}):e.jsxs(S,{children:[e.jsx(j,{title:"Ontime view",description:"Which view or preset will the link point to"}),e.jsx(H,{options:r,value:c("path"),onValueChange:a=>p("path",a,{shouldDirty:!0})})]}),c("path")===x.Cuesheet&&e.jsxs(e.Fragment,{children:[e.jsxs(S,{children:[e.jsx(j,{title:"Preset alias",description:"The name of the preset we will create to hold this options",error:(B=i.alias)==null?void 0:B.message}),e.jsx(fe,{defaultValue:R.current,...t("alias",{required:"Alias cannot be empty and must be unique",pattern:{value:Se,message:"Field can only contain URL safe characters (a-z, 0-9, _ and -)"}})})]}),e.jsx(Le,{readRef:w,writeRef:C})]}),e.jsxs(S,{children:[e.jsx(j,{title:"Lock navigation",description:"Whether to hide the navigation menu"}),e.jsx(_,{size:"large",name:"lockNav","data-testid":"lockNav",checked:c("lockNav"),onCheckedChange:a=>p("lockNav",a,{shouldDirty:!0}),disabled:c("lockConfig")})]}),c("path")!==x.Cuesheet&&e.jsxs(S,{children:[e.jsx(j,{title:"Lock configuration",description:"Whether to hide the configuration panel (also hides navigation)"}),e.jsx(_,{size:"large",name:"lockConfig","data-testid":"lockConfig",checked:c("lockConfig"),onCheckedChange:a=>{a&&p("lockNav",a,{shouldDirty:!0}),p("lockConfig",a,{shouldDirty:!0})}})]}),e.jsxs(S,{children:[e.jsx(j,{title:"Authenticate",description:"Whether the URL should be pre-authenticated"}),e.jsx(_,{size:"large",name:"authenticate","data-testid":"authenticate",checked:c("authenticate"),onCheckedChange:a=>p("authenticate",a,{shouldDirty:!0})})]})]}),e.jsx(me,{children:(q=i.root)==null?void 0:q.message}),e.jsx(pe,{align:"end",className:O.end,children:e.jsx(ve,{type:"submit",variant:N?"primary":"subtle",loading:h==="loading",children:N?"Create share link":"Link copied to clipboard!"})})]}),e.jsxs(be,{className:O.column,children:[e.jsx(g,{children:"Share this link"}),e.jsx(ne,{size:172,value:u,className:O.qrCode}),e.jsx("div",{className:O.copiableLink,"data-testid":"copy-link",children:u}),e.jsx(xe,{copyValue:u,children:"Copy link"})]})]})]})}function lt({lockedPath:s}){const{data:r}=ge(),{data:n}=_e({skip:s===void 0}),o=d.useMemo(()=>r.networkInterfaces.map(l=>({value:`http://${l.address}:${r.serverPort}`,label:`${l.name} - ${l.address}`})),[r.networkInterfaces,r.serverPort]),h=d.useMemo(()=>s?[{value:s.value,label:s.label}]:[{value:x.Timer,label:"Timer"},{value:x.Cuesheet,label:"Cuesheet"},{value:x.Operator,label:"Operator"},{value:"<<companion>>",label:"Companion"},...n.map(l=>({value:`preset-${l.alias}`,label:`URL Preset: ${l.alias}`}))],[s,n]);return e.jsx(Ae,{hostOptions:o,pathOptions:h,presets:n,isLockedToView:!!s})}const Ve="_title_g70eo_17",Me="_description_g70eo_24",Q={title:Ve,description:Me};function ot(){const{data:s}=ke();return!s.title&&!s.description?null:e.jsxs("div",{children:[e.jsx("div",{className:Q.title,children:s.title}),e.jsx("div",{className:Q.description,children:s.description})]})}const Ye="_overview_zh5tn_17",He="_isOffline_zh5tn_24",Ze="_info_zh5tn_24",Ke="_nav_zh5tn_39",E={overview:Ye,isOffline:He,info:Ze,nav:Ke};function ct({navElements:s,children:r}){const{isOnline:n}=we();return e.jsx("div",{className:X([E.overview,!n&&E.isOffline]),children:e.jsxs(le,{children:[e.jsx("div",{className:E.nav,children:s}),e.jsx("div",{className:E.info,children:r})]})})}export{lt as G,ct as O,Z as R,ot as T,rt as a,st as i,it as s,nt as u};
2
+ //# sourceMappingURL=OverviewWrapper-MGJ1uE5W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverviewWrapper-MGJ1uE5W.js","sources":["../../src/common/utils/regex.ts","../../src/common/components/radio-group/RadioGroup.tsx","../../src/views/cuesheet/cuesheet.options.ts","../../src/features/sharing/composite/CuesheetLinkOptions.tsx","../../src/features/sharing/GenerateLinkForm.tsx","../../src/features/sharing/GenerateLinkFormExport.tsx","../../src/features/overview/composite/TitleOverview.tsx","../../src/features/overview/OverviewWrapper.tsx"],"sourcesContent":["/**\n * Simple regex patterns for common use cases\n * mostly used in form validation\n */\n\nexport const isOnlyNumbers = /^\\d+$/;\nexport const isIPAddress = /^((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}$/;\nexport const startsWithHttp = /^https?:\\/\\//;\nexport const startsWithSlash = /^\\//;\nexport const isAlphanumeric = /^[a-z0-9]+$/i;\nexport const isASCII = /^[ -~]+$/; //https://catonmat.net/my-favorite-regex\nexport const isASCIIorEmpty = /^$|^[ -~]+$/; //https://catonmat.net/my-favorite-regex\nexport const isNotEmpty = /\\S/;\nexport const isUrlSafe = /^[a-zA-Z0-9_-]*$/; // https://stackoverflow.com/questions/24419067/validate-a-string-to-be-url-safe-using-regex\n","import { Radio } from '@base-ui-components/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui-components/react/radio-group';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './RadioGroup.module.scss';\n\ninterface RadioGroupProps<T extends string | number | boolean> extends Omit<BaseRadioGroup.Props, 'onValueChange'> {\n items: {\n value: T;\n label: string;\n }[];\n onValueChange?: (value: T) => void;\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport default function RadioGroup<T extends string | number | boolean>({\n items,\n className,\n orientation = 'vertical',\n onValueChange,\n ...elementProps\n}: RadioGroupProps<T>) {\n return (\n <BaseRadioGroup\n onValueChange={(value) => onValueChange?.(value as T)}\n className={cx([style.radioGroup, style[orientation], className])}\n {...elementProps}\n >\n {items.map((item) => (\n <label className={style.item} key={item.value.toString()}>\n <Radio.Root value={item.value.toString()} className={style.radio}>\n <Radio.Indicator className={style.indicator} />\n </Radio.Root>\n {item.label}\n </label>\n ))}\n </BaseRadioGroup>\n );\n}\n","import { CustomFields } from 'ontime-types';\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\ntype OptionValues = {\n hideTableSeconds: boolean;\n hideIndexColumn: boolean;\n showDelayedTimes: boolean;\n hideDelays: boolean;\n};\n\nconst defaultOptions: OptionValues = {\n hideTableSeconds: false,\n hideIndexColumn: false,\n showDelayedTimes: false,\n hideDelays: false,\n};\n\nexport type CuesheetOptionKeys = keyof OptionValues;\n\nexport interface CuesheetOptions extends OptionValues {\n setOption: <K extends CuesheetOptionKeys>(key: K, value: OptionValues[K]) => void;\n toggleOption: (key: CuesheetOptionKeys) => void;\n resetOptions: () => void;\n}\n\nexport const usePersistedCuesheetOptions = create<CuesheetOptions>()(\n persist(\n (set) => {\n return {\n ...defaultOptions,\n setOption: (key, value) => set((state) => ({ ...state, [key]: value })),\n toggleOption: (key) => set((state) => ({ ...state, [key]: !state[key] })),\n resetOptions: () => set(defaultOptions),\n };\n },\n {\n name: 'cuesheet-options',\n },\n ),\n);\n\nexport const cuesheetDefaultColumns = [\n { value: 'flag', label: 'Flag' },\n { value: 'cue', label: 'Cue' },\n { value: 'title', label: 'Title' },\n { value: 'timeStart', label: 'Time start' },\n { value: 'timeEnd', label: 'Time end' },\n { value: 'duration', label: 'Duration' },\n { value: 'note', label: 'Note' },\n];\n\nexport function makeCuesheetCustomColumns(customFields: CustomFields) {\n return Object.entries(customFields).map(([key, field]) => {\n return {\n value: `custom-${key}`,\n label: field.label,\n };\n });\n}\n","import { Fragment, RefObject, useMemo, useState } from 'react';\n\nimport RadioGroup from '../../../common/components/radio-group/RadioGroup';\nimport Switch from '../../../common/components/switch/Switch';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\nimport { cuesheetDefaultColumns, makeCuesheetCustomColumns } from '../../../views/cuesheet/cuesheet.options';\nimport * as Panel from '../../app-settings/panel-utils/PanelUtils';\n\nimport style from './CuesheetLinkOptions.module.scss';\n\ntype AccessMode = 'full' | 'custom';\n\ninterface CuesheetLinkOptionsProps {\n readRef?: RefObject<HTMLInputElement | null>;\n writeRef?: RefObject<HTMLInputElement | null>;\n}\n\nexport default function CuesheetLinkOptions({ readRef, writeRef }: CuesheetLinkOptionsProps) {\n const { data } = useCustomFields();\n const customFieldColumns = useMemo(() => makeCuesheetCustomColumns(data), [data]);\n\n const [readPermissions, setReadPermissions] = useState<AccessMode>('full');\n const [writePermissions, setWritePermissions] = useState<AccessMode>('full');\n\n const [readSwitches, setReadSwitches] = useState<Record<string, boolean>>(() => {\n const initialState: Record<string, boolean> = {};\n [...cuesheetDefaultColumns, ...customFieldColumns].forEach((column) => {\n initialState[column.value] = true;\n });\n return initialState;\n });\n\n const [writeSwitches, setWriteSwitches] = useState<Record<string, boolean>>(() => {\n const initialState: Record<string, boolean> = {};\n [...cuesheetDefaultColumns, ...customFieldColumns].forEach((column) => {\n initialState[column.value] = true;\n });\n return initialState;\n });\n\n const handleReadModeChange = (value: AccessMode) => {\n setReadPermissions(value);\n\n setReadSwitches((prevReadSwitches) => {\n const updatedReadSwitches = { ...prevReadSwitches };\n Object.keys(updatedReadSwitches).forEach((key) => {\n updatedReadSwitches[key] = true;\n });\n return updatedReadSwitches;\n });\n };\n\n const handleWriteModeChange = (value: AccessMode) => {\n if (value === 'full') {\n setReadPermissions('full');\n }\n setWritePermissions(value);\n\n setReadSwitches((prevReadSwitches) => {\n const updatedReadSwitches = { ...prevReadSwitches };\n setWriteSwitches((prevWriteSwitches) => {\n const updatedWriteSwitches = { ...prevWriteSwitches };\n [...cuesheetDefaultColumns, ...customFieldColumns].forEach((column) => {\n updatedReadSwitches[column.value] = true;\n updatedWriteSwitches[column.value] = true;\n });\n return updatedWriteSwitches;\n });\n return updatedReadSwitches;\n });\n };\n\n const handleSwitchChange = (key: string, type: 'read' | 'write', value: boolean) => {\n if (type === 'read') {\n setReadSwitches((prevReadSwitches) => {\n const updatedReadSwitches = { ...prevReadSwitches, [key]: value };\n return updatedReadSwitches;\n });\n } else {\n setWriteSwitches((prevWriteSwitches) => {\n const updatedWriteSwitches = { ...prevWriteSwitches, [key]: value };\n return updatedWriteSwitches;\n });\n }\n };\n\n const getReadPermissions = () => {\n if (readPermissions === 'full' || writePermissions === 'full') {\n return 'full';\n }\n\n return Object.entries(readSwitches)\n .filter(([_, value]) => value)\n .map(([key]) => key)\n .join(',');\n };\n\n const getWritePermissions = () => {\n if (writePermissions === 'full') {\n return 'full';\n }\n\n return Object.entries(writeSwitches)\n .filter(([_, value]) => value)\n .map(([key]) => key)\n .join(',');\n };\n\n return (\n <Panel.Indent>\n <input name='read' hidden readOnly ref={readRef} value={getReadPermissions() || '-'} />\n <input name='write' hidden readOnly ref={writeRef} value={getWritePermissions() || '-'} />\n <div>\n <Panel.Field title='Access mode' description='Which parts of the data will the link give access to' />\n <div>\n <RadioGroup\n value={writePermissions}\n onValueChange={handleWriteModeChange}\n orientation='horizontal'\n items={[\n { value: 'full', label: 'Full write (edit all existing and future columns)' },\n { value: 'custom', label: 'Custom write' },\n ]}\n />\n <RadioGroup\n value={readPermissions}\n onValueChange={handleReadModeChange}\n orientation='horizontal'\n disabled={writePermissions === 'full'}\n items={[\n { value: 'full', label: 'Full read (view all existing and future columns)' },\n { value: 'custom', label: 'Custom read' },\n ]}\n />\n </div>\n </div>\n <div className={style.twoCols}>\n <div className={style.grid}>\n <Panel.Description>Ontime columns</Panel.Description>\n <Panel.Description>Read</Panel.Description>\n <Panel.Description>Write</Panel.Description>\n {cuesheetDefaultColumns.map((column) => (\n <Fragment key={column.value}>\n <div>{column.label}</div>\n <Switch\n checked={Boolean(readSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'read', value)}\n disabled={readPermissions === 'full' || writePermissions === 'full'}\n data-testid={`read-${column.value}`}\n />\n <Switch\n checked={Boolean(writeSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'write', value)}\n disabled={writePermissions === 'full'}\n data-testid={`write-${column.value}`}\n />\n </Fragment>\n ))}\n </div>\n {customFieldColumns.length > 0 && (\n <div className={style.grid}>\n <Panel.Description>Custom fields</Panel.Description>\n <Panel.Description>Read</Panel.Description>\n <Panel.Description>Write</Panel.Description>\n {customFieldColumns.map((column) => (\n <Fragment key={column.value}>\n {column.label}\n <Switch\n checked={Boolean(readSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'read', value)}\n disabled={readPermissions === 'full' || writePermissions === 'full'}\n data-testid={`read-${column.value}`}\n />\n <Switch\n checked={Boolean(writeSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'write', value)}\n disabled={writePermissions === 'full'}\n data-testid={`write-${column.value}`}\n />\n </Fragment>\n ))}\n </div>\n )}\n </div>\n </Panel.Indent>\n );\n}\n","import { useRef, useState } from 'react';\nimport { FieldErrors, useForm } from 'react-hook-form';\nimport QRCode from 'react-qr-code';\nimport { OntimeView, URLPreset } from 'ontime-types';\nimport { generateId } from 'ontime-utils';\n\nimport { generateUrl } from '../../common/api/session';\nimport { maybeAxiosError } from '../../common/api/utils';\nimport Button from '../../common/components/buttons/Button';\nimport CopyTag from '../../common/components/copy-tag/CopyTag';\nimport Info from '../../common/components/info/Info';\nimport Input from '../../common/components/input/input/Input';\nimport Select from '../../common/components/select/Select';\nimport Switch from '../../common/components/switch/Switch';\nimport { useUpdateUrlPreset } from '../../common/hooks-query/useUrlPresets';\nimport copyToClipboard from '../../common/utils/copyToClipboard';\nimport { preventEscape } from '../../common/utils/keyEvent';\nimport { isUrlSafe } from '../../common/utils/regex';\nimport { isOntimeCloud, serverURL } from '../../externals';\nimport * as Panel from '../app-settings/panel-utils/PanelUtils';\n\nimport CuesheetLinkOptions from './composite/CuesheetLinkOptions';\n\nimport style from './GenerateLinkForm.module.scss';\n\ninterface GenerateLinkFormProps {\n hostOptions: { value: string; label: string }[];\n pathOptions: { value: OntimeView | string; label: string }[];\n presets: URLPreset[];\n isLockedToView?: boolean;\n}\n\ntype GenericLinkOptions = {\n baseUrl: string;\n path: OntimeView | string; // we use empty string for Companion view\n authenticate: boolean;\n lockConfig: boolean;\n lockNav: boolean;\n};\n\ntype CuesheetLinkOptions = GenericLinkOptions & {\n path: OntimeView.Cuesheet;\n\n alias: string;\n options: {\n read?: string;\n write?: string;\n };\n};\n\ntype GenerateLinkFormOptions = GenericLinkOptions | CuesheetLinkOptions;\n\ntype GenerateLinkState = 'pending' | 'loading' | 'success' | 'error';\n\nexport default function GenerateLinkForm({ hostOptions, pathOptions, presets, isLockedToView }: GenerateLinkFormProps) {\n const [formState, setFormState] = useState<GenerateLinkState>('pending');\n const [url, setUrl] = useState(serverURL);\n const cuesheetReadRef = useRef<HTMLInputElement>(null);\n const cuesheetWriteRef = useRef<HTMLInputElement>(null);\n const generatedAlias = useRef<string>(`cuesheet-${generateId()}`);\n\n const { addPreset } = useUpdateUrlPreset();\n\n const {\n handleSubmit,\n setError,\n watch,\n setValue,\n reset,\n register,\n formState: { errors, isDirty },\n } = useForm<GenerateLinkFormOptions>({\n mode: 'onChange',\n defaultValues: {\n baseUrl: serverURL,\n path: isLockedToView ? pathOptions[0].value : OntimeView.Timer,\n authenticate: false,\n lockConfig: false,\n lockNav: false,\n },\n });\n\n /**\n * If the user is generating a link to the cuesheet we gather extra options\n * The extra options are saved into a URL preset which we then request a share link for\n */\n const createPresetFromOptions = async (\n alias: string,\n options: Required<CuesheetLinkOptions['options']>,\n ): Promise<URLPreset | undefined> => {\n if (options.read === '-') {\n throw new Error('Cannot create a share with no read permissions');\n }\n const presets = await addPreset({\n target: OntimeView.Cuesheet,\n enabled: true,\n alias,\n search: '',\n options: {\n read: options.read,\n write: options.write,\n },\n });\n return presets.find((preset) => preset.alias === alias);\n };\n\n const onSubmit = async (options: GenerateLinkFormOptions) => {\n try {\n setFormState('loading');\n if (options.path === OntimeView.Cuesheet) {\n const urlPreset = await createPresetFromOptions((options as CuesheetLinkOptions).alias, {\n read: cuesheetReadRef.current?.value ?? 'full',\n write: cuesheetWriteRef.current?.value ?? 'full',\n });\n\n if (!urlPreset) {\n throw new Error('Failed to create URL preset for Cuesheet');\n }\n\n const url = await generateUrl({\n baseUrl: options.baseUrl,\n path: options.path,\n authenticate: options.authenticate,\n lockConfig: options.lockConfig,\n lockNav: options.lockNav,\n preset: urlPreset.alias,\n });\n await copyToClipboard(url);\n setUrl(url);\n } else {\n const presetPath = options.path.startsWith('preset-') ? options.path.replace('preset-', '') : undefined;\n const path = presetPath ? presets.find((preset) => preset.alias === presetPath)?.target : options.path;\n if (!path) {\n throw new Error(`Could not resolve preset: ${path}`);\n }\n\n const url = await generateUrl({\n baseUrl: options.baseUrl,\n path,\n authenticate: options.authenticate,\n lockConfig: options.lockConfig,\n lockNav: options.lockNav,\n preset: presetPath,\n });\n\n await copyToClipboard(url);\n setUrl(url);\n }\n reset(options, {\n keepValues: true,\n keepDirty: false,\n });\n setFormState('success');\n } catch (error) {\n const message = maybeAxiosError(error);\n setError('root', { message });\n setFormState('error');\n }\n };\n\n const canSubmit = isDirty || formState !== 'success';\n\n return (\n <form onSubmit={handleSubmit(onSubmit)} onKeyDown={(event) => preventEscape(event)}>\n {!isLockedToView && (\n <Info>You can generate a link to share with your team or to use in automation (such as companion).</Info>\n )}\n <div className={style.shareInline}>\n <div className={style.column}>\n <Panel.ListGroup>\n {isOntimeCloud ? (\n <input hidden readOnly name='baseUrl' value={serverURL} />\n ) : (\n <Panel.ListItem>\n <Panel.Field\n title='Host IP'\n description={`Which IP address will be used${isOntimeCloud ? ' (not applicable in Ontime Cloud)' : ''}`}\n />\n <Select\n options={hostOptions}\n value={watch('baseUrl')}\n onValueChange={(value) => setValue('baseUrl', value)}\n />\n </Panel.ListItem>\n )}\n {isLockedToView ? (\n <input type='hidden' value={watch('path')} />\n ) : (\n <Panel.ListItem>\n <Panel.Field title='Ontime view' description='Which view or preset will the link point to' />\n <Select\n options={pathOptions}\n value={watch('path')}\n onValueChange={(value) => setValue('path', value, { shouldDirty: true })}\n />\n </Panel.ListItem>\n )}\n\n {watch('path') === OntimeView.Cuesheet && (\n <>\n <Panel.ListItem>\n <Panel.Field\n title='Preset alias'\n description='The name of the preset we will create to hold this options'\n error={(errors as FieldErrors<CuesheetLinkOptions>).alias?.message}\n />\n <Input\n defaultValue={generatedAlias.current}\n {...register('alias', {\n required: 'Alias cannot be empty and must be unique',\n pattern: {\n value: isUrlSafe,\n message: 'Field can only contain URL safe characters (a-z, 0-9, _ and -)',\n },\n })}\n />\n </Panel.ListItem>\n <CuesheetLinkOptions readRef={cuesheetReadRef} writeRef={cuesheetWriteRef} />\n </>\n )}\n\n <Panel.ListItem>\n <Panel.Field title='Lock navigation' description='Whether to hide the navigation menu' />\n <Switch\n size='large'\n name='lockNav'\n data-testid='lockNav'\n checked={watch('lockNav')}\n onCheckedChange={(checked) => setValue('lockNav', checked, { shouldDirty: true })}\n disabled={watch('lockConfig')}\n />\n </Panel.ListItem>\n {watch('path') !== OntimeView.Cuesheet && (\n <Panel.ListItem>\n <Panel.Field\n title='Lock configuration'\n description='Whether to hide the configuration panel (also hides navigation)'\n />\n <Switch\n size='large'\n name='lockConfig'\n data-testid='lockConfig'\n checked={watch('lockConfig')}\n onCheckedChange={(checked) => {\n if (checked) {\n setValue('lockNav', checked, { shouldDirty: true });\n }\n setValue('lockConfig', checked, { shouldDirty: true });\n }}\n />\n </Panel.ListItem>\n )}\n <Panel.ListItem>\n <Panel.Field title='Authenticate' description='Whether the URL should be pre-authenticated' />\n <Switch\n size='large'\n name='authenticate'\n data-testid='authenticate'\n checked={watch('authenticate')}\n onCheckedChange={(checked) => setValue('authenticate', checked, { shouldDirty: true })}\n />\n </Panel.ListItem>\n </Panel.ListGroup>\n <Panel.Error>{errors.root?.message}</Panel.Error>\n <Panel.InlineElements align='end' className={style.end}>\n <Button type='submit' variant={canSubmit ? 'primary' : 'subtle'} loading={formState === 'loading'}>\n {canSubmit ? 'Create share link' : 'Link copied to clipboard!'}\n </Button>\n </Panel.InlineElements>\n </div>\n <Panel.Section className={style.column}>\n <Panel.Description>Share this link</Panel.Description>\n <QRCode size={172} value={url} className={style.qrCode} />\n <div className={style.copiableLink} data-testid='copy-link'>\n {url}\n </div>\n <CopyTag copyValue={url}>Copy link</CopyTag>\n </Panel.Section>\n </div>\n </form>\n );\n}\n","import { useMemo } from 'react';\nimport { OntimeView } from 'ontime-types';\n\nimport useInfo from '../../common/hooks-query/useInfo';\nimport useUrlPresets from '../../common/hooks-query/useUrlPresets';\n\nimport GenerateLinkForm from './GenerateLinkForm';\n\ninterface GenerateLinkFormExportProps {\n lockedPath?: { value: OntimeView; label: string };\n}\n\nexport default function GenerateLinkFormExport({ lockedPath }: GenerateLinkFormExportProps) {\n const { data: infoData } = useInfo();\n const { data: urlPresetData } = useUrlPresets({ skip: lockedPath === undefined });\n\n /**\n * hostOptions are only used for local networks\n * the NIF address is a local IP address: 192.168.x.x or 10.x.x.x\n * We need to inject the port and protocol to create a valid URL\n * eg: http://192.168.x.x:port\n */\n const hostOptions = useMemo(() => {\n return infoData.networkInterfaces.map((nif) => ({\n value: `http://${nif.address}:${infoData.serverPort}`,\n label: `${nif.name} - ${nif.address}`,\n }));\n }, [infoData.networkInterfaces, infoData.serverPort]);\n\n const pathOptions = useMemo(() => {\n if (lockedPath) {\n return [{ value: lockedPath.value, label: lockedPath.label }];\n }\n return [\n { value: OntimeView.Timer, label: 'Timer' },\n { value: OntimeView.Cuesheet, label: 'Cuesheet' },\n { value: OntimeView.Operator, label: 'Operator' },\n { value: '<<companion>>', label: 'Companion' },\n ...urlPresetData.map((preset) => ({\n value: `preset-${preset.alias}`,\n label: `URL Preset: ${preset.alias}`,\n })),\n ];\n }, [lockedPath, urlPresetData]);\n\n return (\n <GenerateLinkForm\n hostOptions={hostOptions}\n pathOptions={pathOptions}\n presets={urlPresetData}\n isLockedToView={Boolean(lockedPath)}\n />\n );\n}\n","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 { PropsWithChildren, ReactNode } from 'react';\nimport { ErrorBoundary } from '@sentry/react';\n\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 return (\n <div className={cx([style.overview, !isOnline && style.isOffline])}>\n <ErrorBoundary>\n <div className={style.nav}>{navElements}</div>\n <div className={style.info}>{children}</div>\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["isOnlyNumbers","startsWithHttp","isAlphanumeric","isUrlSafe","RadioGroup","items","className","orientation","onValueChange","elementProps","jsx","BaseRadioGroup","value","cx","style","item","Radio.Root","Radio.Indicator","defaultOptions","usePersistedCuesheetOptions","create","persist","set","key","state","cuesheetDefaultColumns","makeCuesheetCustomColumns","customFields","field","CuesheetLinkOptions","readRef","writeRef","data","useCustomFields","customFieldColumns","useMemo","readPermissions","setReadPermissions","useState","writePermissions","setWritePermissions","readSwitches","setReadSwitches","initialState","column","writeSwitches","setWriteSwitches","handleReadModeChange","prevReadSwitches","updatedReadSwitches","handleWriteModeChange","prevWriteSwitches","updatedWriteSwitches","handleSwitchChange","type","getReadPermissions","_","getWritePermissions","jsxs","Panel.Indent","Panel.Field","Panel.Description","Fragment","Switch","GenerateLinkForm","hostOptions","pathOptions","presets","isLockedToView","formState","setFormState","url","setUrl","serverURL","cuesheetReadRef","useRef","cuesheetWriteRef","generatedAlias","generateId","addPreset","useUpdateUrlPreset","handleSubmit","setError","watch","setValue","reset","register","errors","isDirty","useForm","OntimeView","createPresetFromOptions","alias","options","preset","onSubmit","urlPreset","_a","_b","generateUrl","copyToClipboard","presetPath","path","_c","error","message","maybeAxiosError","canSubmit","event","preventEscape","Info","Panel.ListGroup","isOntimeCloud","Panel.ListItem","Select","Input","checked","Panel.Error","Panel.InlineElements","Button","Panel.Section","QRCode","CopyTag","GenerateLinkFormExport","lockedPath","infoData","useInfo","urlPresetData","useUrlPresets","nif","TitleOverview","useProjectData","OverviewWrapper","navElements","children","isOnline","useIsOnline","ErrorBoundary"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e,ac as f}from"./vendor-CCiSQ9k9.js";import{u as m,L as u,f as j,O as o}from"./index-BQEUaoAf.js";import{E as l}from"./EmptyPage-Dcbg6rmF.js";import{V as x}from"./ViewLogo-_3Z1hIHi.js";import{V as a}from"./ViewParamsEditor-Bca1TIDW.js";import{u as _}from"./useWindowTitle-DqdFTWns.js";import{u as h}from"./useProjectData-C1hVamxc.js";import"./Empty-gWT_HMeu.js";import"./Select-CedN80WS.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]="ce864784-26a5-4afd-b831-7fdb93549169",s._sentryDebugIdIdentifier="sentry-dbid-ce864784-26a5-4afd-b831-7fdb93549169")}catch{}})();function g(){const s=m(t=>t.mirror),{data:r,status:n}=h();return{data:{projectData:r,isMirrored:s},status:n}}function V(){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{V as default};
2
- //# sourceMappingURL=ProjectInfo-z4k3cipS.js.map
1
+ import{j as e,ac as f}from"./vendor-9UkPSc5K.js";import{u as m,L as u,f as j,O as o}from"./index-njXwwjfn.js";import{E as l}from"./EmptyPage-BSzsxpGg.js";import{V as x}from"./ViewLogo--9miplQv.js";import{V as a}from"./ViewParamsEditor-BFu_0oIb.js";import{u as _}from"./useWindowTitle-B2UzPuki.js";import{u as h}from"./useProjectData-DW06zQvF.js";import"./Empty-C-JO_XAr.js";import"./Select-BLA-yQMq.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]="ce864784-26a5-4afd-b831-7fdb93549169",s._sentryDebugIdIdentifier="sentry-dbid-ce864784-26a5-4afd-b831-7fdb93549169")}catch{}})();function g(){const s=m(t=>t.mirror),{data:r,status:n}=h();return{data:{projectData:r,isMirrored:s},status:n}}function V(){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{V as default};
2
+ //# sourceMappingURL=ProjectInfo-CJ-GLvVG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectInfo-z4k3cipS.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","projectData","projectDataStatus","useProjectData","ProjectInfoLoader","data","status","useWindowTitle","Loader","jsx","EmptyPage","ProjectInfo","getLocalizedString","useTranslation","value","jsxs","Fragment","ViewParamsEditor","OntimeView","ViewLogo","IoOpenOutline","info","idx","hasUrl"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectInfo-CJ-GLvVG.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","projectData","projectDataStatus","useProjectData","ProjectInfoLoader","data","status","useWindowTitle","Loader","jsx","EmptyPage","ProjectInfo","getLocalizedString","useTranslation","value","jsxs","Fragment","ViewParamsEditor","OntimeView","ViewLogo","IoOpenOutline","info","idx","hasUrl"],"mappings":"6uBAWO,SAASA,GAAgD,CAE9D,MAAMC,EAAaC,EAAqBC,GAAUA,EAAM,MAAM,EAGxD,CAAE,KAAMC,EAAa,OAAQC,CAAA,EAAsBC,EAAe,EAEjE,MAAA,CACL,KAAM,CACJ,YAAAF,EACA,WAAAH,CACF,EACA,OAAQI,CACV,CACF,CCXA,SAAwBE,GAAoB,CAC1C,KAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAIT,EAAmB,EAI5C,OAFAU,EAAe,cAAc,EAEzBD,IAAW,gBACLE,EAAO,EAAA,EAGbF,IAAW,QACNG,EAAA,IAACC,EAAU,CAAA,KAAK,4DAA6D,CAAA,EAG/ED,MAACE,EAAa,CAAA,GAAGN,CAAM,CAAA,CAChC,CAEA,SAASM,EAAY,CAAE,YAAAV,EAAa,WAAAH,GAA+B,CAC3D,KAAA,CAAE,mBAAAc,CAAmB,EAAIC,EAAe,EAS9C,MAFE,CAACZ,GACD,OAAO,OAAOA,CAAW,EAAE,MAAOa,GAAU,CAACA,GAAUA,GAAS,MAAM,QAAQA,CAAK,GAAKA,EAAM,SAAW,CAAE,EAIvGC,EAAA,KAAAC,WAAA,CAAA,SAAA,CAAAP,EAAA,IAACQ,GAAiB,OAAQC,EAAW,YAAa,YAAa,CAAA,EAAI,EAClET,EAAA,IAAAC,EAAA,CAAU,KAAME,EAAmB,gBAAgB,CAAG,CAAA,EAAE,GAAA,EAC3D,EAKFG,EAAA,KAAC,OAAI,UAAW,WAAWjB,EAAa,SAAW,EAAE,GAAI,cAAY,eACnE,SAAA,CAAAW,EAAA,IAACQ,GAAiB,OAAQC,EAAW,YAAa,YAAa,CAAA,EAAI,EAClEjB,EAAY,MAASQ,EAAA,IAAAU,EAAA,CAAS,KAAMlB,EAAY,KAAM,UAAU,OAAO,EACxEc,EAAAA,KAAC,MAAI,CAAA,UAAU,OACZ,SAAA,CAAYd,EAAA,cACV,MACC,CAAA,SAAA,CAAAQ,MAAC,MAAI,CAAA,UAAU,cAAe,SAAAG,EAAmB,eAAe,EAAE,EACjEH,EAAA,IAAA,MAAA,CAAI,UAAU,cAAe,WAAY,KAAM,CAAA,CAAA,EAClD,EAEDR,EAAY,aACXc,EAAAA,KAAC,MACC,CAAA,SAAA,CAAAN,MAAC,MAAI,CAAA,UAAU,cAAe,SAAAG,EAAmB,qBAAqB,EAAE,EACvEH,EAAA,IAAA,MAAA,CAAI,UAAU,cAAe,WAAY,WAAY,CAAA,CAAA,EACxD,EAEDR,EAAY,MACXc,EAAAA,KAAC,MACC,CAAA,SAAA,CAAAN,MAAC,MAAI,CAAA,UAAU,cAAe,SAAAG,EAAmB,cAAc,EAAE,EAChEH,EAAA,IAAA,MAAA,CAAI,UAAU,cAAe,WAAY,IAAK,CAAA,CAAA,EACjD,EAEDR,EAAY,KACXc,EAAAA,KAAC,MACC,CAAA,SAAA,CAAAN,MAAC,MAAI,CAAA,UAAU,cAAe,SAAAG,EAAmB,aAAa,EAAE,EAChEG,EAAAA,KAAC,IAAE,CAAA,KAAMd,EAAY,IAAK,OAAO,SAAS,IAAI,aAAa,UAAU,mBAClE,SAAA,CAAYA,EAAA,IAAI,UAAEmB,EAAc,CAAA,MAAO,CAAE,SAAU,MAAS,CAAA,CAAA,CAC/D,CAAA,CAAA,EACF,EAEDnB,EAAY,OAAO,IAAI,CAACoB,EAAMC,IAAQ,CAC/B,MAAAC,EAAS,EAAQF,EAAK,IAE1B,OAAAN,EAAA,KAAC,MAAiC,CAAA,UAAU,eACzC,SAAA,CAAAQ,GACEd,EAAA,IAAA,MAAA,CAAI,UAAU,wBACb,SAACA,EAAAA,IAAA,MAAA,CAAI,UAAU,cAAc,IAAKY,EAAK,IAAK,QAAQ,MAAO,CAAA,EAC7D,SAED,MACC,CAAA,SAAA,CAAAZ,EAAA,IAAC,MAAI,CAAA,UAAU,cAAe,SAAAY,EAAK,MAAM,EACxCZ,EAAA,IAAA,MAAA,CAAI,UAAU,cAAe,WAAK,KAAM,CAAA,CAAA,CAC3C,CAAA,CAAA,CAAA,EATQ,GAAGY,EAAK,KAAK,IAAIC,CAAG,EAU9B,CAEH,CAAA,CAAA,CACH,CAAA,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{h as l,j as t,A as f}from"./vendor-CCiSQ9k9.js";import{i as h,af as p,ai as b,bN as g,S as x}from"./index-BQEUaoAf.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]="85a7d0ce-b73e-4216-b0cc-3068e25ab5bf",e._sentryDebugIdIdentifier="sentry-dbid-85a7d0ce-b73e-4216-b0cc-3068e25ab5bf")}catch{}})();const y="_container_o8th0_17",_="_pin_o8th0_27",m="_pinFailed_o8th0_51",d={container:y,pin:_,pinFailed:m};function v({permission:e,handleValidation:n}){const[s,o]=l.useState(""),[i,r]=l.useState(!1),u=()=>{n(s)||(r(!0),o(""))},c=a=>{o(a),i&&r(!1)};return t.jsxs("div",{className:d.container,children:[`Ontime ${e}`,t.jsxs("form",{onSubmit:a=>{a.preventDefault(),u()},className:h([d.pin,i&&d.pinFailed]),children:[t.jsx(p,{type:"password",maxLength:4,height:"large",value:s,onChange:a=>c(a.target.value)}),t.jsx(b,{type:"submit",variant:"primary","aria-label":"Enter",children:t.jsx(f,{})})]})]})}function w({permission:e,children:n}){const{editorAuth:s,operatorAuth:o,validate:i}=l.useContext(g),r=l.useCallback(c=>i(c,e),[e,i]);return x||(e==="editor"?s:e==="operator"?o:!1)?t.jsx(t.Fragment,{children:n}):t.jsx(v,{permission:e,handleValidation:r})}export{w as P};
2
- //# sourceMappingURL=ProtectRoute-CrcWfOlG.js.map
1
+ import{h as l,j as t,A as f}from"./vendor-9UkPSc5K.js";import{i as h,af as p,ai as b,bN as g,S as x}from"./index-njXwwjfn.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]="85a7d0ce-b73e-4216-b0cc-3068e25ab5bf",e._sentryDebugIdIdentifier="sentry-dbid-85a7d0ce-b73e-4216-b0cc-3068e25ab5bf")}catch{}})();const y="_container_o8th0_17",_="_pin_o8th0_27",m="_pinFailed_o8th0_51",d={container:y,pin:_,pinFailed:m};function v({permission:e,handleValidation:n}){const[s,o]=l.useState(""),[i,r]=l.useState(!1),u=()=>{n(s)||(r(!0),o(""))},c=a=>{o(a),i&&r(!1)};return t.jsxs("div",{className:d.container,children:[`Ontime ${e}`,t.jsxs("form",{onSubmit:a=>{a.preventDefault(),u()},className:h([d.pin,i&&d.pinFailed]),children:[t.jsx(p,{type:"password",maxLength:4,height:"large",value:s,onChange:a=>c(a.target.value)}),t.jsx(b,{type:"submit",variant:"primary","aria-label":"Enter",children:t.jsx(f,{})})]})]})}function w({permission:e,children:n}){const{editorAuth:s,operatorAuth:o,validate:i}=l.useContext(g),r=l.useCallback(c=>i(c,e),[e,i]);return x||(e==="editor"?s:e==="operator"?o:!1)?t.jsx(t.Fragment,{children:n}):t.jsx(v,{permission:e,handleValidation:r})}export{w as P};
2
+ //# sourceMappingURL=ProtectRoute-DJ9xZnPI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProtectRoute-CrcWfOlG.js","sources":["../../src/common/components/protect-route/PinPage.tsx","../../src/common/components/protect-route/ProtectRoute.tsx"],"sourcesContent":["import { PropsWithChildren, useState } from 'react';\nimport { IoCheckmark } from 'react-icons/io5';\n\nimport { cx } from '../../utils/styleUtils';\nimport IconButton from '../buttons/IconButton';\nimport Input from '../input/input/Input';\n\nimport style from './PinPage.module.scss';\n\ninterface PinPageProps {\n permission: 'editor' | 'operator';\n handleValidation: (pin: string) => boolean;\n}\n\nexport default function PinPage({ permission, handleValidation }: PropsWithChildren<PinPageProps>) {\n const [pin, setPin] = useState('');\n const [failed, setFailed] = useState(false);\n\n const validate = () => {\n const isValid = handleValidation(pin);\n if (!isValid) {\n setFailed(true);\n setPin('');\n }\n };\n\n const handleInputChange = (value: string) => {\n setPin(value);\n if (failed) setFailed(false);\n };\n\n return (\n <div className={style.container}>\n {`Ontime ${permission}`}\n <form\n onSubmit={(event) => {\n event.preventDefault();\n validate();\n }}\n className={cx([style.pin, failed && style.pinFailed])}\n >\n <Input\n type='password'\n maxLength={4}\n height='large'\n value={pin}\n onChange={(e) => handleInputChange(e.target.value)}\n />\n <IconButton type='submit' variant='primary' aria-label='Enter'>\n <IoCheckmark />\n </IconButton>\n </form>\n </div>\n );\n}\n","import { PropsWithChildren, useCallback, useContext } from 'react';\n\nimport { isLocalhost } from '../../../externals';\nimport { AppContext } from '../../context/AppContext';\n\nimport PinPage from './PinPage';\n\ninterface ProtectRouteProps {\n permission: 'editor' | 'operator';\n}\n\nexport default function ProtectRoute({ permission, children }: PropsWithChildren<ProtectRouteProps>) {\n const { editorAuth, operatorAuth, validate } = useContext(AppContext);\n\n const handleValidation = useCallback(\n (pin: string) => {\n return validate(pin, permission);\n },\n [permission, validate],\n );\n\n const hasRelevantAuth = () => {\n if (permission === 'editor') {\n return editorAuth;\n }\n if (permission === 'operator') {\n return operatorAuth;\n }\n return false;\n };\n\n if (isLocalhost || hasRelevantAuth()) {\n // eslint-disable-next-line react/jsx-no-useless-fragment -- trying to make typescript happy\n return <>{children}</>;\n }\n\n return <PinPage permission={permission} handleValidation={handleValidation} />;\n}\n"],"names":["PinPage","permission","handleValidation","pin","setPin","useState","failed","setFailed","validate","handleInputChange","value","jsxs","style","event","cx","jsx","Input","e","IconButton","IoCheckmark","ProtectRoute","children","editorAuth","operatorAuth","useContext","AppContext","useCallback","isLocalhost"],"mappings":"kkBAcA,SAAwBA,EAAQ,CAAE,WAAAC,EAAY,iBAAAC,GAAqD,CACjG,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,EAAE,EAC3B,CAACC,EAAQC,CAAS,EAAIF,EAAAA,SAAS,EAAK,EAEpCG,EAAW,IAAM,CACLN,EAAiBC,CAAG,IAElCI,EAAU,EAAI,EACdH,EAAO,EAAE,EAEb,EAEMK,EAAqBC,GAAkB,CAC3CN,EAAOM,CAAK,EACRJ,KAAkB,EAAK,CAC7B,EAEA,OACGK,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,UACnB,SAAA,CAAA,UAAUX,CAAU,GACrBU,EAAA,KAAC,OAAA,CACC,SAAWE,GAAU,CACnBA,EAAM,eAAe,EACZL,EAAA,CACX,EACA,UAAWM,EAAG,CAACF,EAAM,IAAKN,GAAUM,EAAM,SAAS,CAAC,EAEpD,SAAA,CAAAG,EAAA,IAACC,EAAA,CACC,KAAK,WACL,UAAW,EACX,OAAO,QACP,MAAOb,EACP,SAAWc,GAAMR,EAAkBQ,EAAE,OAAO,KAAK,CAAA,CACnD,EACAF,EAAAA,IAACG,EAAW,CAAA,KAAK,SAAS,QAAQ,UAAU,aAAW,QACrD,SAACH,EAAA,IAAAI,EAAA,CAAY,CAAA,CACf,CAAA,CAAA,CAAA,CAAA,CACF,EACF,CAEJ,CC3CA,SAAwBC,EAAa,CAAE,WAAAnB,EAAY,SAAAoB,GAAkD,CACnG,KAAM,CAAE,WAAAC,EAAY,aAAAC,EAAc,SAAAf,CAAS,EAAIgB,EAAAA,WAAWC,CAAU,EAE9DvB,EAAmBwB,EAAA,YACtBvB,GACQK,EAASL,EAAKF,CAAU,EAEjC,CAACA,EAAYO,CAAQ,CACvB,EAYI,OAAAmB,IATE1B,IAAe,SACVqB,EAELrB,IAAe,WACVsB,EAEF,sBAKG,SAAAF,EAAS,EAGdN,EAAA,IAACf,EAAQ,CAAA,WAAAC,EAAwB,iBAAAC,CAAoC,CAAA,CAC9E"}
1
+ {"version":3,"file":"ProtectRoute-DJ9xZnPI.js","sources":["../../src/common/components/protect-route/PinPage.tsx","../../src/common/components/protect-route/ProtectRoute.tsx"],"sourcesContent":["import { PropsWithChildren, useState } from 'react';\nimport { IoCheckmark } from 'react-icons/io5';\n\nimport { cx } from '../../utils/styleUtils';\nimport IconButton from '../buttons/IconButton';\nimport Input from '../input/input/Input';\n\nimport style from './PinPage.module.scss';\n\ninterface PinPageProps {\n permission: 'editor' | 'operator';\n handleValidation: (pin: string) => boolean;\n}\n\nexport default function PinPage({ permission, handleValidation }: PropsWithChildren<PinPageProps>) {\n const [pin, setPin] = useState('');\n const [failed, setFailed] = useState(false);\n\n const validate = () => {\n const isValid = handleValidation(pin);\n if (!isValid) {\n setFailed(true);\n setPin('');\n }\n };\n\n const handleInputChange = (value: string) => {\n setPin(value);\n if (failed) setFailed(false);\n };\n\n return (\n <div className={style.container}>\n {`Ontime ${permission}`}\n <form\n onSubmit={(event) => {\n event.preventDefault();\n validate();\n }}\n className={cx([style.pin, failed && style.pinFailed])}\n >\n <Input\n type='password'\n maxLength={4}\n height='large'\n value={pin}\n onChange={(e) => handleInputChange(e.target.value)}\n />\n <IconButton type='submit' variant='primary' aria-label='Enter'>\n <IoCheckmark />\n </IconButton>\n </form>\n </div>\n );\n}\n","import { PropsWithChildren, useCallback, useContext } from 'react';\n\nimport { isLocalhost } from '../../../externals';\nimport { AppContext } from '../../context/AppContext';\n\nimport PinPage from './PinPage';\n\ninterface ProtectRouteProps {\n permission: 'editor' | 'operator';\n}\n\nexport default function ProtectRoute({ permission, children }: PropsWithChildren<ProtectRouteProps>) {\n const { editorAuth, operatorAuth, validate } = useContext(AppContext);\n\n const handleValidation = useCallback(\n (pin: string) => {\n return validate(pin, permission);\n },\n [permission, validate],\n );\n\n const hasRelevantAuth = () => {\n if (permission === 'editor') {\n return editorAuth;\n }\n if (permission === 'operator') {\n return operatorAuth;\n }\n return false;\n };\n\n if (isLocalhost || hasRelevantAuth()) {\n // eslint-disable-next-line react/jsx-no-useless-fragment -- trying to make typescript happy\n return <>{children}</>;\n }\n\n return <PinPage permission={permission} handleValidation={handleValidation} />;\n}\n"],"names":["PinPage","permission","handleValidation","pin","setPin","useState","failed","setFailed","validate","handleInputChange","value","jsxs","style","event","cx","jsx","Input","e","IconButton","IoCheckmark","ProtectRoute","children","editorAuth","operatorAuth","useContext","AppContext","useCallback","isLocalhost"],"mappings":"kkBAcA,SAAwBA,EAAQ,CAAE,WAAAC,EAAY,iBAAAC,GAAqD,CACjG,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,EAAE,EAC3B,CAACC,EAAQC,CAAS,EAAIF,EAAAA,SAAS,EAAK,EAEpCG,EAAW,IAAM,CACLN,EAAiBC,CAAG,IAElCI,EAAU,EAAI,EACdH,EAAO,EAAE,EAEb,EAEMK,EAAqBC,GAAkB,CAC3CN,EAAOM,CAAK,EACRJ,KAAkB,EAAK,CAC7B,EAEA,OACGK,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,UACnB,SAAA,CAAA,UAAUX,CAAU,GACrBU,EAAA,KAAC,OAAA,CACC,SAAWE,GAAU,CACnBA,EAAM,eAAe,EACZL,EAAA,CACX,EACA,UAAWM,EAAG,CAACF,EAAM,IAAKN,GAAUM,EAAM,SAAS,CAAC,EAEpD,SAAA,CAAAG,EAAA,IAACC,EAAA,CACC,KAAK,WACL,UAAW,EACX,OAAO,QACP,MAAOb,EACP,SAAWc,GAAMR,EAAkBQ,EAAE,OAAO,KAAK,CAAA,CACnD,EACAF,EAAAA,IAACG,EAAW,CAAA,KAAK,SAAS,QAAQ,UAAU,aAAW,QACrD,SAACH,EAAA,IAAAI,EAAA,CAAY,CAAA,CACf,CAAA,CAAA,CAAA,CAAA,CACF,EACF,CAEJ,CC3CA,SAAwBC,EAAa,CAAE,WAAAnB,EAAY,SAAAoB,GAAkD,CACnG,KAAM,CAAE,WAAAC,EAAY,aAAAC,EAAc,SAAAf,CAAS,EAAIgB,EAAAA,WAAWC,CAAU,EAE9DvB,EAAmBwB,EAAA,YACtBvB,GACQK,EAASL,EAAKF,CAAU,EAEjC,CAACA,EAAYO,CAAQ,CACvB,EAYI,OAAAmB,IATE1B,IAAe,SACVqB,EAELrB,IAAe,WACVsB,EAEF,sBAKG,SAAAF,EAAS,EAGdN,EAAA,IAACf,EAAQ,CAAA,WAAAC,EAAwB,iBAAAC,CAAoC,CAAA,CAC9E"}