@getontime/cli 4.4.1 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/client/assets/{Backstage-BY9GL_rk.js → Backstage-DQu8ne-1.js} +2 -2
  2. package/client/assets/Backstage-DQu8ne-1.js.br +0 -0
  3. package/client/assets/Backstage-DQu8ne-1.js.gz +0 -0
  4. package/client/assets/{Backstage-BY9GL_rk.js.map → Backstage-DQu8ne-1.js.map} +1 -1
  5. package/client/assets/{Countdown-CXFgDHND.js → Countdown-COte1yne.js} +2 -2
  6. package/client/assets/Countdown-COte1yne.js.br +0 -0
  7. package/client/assets/Countdown-COte1yne.js.gz +0 -0
  8. package/client/assets/{Countdown-CXFgDHND.js.map → Countdown-COte1yne.js.map} +1 -1
  9. package/client/assets/CuesheetTable-BQfxAp-I.js +2 -0
  10. package/client/assets/CuesheetTable-BQfxAp-I.js.br +0 -0
  11. package/client/assets/CuesheetTable-BQfxAp-I.js.gz +0 -0
  12. package/client/assets/CuesheetTable-BQfxAp-I.js.map +1 -0
  13. package/client/assets/CustomTranslationModal-C5mAtBjW.js +2 -0
  14. package/client/assets/CustomTranslationModal-C5mAtBjW.js.br +0 -0
  15. package/client/assets/CustomTranslationModal-C5mAtBjW.js.gz +0 -0
  16. package/client/assets/{CustomTranslationModal-4PVZBtkC.js.map → CustomTranslationModal-C5mAtBjW.js.map} +1 -1
  17. package/client/assets/{DelayIndicator-DUbpd6DG.js → DelayIndicator-B0cudY9N.js} +2 -2
  18. package/client/assets/DelayIndicator-B0cudY9N.js.br +0 -0
  19. package/client/assets/DelayIndicator-B0cudY9N.js.gz +0 -0
  20. package/client/assets/DelayIndicator-B0cudY9N.js.map +1 -0
  21. package/client/assets/{EditorFeatureWrapper-CV_zaDoG.js → EditorFeatureWrapper-DpDaCaJ3.js} +2 -2
  22. package/client/assets/EditorFeatureWrapper-DpDaCaJ3.js.br +0 -0
  23. package/client/assets/EditorFeatureWrapper-DpDaCaJ3.js.gz +0 -0
  24. package/client/assets/{EditorFeatureWrapper-CV_zaDoG.js.map → EditorFeatureWrapper-DpDaCaJ3.js.map} +1 -1
  25. package/client/assets/{EditorUtils-CLBWDP4k.js → EditorUtils-k5KpETPG.js} +2 -2
  26. package/client/assets/EditorUtils-k5KpETPG.js.br +0 -0
  27. package/client/assets/EditorUtils-k5KpETPG.js.gz +0 -0
  28. package/client/assets/{EditorUtils-CLBWDP4k.js.map → EditorUtils-k5KpETPG.js.map} +1 -1
  29. package/client/assets/EmptyPage-aTb22KTq.js +2 -0
  30. package/client/assets/EmptyPage-aTb22KTq.js.br +0 -0
  31. package/client/assets/EmptyPage-aTb22KTq.js.gz +0 -0
  32. package/client/assets/{EmptyPage-DmpOAg7R.js.map → EmptyPage-aTb22KTq.js.map} +1 -1
  33. package/client/assets/{FollowButton-CAUWz5Ma.js → FollowButton--Bj9S6jO.js} +2 -2
  34. package/client/assets/FollowButton--Bj9S6jO.js.br +0 -0
  35. package/client/assets/FollowButton--Bj9S6jO.js.gz +0 -0
  36. package/client/assets/{FollowButton-CAUWz5Ma.js.map → FollowButton--Bj9S6jO.js.map} +1 -1
  37. package/client/assets/MessageControlExport-BN6OfADo.js +3 -0
  38. package/client/assets/MessageControlExport-BN6OfADo.js.br +0 -0
  39. package/client/assets/MessageControlExport-BN6OfADo.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-Dm8IjSr4.js.map → MessageControlExport-BN6OfADo.js.map} +1 -1
  41. package/client/assets/{MultiPartProgressBar-Fp-sTN2u.js → MultiPartProgressBar-BlLJNQ0D.js} +2 -2
  42. package/client/assets/MultiPartProgressBar-BlLJNQ0D.js.br +0 -0
  43. package/client/assets/MultiPartProgressBar-BlLJNQ0D.js.gz +0 -0
  44. package/client/assets/{MultiPartProgressBar-Fp-sTN2u.js.map → MultiPartProgressBar-BlLJNQ0D.js.map} +1 -1
  45. package/client/assets/{OperatorExport-CE4ajLPS.js → OperatorExport-CmgIl1lz.js} +2 -2
  46. package/client/assets/OperatorExport-CmgIl1lz.js.br +0 -0
  47. package/client/assets/OperatorExport-CmgIl1lz.js.gz +0 -0
  48. package/client/assets/OperatorExport-CmgIl1lz.js.map +1 -0
  49. package/client/assets/OverviewWrapper-B4nU68Eq.js +2 -0
  50. package/client/assets/OverviewWrapper-B4nU68Eq.js.br +0 -0
  51. package/client/assets/OverviewWrapper-B4nU68Eq.js.gz +0 -0
  52. package/client/assets/{OverviewWrapper-BNnAIUP1.js.map → OverviewWrapper-B4nU68Eq.js.map} +1 -1
  53. package/client/assets/OverviewWrapper-fPfl6o_p.css +1 -0
  54. package/client/assets/OverviewWrapper-fPfl6o_p.css.br +0 -0
  55. package/client/assets/OverviewWrapper-fPfl6o_p.css.gz +0 -0
  56. package/client/assets/{PipHost-CbNFsfqp.js → PipHost-BZy7ouDv.js} +2 -2
  57. package/client/assets/PipHost-BZy7ouDv.js.br +0 -0
  58. package/client/assets/PipHost-BZy7ouDv.js.gz +0 -0
  59. package/client/assets/{PipHost-CbNFsfqp.js.map → PipHost-BZy7ouDv.js.map} +1 -1
  60. package/client/assets/{ProjectInfo-Bf5z4Xsv.js → ProjectInfo-D0X9vdIX.js} +2 -2
  61. package/client/assets/ProjectInfo-D0X9vdIX.js.br +0 -0
  62. package/client/assets/ProjectInfo-D0X9vdIX.js.gz +0 -0
  63. package/client/assets/{ProjectInfo-Bf5z4Xsv.js.map → ProjectInfo-D0X9vdIX.js.map} +1 -1
  64. package/client/assets/ProtectRoute-DSilyhst.js +2 -0
  65. package/client/assets/ProtectRoute-DSilyhst.js.br +0 -0
  66. package/client/assets/ProtectRoute-DSilyhst.js.gz +0 -0
  67. package/client/assets/{ProtectRoute-CCHzyy0I.js.map → ProtectRoute-DSilyhst.js.map} +1 -1
  68. package/client/assets/ProtectedCuesheet-DRTfZTZN.js +2 -0
  69. package/client/assets/ProtectedCuesheet-DRTfZTZN.js.br +0 -0
  70. package/client/assets/ProtectedCuesheet-DRTfZTZN.js.gz +0 -0
  71. package/client/assets/ProtectedCuesheet-DRTfZTZN.js.map +1 -0
  72. package/client/assets/ProtectedEditor-DNOiQqIU.js +3 -0
  73. package/client/assets/ProtectedEditor-DNOiQqIU.js.br +0 -0
  74. package/client/assets/ProtectedEditor-DNOiQqIU.js.gz +0 -0
  75. package/client/assets/ProtectedEditor-DNOiQqIU.js.map +1 -0
  76. package/client/assets/ProtectedEditor-DyaLP0mG.css +1 -0
  77. package/client/assets/ProtectedEditor-DyaLP0mG.css.br +0 -0
  78. package/client/assets/ProtectedEditor-DyaLP0mG.css.gz +0 -0
  79. package/client/assets/{RundownExport-C_q3KYN_.js → RundownExport-Bvc1J50m.js} +2 -2
  80. package/client/assets/RundownExport-Bvc1J50m.js.br +0 -0
  81. package/client/assets/RundownExport-Bvc1J50m.js.gz +0 -0
  82. package/client/assets/RundownExport-Bvc1J50m.js.map +1 -0
  83. package/client/assets/{Select-DQwYPDyI.js → Select-CvUrsmYI.js} +2 -2
  84. package/client/assets/Select-CvUrsmYI.js.br +0 -0
  85. package/client/assets/Select-CvUrsmYI.js.gz +0 -0
  86. package/client/assets/{Select-DQwYPDyI.js.map → Select-CvUrsmYI.js.map} +1 -1
  87. package/client/assets/{Studio-DzXTmBx4.js → Studio-BSSiKd6k.js} +2 -2
  88. package/client/assets/Studio-BSSiKd6k.js.br +0 -0
  89. package/client/assets/Studio-BSSiKd6k.js.gz +0 -0
  90. package/client/assets/{Studio-DzXTmBx4.js.map → Studio-BSSiKd6k.js.map} +1 -1
  91. package/client/assets/{StyleEditor-ClMEMaWh.js → StyleEditor-buc-zQHR.js} +2 -2
  92. package/client/assets/StyleEditor-buc-zQHR.js.br +0 -0
  93. package/client/assets/StyleEditor-buc-zQHR.js.gz +0 -0
  94. package/client/assets/{StyleEditor-ClMEMaWh.js.map → StyleEditor-buc-zQHR.js.map} +1 -1
  95. package/client/assets/{SuperscriptPeriod-CBiZU34J.js → SuperscriptPeriod-CSX8zFgq.js} +2 -2
  96. package/client/assets/SuperscriptPeriod-CSX8zFgq.js.br +0 -0
  97. package/client/assets/SuperscriptPeriod-CSX8zFgq.js.gz +0 -0
  98. package/client/assets/{SuperscriptPeriod-CBiZU34J.js.map → SuperscriptPeriod-CSX8zFgq.js.map} +1 -1
  99. package/client/assets/{SuperscriptTime-DP1CDlOX.js → SuperscriptTime-retbmT5o.js} +2 -2
  100. package/client/assets/SuperscriptTime-retbmT5o.js.br +0 -0
  101. package/client/assets/SuperscriptTime-retbmT5o.js.gz +0 -0
  102. package/client/assets/{SuperscriptTime-DP1CDlOX.js.map → SuperscriptTime-retbmT5o.js.map} +1 -1
  103. package/client/assets/SwatchPicker-DuWAohyD.js +2 -0
  104. package/client/assets/SwatchPicker-DuWAohyD.js.br +0 -0
  105. package/client/assets/SwatchPicker-DuWAohyD.js.gz +0 -0
  106. package/client/assets/{SwatchPicker-Dyxkxf3_.js.map → SwatchPicker-DuWAohyD.js.map} +1 -1
  107. package/client/assets/TimeElements-BfxdLkpO.js +2 -0
  108. package/client/assets/TimeElements-BfxdLkpO.js.br +0 -0
  109. package/client/assets/TimeElements-BfxdLkpO.js.gz +0 -0
  110. package/client/assets/{TimeElements-pDYJeFbV.js.map → TimeElements-BfxdLkpO.js.map} +1 -1
  111. package/client/assets/{TimeInput-DTWDnaum.js → TimeInput-BjOTgjcv.js} +2 -2
  112. package/client/assets/TimeInput-BjOTgjcv.js.br +0 -0
  113. package/client/assets/TimeInput-BjOTgjcv.js.gz +0 -0
  114. package/client/assets/{TimeInput-DTWDnaum.js.map → TimeInput-BjOTgjcv.js.map} +1 -1
  115. package/client/assets/{TimelinePage-DbLt9rQi.js → TimelinePage-pjff5TxG.js} +2 -2
  116. package/client/assets/TimelinePage-pjff5TxG.js.br +0 -0
  117. package/client/assets/TimelinePage-pjff5TxG.js.gz +0 -0
  118. package/client/assets/TimelinePage-pjff5TxG.js.map +1 -0
  119. package/client/assets/{Timer-BfyVKQ8U.js → Timer-ahF-O2zN.js} +2 -2
  120. package/client/assets/Timer-ahF-O2zN.js.br +0 -0
  121. package/client/assets/Timer-ahF-O2zN.js.gz +0 -0
  122. package/client/assets/{Timer-BfyVKQ8U.js.map → Timer-ahF-O2zN.js.map} +1 -1
  123. package/client/assets/TimerControlExport-De2n8HWG.js +2 -0
  124. package/client/assets/TimerControlExport-De2n8HWG.js.br +0 -0
  125. package/client/assets/TimerControlExport-De2n8HWG.js.gz +0 -0
  126. package/client/assets/TimerControlExport-De2n8HWG.js.map +1 -0
  127. package/client/assets/TimerDisplay-DeFQvmo9.js +2 -0
  128. package/client/assets/TimerDisplay-DeFQvmo9.js.br +0 -0
  129. package/client/assets/TimerDisplay-DeFQvmo9.js.gz +0 -0
  130. package/client/assets/{TimerDisplay-Dgmbqf65.js.map → TimerDisplay-DeFQvmo9.js.map} +1 -1
  131. package/client/assets/{TitleCard-MUurHeZ7.js → TitleCard-BiaQE4ZK.js} +2 -2
  132. package/client/assets/TitleCard-BiaQE4ZK.js.br +0 -0
  133. package/client/assets/TitleCard-BiaQE4ZK.js.gz +0 -0
  134. package/client/assets/{TitleCard-MUurHeZ7.js.map → TitleCard-BiaQE4ZK.js.map} +1 -1
  135. package/client/assets/{Tooltip-DXph8P8p.js → Tooltip-C5iPq6NR.js} +2 -2
  136. package/client/assets/Tooltip-C5iPq6NR.js.br +0 -0
  137. package/client/assets/Tooltip-C5iPq6NR.js.gz +0 -0
  138. package/client/assets/{Tooltip-DXph8P8p.js.map → Tooltip-C5iPq6NR.js.map} +1 -1
  139. package/client/assets/{ViewLogo-Ckp7i75x.js → ViewLogo-DcDhyyIF.js} +2 -2
  140. package/client/assets/ViewLogo-DcDhyyIF.js.br +0 -0
  141. package/client/assets/ViewLogo-DcDhyyIF.js.gz +0 -0
  142. package/client/assets/{ViewLogo-Ckp7i75x.js.map → ViewLogo-DcDhyyIF.js.map} +1 -1
  143. package/client/assets/{ViewParamsEditor-Cxngd15h.js → ViewParamsEditor-DeMdkxxC.js} +2 -2
  144. package/client/assets/ViewParamsEditor-DeMdkxxC.js.br +0 -0
  145. package/client/assets/ViewParamsEditor-DeMdkxxC.js.gz +0 -0
  146. package/client/assets/{ViewParamsEditor-Cxngd15h.js.map → ViewParamsEditor-DeMdkxxC.js.map} +1 -1
  147. package/client/assets/{editorSettings-D4jfu68W.js → editorSettings-xk5GwlLv.js} +2 -2
  148. package/client/assets/editorSettings-xk5GwlLv.js.br +0 -0
  149. package/client/assets/editorSettings-xk5GwlLv.js.gz +0 -0
  150. package/client/assets/{editorSettings-D4jfu68W.js.map → editorSettings-xk5GwlLv.js.map} +1 -1
  151. package/client/assets/{getProgress-B9UANc25.js → getProgress-CWSCZOIN.js} +2 -2
  152. package/client/assets/getProgress-CWSCZOIN.js.br +0 -0
  153. package/client/assets/getProgress-CWSCZOIN.js.gz +0 -0
  154. package/client/assets/{getProgress-B9UANc25.js.map → getProgress-CWSCZOIN.js.map} +1 -1
  155. package/client/assets/index-3aosT33y.js +3 -0
  156. package/client/assets/index-3aosT33y.js.br +0 -0
  157. package/client/assets/index-3aosT33y.js.gz +0 -0
  158. package/client/assets/index-3aosT33y.js.map +1 -0
  159. package/client/assets/{offset-DAyBfv5b.js → offset-yVqq_CB1.js} +2 -2
  160. package/client/assets/offset-yVqq_CB1.js.br +0 -0
  161. package/client/assets/offset-yVqq_CB1.js.gz +0 -0
  162. package/client/assets/{offset-DAyBfv5b.js.map → offset-yVqq_CB1.js.map} +1 -1
  163. package/client/assets/parseUserTime-wAKk9aCJ.js +2 -0
  164. package/client/assets/parseUserTime-wAKk9aCJ.js.br +0 -0
  165. package/client/assets/parseUserTime-wAKk9aCJ.js.gz +0 -0
  166. package/client/assets/{parseUserTime-WkVNjkkE.js.map → parseUserTime-wAKk9aCJ.js.map} +1 -1
  167. package/client/assets/{playbackstate-znZk3SSJ.js → playbackstate-BZ9WYn2k.js} +2 -2
  168. package/client/assets/playbackstate-BZ9WYn2k.js.br +0 -0
  169. package/client/assets/playbackstate-BZ9WYn2k.js.gz +0 -0
  170. package/client/assets/{playbackstate-znZk3SSJ.js.map → playbackstate-BZ9WYn2k.js.map} +1 -1
  171. package/client/assets/{presentation.utils-CjjYs5II.js → presentation.utils-lyuuD4A5.js} +2 -2
  172. package/client/assets/presentation.utils-lyuuD4A5.js.br +0 -0
  173. package/client/assets/presentation.utils-lyuuD4A5.js.gz +0 -0
  174. package/client/assets/{presentation.utils-CjjYs5II.js.map → presentation.utils-lyuuD4A5.js.map} +1 -1
  175. package/client/assets/{rundownUtils-BTQ3EeqN.js → rundownUtils-XX_c4Pcl.js} +2 -2
  176. package/client/assets/rundownUtils-XX_c4Pcl.js.br +0 -0
  177. package/client/assets/rundownUtils-XX_c4Pcl.js.gz +0 -0
  178. package/client/assets/{rundownUtils-BTQ3EeqN.js.map → rundownUtils-XX_c4Pcl.js.map} +1 -1
  179. package/client/assets/timer.utils-CWHFVz06.js +2 -0
  180. package/client/assets/timer.utils-CWHFVz06.js.br +0 -0
  181. package/client/assets/timer.utils-CWHFVz06.js.gz +0 -0
  182. package/client/assets/{timer.utils-B-Ui91P7.js.map → timer.utils-CWHFVz06.js.map} +1 -1
  183. package/client/assets/useCustomFields-kBD1jvDA.js +2 -0
  184. package/client/assets/useCustomFields-kBD1jvDA.js.br +0 -0
  185. package/client/assets/useCustomFields-kBD1jvDA.js.gz +0 -0
  186. package/client/assets/{useCustomFields-zr9SUl5o.js.map → useCustomFields-kBD1jvDA.js.map} +1 -1
  187. package/client/assets/{useEventSelection-B9mbj1cM.js → useEventSelection-Cvdw9all.js} +2 -2
  188. package/client/assets/useEventSelection-Cvdw9all.js.br +0 -0
  189. package/client/assets/useEventSelection-Cvdw9all.js.gz +0 -0
  190. package/client/assets/{useEventSelection-B9mbj1cM.js.map → useEventSelection-Cvdw9all.js.map} +1 -1
  191. package/client/assets/{useProjectData-DD_BQ9eJ.js → useProjectData-gGT2eczr.js} +2 -2
  192. package/client/assets/useProjectData-gGT2eczr.js.br +0 -0
  193. package/client/assets/useProjectData-gGT2eczr.js.gz +0 -0
  194. package/client/assets/{useProjectData-DD_BQ9eJ.js.map → useProjectData-gGT2eczr.js.map} +1 -1
  195. package/client/assets/{useReport-DozG5uz5.js → useReport-CG6m_Zb0.js} +2 -2
  196. package/client/assets/useReport-CG6m_Zb0.js.br +0 -0
  197. package/client/assets/useReport-CG6m_Zb0.js.gz +0 -0
  198. package/client/assets/{useReport-DozG5uz5.js.map → useReport-CG6m_Zb0.js.map} +1 -1
  199. package/client/assets/{useRundown-D6vokFHi.js → useRundown-C6stroSA.js} +2 -2
  200. package/client/assets/useRundown-C6stroSA.js.br +0 -0
  201. package/client/assets/useRundown-C6stroSA.js.gz +0 -0
  202. package/client/assets/useRundown-C6stroSA.js.map +1 -0
  203. package/client/assets/{useSelectAndRevealEntry-Dd6MpVHe.js → useSelectAndRevealEntry-D79sYFHr.js} +2 -2
  204. package/client/assets/useSelectAndRevealEntry-D79sYFHr.js.br +0 -0
  205. package/client/assets/useSelectAndRevealEntry-D79sYFHr.js.gz +0 -0
  206. package/client/assets/{useSelectAndRevealEntry-Dd6MpVHe.js.map → useSelectAndRevealEntry-D79sYFHr.js.map} +1 -1
  207. package/client/assets/{useWindowTitle-bg-fLPOk.js → useWindowTitle-CQ8nEeel.js} +2 -2
  208. package/client/assets/useWindowTitle-CQ8nEeel.js.br +0 -0
  209. package/client/assets/useWindowTitle-CQ8nEeel.js.gz +0 -0
  210. package/client/assets/{useWindowTitle-bg-fLPOk.js.map → useWindowTitle-CQ8nEeel.js.map} +1 -1
  211. package/client/assets/{validateEvent-BUgLWn7x.js → validateEvent-BnwPmDph.js} +2 -2
  212. package/client/assets/validateEvent-BnwPmDph.js.br +0 -0
  213. package/client/assets/validateEvent-BnwPmDph.js.gz +0 -0
  214. package/client/assets/{validateEvent-BUgLWn7x.js.map → validateEvent-BnwPmDph.js.map} +1 -1
  215. package/client/assets/{vendor-CKDP5hij.js → vendor-Dt3_Fdfs.js} +2 -2
  216. package/client/assets/vendor-Dt3_Fdfs.js.br +0 -0
  217. package/client/assets/vendor-Dt3_Fdfs.js.gz +0 -0
  218. package/client/assets/{vendor-CKDP5hij.js.map → vendor-Dt3_Fdfs.js.map} +1 -1
  219. package/client/assets/{viewLoader.utils-Bn5zu5sz.js → viewLoader.utils-H7r-zNPP.js} +2 -2
  220. package/client/assets/viewLoader.utils-H7r-zNPP.js.br +0 -0
  221. package/client/assets/viewLoader.utils-H7r-zNPP.js.gz +0 -0
  222. package/client/assets/{viewLoader.utils-Bn5zu5sz.js.map → viewLoader.utils-H7r-zNPP.js.map} +1 -1
  223. package/client/assets/{viewUtils-DQFwr7hm.js → viewUtils-k0tARVDN.js} +2 -2
  224. package/client/assets/viewUtils-k0tARVDN.js.br +0 -0
  225. package/client/assets/viewUtils-k0tARVDN.js.gz +0 -0
  226. package/client/assets/{viewUtils-DQFwr7hm.js.map → viewUtils-k0tARVDN.js.map} +1 -1
  227. package/client/index.html +2 -2
  228. package/package.json +1 -1
  229. package/server/index.cjs +104 -104
  230. package/client/assets/Backstage-BY9GL_rk.js.br +0 -0
  231. package/client/assets/Backstage-BY9GL_rk.js.gz +0 -0
  232. package/client/assets/Countdown-CXFgDHND.js.br +0 -0
  233. package/client/assets/Countdown-CXFgDHND.js.gz +0 -0
  234. package/client/assets/CuesheetTable-BLICUNky.js +0 -2
  235. package/client/assets/CuesheetTable-BLICUNky.js.br +0 -0
  236. package/client/assets/CuesheetTable-BLICUNky.js.gz +0 -0
  237. package/client/assets/CuesheetTable-BLICUNky.js.map +0 -1
  238. package/client/assets/CustomTranslationModal-4PVZBtkC.js +0 -2
  239. package/client/assets/CustomTranslationModal-4PVZBtkC.js.br +0 -0
  240. package/client/assets/CustomTranslationModal-4PVZBtkC.js.gz +0 -0
  241. package/client/assets/DelayIndicator-DUbpd6DG.js.br +0 -0
  242. package/client/assets/DelayIndicator-DUbpd6DG.js.gz +0 -0
  243. package/client/assets/DelayIndicator-DUbpd6DG.js.map +0 -1
  244. package/client/assets/EditorFeatureWrapper-CV_zaDoG.js.br +0 -0
  245. package/client/assets/EditorFeatureWrapper-CV_zaDoG.js.gz +0 -0
  246. package/client/assets/EditorUtils-CLBWDP4k.js.br +0 -0
  247. package/client/assets/EditorUtils-CLBWDP4k.js.gz +0 -0
  248. package/client/assets/EmptyPage-DmpOAg7R.js +0 -2
  249. package/client/assets/EmptyPage-DmpOAg7R.js.br +0 -2
  250. package/client/assets/EmptyPage-DmpOAg7R.js.gz +0 -0
  251. package/client/assets/FollowButton-CAUWz5Ma.js.br +0 -0
  252. package/client/assets/FollowButton-CAUWz5Ma.js.gz +0 -0
  253. package/client/assets/MessageControlExport-Dm8IjSr4.js +0 -3
  254. package/client/assets/MessageControlExport-Dm8IjSr4.js.br +0 -0
  255. package/client/assets/MessageControlExport-Dm8IjSr4.js.gz +0 -0
  256. package/client/assets/MultiPartProgressBar-Fp-sTN2u.js.br +0 -0
  257. package/client/assets/MultiPartProgressBar-Fp-sTN2u.js.gz +0 -0
  258. package/client/assets/OperatorExport-CE4ajLPS.js.br +0 -0
  259. package/client/assets/OperatorExport-CE4ajLPS.js.gz +0 -0
  260. package/client/assets/OperatorExport-CE4ajLPS.js.map +0 -1
  261. package/client/assets/OverviewWrapper-BNnAIUP1.js +0 -2
  262. package/client/assets/OverviewWrapper-BNnAIUP1.js.br +0 -0
  263. package/client/assets/OverviewWrapper-BNnAIUP1.js.gz +0 -0
  264. package/client/assets/OverviewWrapper-DOYzR0Ef.css +0 -1
  265. package/client/assets/OverviewWrapper-DOYzR0Ef.css.br +0 -0
  266. package/client/assets/OverviewWrapper-DOYzR0Ef.css.gz +0 -0
  267. package/client/assets/PipHost-CbNFsfqp.js.br +0 -0
  268. package/client/assets/PipHost-CbNFsfqp.js.gz +0 -0
  269. package/client/assets/ProjectInfo-Bf5z4Xsv.js.br +0 -0
  270. package/client/assets/ProjectInfo-Bf5z4Xsv.js.gz +0 -0
  271. package/client/assets/ProtectRoute-CCHzyy0I.js +0 -2
  272. package/client/assets/ProtectRoute-CCHzyy0I.js.br +0 -0
  273. package/client/assets/ProtectRoute-CCHzyy0I.js.gz +0 -0
  274. package/client/assets/ProtectedCuesheet-COI1W_V3.js +0 -2
  275. package/client/assets/ProtectedCuesheet-COI1W_V3.js.br +0 -0
  276. package/client/assets/ProtectedCuesheet-COI1W_V3.js.gz +0 -0
  277. package/client/assets/ProtectedCuesheet-COI1W_V3.js.map +0 -1
  278. package/client/assets/ProtectedEditor-BvTFmv-F.js +0 -3
  279. package/client/assets/ProtectedEditor-BvTFmv-F.js.br +0 -0
  280. package/client/assets/ProtectedEditor-BvTFmv-F.js.gz +0 -0
  281. package/client/assets/ProtectedEditor-BvTFmv-F.js.map +0 -1
  282. package/client/assets/ProtectedEditor-DID9cfOA.css +0 -1
  283. package/client/assets/ProtectedEditor-DID9cfOA.css.br +0 -0
  284. package/client/assets/ProtectedEditor-DID9cfOA.css.gz +0 -0
  285. package/client/assets/RundownExport-C_q3KYN_.js.br +0 -0
  286. package/client/assets/RundownExport-C_q3KYN_.js.gz +0 -0
  287. package/client/assets/RundownExport-C_q3KYN_.js.map +0 -1
  288. package/client/assets/Select-DQwYPDyI.js.br +0 -0
  289. package/client/assets/Select-DQwYPDyI.js.gz +0 -0
  290. package/client/assets/Studio-DzXTmBx4.js.br +0 -0
  291. package/client/assets/Studio-DzXTmBx4.js.gz +0 -0
  292. package/client/assets/StyleEditor-ClMEMaWh.js.br +0 -0
  293. package/client/assets/StyleEditor-ClMEMaWh.js.gz +0 -0
  294. package/client/assets/SuperscriptPeriod-CBiZU34J.js.br +0 -0
  295. package/client/assets/SuperscriptPeriod-CBiZU34J.js.gz +0 -0
  296. package/client/assets/SuperscriptTime-DP1CDlOX.js.br +0 -0
  297. package/client/assets/SuperscriptTime-DP1CDlOX.js.gz +0 -0
  298. package/client/assets/SwatchPicker-Dyxkxf3_.js +0 -2
  299. package/client/assets/SwatchPicker-Dyxkxf3_.js.br +0 -0
  300. package/client/assets/SwatchPicker-Dyxkxf3_.js.gz +0 -0
  301. package/client/assets/TimeElements-pDYJeFbV.js +0 -2
  302. package/client/assets/TimeElements-pDYJeFbV.js.br +0 -0
  303. package/client/assets/TimeElements-pDYJeFbV.js.gz +0 -0
  304. package/client/assets/TimeInput-DTWDnaum.js.br +0 -0
  305. package/client/assets/TimeInput-DTWDnaum.js.gz +0 -0
  306. package/client/assets/TimelinePage-DbLt9rQi.js.br +0 -0
  307. package/client/assets/TimelinePage-DbLt9rQi.js.gz +0 -0
  308. package/client/assets/TimelinePage-DbLt9rQi.js.map +0 -1
  309. package/client/assets/Timer-BfyVKQ8U.js.br +0 -0
  310. package/client/assets/Timer-BfyVKQ8U.js.gz +0 -0
  311. package/client/assets/TimerControlExport-BJfhJc07.js +0 -2
  312. package/client/assets/TimerControlExport-BJfhJc07.js.br +0 -0
  313. package/client/assets/TimerControlExport-BJfhJc07.js.gz +0 -0
  314. package/client/assets/TimerControlExport-BJfhJc07.js.map +0 -1
  315. package/client/assets/TimerDisplay-Dgmbqf65.js +0 -2
  316. package/client/assets/TimerDisplay-Dgmbqf65.js.br +0 -0
  317. package/client/assets/TimerDisplay-Dgmbqf65.js.gz +0 -0
  318. package/client/assets/TitleCard-MUurHeZ7.js.br +0 -0
  319. package/client/assets/TitleCard-MUurHeZ7.js.gz +0 -0
  320. package/client/assets/Tooltip-DXph8P8p.js.br +0 -0
  321. package/client/assets/Tooltip-DXph8P8p.js.gz +0 -0
  322. package/client/assets/ViewLogo-Ckp7i75x.js.br +0 -0
  323. package/client/assets/ViewLogo-Ckp7i75x.js.gz +0 -0
  324. package/client/assets/ViewParamsEditor-Cxngd15h.js.br +0 -0
  325. package/client/assets/ViewParamsEditor-Cxngd15h.js.gz +0 -0
  326. package/client/assets/editorSettings-D4jfu68W.js.br +0 -0
  327. package/client/assets/editorSettings-D4jfu68W.js.gz +0 -0
  328. package/client/assets/getProgress-B9UANc25.js.br +0 -0
  329. package/client/assets/getProgress-B9UANc25.js.gz +0 -0
  330. package/client/assets/index-2lQ-45a9.js +0 -3
  331. package/client/assets/index-2lQ-45a9.js.br +0 -0
  332. package/client/assets/index-2lQ-45a9.js.gz +0 -0
  333. package/client/assets/index-2lQ-45a9.js.map +0 -1
  334. package/client/assets/offset-DAyBfv5b.js.br +0 -4
  335. package/client/assets/offset-DAyBfv5b.js.gz +0 -0
  336. package/client/assets/parseUserTime-WkVNjkkE.js +0 -2
  337. package/client/assets/parseUserTime-WkVNjkkE.js.br +0 -0
  338. package/client/assets/parseUserTime-WkVNjkkE.js.gz +0 -0
  339. package/client/assets/playbackstate-znZk3SSJ.js.br +0 -0
  340. package/client/assets/playbackstate-znZk3SSJ.js.gz +0 -0
  341. package/client/assets/presentation.utils-CjjYs5II.js.br +0 -0
  342. package/client/assets/presentation.utils-CjjYs5II.js.gz +0 -0
  343. package/client/assets/rundownUtils-BTQ3EeqN.js.br +0 -0
  344. package/client/assets/rundownUtils-BTQ3EeqN.js.gz +0 -0
  345. package/client/assets/timer.utils-B-Ui91P7.js +0 -2
  346. package/client/assets/timer.utils-B-Ui91P7.js.br +0 -0
  347. package/client/assets/timer.utils-B-Ui91P7.js.gz +0 -0
  348. package/client/assets/useCustomFields-zr9SUl5o.js +0 -2
  349. package/client/assets/useCustomFields-zr9SUl5o.js.br +0 -0
  350. package/client/assets/useCustomFields-zr9SUl5o.js.gz +0 -0
  351. package/client/assets/useEventSelection-B9mbj1cM.js.br +0 -0
  352. package/client/assets/useEventSelection-B9mbj1cM.js.gz +0 -0
  353. package/client/assets/useProjectData-DD_BQ9eJ.js.br +0 -0
  354. package/client/assets/useProjectData-DD_BQ9eJ.js.gz +0 -0
  355. package/client/assets/useReport-DozG5uz5.js.br +0 -0
  356. package/client/assets/useReport-DozG5uz5.js.gz +0 -0
  357. package/client/assets/useRundown-D6vokFHi.js.br +0 -0
  358. package/client/assets/useRundown-D6vokFHi.js.gz +0 -0
  359. package/client/assets/useRundown-D6vokFHi.js.map +0 -1
  360. package/client/assets/useSelectAndRevealEntry-Dd6MpVHe.js.br +0 -0
  361. package/client/assets/useSelectAndRevealEntry-Dd6MpVHe.js.gz +0 -0
  362. package/client/assets/useWindowTitle-bg-fLPOk.js.br +0 -0
  363. package/client/assets/useWindowTitle-bg-fLPOk.js.gz +0 -0
  364. package/client/assets/validateEvent-BUgLWn7x.js.br +0 -0
  365. package/client/assets/validateEvent-BUgLWn7x.js.gz +0 -0
  366. package/client/assets/vendor-CKDP5hij.js.br +0 -0
  367. package/client/assets/vendor-CKDP5hij.js.gz +0 -0
  368. package/client/assets/viewLoader.utils-Bn5zu5sz.js.br +0 -0
  369. package/client/assets/viewLoader.utils-Bn5zu5sz.js.gz +0 -0
  370. package/client/assets/viewUtils-DQFwr7hm.js.br +0 -0
  371. package/client/assets/viewUtils-DQFwr7hm.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useEventSelection-B9mbj1cM.js","sources":["../../src/common/api/automation.ts","../../src/common/models/AutomationSettings.ts","../../src/common/hooks-query/useAutomationSettings.ts","../../src/common/utils/regex.ts","../../src/common/components/tag/Tag.tsx","../../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/common/components/input/colour-input/Swatch.tsx","../../src/common/components/input/colour-input/SwatchSelect.tsx","../../src/common/components/dropdown-menu/DropdownMenu.tsx","../../src/common/components/modal/Modal.tsx","../../src/common/utils/deviceUtils.ts","../../src/features/rundown/useEventSelection.ts"],"sourcesContent":["import axios from 'axios';\nimport type {\n Automation,\n AutomationDTO,\n AutomationOutput,\n AutomationSettings,\n Trigger,\n TriggerDTO,\n} from 'ontime-types';\n\nimport { apiEntryUrl } from './constants';\nimport type { RequestOptions } from './requestOptions';\n\nconst automationsPath = `${apiEntryUrl}/automations`;\n\n/**\n * HTTP request to get the automations settings\n */\nexport async function getAutomationSettings(options?: RequestOptions): Promise<AutomationSettings> {\n const res = await axios.get(automationsPath, { signal: options?.signal });\n return res.data;\n}\n\n/**\n * HTTP request to edit the automations settings\n */\nexport async function editAutomationSettings(\n automationSettings: Partial<AutomationSettings>,\n): Promise<AutomationSettings> {\n const res = await axios.post(automationsPath, automationSettings);\n return res.data;\n}\n\n/**\n * HTTP request to create a new automation trigger\n */\nexport async function addTrigger(trigger: TriggerDTO): Promise<Trigger> {\n const res = await axios.post(`${automationsPath}/trigger`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to update an automation trigger\n */\nexport async function editTrigger(id: string, trigger: Trigger): Promise<Trigger> {\n const res = await axios.put(`${automationsPath}/trigger/${id}`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to delete an automation trigger\n */\nexport function deleteTrigger(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/trigger/${id}`);\n}\n\n/**\n * HTTP request to create a new automation\n */\nexport async function addAutomation(automation: AutomationDTO): Promise<Automation> {\n const res = await axios.post(`${automationsPath}/automation`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to update a automation\n */\nexport async function editAutomation(id: string, automation: Automation): Promise<Automation> {\n const res = await axios.put(`${automationsPath}/automation/${id}`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to delete a automation\n */\nexport function deleteAutomation(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/automation/${id}`);\n}\n\n/**\n * HTTP request to test automation output\n * The return is irrelevant as we care for the resolution of the promise\n */\nexport function testOutput(output: AutomationOutput): Promise<void> {\n return axios.post(`${automationsPath}/test`, output);\n}\n","import { AutomationSettings } from 'ontime-types';\n\nexport const automationPlaceholderSettings: AutomationSettings = {\n enabledAutomations: false,\n enabledOscIn: false,\n oscPortIn: 8888,\n triggers: [],\n automations: {},\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport { queryRefetchIntervalSlow } from '../../ontimeConfig';\nimport { getAutomationSettings } from '../api/automation';\nimport { AUTOMATION } from '../api/constants';\nimport { automationPlaceholderSettings } from '../models/AutomationSettings';\n\nexport default function useAutomationSettings() {\n const { data, status, isFetching, isError, refetch } = useQuery({\n queryKey: AUTOMATION,\n queryFn: ({ signal }) => getAutomationSettings({ signal }),\n placeholderData: (previousData, _previousQuery) => previousData,\n refetchInterval: queryRefetchIntervalSlow,\n });\n\n return { data: data ?? automationPlaceholderSettings, status, isFetching, isError, refetch };\n}\n","/**\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 { PropsWithChildren } from 'react';\n\nimport style from './Tag.module.scss';\n\ninterface TagProps {\n className?: string;\n}\n\nexport default function Tag({ className, children }: PropsWithChildren<TagProps>) {\n return <span className={`${style.tag} ${className || ''}`}>{children}</span>;\n}\n","import { Radio } from '@base-ui/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui/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 { safeCopyToClipboard } 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 safeCopyToClipboard(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 safeCopyToClipboard(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: string | null) => {\n if (value === null) return;\n setValue('baseUrl', value);\n }}\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: OntimeView | string | null) => {\n if (value === null) return;\n setValue('path', value, { shouldDirty: true });\n }}\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 { MouseEvent } from 'react';\nimport { IoBan } from 'react-icons/io5';\n\nimport { cx } from '../../../utils/styleUtils';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface SwatchProps {\n color: string;\n onClick?: (color: string) => void;\n isSelected?: boolean;\n}\n\nexport default function Swatch({ color, isSelected, onClick }: SwatchProps) {\n const handleClick = (event: MouseEvent) => {\n onClick?.(color);\n event.preventDefault();\n event.stopPropagation();\n };\n\n const classes = cx([style.swatch, isSelected && style.selected, onClick && style.selectable]);\n\n if (!color) {\n return (\n <div className={classes} onClick={handleClick}>\n <IoBan />\n </div>\n );\n }\n return <div className={classes} style={{ backgroundColor: `${color}` }} onClick={handleClick} />;\n}\n","import { useCallback } from 'react';\n\nimport Swatch from './Swatch';\nimport SwatchPicker from './SwatchPicker';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface ColourInputProps {\n value: string;\n name: 'colour';\n handleChange: (newValue: 'colour', name: string) => void;\n}\n\nconst colours = [\n '',\n '#FFCC78', // $orange-400\n '#FFAB33', // $orange-600\n '#77C785', // $green-400\n '#339E4E', // $green-600\n '#779BE7', // $blue-400\n '#3E75E8', // $blue-600\n '#FF7878', // $red-400\n '#ED3333', // $red-600\n '#A790F5', // $violet-400\n '#8064E1', // $violet-600\n '#9d9d9d', // $gray-500\n '#ececec', // $gray-100\n];\n\nexport default function SwatchSelect(props: ColourInputProps) {\n const { value, name, handleChange } = props;\n\n const setColour = useCallback(\n (newValue: string) => {\n if (newValue !== value) {\n handleChange(name, newValue);\n }\n },\n [handleChange, name, value],\n );\n\n return (\n <div className={style.list}>\n {colours.map((colour) => (\n <Swatch key={colour} color={colour} onClick={setColour} isSelected={value === colour} />\n ))}\n <SwatchPicker color={value} onChange={setColour} isSelected={!colours.includes(value)} />\n </div>\n );\n}\n","import { PropsWithChildren } from 'react';\nimport { IconType } from 'react-icons';\nimport { Menu as BaseMenu } from '@base-ui/react/menu';\n\nimport style from './DropdownMenu.module.scss';\n\ntype DropdownMenuItemDivider = { type: 'divider' };\ntype DropdownMenuItem = {\n type: 'item' | 'destructive';\n label: string;\n description?: string;\n icon?: IconType;\n disabled?: boolean;\n onClick: () => void;\n shortcut?: string;\n};\n\nexport type DropdownMenuOption = DropdownMenuItemDivider | DropdownMenuItem;\n\ninterface DropdownMenuProps extends BaseMenu.Trigger.Props {\n items: DropdownMenuOption[];\n}\n\nexport function DropdownMenu({ items, children, ...triggerProps }: PropsWithChildren<DropdownMenuProps>) {\n return (\n <BaseMenu.Root>\n <BaseMenu.Trigger {...triggerProps}>{children}</BaseMenu.Trigger>\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item\n key={index}\n className={style.item}\n onClick={item.onClick}\n disabled={item.disabled}\n data-type={item.type}\n >\n <span className={style.content}>\n <span className={style.label}>\n {item.icon && <item.icon />}\n {item.label}\n </span>\n {item.description && <span className={style.description}>{item.description}</span>}\n </span>\n {item.shortcut && <span className={style.shortcut}>{item.shortcut}</span>}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n\ninterface PositionedDropdownMenuProps {\n items: Array<DropdownMenuItemDivider | DropdownMenuItem>;\n isOpen: boolean;\n onClose: () => void;\n position: { x: number; y: number };\n}\n\nexport function PositionedDropdownMenu({ items, isOpen, position, onClose }: PositionedDropdownMenuProps) {\n return (\n <BaseMenu.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <BaseMenu.Trigger style={{ position: 'fixed', left: position.x, top: position.y }} aria-hidden />\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8} alignOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item key={index} className={style.item} onClick={item.onClick} disabled={item.disabled}>\n <span className={style.content}>\n <span className={style.label}>\n {item.icon && <item.icon />}\n {item.label}\n </span>\n {item.description && <span className={style.description}>{item.description}</span>}\n </span>\n {item.shortcut && <span className={style.shortcut}>{item.shortcut}</span>}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n","import type { ReactNode } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog as BaseDialog } from '@base-ui/react/dialog';\n\nimport IconButton from '../buttons/IconButton';\n\nimport style from './Modal.module.scss';\n\ninterface ModalProps {\n isOpen: boolean;\n title?: string;\n showCloseButton?: boolean;\n showBackdrop?: boolean;\n bodyElements: ReactNode;\n footerElements?: ReactNode;\n onClose: () => void;\n}\n\nexport default function Modal({\n isOpen,\n title,\n showCloseButton,\n showBackdrop,\n bodyElements,\n footerElements,\n onClose,\n}: ModalProps) {\n return (\n <BaseDialog.Root\n open={isOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n disablePointerDismissal\n >\n <BaseDialog.Portal>\n {showBackdrop && <BaseDialog.Backdrop className={style.backdrop} />}\n <BaseDialog.Popup className={style.modal}>\n <div className={style.title}>\n {title}\n {showCloseButton && (\n <IconButton variant='subtle-white' onClick={onClose}>\n <IoClose />\n </IconButton>\n )}\n </div>\n <div className={style.body}>{bodyElements}</div>\n <div className={style.footer}>{footerElements}</div>\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n );\n}\n","export function isMacOS() {\n const userAgent = navigator.userAgent.toLowerCase();\n return userAgent.includes('macintosh') || userAgent.includes('mac os');\n}\n\nexport const deviceAlt = isMacOS() ? 'Option' : 'Alt';\n\nexport const deviceMod = isMacOS() ? 'Cmd' : 'Ctrl';\n","import { MouseEvent } from 'react';\nimport { EntryId, isOntimeEvent, MaybeNumber, Rundown } from 'ontime-types';\nimport { create } from 'zustand';\n\nimport { RUNDOWN } from '../../common/api/constants';\nimport { ontimeQueryClient } from '../../common/queryClient';\nimport { isMacOS } from '../../common/utils/deviceUtils';\n\nexport type SelectionMode = 'shift' | 'click' | 'ctrl';\n\ninterface EventSelectionStore {\n selectedEvents: Set<EntryId>;\n anchoredIndex: MaybeNumber;\n cursor: EntryId | null;\n entryMode: 'event' | 'single' | null;\n scrollHandler: ((id: EntryId) => void) | null;\n setSingleEntrySelection: (selectionArgs: { id: EntryId }) => void;\n setSelectedEvents: (selectionArgs: { id: EntryId; index: number; selectMode: SelectionMode }) => void;\n clearSelectedEvents: () => void;\n clearMultiSelect: () => void;\n unselect: (id: EntryId) => void;\n setScrollHandler: (handler: ((id: EntryId) => void) | null) => void;\n scrollToEntry: (id: EntryId) => void;\n}\n\n/**\n * Keeps track of the selected entries and selection mode\n * Provides methods to update the selection based on user interactions\n */\nexport const useEventSelection = create<EventSelectionStore>()((set, get) => ({\n selectedEvents: new Set(),\n anchoredIndex: null,\n cursor: null,\n entryMode: null,\n scrollHandler: null,\n setSingleEntrySelection: ({ id }) => {\n set({ selectedEvents: new Set([id]), anchoredIndex: null, cursor: id, entryMode: 'single' });\n },\n setSelectedEvents: ({ id, index, selectMode }) => {\n const { selectedEvents, anchoredIndex, entryMode } = get();\n\n // if we are in single mode, we replace the selection and change the mode\n if (entryMode === 'single') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on click, we replace selection with event\n if (selectMode === 'click') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on ctrl + click, we toggle the selection of that event\n if (selectMode === 'ctrl') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // if it doesnt exist, simply add to the list and set an anchor\n if (!selectedEvents.has(id)) {\n return set({\n selectedEvents: selectedEvents.add(id),\n anchoredIndex: index,\n cursor: id,\n entryMode: 'event',\n });\n }\n\n // if event is already selected, we remove it from selection\n // and set the anchor to the event after\n selectedEvents.delete(id);\n\n const nextIndex = rundownData.order.findIndex(\n (eventId, i) => i > index && isOntimeEvent(rundownData.entries[eventId]) && selectedEvents.has(eventId),\n );\n\n // if we didnt find anything after, set the anchor to the last event\n return set({\n selectedEvents,\n anchoredIndex: nextIndex < 0 ? rundownData.order.length - 1 : nextIndex,\n entryMode: 'event',\n });\n }\n\n // on shift + click, we select a range of events up to the clicked event\n if (selectMode === 'shift') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // get list of rundown with only ontime events\n const eventIds: EntryId[] = [];\n rundownData.flatOrder.forEach((eventId) => {\n const event = rundownData.entries[eventId];\n if (isOntimeEvent(event)) {\n eventIds.push(event.id);\n }\n });\n\n const start = anchoredIndex === null ? 0 : Math.min(anchoredIndex, index);\n const end = anchoredIndex === null ? index : Math.max(anchoredIndex, index + 1);\n\n // create new set with range of ids from start to end\n const selectedEventIds = eventIds.slice(start, end);\n\n return set({\n selectedEvents: new Set([...selectedEvents, ...selectedEventIds]),\n anchoredIndex: index,\n entryMode: 'event',\n });\n }\n },\n clearSelectedEvents: () => set({ selectedEvents: new Set(), anchoredIndex: null, cursor: null, entryMode: null }),\n clearMultiSelect: () => {\n const { selectedEvents } = get();\n const [firstSelected] = selectedEvents;\n set({\n selectedEvents: new Set(firstSelected ? [firstSelected] : []),\n anchoredIndex: null,\n entryMode: null,\n });\n },\n unselect: (id: string) => {\n const { entryMode, selectedEvents } = get();\n selectedEvents.delete(id);\n set({\n selectedEvents,\n entryMode: selectedEvents.size === 0 ? null : entryMode,\n });\n },\n // Sets the scroll handler for programmatic scrolling to entries\n setScrollHandler: (handler) => set({ scrollHandler: handler }),\n // Scrolls to the specified entry using the registered scroll handler\n scrollToEntry: (id: EntryId) => {\n const handler = get().scrollHandler;\n if (handler) {\n handler(id);\n }\n },\n}));\n\nexport function getSelectionMode(event: MouseEvent): SelectionMode {\n if ((isMacOS() && event.metaKey) || event.ctrlKey) {\n return 'ctrl';\n }\n\n if (event.shiftKey) {\n return 'shift';\n }\n\n return 'click';\n}\n"],"names":["automationsPath","apiEntryUrl","getAutomationSettings","options","axios","get","signal","data","editAutomationSettings","automationSettings","post","addTrigger","trigger","editTrigger","id","put","deleteTrigger","delete","addAutomation","automation","editAutomation","deleteAutomation","testOutput","output","automationPlaceholderSettings","enabledAutomations","enabledOscIn","oscPortIn","triggers","automations","useAutomationSettings","status","isFetching","isError","refetch","useQuery","queryKey","AUTOMATION","queryFn","placeholderData","previousData","_previousQuery","refetchInterval","queryRefetchIntervalSlow","isOnlyNumbers","startsWithHttp","isAlphanumeric","isUrlSafe","Tag","className","children","jsx","style","tag","RadioGroup","items","orientation","onValueChange","elementProps","BaseRadioGroup","value","cx","radioGroup","map","item","jsxs","Radio.Root","toString","radio","Radio.Indicator","indicator","label","defaultOptions","hideTableSeconds","hideIndexColumn","showDelayedTimes","hideDelays","usePersistedCuesheetOptions","create","persist","set","setOption","key","state","toggleOption","resetOptions","name","cuesheetDefaultColumns","makeCuesheetCustomColumns","customFields","Object","entries","field","CuesheetLinkOptions","readRef","writeRef","useCustomFields","customFieldColumns","useMemo","readPermissions","setReadPermissions","useState","writePermissions","setWritePermissions","readSwitches","setReadSwitches","initialState","forEach","column","writeSwitches","setWriteSwitches","handleReadModeChange","prevReadSwitches","updatedReadSwitches","keys","handleWriteModeChange","prevWriteSwitches","updatedWriteSwitches","handleSwitchChange","type","getReadPermissions","filter","_","join","getWritePermissions","Panel.Indent","Panel.Field","twoCols","grid","Panel.Description","Fragment","Switch","Boolean","length","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","mode","defaultValues","baseUrl","path","OntimeView","Timer","authenticate","lockConfig","lockNav","createPresetFromOptions","alias","read","Error","target","Cuesheet","enabled","search","write","find","preset","onSubmit","urlPreset","current","generateUrl","safeCopyToClipboard","presetPath","startsWith","replace","undefined","keepValues","keepDirty","error","message","maybeAxiosError","canSubmit","event","preventEscape","Info","shareInline","Panel.ListGroup","isOntimeCloud","Panel.ListItem","Select","shouldDirty","Input","required","pattern","checked","Panel.Error","root","Panel.InlineElements","end","Button","Panel.Section","QRCode","qrCode","copiableLink","CopyTag","GenerateLinkFormExport","lockedPath","infoData","useInfo","urlPresetData","useUrlPresets","skip","networkInterfaces","nif","address","serverPort","Operator","Swatch","color","isSelected","onClick","handleClick","preventDefault","stopPropagation","classes","swatch","selected","selectable","backgroundColor","IoBan","colours","SwatchSelect","props","handleChange","setColour","useCallback","newValue","list","colour","SwatchPicker","includes","DropdownMenu","triggerProps","BaseMenu.Root","BaseMenu.Trigger","BaseMenu.Portal","BaseMenu.Positioner","positioner","BaseMenu.Popup","popup","index","BaseMenu.Separator","separator","BaseMenu.Item","disabled","content","icon","description","shortcut","PositionedDropdownMenu","isOpen","position","onClose","open","left","x","top","y","Modal","title","showCloseButton","showBackdrop","bodyElements","footerElements","BaseDialog.Root","BaseDialog.Portal","BaseDialog.Backdrop","backdrop","BaseDialog.Popup","modal","IconButton","IoClose","body","footer","isMacOS","userAgent","navigator","toLowerCase","deviceAlt","deviceMod","useEventSelection","selectedEvents","Set","anchoredIndex","cursor","entryMode","scrollHandler","setSingleEntrySelection","setSelectedEvents","selectMode","rundownData","ontimeQueryClient","getQueryData","RUNDOWN","has","add","nextIndex","order","findIndex","eventId","i","isOntimeEvent","eventIds","flatOrder","push","start","Math","min","max","selectedEventIds","slice","clearSelectedEvents","clearMultiSelect","firstSelected","unselect","size","setScrollHandler","handler","scrollToEntry","getSelectionMode","metaKey","ctrlKey","shiftKey"],"mappings":"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"}
1
+ {"version":3,"file":"useEventSelection-Cvdw9all.js","sources":["../../src/common/api/automation.ts","../../src/common/models/AutomationSettings.ts","../../src/common/hooks-query/useAutomationSettings.ts","../../src/common/utils/regex.ts","../../src/common/components/tag/Tag.tsx","../../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/common/components/input/colour-input/Swatch.tsx","../../src/common/components/input/colour-input/SwatchSelect.tsx","../../src/common/components/dropdown-menu/DropdownMenu.tsx","../../src/common/components/modal/Modal.tsx","../../src/common/utils/deviceUtils.ts","../../src/features/rundown/useEventSelection.ts"],"sourcesContent":["import axios from 'axios';\nimport type {\n Automation,\n AutomationDTO,\n AutomationOutput,\n AutomationSettings,\n Trigger,\n TriggerDTO,\n} from 'ontime-types';\n\nimport { apiEntryUrl } from './constants';\nimport type { RequestOptions } from './requestOptions';\n\nconst automationsPath = `${apiEntryUrl}/automations`;\n\n/**\n * HTTP request to get the automations settings\n */\nexport async function getAutomationSettings(options?: RequestOptions): Promise<AutomationSettings> {\n const res = await axios.get(automationsPath, { signal: options?.signal });\n return res.data;\n}\n\n/**\n * HTTP request to edit the automations settings\n */\nexport async function editAutomationSettings(\n automationSettings: Partial<AutomationSettings>,\n): Promise<AutomationSettings> {\n const res = await axios.post(automationsPath, automationSettings);\n return res.data;\n}\n\n/**\n * HTTP request to create a new automation trigger\n */\nexport async function addTrigger(trigger: TriggerDTO): Promise<Trigger> {\n const res = await axios.post(`${automationsPath}/trigger`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to update an automation trigger\n */\nexport async function editTrigger(id: string, trigger: Trigger): Promise<Trigger> {\n const res = await axios.put(`${automationsPath}/trigger/${id}`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to delete an automation trigger\n */\nexport function deleteTrigger(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/trigger/${id}`);\n}\n\n/**\n * HTTP request to create a new automation\n */\nexport async function addAutomation(automation: AutomationDTO): Promise<Automation> {\n const res = await axios.post(`${automationsPath}/automation`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to update a automation\n */\nexport async function editAutomation(id: string, automation: Automation): Promise<Automation> {\n const res = await axios.put(`${automationsPath}/automation/${id}`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to delete a automation\n */\nexport function deleteAutomation(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/automation/${id}`);\n}\n\n/**\n * HTTP request to test automation output\n * The return is irrelevant as we care for the resolution of the promise\n */\nexport function testOutput(output: AutomationOutput): Promise<void> {\n return axios.post(`${automationsPath}/test`, output);\n}\n","import { AutomationSettings } from 'ontime-types';\n\nexport const automationPlaceholderSettings: AutomationSettings = {\n enabledAutomations: false,\n enabledOscIn: false,\n oscPortIn: 8888,\n triggers: [],\n automations: {},\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport { queryRefetchIntervalSlow } from '../../ontimeConfig';\nimport { getAutomationSettings } from '../api/automation';\nimport { AUTOMATION } from '../api/constants';\nimport { automationPlaceholderSettings } from '../models/AutomationSettings';\n\nexport default function useAutomationSettings() {\n const { data, status, isFetching, isError, refetch } = useQuery({\n queryKey: AUTOMATION,\n queryFn: ({ signal }) => getAutomationSettings({ signal }),\n placeholderData: (previousData, _previousQuery) => previousData,\n refetchInterval: queryRefetchIntervalSlow,\n });\n\n return { data: data ?? automationPlaceholderSettings, status, isFetching, isError, refetch };\n}\n","/**\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 { PropsWithChildren } from 'react';\n\nimport style from './Tag.module.scss';\n\ninterface TagProps {\n className?: string;\n}\n\nexport default function Tag({ className, children }: PropsWithChildren<TagProps>) {\n return <span className={`${style.tag} ${className || ''}`}>{children}</span>;\n}\n","import { Radio } from '@base-ui/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui/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 { safeCopyToClipboard } 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 safeCopyToClipboard(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 safeCopyToClipboard(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: string | null) => {\n if (value === null) return;\n setValue('baseUrl', value);\n }}\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: OntimeView | string | null) => {\n if (value === null) return;\n setValue('path', value, { shouldDirty: true });\n }}\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 { MouseEvent } from 'react';\nimport { IoBan } from 'react-icons/io5';\n\nimport { cx } from '../../../utils/styleUtils';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface SwatchProps {\n color: string;\n onClick?: (color: string) => void;\n isSelected?: boolean;\n}\n\nexport default function Swatch({ color, isSelected, onClick }: SwatchProps) {\n const handleClick = (event: MouseEvent) => {\n onClick?.(color);\n event.preventDefault();\n event.stopPropagation();\n };\n\n const classes = cx([style.swatch, isSelected && style.selected, onClick && style.selectable]);\n\n if (!color) {\n return (\n <div className={classes} onClick={handleClick}>\n <IoBan />\n </div>\n );\n }\n return <div className={classes} style={{ backgroundColor: `${color}` }} onClick={handleClick} />;\n}\n","import { useCallback } from 'react';\n\nimport Swatch from './Swatch';\nimport SwatchPicker from './SwatchPicker';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface ColourInputProps {\n value: string;\n name: 'colour';\n handleChange: (newValue: 'colour', name: string) => void;\n}\n\nconst colours = [\n '',\n '#FFCC78', // $orange-400\n '#FFAB33', // $orange-600\n '#77C785', // $green-400\n '#339E4E', // $green-600\n '#779BE7', // $blue-400\n '#3E75E8', // $blue-600\n '#FF7878', // $red-400\n '#ED3333', // $red-600\n '#A790F5', // $violet-400\n '#8064E1', // $violet-600\n '#9d9d9d', // $gray-500\n '#ececec', // $gray-100\n];\n\nexport default function SwatchSelect(props: ColourInputProps) {\n const { value, name, handleChange } = props;\n\n const setColour = useCallback(\n (newValue: string) => {\n if (newValue !== value) {\n handleChange(name, newValue);\n }\n },\n [handleChange, name, value],\n );\n\n return (\n <div className={style.list}>\n {colours.map((colour) => (\n <Swatch key={colour} color={colour} onClick={setColour} isSelected={value === colour} />\n ))}\n <SwatchPicker color={value} onChange={setColour} isSelected={!colours.includes(value)} />\n </div>\n );\n}\n","import { PropsWithChildren } from 'react';\nimport { IconType } from 'react-icons';\nimport { Menu as BaseMenu } from '@base-ui/react/menu';\n\nimport style from './DropdownMenu.module.scss';\n\ntype DropdownMenuItemDivider = { type: 'divider' };\ntype DropdownMenuItem = {\n type: 'item' | 'destructive';\n label: string;\n description?: string;\n icon?: IconType;\n disabled?: boolean;\n onClick: () => void;\n shortcut?: string;\n};\n\nexport type DropdownMenuOption = DropdownMenuItemDivider | DropdownMenuItem;\n\ninterface DropdownMenuProps extends BaseMenu.Trigger.Props {\n items: DropdownMenuOption[];\n}\n\nexport function DropdownMenu({ items, children, ...triggerProps }: PropsWithChildren<DropdownMenuProps>) {\n return (\n <BaseMenu.Root>\n <BaseMenu.Trigger {...triggerProps}>{children}</BaseMenu.Trigger>\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item\n key={index}\n className={style.item}\n onClick={item.onClick}\n disabled={item.disabled}\n data-type={item.type}\n >\n <span className={style.content}>\n <span className={style.label}>\n {item.icon && <item.icon />}\n {item.label}\n </span>\n {item.description && <span className={style.description}>{item.description}</span>}\n </span>\n {item.shortcut && <span className={style.shortcut}>{item.shortcut}</span>}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n\ninterface PositionedDropdownMenuProps {\n items: Array<DropdownMenuItemDivider | DropdownMenuItem>;\n isOpen: boolean;\n onClose: () => void;\n position: { x: number; y: number };\n}\n\nexport function PositionedDropdownMenu({ items, isOpen, position, onClose }: PositionedDropdownMenuProps) {\n return (\n <BaseMenu.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <BaseMenu.Trigger style={{ position: 'fixed', left: position.x, top: position.y }} aria-hidden />\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8} alignOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item key={index} className={style.item} onClick={item.onClick} disabled={item.disabled}>\n <span className={style.content}>\n <span className={style.label}>\n {item.icon && <item.icon />}\n {item.label}\n </span>\n {item.description && <span className={style.description}>{item.description}</span>}\n </span>\n {item.shortcut && <span className={style.shortcut}>{item.shortcut}</span>}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n","import type { ReactNode } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog as BaseDialog } from '@base-ui/react/dialog';\n\nimport IconButton from '../buttons/IconButton';\n\nimport style from './Modal.module.scss';\n\ninterface ModalProps {\n isOpen: boolean;\n title?: string;\n showCloseButton?: boolean;\n showBackdrop?: boolean;\n bodyElements: ReactNode;\n footerElements?: ReactNode;\n onClose: () => void;\n}\n\nexport default function Modal({\n isOpen,\n title,\n showCloseButton,\n showBackdrop,\n bodyElements,\n footerElements,\n onClose,\n}: ModalProps) {\n return (\n <BaseDialog.Root\n open={isOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n disablePointerDismissal\n >\n <BaseDialog.Portal>\n {showBackdrop && <BaseDialog.Backdrop className={style.backdrop} />}\n <BaseDialog.Popup className={style.modal}>\n <div className={style.title}>\n {title}\n {showCloseButton && (\n <IconButton variant='subtle-white' onClick={onClose}>\n <IoClose />\n </IconButton>\n )}\n </div>\n <div className={style.body}>{bodyElements}</div>\n <div className={style.footer}>{footerElements}</div>\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n );\n}\n","export function isMacOS() {\n const userAgent = navigator.userAgent.toLowerCase();\n return userAgent.includes('macintosh') || userAgent.includes('mac os');\n}\n\nexport const deviceAlt = isMacOS() ? 'Option' : 'Alt';\n\nexport const deviceMod = isMacOS() ? 'Cmd' : 'Ctrl';\n","import { MouseEvent } from 'react';\nimport { EntryId, isOntimeEvent, MaybeNumber, Rundown } from 'ontime-types';\nimport { create } from 'zustand';\n\nimport { RUNDOWN } from '../../common/api/constants';\nimport { ontimeQueryClient } from '../../common/queryClient';\nimport { isMacOS } from '../../common/utils/deviceUtils';\n\nexport type SelectionMode = 'shift' | 'click' | 'ctrl';\n\ninterface EventSelectionStore {\n selectedEvents: Set<EntryId>;\n anchoredIndex: MaybeNumber;\n cursor: EntryId | null;\n entryMode: 'event' | 'single' | null;\n scrollHandler: ((id: EntryId) => void) | null;\n setSingleEntrySelection: (selectionArgs: { id: EntryId }) => void;\n setSelectedEvents: (selectionArgs: { id: EntryId; index: number; selectMode: SelectionMode }) => void;\n clearSelectedEvents: () => void;\n clearMultiSelect: () => void;\n unselect: (id: EntryId) => void;\n setScrollHandler: (handler: ((id: EntryId) => void) | null) => void;\n scrollToEntry: (id: EntryId) => void;\n}\n\n/**\n * Keeps track of the selected entries and selection mode\n * Provides methods to update the selection based on user interactions\n */\nexport const useEventSelection = create<EventSelectionStore>()((set, get) => ({\n selectedEvents: new Set(),\n anchoredIndex: null,\n cursor: null,\n entryMode: null,\n scrollHandler: null,\n setSingleEntrySelection: ({ id }) => {\n set({ selectedEvents: new Set([id]), anchoredIndex: null, cursor: id, entryMode: 'single' });\n },\n setSelectedEvents: ({ id, index, selectMode }) => {\n const { selectedEvents, anchoredIndex, entryMode } = get();\n\n // if we are in single mode, we replace the selection and change the mode\n if (entryMode === 'single') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on click, we replace selection with event\n if (selectMode === 'click') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on ctrl + click, we toggle the selection of that event\n if (selectMode === 'ctrl') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // if it doesnt exist, simply add to the list and set an anchor\n if (!selectedEvents.has(id)) {\n return set({\n selectedEvents: selectedEvents.add(id),\n anchoredIndex: index,\n cursor: id,\n entryMode: 'event',\n });\n }\n\n // if event is already selected, we remove it from selection\n // and set the anchor to the event after\n selectedEvents.delete(id);\n\n const nextIndex = rundownData.order.findIndex(\n (eventId, i) => i > index && isOntimeEvent(rundownData.entries[eventId]) && selectedEvents.has(eventId),\n );\n\n // if we didnt find anything after, set the anchor to the last event\n return set({\n selectedEvents,\n anchoredIndex: nextIndex < 0 ? rundownData.order.length - 1 : nextIndex,\n entryMode: 'event',\n });\n }\n\n // on shift + click, we select a range of events up to the clicked event\n if (selectMode === 'shift') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // get list of rundown with only ontime events\n const eventIds: EntryId[] = [];\n rundownData.flatOrder.forEach((eventId) => {\n const event = rundownData.entries[eventId];\n if (isOntimeEvent(event)) {\n eventIds.push(event.id);\n }\n });\n\n const start = anchoredIndex === null ? 0 : Math.min(anchoredIndex, index);\n const end = anchoredIndex === null ? index : Math.max(anchoredIndex, index + 1);\n\n // create new set with range of ids from start to end\n const selectedEventIds = eventIds.slice(start, end);\n\n return set({\n selectedEvents: new Set([...selectedEvents, ...selectedEventIds]),\n anchoredIndex: index,\n entryMode: 'event',\n });\n }\n },\n clearSelectedEvents: () => set({ selectedEvents: new Set(), anchoredIndex: null, cursor: null, entryMode: null }),\n clearMultiSelect: () => {\n const { selectedEvents } = get();\n const [firstSelected] = selectedEvents;\n set({\n selectedEvents: new Set(firstSelected ? [firstSelected] : []),\n anchoredIndex: null,\n entryMode: null,\n });\n },\n unselect: (id: string) => {\n const { entryMode, selectedEvents } = get();\n selectedEvents.delete(id);\n set({\n selectedEvents,\n entryMode: selectedEvents.size === 0 ? null : entryMode,\n });\n },\n // Sets the scroll handler for programmatic scrolling to entries\n setScrollHandler: (handler) => set({ scrollHandler: handler }),\n // Scrolls to the specified entry using the registered scroll handler\n scrollToEntry: (id: EntryId) => {\n const handler = get().scrollHandler;\n if (handler) {\n handler(id);\n }\n },\n}));\n\nexport function getSelectionMode(event: MouseEvent): SelectionMode {\n if ((isMacOS() && event.metaKey) || event.ctrlKey) {\n return 'ctrl';\n }\n\n if (event.shiftKey) {\n return 'shift';\n }\n\n return 'click';\n}\n"],"names":["automationsPath","apiEntryUrl","getAutomationSettings","options","axios","get","signal","data","editAutomationSettings","automationSettings","post","addTrigger","trigger","editTrigger","id","put","deleteTrigger","delete","addAutomation","automation","editAutomation","deleteAutomation","testOutput","output","automationPlaceholderSettings","enabledAutomations","enabledOscIn","oscPortIn","triggers","automations","useAutomationSettings","status","isFetching","isError","refetch","useQuery","queryKey","AUTOMATION","queryFn","placeholderData","previousData","_previousQuery","refetchInterval","queryRefetchIntervalSlow","isOnlyNumbers","startsWithHttp","isAlphanumeric","isUrlSafe","Tag","className","children","jsx","style","tag","RadioGroup","items","orientation","onValueChange","elementProps","BaseRadioGroup","value","cx","radioGroup","map","item","jsxs","Radio.Root","toString","radio","Radio.Indicator","indicator","label","defaultOptions","hideTableSeconds","hideIndexColumn","showDelayedTimes","hideDelays","usePersistedCuesheetOptions","create","persist","set","setOption","key","state","toggleOption","resetOptions","name","cuesheetDefaultColumns","makeCuesheetCustomColumns","customFields","Object","entries","field","CuesheetLinkOptions","readRef","writeRef","useCustomFields","customFieldColumns","useMemo","readPermissions","setReadPermissions","useState","writePermissions","setWritePermissions","readSwitches","setReadSwitches","initialState","forEach","column","writeSwitches","setWriteSwitches","handleReadModeChange","prevReadSwitches","updatedReadSwitches","keys","handleWriteModeChange","prevWriteSwitches","updatedWriteSwitches","handleSwitchChange","type","getReadPermissions","filter","_","join","getWritePermissions","Panel.Indent","Panel.Field","twoCols","grid","Panel.Description","Fragment","Switch","Boolean","length","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","mode","defaultValues","baseUrl","path","OntimeView","Timer","authenticate","lockConfig","lockNav","createPresetFromOptions","alias","read","Error","target","Cuesheet","enabled","search","write","find","preset","onSubmit","urlPreset","current","generateUrl","safeCopyToClipboard","presetPath","startsWith","replace","undefined","keepValues","keepDirty","error","message","maybeAxiosError","canSubmit","event","preventEscape","Info","shareInline","Panel.ListGroup","isOntimeCloud","Panel.ListItem","Select","shouldDirty","Input","required","pattern","checked","Panel.Error","root","Panel.InlineElements","end","Button","Panel.Section","QRCode","qrCode","copiableLink","CopyTag","GenerateLinkFormExport","lockedPath","infoData","useInfo","urlPresetData","useUrlPresets","skip","networkInterfaces","nif","address","serverPort","Operator","Swatch","color","isSelected","onClick","handleClick","preventDefault","stopPropagation","classes","swatch","selected","selectable","backgroundColor","IoBan","colours","SwatchSelect","props","handleChange","setColour","useCallback","newValue","list","colour","SwatchPicker","includes","DropdownMenu","triggerProps","BaseMenu.Root","BaseMenu.Trigger","BaseMenu.Portal","BaseMenu.Positioner","positioner","BaseMenu.Popup","popup","index","BaseMenu.Separator","separator","BaseMenu.Item","disabled","content","icon","description","shortcut","PositionedDropdownMenu","isOpen","position","onClose","open","left","x","top","y","Modal","title","showCloseButton","showBackdrop","bodyElements","footerElements","BaseDialog.Root","BaseDialog.Portal","BaseDialog.Backdrop","backdrop","BaseDialog.Popup","modal","IconButton","IoClose","body","footer","isMacOS","userAgent","navigator","toLowerCase","deviceAlt","deviceMod","useEventSelection","selectedEvents","Set","anchoredIndex","cursor","entryMode","scrollHandler","setSingleEntrySelection","setSelectedEvents","selectMode","rundownData","ontimeQueryClient","getQueryData","RUNDOWN","has","add","nextIndex","order","findIndex","eventId","i","isOntimeEvent","eventIds","flatOrder","push","start","Math","min","max","selectedEventIds","slice","clearSelectedEvents","clearMultiSelect","firstSelected","unselect","size","setScrollHandler","handler","scrollToEntry","getSelectionMode","metaKey","ctrlKey","shiftKey"],"mappings":"+iCAaA,MAAMA,EAAkB,GAAGC,EAAW,eAKtC,eAAsBC,GAAsBC,EAAuD,CAEjG,OADY,MAAMC,EAAMC,IAAIL,EAAiB,CAAEM,OAAQH,GAAAA,YAAAA,EAASG,MAAAA,CAAQ,GAC7DC,IACb,CAKA,eAAsBC,GACpBC,EAC6B,CAE7B,OADY,MAAML,EAAMM,KAAKV,EAAiBS,CAAkB,GACrDF,IACb,CAKA,eAAsBI,GAAWC,EAAuC,CAEtE,OADY,MAAMR,EAAMM,KAAK,GAAGV,CAAe,WAAYY,CAAO,GACvDL,IACb,CAKsBM,eAAAA,GAAYC,EAAYF,EAAoC,CAEhF,OADY,MAAMR,EAAMW,IAAI,GAAGf,CAAe,YAAYc,CAAE,GAAIF,CAAO,GAC5DL,IACb,CAKO,SAASS,GAAcF,EAA2B,CACvD,OAAOV,EAAMa,OAAO,GAAGjB,CAAe,YAAYc,CAAE,EAAE,CACxD,CAKA,eAAsBI,GAAcC,EAAgD,CAElF,OADY,MAAMf,EAAMM,KAAK,GAAGV,CAAe,cAAemB,CAAU,GAC7DZ,IACb,CAKsBa,eAAAA,GAAeN,EAAYK,EAA6C,CAE5F,OADY,MAAMf,EAAMW,IAAI,GAAGf,CAAe,eAAec,CAAE,GAAIK,CAAU,GAClEZ,IACb,CAKO,SAASc,GAAiBP,EAA2B,CAC1D,OAAOV,EAAMa,OAAO,GAAGjB,CAAe,eAAec,CAAE,EAAE,CAC3D,CAMO,SAASQ,GAAWC,EAAyC,CAClE,OAAOnB,EAAMM,KAAK,GAAGV,CAAe,QAASuB,CAAM,CACrD,CCnFO,MAAMC,GAAoD,CAC/DC,mBAAoB,GACpBC,aAAc,GACdC,UAAW,KACXC,SAAU,CAAE,EACZC,YAAa,CAAA,CACf,ECDA,SAAwBC,IAAwB,CACxC,KAAA,CAAEvB,KAAAA,EAAMwB,OAAAA,EAAQC,WAAAA,EAAYC,QAAAA,EAASC,QAAAA,GAAYC,GAAS,CAC9DC,SAAUC,GACVC,QAASA,CAAC,CAAEhC,OAAAA,KAAaJ,GAAsB,CAAEI,OAAAA,CAAAA,CAAQ,EACzDiC,gBAAiBA,CAACC,EAAcC,IAAmBD,EACnDE,gBAAiBC,EAAAA,CAClB,EAEM,MAAA,CAAEpC,KAAMA,GAAQiB,GAA+BO,OAAAA,EAAQC,WAAAA,EAAYC,QAAAA,EAASC,QAAAA,CAAQ,CAC7F,CCXO,MAAMU,GAAgB,QAEhBC,GAAiB,eAEjBC,GAAiB,eAIjBC,GAAY,kDCLzB,SAAwBC,GAAI,CAAEC,UAAAA,EAAWC,SAAAA,CAAsC,EAAG,CACzE,OAAAC,EAAA,IAAC,OAAK,CAAA,UAAW,GAAGC,GAAMC,GAAG,IAAIJ,GAAa,EAAE,GAAKC,SAAAA,CAAS,CAAA,CACvE,oSCMA,SAAwBI,GAAgD,CACtEC,MAAAA,EACAN,UAAAA,EACAO,YAAAA,EAAc,WACdC,cAAAA,EACA,GAAGC,CACe,EAAG,CAEnB,OAAAP,EAAA,IAACQ,GACC,CAAA,cAA0BF,GAAAA,GAAAA,YAAAA,EAAgBG,GAC1C,UAAWC,GAAG,CAACT,EAAMU,WAAYV,EAAMI,CAAW,EAAGP,CAAS,CAAC,EAC/D,GAAIS,EAEHH,SAAAA,EAAMQ,IAAKC,GACTC,EAAA,KAAA,QAAA,CAAM,UAAWb,EAAMY,KACtB,SAAA,CAAAb,EAAA,IAACe,GAAA,CAAW,MAAOF,EAAKJ,MAAMO,SAAY,EAAA,UAAWf,EAAMgB,MACzD,eAACC,GAAA,CAAgB,UAAWjB,EAAMkB,SAAU,CAAA,EAC9C,EACCN,EAAKO,KAAAA,CAAAA,EAJ2BP,EAAKJ,MAAMO,SAK9C,CAAA,CACD,CACH,CAAA,CAEJ,CC5BA,MAAMK,GAA+B,CACnCC,iBAAkB,GAClBC,gBAAiB,GACjBC,iBAAkB,GAClBC,WAAY,EACd,EAUaC,GAA8BC,GAAAA,EACzCC,GACWC,IACA,CACL,GAAGR,GACHS,UAAWA,CAACC,EAAKtB,IAAUoB,EAAgBG,IAAA,CAAE,GAAGA,EAAO,CAACD,CAAG,EAAGtB,CAAAA,EAAQ,EACtEwB,aAAuBJ,GAAAA,EAAgBG,IAAA,CAAE,GAAGA,EAAO,CAACD,CAAG,EAAG,CAACC,EAAMD,CAAG,CAAA,EAAI,EACxEG,aAAcA,IAAML,EAAIR,EAAc,CACxC,GAEF,CACEc,KAAM,kBACR,CACF,CACF,EAEaC,EAAyB,CACpC,CAAE3B,MAAO,OAAQW,MAAO,MAAO,EAC/B,CAAEX,MAAO,MAAOW,MAAO,KAAM,EAC7B,CAAEX,MAAO,QAASW,MAAO,OAAQ,EACjC,CAAEX,MAAO,YAAaW,MAAO,YAAa,EAC1C,CAAEX,MAAO,UAAWW,MAAO,UAAW,EACtC,CAAEX,MAAO,WAAYW,MAAO,UAAW,EACvC,CAAEX,MAAO,OAAQW,MAAO,MAAO,CAAC,EAG3B,SAASiB,GAA0BC,EAA4B,CAC7DC,OAAAA,OAAOC,QAAQF,CAAY,EAAE1B,IAAI,CAAC,CAACmB,EAAKU,CAAK,KAC3C,CACLhC,MAAO,UAAUsB,CAAG,GACpBX,MAAOqB,EAAMrB,KACf,EACD,CACH,yEC1CA,SAAwBsB,GAAoB,CAAEC,QAAAA,EAASC,SAAAA,CAAmC,EAAG,CACrF,KAAA,CAAExF,KAAAA,GAASyF,GAAgB,EAC3BC,EAAqBC,EAAAA,QAAQ,IAAMV,GAA0BjF,CAAI,EAAG,CAACA,CAAI,CAAC,EAE1E,CAAC4F,EAAiBC,CAAkB,EAAIC,EAAAA,SAAqB,MAAM,EACnE,CAACC,EAAkBC,CAAmB,EAAIF,EAAAA,SAAqB,MAAM,EAErE,CAACG,EAAcC,CAAe,EAAIJ,WAAkC,IAAM,CAC9E,MAAMK,EAAwC,CAAC,EAC/C,OAAC,GAAGnB,EAAwB,GAAGU,CAAkB,EAAEU,QAAoBC,GAAA,CACxDA,EAAAA,EAAOhD,KAAK,EAAI,EAAA,CAC9B,EACM8C,CAAAA,CACR,EAEK,CAACG,EAAeC,CAAgB,EAAIT,WAAkC,IAAM,CAChF,MAAMK,EAAwC,CAAC,EAC/C,OAAC,GAAGnB,EAAwB,GAAGU,CAAkB,EAAEU,QAAoBC,GAAA,CACxDA,EAAAA,EAAOhD,KAAK,EAAI,EAAA,CAC9B,EACM8C,CAAAA,CACR,EAEKK,EAAwBnD,GAAsB,CAClDwC,EAAmBxC,CAAK,EAExB6C,EAAsCO,GAAA,CACpC,MAAMC,EAAsB,CAAE,GAAGD,CAAiB,EAClDtB,cAAOwB,KAAKD,CAAmB,EAAEN,QAAiBzB,GAAA,CAChD+B,EAAoB/B,CAAG,EAAI,EAAA,CAC5B,EACM+B,CAAAA,CACR,CACH,EAEME,EAAyBvD,GAAsB,CAC/CA,IAAU,QACZwC,EAAmB,MAAM,EAE3BG,EAAoB3C,CAAK,EAEzB6C,EAAsCO,GAAA,CACpC,MAAMC,EAAsB,CAAE,GAAGD,CAAiB,EAClDF,OAAAA,EAAwCM,GAAA,CACtC,MAAMC,EAAuB,CAAE,GAAGD,CAAkB,EACpD,OAAC,GAAG7B,EAAwB,GAAGU,CAAkB,EAAEU,QAAoBC,GAAA,CACjDA,EAAAA,EAAOhD,KAAK,EAAI,GACfgD,EAAAA,EAAOhD,KAAK,EAAI,EAAA,CACtC,EACMyD,CAAAA,CACR,EACMJ,CAAAA,CACR,CACH,EAEMK,EAAqBA,CAACpC,EAAaqC,EAAwB3D,IAAmB,CAC9E2D,IAAS,OACXd,EAAsCO,IACR,CAAE,GAAGA,EAAkB,CAAC9B,CAAG,EAAGtB,CAAM,EAEjE,EAEDkD,EAAwCM,IACT,CAAE,GAAGA,EAAmB,CAAClC,CAAG,EAAGtB,CAAM,EAEnE,CAEL,EAEM4D,EAAqBA,IACrBrB,IAAoB,QAAUG,IAAqB,OAC9C,OAGFZ,OAAOC,QAAQa,CAAY,EAC/BiB,OAAO,CAAC,CAACC,EAAG9D,CAAK,IAAMA,CAAK,EAC5BG,IAAI,CAAC,CAACmB,CAAG,IAAMA,CAAG,EAClByC,KAAK,GAAG,EAGPC,EAAsBA,IACtBtB,IAAqB,OAChB,OAGFZ,OAAOC,QAAQkB,CAAa,EAChCY,OAAO,CAAC,CAACC,EAAG9D,CAAK,IAAMA,CAAK,EAC5BG,IAAI,CAAC,CAACmB,CAAG,IAAMA,CAAG,EAClByC,KAAK,GAAG,EAIX,OAAA1D,EAAA,KAAC4D,GAAA,CACC,SAAA,CAAA1E,EAAA,IAAC,QAAM,CAAA,KAAK,OAAO,OAAM,GAAC,SAAQ,GAAC,IAAK2C,EAAS,MAAO0B,EAAmB,GAAK,GAAI,CAAA,EACnFrE,EAAA,IAAA,QAAA,CAAM,KAAK,QAAQ,OAAM,GAAC,SAAQ,GAAC,IAAK4C,EAAU,MAAO6B,KAAyB,GAAI,CAAA,SACtF,MACC,CAAA,SAAA,CAAAzE,EAAA,IAAC2E,EAAA,CAAY,MAAM,cAAc,YAAY,uDAAsD,SAClG,MACC,CAAA,SAAA,CAAC3E,MAAAG,GAAA,CACC,MAAOgD,EACP,cAAea,EACf,YAAY,aACZ,MAAO,CACL,CAAEvD,MAAO,OAAQW,MAAO,mDAAA,EACxB,CAAEX,MAAO,SAAUW,MAAO,cAAgB,CAAA,EAC1C,EAEHpB,EAAAA,IAAAG,GAAA,CACC,MAAO6C,EACP,cAAeY,EACf,YAAY,aACZ,SAAUT,IAAqB,OAC/B,MAAO,CACL,CAAE1C,MAAO,OAAQW,MAAO,kDAAA,EACxB,CAAEX,MAAO,SAAUW,MAAO,aAAA,CAAe,CACzC,CAAA,CAAA,CAEN,CAAA,CAAA,EACF,EACCN,EAAA,KAAA,MAAA,CAAI,UAAWb,EAAM2E,QACpB,SAAA,CAAC9D,EAAA,KAAA,MAAA,CAAI,UAAWb,EAAM4E,KACpB,SAAA,CAAC7E,EAAAA,IAAA8E,EAAA,CAAkB,SAAc,gBAAA,CAAA,EAChC9E,EAAAA,IAAA8E,EAAA,CAAkB,SAAI,MAAA,CAAA,EACtB9E,EAAAA,IAAA8E,EAAA,CAAkB,SAAK,OAAA,CAAA,EACvB1C,EAAuBxB,IACtB6C,GAAA3C,EAAAA,KAACiE,EAAAA,SACC,CAAA,SAAA,CAAC/E,EAAAA,IAAA,MAAA,CAAKyD,WAAOrC,KAAM,CAAA,EACnBpB,EAAAA,IAACgF,EACC,CAAA,QAASC,EAAQ5B,EAAaI,EAAOhD,KAAK,EAC1C,gBAAkBA,GAAmB0D,EAAmBV,EAAOhD,MAAO,OAAQA,CAAK,EACnF,SAAUuC,IAAoB,QAAUG,IAAqB,OAC7D,cAAa,QAAQM,EAAOhD,KAAK,EAAG,CAAA,EAEtCT,EAAAA,IAACgF,EACC,CAAA,QAASC,EAAQvB,EAAcD,EAAOhD,KAAK,EAC3C,gBAAkBA,GAAmB0D,EAAmBV,EAAOhD,MAAO,QAASA,CAAK,EACpF,SAAU0C,IAAqB,OAC/B,cAAa,SAASM,EAAOhD,KAAK,EAAG,CAAA,CAAA,CAZ1BgD,EAAAA,EAAOhD,KActB,CACD,CAAA,EACH,EACCqC,EAAmBoC,OAAS,UAC1B,MAAI,CAAA,UAAWjF,EAAM4E,KACpB,SAAA,CAAC7E,EAAAA,IAAA8E,EAAA,CAAkB,SAAa,eAAA,CAAA,EAC/B9E,EAAAA,IAAA8E,EAAA,CAAkB,SAAI,MAAA,CAAA,EACtB9E,EAAAA,IAAA8E,EAAA,CAAkB,SAAK,OAAA,CAAA,EACvBhC,EAAmBlC,IAClB6C,GAAA3C,EAAAA,KAACiE,EAAAA,SACEtB,CAAAA,SAAAA,CAAOrC,EAAAA,MACRpB,EAAAA,IAACgF,EACC,CAAA,QAASC,EAAQ5B,EAAaI,EAAOhD,KAAK,EAC1C,gBAAkBA,GAAmB0D,EAAmBV,EAAOhD,MAAO,OAAQA,CAAK,EACnF,SAAUuC,IAAoB,QAAUG,IAAqB,OAC7D,cAAa,QAAQM,EAAOhD,KAAK,EAAG,CAAA,EAEtCT,EAAAA,IAACgF,EACC,CAAA,QAASC,EAAQvB,EAAcD,EAAOhD,KAAK,EAC3C,gBAAkBA,GAAmB0D,EAAmBV,EAAOhD,MAAO,QAASA,CAAK,EACpF,SAAU0C,IAAqB,OAC/B,cAAa,SAASM,EAAOhD,KAAK,EAAG,CAAA,CAAA,CAZ1BgD,EAAAA,EAAOhD,KActB,CACD,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAAA,EACF,CAEJ,2LCpIA,SAAwB0E,GAAiB,CAAEC,YAAAA,EAAaC,YAAAA,EAAaC,QAAAA,EAASC,eAAAA,CAAsC,EAAG,SACrH,KAAM,CAACC,EAAWC,CAAY,EAAIvC,EAAAA,SAA4B,SAAS,EACjE,CAACwC,EAAKC,CAAM,EAAIzC,EAAAA,SAAS0C,CAAS,EAClCC,EAAkBC,SAAyB,IAAI,EAC/CC,EAAmBD,SAAyB,IAAI,EAChDE,EAAiBF,EAAAA,OAAe,YAAYG,GAAAA,CAAY,EAAE,EAE1D,CAAEC,UAAAA,GAAcC,GAAmB,EAEnC,CACJC,aAAAA,EACAC,SAAAA,EACAC,MAAAA,EACAC,SAAAA,EACAC,MAAAA,EACAC,SAAAA,EACAjB,UAAW,CAAEkB,OAAAA,EAAQC,QAAAA,CAAAA,GACnBC,GAAiC,CACnCC,KAAM,WACNC,cAAe,CACbC,QAASnB,EACToB,KAAMzB,EAAiBF,EAAY,CAAC,EAAE5E,MAAQwG,EAAWC,MACzDC,aAAc,GACdC,WAAY,GACZC,QAAS,EAAA,CACX,CACD,EAMKC,EAA0B,MAC9BC,EACAvK,IACmC,CAC/BA,GAAAA,EAAQwK,OAAS,IACb,MAAA,IAAIC,MAAM,gDAAgD,EAYlE,OAVgB,MAAMvB,EAAU,CAC9BwB,OAAQT,EAAWU,SACnBC,QAAS,GACTL,MAAAA,EACAM,OAAQ,GACR7K,QAAS,CACPwK,KAAMxK,EAAQwK,KACdM,MAAO9K,EAAQ8K,KAAAA,CACjB,CACD,GACcC,KAAiBC,GAAAA,EAAOT,QAAUA,CAAK,CACxD,EAEMU,EAAW,MAAOjL,GAAqC,WACvD,GAAA,CAEEA,GADJyI,EAAa,SAAS,EAClBzI,EAAQgK,OAASC,EAAWU,SAAU,CACxC,MAAMO,EAAY,MAAMZ,EAAyBtK,EAAgCuK,MAAO,CACtFC,OAAM3B,EAAAA,EAAgBsC,UAAhBtC,YAAAA,EAAyBpF,QAAS,OACxCqH,QAAO/B,EAAAA,EAAiBoC,UAAjBpC,YAAAA,EAA0BtF,QAAS,MAAA,CAC3C,EAED,GAAI,CAACyH,EACG,MAAA,IAAIT,MAAM,0CAA0C,EAGtD/B,MAAAA,EAAM,MAAM0C,EAAY,CAC5BrB,QAAS/J,EAAQ+J,QACjBC,KAAMhK,EAAQgK,KACdG,aAAcnK,EAAQmK,aACtBC,WAAYpK,EAAQoK,WACpBC,QAASrK,EAAQqK,QACjBW,OAAQE,EAAUX,KAAAA,CACnB,EACD,MAAMc,EAAoB3C,CAAG,EAC7BC,EAAOD,CAAG,CAAA,KACL,CACC4C,MAAAA,EAAatL,EAAQgK,KAAKuB,WAAW,SAAS,EAAIvL,EAAQgK,KAAKwB,QAAQ,UAAW,EAAE,EAAIC,OACxFzB,EAAOsB,GAAahD,EAAAA,EAAQyC,KAAMC,IAAWA,GAAOT,QAAUe,CAAU,IAApDhD,YAAAA,EAAuDoC,OAAS1K,EAAQgK,KAClG,GAAI,CAACA,EACH,MAAM,IAAIS,MAAM,6BAA6BT,CAAI,EAAE,EAG/CtB,MAAAA,EAAM,MAAM0C,EAAY,CAC5BrB,QAAS/J,EAAQ+J,QACjBC,KAAAA,EACAG,aAAcnK,EAAQmK,aACtBC,WAAYpK,EAAQoK,WACpBC,QAASrK,EAAQqK,QACjBW,OAAQM,CAAAA,CACT,EAED,MAAMD,EAAoB3C,CAAG,EAC7BC,EAAOD,CAAG,CAAA,CAEZc,EAAMxJ,EAAS,CACb0L,WAAY,GACZC,UAAW,EAAA,CACZ,EACDlD,EAAa,SAAS,QACfmD,EAAO,CACRC,MAAAA,EAAUC,GAAgBF,CAAK,EACrCvC,EAAS,OAAQ,CAAEwC,QAAAA,CAAAA,CAAS,EAC5BpD,EAAa,OAAO,CAAA,CAExB,EAEMsD,EAAYpC,GAAWnB,IAAc,UAGzC,OAAA1E,EAAA,KAAC,OAAK,CAAA,SAAUsF,EAAa6B,CAAQ,EAAG,UAAYe,GAAUC,GAAcD,CAAK,EAC9E,SAAA,CAACzD,CAAAA,GACCvF,EAAAA,IAAAkJ,GAAA,CAAK,SAA4F,8FAAA,CAAA,EAEnGpI,EAAA,KAAA,MAAA,CAAI,UAAWb,EAAMkJ,YACpB,SAAA,CAACrI,EAAA,KAAA,MAAA,CAAI,UAAWb,EAAMwD,OACpB,SAAA,CAAC3C,OAAAsI,GAAA,CACEC,SAAAA,CAAAA,EACErJ,EAAA,IAAA,QAAA,CAAM,OAAM,GAAC,SAAQ,GAAC,KAAK,UAAU,MAAO4F,IAE5C9E,EAAAA,KAAAwI,EAAA,CACC,SAAA,CAACtJ,EAAAA,IAAA2E,EAAA,CACC,MAAM,UACN,YAAa,gCAAgC0E,EAAgB,oCAAsC,EAAE,EAAG,CAAA,EAE1GrJ,EAAAA,IAACuJ,GACC,CAAA,QAASnE,EACT,MAAOkB,EAAM,SAAS,EACtB,cAAgB7F,GAAyB,CACnCA,IAAU,MACd8F,EAAS,UAAW9F,CAAK,CAAA,CACzB,CAAA,CAAA,EAEN,EAED8E,EACCvF,EAAAA,IAAC,QAAM,CAAA,KAAK,SAAS,MAAOsG,EAAM,MAAM,IAEvCxF,EAAA,KAAAwI,EAAA,CACC,SAAA,CAAAtJ,EAAA,IAAC2E,EAAA,CAAY,MAAM,cAAc,YAAY,8CAA6C,EAC1F3E,EAAAA,IAACuJ,GACC,CAAA,QAASlE,EACT,MAAOiB,EAAM,MAAM,EACnB,cAAgB7F,GAAsC,CAChDA,IAAU,MACd8F,EAAS,OAAQ9F,EAAO,CAAE+I,YAAa,EAAA,CAAM,CAAA,CAC7C,CAAA,CAAA,EAEN,EAGDlD,EAAM,MAAM,IAAMW,EAAWU,UAE1B7G,OAAAiE,EAAAA,SAAA,CAAA,SAAA,CAACjE,OAAAwI,EAAA,CACC,SAAA,CAACtJ,EAAAA,IAAA2E,EAAA,CACC,MAAM,eACN,YAAY,6DACZ,OAAQ+B,EAAAA,EAA4Ca,QAA5Cb,YAAAA,EAAmDmC,OAAQ,CAAA,QAEpEY,GACC,CAAA,aAAczD,EAAemC,QAC7B,GAAI1B,EAAS,QAAS,CACpBiD,SAAU,2CACVC,QAAS,CACPlJ,MAAOb,GACPiJ,QAAS,gEAAA,CACX,CACD,CAAE,CAAA,CAAA,EAEP,EACC7I,EAAA,IAAA0C,GAAA,CAAoB,QAASmD,EAAiB,SAAUE,CAAiB,CAAA,CAAA,EAC5E,EAGFjF,OAACwI,EAAA,CACC,SAAA,CAAAtJ,EAAA,IAAC2E,EAAA,CAAY,MAAM,kBAAkB,YAAY,sCAAqC,QACrFK,EACC,CAAA,KAAK,QACL,KAAK,UACL,cAAY,UACZ,QAASsB,EAAM,SAAS,EACxB,gBAA8BC,GAAAA,EAAS,UAAWqD,EAAS,CAAEJ,YAAa,EAAM,CAAA,EAChF,SAAUlD,EAAM,YAAY,CAAE,CAAA,CAAA,EAElC,EACCA,EAAM,MAAM,IAAMW,EAAWU,UAC3B7G,OAAAwI,EAAA,CACC,SAAA,CAAAtJ,EAAA,IAAC2E,EAAA,CACC,MAAM,qBACN,YAAY,kEAAiE,EAE9E3E,EAAA,IAAAgF,EAAA,CACC,KAAK,QACL,KAAK,aACL,cAAY,aACZ,QAASsB,EAAM,YAAY,EAC3B,gBAA8BsD,GAAA,CACxBA,GACFrD,EAAS,UAAWqD,EAAS,CAAEJ,YAAa,EAAA,CAAM,EAEpDjD,EAAS,aAAcqD,EAAS,CAAEJ,YAAa,EAAA,CAAM,CAAA,CACrD,CAAA,CAAA,EAEN,EAEF1I,OAACwI,EAAA,CACC,SAAA,CAAAtJ,EAAA,IAAC2E,EAAA,CAAY,MAAM,eAAe,YAAY,8CAA6C,QAC1FK,EACC,CAAA,KAAK,QACL,KAAK,eACL,cAAY,eACZ,QAASsB,EAAM,cAAc,EAC7B,gBAA8BC,GAAAA,EAAS,eAAgBqD,EAAS,CAAEJ,YAAa,EAAA,CAAM,CAAE,CAAA,CAAA,CAE3F,CAAA,CAAA,EACF,QACCK,GAAA,CAAanD,UAAAA,EAAAA,EAAOoD,OAAPpD,YAAAA,EAAamC,QAAQ,EACnC7I,EAAAA,IAAC+J,GAAA,CAAqB,MAAM,MAAM,UAAW9J,EAAM+J,IACjD,SAAChK,MAAAiK,GAAA,CAAO,KAAK,SAAS,QAASlB,EAAY,UAAY,SAAU,QAASvD,IAAc,UACrFuD,SAAAA,EAAY,oBAAsB,2BACrC,CAAA,CACF,CAAA,CAAA,EACF,SACCmB,GAAA,CAAc,UAAWjK,EAAMwD,OAC9B,SAAA,CAACzD,EAAAA,IAAA8E,EAAA,CAAkB,SAAe,iBAAA,CAAA,EAClC9E,MAACmK,IAAO,KAAM,IAAK,MAAOzE,EAAK,UAAWzF,EAAMmK,OAAO,QACtD,MAAI,CAAA,UAAWnK,EAAMoK,aAAc,cAAY,YAC7C3E,SACHA,EAAA,EACC1F,EAAA,IAAAsK,GAAA,CAAQ,UAAW5E,EAAK,SAAS,WAAA,CAAA,CAAA,CACpC,CAAA,CAAA,CACF,CAAA,CAAA,EACF,CAEJ,CCnRA,SAAwB6E,GAAuB,CAAEC,WAAAA,CAAwC,EAAG,CACpF,KAAA,CAAEpN,KAAMqN,GAAaC,GAAQ,EAC7B,CAAEtN,KAAMuN,GAAkBC,GAAc,CAAEC,KAAML,IAAe/B,MAAAA,CAAW,EAQ1ErD,EAAcrC,EAAAA,QAAQ,IACnB0H,EAASK,kBAAkBlK,IAAcmK,IAAA,CAC9CtK,MAAO,UAAUsK,EAAIC,OAAO,IAAIP,EAASQ,UAAU,GACnD7J,MAAO,GAAG2J,EAAI5I,IAAI,MAAM4I,EAAIC,OAAO,EAAA,EACnC,EACD,CAACP,EAASK,kBAAmBL,EAASQ,UAAU,CAAC,EAE9C5F,EAActC,EAAAA,QAAQ,IACtByH,EACK,CAAC,CAAE/J,MAAO+J,EAAW/J,MAAOW,MAAOoJ,EAAWpJ,KAAAA,CAAO,EAEvD,CACL,CAAEX,MAAOwG,EAAWC,MAAO9F,MAAO,OAAA,EAClC,CAAEX,MAAOwG,EAAWU,SAAUvG,MAAO,UAAA,EACrC,CAAEX,MAAOwG,EAAWiE,SAAU9J,MAAO,UAAA,EACrC,CAAEX,MAAO,gBAAiBW,MAAO,WACjC,EAAA,GAAGuJ,EAAc/J,IAAiBoH,IAAA,CAChCvH,MAAO,UAAUuH,EAAOT,KAAK,GAC7BnG,MAAO,eAAe4G,EAAOT,KAAK,IAClC,CAAC,EAEJ,CAACiD,EAAYG,CAAa,CAAC,EAG5B,OAAA3K,MAACmF,IACC,YAAAC,EACA,YAAAC,EACA,QAASsF,EACT,eAAgB1F,EAAQuF,CACxB,CAAA,CAEN,CCxCA,SAAwBW,GAAO,CAAEC,MAAAA,EAAOC,WAAAA,EAAYC,QAAAA,CAAqB,EAAG,CACpEC,MAAAA,EAAevC,GAAsB,CACzCsC,GAAAA,MAAAA,EAAUF,GACVpC,EAAMwC,eAAe,EACrBxC,EAAMyC,gBAAgB,CACxB,EAEMC,EAAUhL,GAAG,CAACT,EAAM0L,OAAQN,GAAcpL,EAAM2L,SAAUN,GAAWrL,EAAM4L,UAAU,CAAC,EAE5F,OAAKT,EAOGpL,EAAA,IAAA,MAAA,CAAI,UAAW0L,EAAS,MAAO,CAAEI,gBAAiB,GAAGV,CAAK,EAAA,EAAM,QAASG,EAAe,EAL5FvL,MAAC,OAAI,UAAW0L,EAAS,QAASH,EAChC,SAAAvL,EAAA,IAAC+L,KAAK,CACR,CAAA,CAIN,CCjBA,MAAMC,GAAU,CACd,GACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SAAW,EAGb,SAAwBC,GAAaC,EAAyB,CACtD,KAAA,CAAEzL,MAAAA,EAAO0B,KAAAA,EAAMgK,aAAAA,CAAAA,EAAiBD,EAEhCE,EAAYC,cACfC,GAAqB,CAChBA,IAAa7L,GACf0L,EAAahK,EAAMmK,CAAQ,CAG/B,EAAA,CAACH,EAAchK,EAAM1B,CAAK,CAC5B,EAEA,OACGK,EAAAA,KAAA,MAAA,CAAI,UAAWb,EAAMsM,KACnBP,SAAAA,CAAAA,GAAQpL,IAAK4L,GACXxM,EAAAA,IAAAmL,GAAA,CAAoB,MAAOqB,EAAQ,QAASJ,EAAW,WAAY3L,IAAU+L,CAAjEA,EAAAA,EACd,EACDxM,EAAAA,IAACyM,GAAa,CAAA,MAAOhM,EAAO,SAAU2L,EAAW,WAAY,CAACJ,GAAQU,SAASjM,CAAK,CAAE,CAAA,CAAA,EACxF,CAEJ,kSC1BO,SAASkM,GAAa,CAAEvM,MAAAA,EAAOL,SAAAA,EAAU,GAAG6M,CAAmD,EAAG,CAErG,OAAA9L,EAAA,KAAC+L,GAAA,CACC,SAAA,CAAA7M,EAAAA,IAAC8M,GAAA,CAAqBF,GAAAA,EAAe7M,SAAAA,CAAS,CAAA,EAC9CC,EAAAA,IAAC+M,GAAA,CACC,SAAA/M,EAAA,IAACgN,GAAA,CAAoB,UAAW/M,EAAMgN,WAAY,MAAM,QAAQ,WAAY,EAC1E,SAAAjN,EAAA,IAACkN,GAAA,CAAe,UAAWjN,EAAMkN,MAC9B/M,SAAMQ,EAAAA,IAAI,CAACC,EAAMuM,IACZvM,EAAKuD,OAAS,gBACRiJ,GAAA,CAA+B,UAAWpN,EAAMqN,WAAxBF,CAAqC,EAGpEtM,EAAAA,KAAAyM,GAAA,CAEC,UAAWtN,EAAMY,KACjB,QAASA,EAAKyK,QACd,SAAUzK,EAAK2M,SACf,YAAW3M,EAAKuD,KAEhB,SAAA,CAACtD,EAAA,KAAA,OAAA,CAAK,UAAWb,EAAMwN,QACrB,SAAA,CAAC3M,EAAA,KAAA,OAAA,CAAK,UAAWb,EAAMmB,MACpBP,SAAAA,CAAAA,EAAK6M,MAAQ1N,EAAAA,IAACa,EAAK,KAAL,CAAA,CAAY,EAC1BA,EAAKO,KAAAA,EACR,EACCP,EAAK8M,aAAgB3N,MAAA,OAAA,CAAK,UAAWC,EAAM0N,YAAc9M,WAAK8M,WAAY,CAAA,CAAA,EAC7E,EACC9M,EAAK+M,UAAa5N,MAAA,OAAA,CAAK,UAAWC,EAAM2N,SAAW/M,WAAK+M,QAAS,CAAA,CAAA,CAAA,EAb7DR,CAcP,CAEH,CACH,CAAA,CAAA,CACF,CACF,CAAA,CAAA,EACF,CAEJ,CASO,SAASS,GAAuB,CAAEzN,MAAAA,EAAO0N,OAAAA,EAAQC,SAAAA,EAAUC,QAAAA,CAAqC,EAAG,CACxG,cACGnB,GAAA,CACC,KAAMiB,EACN,aAAwBG,GAAA,CACjBA,GAAcD,EAAA,CAGrB,EAAA,SAAA,CAAChO,MAAA8M,GAAA,CAAiB,MAAO,CAAEiB,SAAU,QAASG,KAAMH,EAASI,EAAGC,IAAKL,EAASM,CAAAA,EAAK,cAAW,GAAA,EAC7FrO,EAAAA,IAAA+M,GAAA,CACC,SAAC/M,EAAAA,IAAAgN,GAAA,CAAoB,UAAW/M,EAAMgN,WAAY,MAAM,QAAQ,WAAY,EAAG,YAAa,EAC1F,SAAAjN,EAAAA,IAACkN,GAAA,CAAe,UAAWjN,EAAMkN,MAC9B/M,SAAMQ,EAAAA,IAAI,CAACC,EAAMuM,IACZvM,EAAKuD,OAAS,gBACRiJ,GAAA,CAA+B,UAAWpN,EAAMqN,WAAxBF,CAAqC,EAGpEtM,EAAA,KAAAyM,GAAA,CAA0B,UAAWtN,EAAMY,KAAM,QAASA,EAAKyK,QAAS,SAAUzK,EAAK2M,SACtF,SAAA,CAAC1M,EAAA,KAAA,OAAA,CAAK,UAAWb,EAAMwN,QACrB,SAAA,CAAC3M,EAAA,KAAA,OAAA,CAAK,UAAWb,EAAMmB,MACpBP,SAAAA,CAAAA,EAAK6M,MAAQ1N,EAAAA,IAACa,EAAK,KAAL,CAAA,CAAY,EAC1BA,EAAKO,KAAAA,EACR,EACCP,EAAK8M,aAAgB3N,MAAA,OAAA,CAAK,UAAWC,EAAM0N,YAAc9M,WAAK8M,WAAY,CAAA,CAAA,EAC7E,EACC9M,EAAK+M,UAAa5N,MAAA,OAAA,CAAK,UAAWC,EAAM2N,SAAW/M,WAAK+M,QAAS,CAAA,CAAA,CAAA,EARhDR,CASpB,CAEH,CACH,CAAA,CAAA,CACF,CACF,CAAA,CAAA,EACF,CAEJ,uKCnFA,SAAwBkB,GAAM,CAC5BR,OAAAA,EACAS,MAAAA,EACAC,gBAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,eAAAA,EACAX,QAAAA,CACU,EAAG,CAEX,OAAAhO,EAAAA,IAAC4O,GAAA,CACC,KAAMd,EACN,aAAeA,GAAW,CACnBA,GAAgBE,EAAA,CAAA,EAEvB,wBAAuB,GAEvB,SAAClN,EAAAA,KAAA+N,GAAA,CACEJ,SAAAA,CAAAA,SAAiBK,GAAA,CAAoB,UAAW7O,EAAM8O,SAAY,SAClEC,GAAA,CAAiB,UAAW/O,EAAMgP,MACjC,SAAA,CAACnO,EAAA,KAAA,MAAA,CAAI,UAAWb,EAAMsO,MACnBA,SAAAA,CAAAA,EACAC,SACEU,GAAW,CAAA,QAAQ,eAAe,QAASlB,EAC1C,SAAChO,EAAAA,IAAAmP,GAAA,CAAO,CAAA,CACV,CAAA,CAAA,EAEJ,EACCnP,EAAA,IAAA,MAAA,CAAI,UAAWC,EAAMmP,KAAOV,SAAaA,EAAA,EACzC1O,EAAA,IAAA,MAAA,CAAI,UAAWC,EAAMoP,OAASV,SAAeA,CAAA,CAAA,CAAA,CAChD,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ,CCpDO,SAASW,GAAU,CAClBC,MAAAA,EAAYC,UAAUD,UAAUE,YAAY,EAClD,OAAOF,EAAU7C,SAAS,WAAW,GAAK6C,EAAU7C,SAAS,QAAQ,CACvE,CAEagD,MAAAA,GAAYJ,EAAQ,EAAI,SAAW,MAEnCK,GAAYL,EAAQ,EAAI,MAAQ,OCsBhCM,GAAoBjO,GAAAA,EAA8B,CAACE,EAAK3E,KAAS,CAC5E2S,mBAAoBC,IACpBC,cAAe,KACfC,OAAQ,KACRC,UAAW,KACXC,cAAe,KACfC,wBAAyBA,CAAC,CAAExS,GAAAA,CAAAA,IAAS,CAC/BkE,EAAA,CAAEgO,eAAgB,IAAIC,IAAI,CAACnS,CAAE,CAAC,EAAGoS,cAAe,KAAMC,OAAQrS,EAAIsS,UAAW,QAAA,CAAU,CAC7F,EACAG,kBAAmBA,CAAC,CAAEzS,GAAAA,EAAIyP,MAAAA,EAAOiD,WAAAA,CAAAA,IAAiB,CAC1C,KAAA,CAAER,eAAAA,EAAgBE,cAAAA,EAAeE,UAAAA,GAAc/S,EAAI,EAGzD,GAAI+S,IAAc,SAChB,OAAOpO,EAAI,CAAEgO,eAAgB,IAAIC,IAAI,CAACnS,CAAE,CAAC,EAAGoS,cAAe3C,EAAO4C,OAAQrS,EAAIsS,UAAW,OAAA,CAAS,EAIpG,GAAII,IAAe,QACjB,OAAOxO,EAAI,CAAEgO,eAAgB,IAAIC,IAAI,CAACnS,CAAE,CAAC,EAAGoS,cAAe3C,EAAO4C,OAAQrS,EAAIsS,UAAW,OAAA,CAAS,EAIpG,GAAII,IAAe,OAAQ,CACnBC,MAAAA,EAAcC,EAAkBC,aAAsBC,EAAO,EACnE,GAAI,CAACH,EAAa,OAGlB,GAAI,CAACT,EAAea,IAAI/S,CAAE,EACxB,OAAOkE,EAAI,CACTgO,eAAgBA,EAAec,IAAIhT,CAAE,EACrCoS,cAAe3C,EACf4C,OAAQrS,EACRsS,UAAW,OAAA,CACZ,EAKHJ,EAAe/R,OAAOH,CAAE,EAExB,MAAMiT,EAAYN,EAAYO,MAAMC,UAClC,CAACC,EAASC,IAAMA,EAAI5D,GAAS6D,GAAcX,EAAY9N,QAAQuO,CAAO,CAAC,GAAKlB,EAAea,IAAIK,CAAO,CACxG,EAGA,OAAOlP,EAAI,CACTgO,eAAAA,EACAE,cAAea,EAAY,EAAIN,EAAYO,MAAM3L,OAAS,EAAI0L,EAC9DX,UAAW,OAAA,CACZ,CAAA,CAIH,GAAII,IAAe,QAAS,CACpBC,MAAAA,EAAcC,EAAkBC,aAAsBC,EAAO,EACnE,GAAI,CAACH,EAAa,OAGlB,MAAMY,EAAsB,CAAE,EAClBC,EAAAA,UAAU3N,QAAqBuN,GAAA,CACnC/H,MAAAA,EAAQsH,EAAY9N,QAAQuO,CAAO,EACrCE,GAAcjI,CAAK,GACZoI,EAAAA,KAAKpI,EAAMrL,EAAE,CACxB,CACD,EAED,MAAM0T,EAAQtB,IAAkB,KAAO,EAAIuB,KAAKC,IAAIxB,EAAe3C,CAAK,EAClEpD,EAAM+F,IAAkB,KAAO3C,EAAQkE,KAAKE,IAAIzB,EAAe3C,EAAQ,CAAC,EAGxEqE,EAAmBP,EAASQ,MAAML,EAAOrH,CAAG,EAElD,OAAOnI,EAAI,CACTgO,mBAAoBC,IAAI,CAAC,GAAGD,EAAgB,GAAG4B,CAAgB,CAAC,EAChE1B,cAAe3C,EACf6C,UAAW,OAAA,CACZ,CAAA,CAEL,EACA0B,oBAAqBA,IAAM9P,EAAI,CAAEgO,mBAAoBC,IAAOC,cAAe,KAAMC,OAAQ,KAAMC,UAAW,IAAA,CAAM,EAChH2B,iBAAkBA,IAAM,CAChB,KAAA,CAAE/B,eAAAA,GAAmB3S,EAAI,EACzB,CAAC2U,CAAa,EAAIhC,EACpBhO,EAAA,CACFgO,eAAgB,IAAIC,IAAI+B,EAAgB,CAACA,CAAa,EAAI,CAAA,CAAE,EAC5D9B,cAAe,KACfE,UAAW,IAAA,CACZ,CACH,EACA6B,SAAWnU,GAAe,CAClB,KAAA,CAAEsS,UAAAA,EAAWJ,eAAAA,GAAmB3S,EAAI,EAC1C2S,EAAe/R,OAAOH,CAAE,EACpBkE,EAAA,CACFgO,eAAAA,EACAI,UAAWJ,EAAekC,OAAS,EAAI,KAAO9B,CAAAA,CAC/C,CACH,EAEA+B,oBAA+BnQ,EAAI,CAAEqO,cAAe+B,CAAAA,CAAS,EAE7DC,cAAgBvU,GAAgB,CACxBsU,MAAAA,EAAU/U,IAAMgT,cAClB+B,GACFA,EAAQtU,CAAE,CACZ,CAEJ,EAAE,EAEK,SAASwU,GAAiBnJ,EAAkC,CACjE,OAAKsG,EAAQ,GAAKtG,EAAMoJ,SAAYpJ,EAAMqJ,QACjC,OAGLrJ,EAAMsJ,SACD,QAGF,OACT"}
@@ -1,2 +1,2 @@
1
- import{a as n,k as c,O as d,P as l}from"./vendor-CKDP5hij.js";import{ay as f,az as y,aR as o,aH as g}from"./index-2lQ-45a9.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="1162ea55-dab1-46e1-8922-5422e45894e0",e._sentryDebugIdIdentifier="sentry-dbid-1162ea55-dab1-46e1-8922-5422e45894e0")}catch{}})();const s=`${f}/project`;async function p(e){return(await n.get(s,{signal:e==null?void 0:e.signal,timeout:e==null?void 0:e.timeout})).data}async function m(e){return n.post(s,e)}async function j(e){const t=new FormData;return t.append("image",e),await n.post(`${s}/upload`,t,{timeout:y.longTimeout,headers:{"Content-Type":"multipart/form-data"}})}const D={title:"",description:"",url:"",info:"",logo:null,custom:[]};function w(){const{data:e,status:t,isFetching:a,isError:u,refetch:i}=c({queryKey:o,queryFn:({signal:r})=>p({signal:r}),placeholderData:(r,b)=>r,refetchInterval:g});return{data:e??D,status:t,isFetching:a,isError:u,refetch:i}}function I(){const e=d(),t=l({mutationFn:m,onSuccess:a=>{e.setQueryData(o,a)}});return{updateProjectData:t.mutateAsync,isMutating:t.isPending,isMutatingError:t.isError}}export{I as a,j as b,w as u};
2
- //# sourceMappingURL=useProjectData-DD_BQ9eJ.js.map
1
+ import{a as n,k as c,O as d,P as l}from"./vendor-Dt3_Fdfs.js";import{ay as f,az as y,aS as o,aI as g}from"./index-3aosT33y.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="20339906-89d0-4e6f-9432-ad15b49bf28a",e._sentryDebugIdIdentifier="sentry-dbid-20339906-89d0-4e6f-9432-ad15b49bf28a")}catch{}})();const s=`${f}/project`;async function p(e){return(await n.get(s,{signal:e==null?void 0:e.signal,timeout:e==null?void 0:e.timeout})).data}async function m(e){return n.post(s,e)}async function j(e){const t=new FormData;return t.append("image",e),await n.post(`${s}/upload`,t,{timeout:y.longTimeout,headers:{"Content-Type":"multipart/form-data"}})}const D={title:"",description:"",url:"",info:"",logo:null,custom:[]};function w(){const{data:e,status:t,isFetching:a,isError:u,refetch:i}=c({queryKey:o,queryFn:({signal:r})=>p({signal:r}),placeholderData:(r,b)=>r,refetchInterval:g});return{data:e??D,status:t,isFetching:a,isError:u,refetch:i}}function I(){const e=d(),t=l({mutationFn:m,onSuccess:a=>{e.setQueryData(o,a)}});return{updateProjectData:t.mutateAsync,isMutating:t.isPending,isMutatingError:t.isError}}export{I as a,j as b,w as u};
2
+ //# sourceMappingURL=useProjectData-gGT2eczr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useProjectData-DD_BQ9eJ.js","sources":["../../src/common/api/project.ts","../../src/common/models/ProjectData.ts","../../src/common/hooks-query/useProjectData.ts"],"sourcesContent":["import axios, { AxiosResponse } from 'axios';\nimport { ProjectData, ProjectLogoResponse } from 'ontime-types';\n\nimport { apiEntryUrl } from './constants';\nimport type { RequestOptions } from './requestOptions';\nimport { axiosConfig } from './requestTimeouts';\n\nconst projectPath = `${apiEntryUrl}/project`;\n\n/**\n * HTTP request to fetch project data\n */\nexport async function getProjectData(options?: RequestOptions): Promise<ProjectData> {\n const res = await axios.get(projectPath, {\n signal: options?.signal,\n timeout: options?.timeout,\n });\n return res.data;\n}\n\n/**\n * HTTP request to mutate project data\n */\nexport async function postProjectData(data: ProjectData): Promise<AxiosResponse<ProjectData>> {\n return axios.post(projectPath, data);\n}\n\n/**\n * HTTP request to upload a project logo\n */\nexport async function uploadProjectLogo(file: File): Promise<AxiosResponse<ProjectLogoResponse>> {\n const formData = new FormData();\n formData.append('image', file);\n const response = await axios.post(`${projectPath}/upload`, formData, {\n timeout: axiosConfig.longTimeout,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n });\n\n return response;\n}\n","import { ProjectData } from 'ontime-types';\n\nexport const projectDataPlaceholder: ProjectData = {\n title: '',\n description: '',\n url: '',\n info: '',\n logo: null,\n custom: [],\n};\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { queryRefetchIntervalSlow } from '../../ontimeConfig';\nimport { PROJECT_DATA } from '../api/constants';\nimport { getProjectData, postProjectData } from '../api/project';\nimport { projectDataPlaceholder } from '../models/ProjectData';\n\nexport default function useProjectData() {\n const { data, status, isFetching, isError, refetch } = useQuery({\n queryKey: PROJECT_DATA,\n queryFn: ({ signal }) => getProjectData({ signal }),\n placeholderData: (previousData, _previousQuery) => previousData,\n refetchInterval: queryRefetchIntervalSlow,\n });\n\n return { data: data ?? projectDataPlaceholder, status, isFetching, isError, refetch };\n}\n\nexport function useUpdateProjectData() {\n const queryClient = useQueryClient();\n\n const updateFn = useMutation({\n mutationFn: postProjectData,\n onSuccess: (newProjectData) => {\n queryClient.setQueryData(PROJECT_DATA, newProjectData);\n },\n });\n\n return {\n updateProjectData: updateFn.mutateAsync,\n isMutating: updateFn.isPending,\n isMutatingError: updateFn.isError,\n };\n}\n"],"names":["projectPath","apiEntryUrl","getProjectData","options","axios","get","signal","timeout","data","postProjectData","post","uploadProjectLogo","file","formData","FormData","append","axiosConfig","longTimeout","headers","projectDataPlaceholder","title","description","url","info","logo","custom","useProjectData","status","isFetching","isError","refetch","useQuery","queryKey","PROJECT_DATA","queryFn","placeholderData","previousData","_previousQuery","refetchInterval","queryRefetchIntervalSlow","useUpdateProjectData","queryClient","useQueryClient","updateFn","useMutation","mutationFn","onSuccess","newProjectData","setQueryData","updateProjectData","mutateAsync","isMutating","isPending","isMutatingError"],"mappings":"ydAOA,MAAMA,EAAc,GAAGC,CAAW,WAKlC,eAAsBC,EAAeC,EAAgD,CAKnF,OAJY,MAAMC,EAAMC,IAAIL,EAAa,CACvCM,OAAQH,GAAAA,YAAAA,EAASG,OACjBC,QAASJ,GAAAA,YAAAA,EAASI,OAAAA,CACnB,GACUC,IACb,CAKA,eAAsBC,EAAgBD,EAAwD,CACrFJ,OAAAA,EAAMM,KAAKV,EAAaQ,CAAI,CACrC,CAKA,eAAsBG,EAAkBC,EAAyD,CACzFC,MAAAA,EAAW,IAAIC,SACZC,OAAAA,EAAAA,OAAO,QAASH,CAAI,EACZ,MAAMR,EAAMM,KAAK,GAAGV,CAAW,UAAWa,EAAU,CACnEN,QAASS,EAAYC,YACrBC,QAAS,CACP,eAAgB,qBAAA,CAClB,CACD,CAGH,CCvCO,MAAMC,EAAsC,CACjDC,MAAO,GACPC,YAAa,GACbC,IAAK,GACLC,KAAM,GACNC,KAAM,KACNC,OAAQ,CAAA,CACV,ECFA,SAAwBC,GAAiB,CACjC,KAAA,CAAElB,KAAAA,EAAMmB,OAAAA,EAAQC,WAAAA,EAAYC,QAAAA,EAASC,QAAAA,GAAYC,EAAS,CAC9DC,SAAUC,EACVC,QAASA,CAAC,CAAE5B,OAAAA,KAAaJ,EAAe,CAAEI,OAAAA,CAAAA,CAAQ,EAClD6B,gBAAiBA,CAACC,EAAcC,IAAmBD,EACnDE,gBAAiBC,CAAAA,CAClB,EAEM,MAAA,CAAE/B,KAAMA,GAAQW,EAAwBQ,OAAAA,EAAQC,WAAAA,EAAYC,QAAAA,EAASC,QAAAA,CAAQ,CACtF,CAEO,SAASU,GAAuB,CACrC,MAAMC,EAAcC,EAAe,EAE7BC,EAAWC,EAAY,CAC3BC,WAAYpC,EACZqC,UAA+BC,GAAA,CACjBC,EAAAA,aAAaf,EAAcc,CAAc,CAAA,CACvD,CACD,EAEM,MAAA,CACLE,kBAAmBN,EAASO,YAC5BC,WAAYR,EAASS,UACrBC,gBAAiBV,EAASd,OAC5B,CACF"}
1
+ {"version":3,"file":"useProjectData-gGT2eczr.js","sources":["../../src/common/api/project.ts","../../src/common/models/ProjectData.ts","../../src/common/hooks-query/useProjectData.ts"],"sourcesContent":["import axios, { AxiosResponse } from 'axios';\nimport { ProjectData, ProjectLogoResponse } from 'ontime-types';\n\nimport { apiEntryUrl } from './constants';\nimport type { RequestOptions } from './requestOptions';\nimport { axiosConfig } from './requestTimeouts';\n\nconst projectPath = `${apiEntryUrl}/project`;\n\n/**\n * HTTP request to fetch project data\n */\nexport async function getProjectData(options?: RequestOptions): Promise<ProjectData> {\n const res = await axios.get(projectPath, {\n signal: options?.signal,\n timeout: options?.timeout,\n });\n return res.data;\n}\n\n/**\n * HTTP request to mutate project data\n */\nexport async function postProjectData(data: ProjectData): Promise<AxiosResponse<ProjectData>> {\n return axios.post(projectPath, data);\n}\n\n/**\n * HTTP request to upload a project logo\n */\nexport async function uploadProjectLogo(file: File): Promise<AxiosResponse<ProjectLogoResponse>> {\n const formData = new FormData();\n formData.append('image', file);\n const response = await axios.post(`${projectPath}/upload`, formData, {\n timeout: axiosConfig.longTimeout,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n });\n\n return response;\n}\n","import { ProjectData } from 'ontime-types';\n\nexport const projectDataPlaceholder: ProjectData = {\n title: '',\n description: '',\n url: '',\n info: '',\n logo: null,\n custom: [],\n};\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { queryRefetchIntervalSlow } from '../../ontimeConfig';\nimport { PROJECT_DATA } from '../api/constants';\nimport { getProjectData, postProjectData } from '../api/project';\nimport { projectDataPlaceholder } from '../models/ProjectData';\n\nexport default function useProjectData() {\n const { data, status, isFetching, isError, refetch } = useQuery({\n queryKey: PROJECT_DATA,\n queryFn: ({ signal }) => getProjectData({ signal }),\n placeholderData: (previousData, _previousQuery) => previousData,\n refetchInterval: queryRefetchIntervalSlow,\n });\n\n return { data: data ?? projectDataPlaceholder, status, isFetching, isError, refetch };\n}\n\nexport function useUpdateProjectData() {\n const queryClient = useQueryClient();\n\n const updateFn = useMutation({\n mutationFn: postProjectData,\n onSuccess: (newProjectData) => {\n queryClient.setQueryData(PROJECT_DATA, newProjectData);\n },\n });\n\n return {\n updateProjectData: updateFn.mutateAsync,\n isMutating: updateFn.isPending,\n isMutatingError: updateFn.isError,\n };\n}\n"],"names":["projectPath","apiEntryUrl","getProjectData","options","axios","get","signal","timeout","data","postProjectData","post","uploadProjectLogo","file","formData","FormData","append","axiosConfig","longTimeout","headers","projectDataPlaceholder","title","description","url","info","logo","custom","useProjectData","status","isFetching","isError","refetch","useQuery","queryKey","PROJECT_DATA","queryFn","placeholderData","previousData","_previousQuery","refetchInterval","queryRefetchIntervalSlow","useUpdateProjectData","queryClient","useQueryClient","updateFn","useMutation","mutationFn","onSuccess","newProjectData","setQueryData","updateProjectData","mutateAsync","isMutating","isPending","isMutatingError"],"mappings":"ydAOA,MAAMA,EAAc,GAAGC,CAAW,WAKlC,eAAsBC,EAAeC,EAAgD,CAKnF,OAJY,MAAMC,EAAMC,IAAIL,EAAa,CACvCM,OAAQH,GAAAA,YAAAA,EAASG,OACjBC,QAASJ,GAAAA,YAAAA,EAASI,OAAAA,CACnB,GACUC,IACb,CAKA,eAAsBC,EAAgBD,EAAwD,CACrFJ,OAAAA,EAAMM,KAAKV,EAAaQ,CAAI,CACrC,CAKA,eAAsBG,EAAkBC,EAAyD,CACzFC,MAAAA,EAAW,IAAIC,SACZC,OAAAA,EAAAA,OAAO,QAASH,CAAI,EACZ,MAAMR,EAAMM,KAAK,GAAGV,CAAW,UAAWa,EAAU,CACnEN,QAASS,EAAYC,YACrBC,QAAS,CACP,eAAgB,qBAAA,CAClB,CACD,CAGH,CCvCO,MAAMC,EAAsC,CACjDC,MAAO,GACPC,YAAa,GACbC,IAAK,GACLC,KAAM,GACNC,KAAM,KACNC,OAAQ,CAAA,CACV,ECFA,SAAwBC,GAAiB,CACjC,KAAA,CAAElB,KAAAA,EAAMmB,OAAAA,EAAQC,WAAAA,EAAYC,QAAAA,EAASC,QAAAA,GAAYC,EAAS,CAC9DC,SAAUC,EACVC,QAASA,CAAC,CAAE5B,OAAAA,KAAaJ,EAAe,CAAEI,OAAAA,CAAAA,CAAQ,EAClD6B,gBAAiBA,CAACC,EAAcC,IAAmBD,EACnDE,gBAAiBC,CAAAA,CAClB,EAEM,MAAA,CAAE/B,KAAMA,GAAQW,EAAwBQ,OAAAA,EAAQC,WAAAA,EAAYC,QAAAA,EAASC,QAAAA,CAAQ,CACtF,CAEO,SAASU,GAAuB,CACrC,MAAMC,EAAcC,EAAe,EAE7BC,EAAWC,EAAY,CAC3BC,WAAYpC,EACZqC,UAA+BC,GAAA,CACjBC,EAAAA,aAAaf,EAAcc,CAAc,CAAA,CACvD,CACD,EAEM,MAAA,CACLE,kBAAmBN,EAASO,YAC5BC,WAAYR,EAASS,UACrBC,gBAAiBV,EAASd,OAC5B,CACF"}
@@ -1,2 +1,2 @@
1
- import{a as r,k as d}from"./vendor-CKDP5hij.js";import{ay as i,bL as l,bP as n,I as u}from"./index-2lQ-45a9.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},a=new e.Error().stack;a&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[a]="7e0197f6-b639-4a30-8529-d80fea71c42a",e._sentryDebugIdIdentifier="sentry-dbid-7e0197f6-b639-4a30-8529-d80fea71c42a")}catch{}})();const s=`${i}/report`;async function o(e){return(await r.get(s,{signal:e==null?void 0:e.signal})).data}async function b(){await r.delete(`${s}/all`),await l.invalidateQueries({queryKey:n})}function g(){const{data:e,refetch:a}=d({queryKey:n,queryFn:({signal:t})=>o({signal:t}),placeholderData:(t,f)=>t,staleTime:u});return{data:e??{},refetch:a}}export{b as d,g as u};
2
- //# sourceMappingURL=useReport-DozG5uz5.js.map
1
+ import{a as r,k as d}from"./vendor-Dt3_Fdfs.js";import{ay as i,bN as l,bR as n,I as u}from"./index-3aosT33y.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},a=new e.Error().stack;a&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[a]="1a95f02b-61fd-4ac7-9a7b-cb64ecd298d1",e._sentryDebugIdIdentifier="sentry-dbid-1a95f02b-61fd-4ac7-9a7b-cb64ecd298d1")}catch{}})();const s=`${i}/report`;async function o(e){return(await r.get(s,{signal:e==null?void 0:e.signal})).data}async function b(){await r.delete(`${s}/all`),await l.invalidateQueries({queryKey:n})}function g(){const{data:e,refetch:a}=d({queryKey:n,queryFn:({signal:t})=>o({signal:t}),placeholderData:(t,f)=>t,staleTime:u});return{data:e??{},refetch:a}}export{b as d,g as u};
2
+ //# sourceMappingURL=useReport-CG6m_Zb0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useReport-DozG5uz5.js","sources":["../../src/common/api/report.ts","../../src/common/hooks-query/useReport.ts"],"sourcesContent":["import axios from 'axios';\nimport { OntimeReport } from 'ontime-types';\n\nimport { ontimeQueryClient } from '../../common/queryClient';\n\nimport { apiEntryUrl, REPORT } from './constants';\nimport type { RequestOptions } from './requestOptions';\n\nexport const reportUrl = `${apiEntryUrl}/report`;\n\n/**\n * HTTP request to fetch all reports\n */\nexport async function fetchReport(options?: RequestOptions): Promise<OntimeReport> {\n const res = await axios.get(reportUrl, { signal: options?.signal });\n return res.data;\n}\n\nexport async function deleteReport(id: string) {\n await axios.delete(`${reportUrl}/${id}`);\n await ontimeQueryClient.invalidateQueries({ queryKey: REPORT });\n}\n\nexport async function deleteAllReport() {\n await axios.delete(`${reportUrl}/all`);\n await ontimeQueryClient.invalidateQueries({ queryKey: REPORT });\n}\n","import { useQuery } from '@tanstack/react-query';\nimport { OntimeReport } from 'ontime-types';\nimport { MILLIS_PER_HOUR } from 'ontime-utils';\n\nimport { REPORT } from '../api/constants';\nimport { fetchReport } from '../api/report';\n\nexport default function useReport() {\n const { data, refetch } = useQuery<OntimeReport>({\n queryKey: REPORT,\n queryFn: ({ signal }) => fetchReport({ signal }),\n placeholderData: (previousData, _previousQuery) => previousData,\n staleTime: MILLIS_PER_HOUR,\n });\n\n return { data: data ?? {}, refetch };\n}\n"],"names":["reportUrl","apiEntryUrl","fetchReport","options","axios","get","signal","data","deleteAllReport","delete","ontimeQueryClient","invalidateQueries","queryKey","REPORT","useReport","refetch","useQuery","queryFn","placeholderData","previousData","_previousQuery","staleTime","MILLIS_PER_HOUR"],"mappings":"0cAQaA,MAAAA,EAAY,GAAGC,CAAW,UAKvC,eAAsBC,EAAYC,EAAiD,CAEjF,OADY,MAAMC,EAAMC,IAAIL,EAAW,CAAEM,OAAQH,GAAAA,YAAAA,EAASG,MAAAA,CAAQ,GACvDC,IACb,CAOA,eAAsBC,GAAkB,CACtC,MAAMJ,EAAMK,OAAO,GAAGT,CAAS,MAAM,EACrC,MAAMU,EAAkBC,kBAAkB,CAAEC,SAAUC,CAAAA,CAAQ,CAChE,CCnBA,SAAwBC,GAAY,CAC5B,KAAA,CAAEP,KAAAA,EAAMQ,QAAAA,GAAYC,EAAuB,CAC/CJ,SAAUC,EACVI,QAASA,CAAC,CAAEX,OAAAA,KAAaJ,EAAY,CAAEI,OAAAA,CAAAA,CAAQ,EAC/CY,gBAAiBA,CAACC,EAAcC,IAAmBD,EACnDE,UAAWC,CAAAA,CACZ,EAEM,MAAA,CAAEf,KAAMA,GAAQ,CAAC,EAAGQ,QAAAA,CAAQ,CACrC"}
1
+ {"version":3,"file":"useReport-CG6m_Zb0.js","sources":["../../src/common/api/report.ts","../../src/common/hooks-query/useReport.ts"],"sourcesContent":["import axios from 'axios';\nimport { OntimeReport } from 'ontime-types';\n\nimport { ontimeQueryClient } from '../../common/queryClient';\n\nimport { apiEntryUrl, REPORT } from './constants';\nimport type { RequestOptions } from './requestOptions';\n\nexport const reportUrl = `${apiEntryUrl}/report`;\n\n/**\n * HTTP request to fetch all reports\n */\nexport async function fetchReport(options?: RequestOptions): Promise<OntimeReport> {\n const res = await axios.get(reportUrl, { signal: options?.signal });\n return res.data;\n}\n\nexport async function deleteReport(id: string) {\n await axios.delete(`${reportUrl}/${id}`);\n await ontimeQueryClient.invalidateQueries({ queryKey: REPORT });\n}\n\nexport async function deleteAllReport() {\n await axios.delete(`${reportUrl}/all`);\n await ontimeQueryClient.invalidateQueries({ queryKey: REPORT });\n}\n","import { useQuery } from '@tanstack/react-query';\nimport { OntimeReport } from 'ontime-types';\nimport { MILLIS_PER_HOUR } from 'ontime-utils';\n\nimport { REPORT } from '../api/constants';\nimport { fetchReport } from '../api/report';\n\nexport default function useReport() {\n const { data, refetch } = useQuery<OntimeReport>({\n queryKey: REPORT,\n queryFn: ({ signal }) => fetchReport({ signal }),\n placeholderData: (previousData, _previousQuery) => previousData,\n staleTime: MILLIS_PER_HOUR,\n });\n\n return { data: data ?? {}, refetch };\n}\n"],"names":["reportUrl","apiEntryUrl","fetchReport","options","axios","get","signal","data","deleteAllReport","delete","ontimeQueryClient","invalidateQueries","queryKey","REPORT","useReport","refetch","useQuery","queryFn","placeholderData","previousData","_previousQuery","staleTime","MILLIS_PER_HOUR"],"mappings":"0cAQaA,MAAAA,EAAY,GAAGC,CAAW,UAKvC,eAAsBC,EAAYC,EAAiD,CAEjF,OADY,MAAMC,EAAMC,IAAIL,EAAW,CAAEM,OAAQH,GAAAA,YAAAA,EAASG,MAAAA,CAAQ,GACvDC,IACb,CAOA,eAAsBC,GAAkB,CACtC,MAAMJ,EAAMK,OAAO,GAAGT,CAAS,MAAM,EACrC,MAAMU,EAAkBC,kBAAkB,CAAEC,SAAUC,CAAAA,CAAQ,CAChE,CCnBA,SAAwBC,GAAY,CAC5B,KAAA,CAAEP,KAAAA,EAAMQ,QAAAA,GAAYC,EAAuB,CAC/CJ,SAAUC,EACVI,QAASA,CAAC,CAAEX,OAAAA,KAAaJ,EAAY,CAAEI,OAAAA,CAAAA,CAAQ,EAC/CY,gBAAiBA,CAACC,EAAcC,IAAmBD,EACnDE,UAAWC,CAAAA,CACZ,EAEM,MAAA,CAAEf,KAAMA,GAAQ,CAAC,EAAGQ,QAAAA,CAAQ,CACrC"}
@@ -1,2 +1,2 @@
1
- import{a as r,k as g,h as c}from"./vendor-CKDP5hij.js";import{s as f,ay as $,o as p,aH as h,aA as E}from"./index-2lQ-45a9.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new t.Error().stack;n&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[n]="39005c73-6142-46a3-acec-2ec7d570c767",t._sentryDebugIdIdentifier="sentry-dbid-39005c73-6142-46a3-acec-2ec7d570c767")}catch{}})();var i=(t=>(t.Event="event",t.Delay="delay",t.Group="group",t.Milestone="milestone",t))(i||{});function m(t){return(t==null?void 0:t.type)===i.Event}function R(t){return!t.skip}function G(t){return(t==null?void 0:t.type)===i.Delay}function I(t){return(t==null?void 0:t.type)===i.Group}function C(t){return(t==null?void 0:t.type)===i.Milestone}function F(t,n){return t in n}function S(t){return t.type==="osc"}function N(t){return t.type==="http"}function W(t){return t.type==="ontime"}function M(t,n){return!(!n||t.dayOffset<=n.dayOffset||n.timeStart+n.duration>f)}function O(t,n){if(!n)return!0;const a=t.timeStart+t.duration+t.dayOffset*f,e=n.timeStart+n.duration+n.dayOffset*f;return a>=e}const s=`${$}/rundowns`;async function j(t){return(await r.get(s,{signal:t==null?void 0:t.signal})).data}async function D(t){const n=await r.get(`${s}/current`,{signal:t==null?void 0:t.signal});if(!a(n.data))throw new Error("Invalid rundown payload");return n.data;function a(e){return e&&typeof e=="object"&&typeof e.id=="string"&&Array.isArray(e.order)&&Array.isArray(e.flatOrder)&&e.entries&&typeof e.entries=="object"&&typeof e.revision=="number"}}async function x(t){return r.post(`${s}/${t}/load`)}async function B(t){return r.post(s,{title:t})}async function _(t){return r.post(`${s}/${t}/duplicate`)}async function H(t,n){return r.patch(`${s}/${t}`,{title:n})}async function K(t){return r.delete(`${s}/${t}`)}async function U(t,n){return r.post(`${s}/${t}/entry`,n)}async function z(t,n){return r.put(`${s}/${t}/entry`,n)}async function Q(t,n){return r.put(`${s}/${t}/batch`,n)}async function V(t,n){return r.patch(`${s}/${t}/reorder`,n)}async function J(t,n,a){return r.patch(`${s}/${t}/swap`,{from:n,to:a})}async function X(t,n){return r.patch(`${s}/${t}/applydelay/${n}`)}async function Y(t,n,a){return r.post(`${s}/${t}/clone/${n}`,a)}async function Z(t,n){return r.post(`${s}/${t}/group`,{ids:n})}async function tt(t,n){return r.post(`${s}/${t}/ungroup/${n}`)}async function nt(t,n){return r.delete(`${s}/${t}/entries`,{data:{ids:n}})}async function et(t){return r.delete(`${s}/${t}/all`)}const v="LAST";function L(t,n){const{metadata:a,process:e}=y(n);let o=a;const u={};for(const d of t.flatOrder){const w=t.entries[d];o=e(w),u[d]=o}return u[v]=o,u}function b(t,n){const{process:a}=y(n),e=[];for(const o of t.flatOrder){const u=t.entries[o],d={...u,...a(u)};e.push(d)}return e}function y(t){let n={previousEvent:null,latestEvent:null,previousEntryId:null,thisId:null,eventIndex:0,isPast:!!t,isNextDay:!1,totalGap:0,isLinkedToLoaded:!1,isLoaded:!1,groupId:null,groupColour:void 0,groupEntries:void 0,isFirstAfterGroup:!1};function a(e){return n=A(n,t,e),n}return{metadata:n,process:a}}function A(t,n,a){var o,u;const e={...t};return e.isNextDay=!1,e.isLoaded=!1,e.previousEntryId=e.thisId,e.thisId=a.id,e.previousEvent=e.latestEvent,a.id===n&&(e.isLoaded=!0,e.isPast=!1,e.isLinkedToLoaded=!0),I(a)?(e.groupId=a.id,e.groupColour=a.colour,e.groupEntries=a.entries.length):(a.parent!==e.groupId&&(e.groupId=a.parent,e.groupEntries=void 0,a.parent===null&&(e.groupColour=void 0)),m(a)&&(e.eventIndex+=1,e.isFirstAfterGroup=!!((o=e.previousEvent)!=null&&o.parent)&&a.parent===null,R(a)&&(e.isNextDay=M(a,e.previousEvent),!e.isPast&&!e.isLoaded&&(e.totalGap+=a.gap,e.isLinkedToLoaded=a.linkStart&&!((u=e.previousEvent)!=null&&u.countToEnd)&&e.isLinkedToLoaded),O(a,e.latestEvent)&&(e.latestEvent=a)))),e}const T={id:"default",title:"",order:[],flatOrder:[],entries:{},revision:-1};function l(){const{data:t,status:n,isError:a,refetch:e,isFetching:o}=g({queryKey:E,queryFn:({signal:u})=>D({signal:u}),refetchInterval:h});return{data:t??T,status:n,isError:a,refetch:e,isFetching:o}}function at(){const{data:t,status:n}=l(),a=p(),e=c.useMemo(()=>L(t,a),[t,a]);return{data:t,status:n,rundownMetadata:e}}function rt(){const{data:t,status:n}=l();return{data:c.useMemo(()=>t.revision===-1?[]:t.flatOrder.map(e=>t.entries[e]).filter(e=>e!==void 0),[t]),rundownId:t.id,status:n}}function k(){const{data:t,status:n}=l(),a=p();return{data:c.useMemo(()=>b(t,a),[t,a]),status:n}}function st(t){const{data:n,status:a}=k();return{data:c.useMemo(()=>n.filter(t),[n,t]),status:a}}function ot(t){const{data:n}=l();return t===null?null:n.entries[t]??null}export{z as A,Q as B,nt as C,et as D,X as E,tt as F,Z as G,V as H,J as I,i as S,k as a,R as b,st as c,rt as d,O as e,S as f,N as g,W as h,m as i,I as j,C as k,B as l,_ as m,K as n,x as o,j as p,F as q,H as r,b as s,at as t,l as u,ot as v,G as w,v as x,U as y,Y as z};
2
- //# sourceMappingURL=useRundown-D6vokFHi.js.map
1
+ import{a as r,k as g,h as c}from"./vendor-Dt3_Fdfs.js";import{s as f,ay as $,o as p,aI as h,aA as E}from"./index-3aosT33y.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new t.Error().stack;n&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[n]="0e44dbde-b84d-4cce-ae38-d681ae31678f",t._sentryDebugIdIdentifier="sentry-dbid-0e44dbde-b84d-4cce-ae38-d681ae31678f")}catch{}})();var i=(t=>(t.Event="event",t.Delay="delay",t.Group="group",t.Milestone="milestone",t))(i||{});function m(t){return(t==null?void 0:t.type)===i.Event}function I(t){return!t.skip}function G(t){return(t==null?void 0:t.type)===i.Delay}function R(t){return(t==null?void 0:t.type)===i.Group}function C(t){return(t==null?void 0:t.type)===i.Milestone}function F(t,n){return t in n}function S(t){return t.type==="osc"}function N(t){return t.type==="http"}function W(t){return t.type==="ontime"}function M(t,n){return!(!n||t.dayOffset<=n.dayOffset||n.timeStart+n.duration>f)}function O(t,n){if(!n)return!0;const a=t.timeStart+t.duration+t.dayOffset*f,e=n.timeStart+n.duration+n.dayOffset*f;return a>=e}const s=`${$}/rundowns`;async function j(t){return(await r.get(s,{signal:t==null?void 0:t.signal})).data}async function b(t){const n=await r.get(`${s}/current`,{signal:t==null?void 0:t.signal});if(!a(n.data))throw new Error("Invalid rundown payload");return n.data;function a(e){return e&&typeof e=="object"&&typeof e.id=="string"&&Array.isArray(e.order)&&Array.isArray(e.flatOrder)&&e.entries&&typeof e.entries=="object"&&typeof e.revision=="number"}}async function x(t){return r.post(`${s}/${t}/load`)}async function B(t){return r.post(s,{title:t})}async function _(t){return r.post(`${s}/${t}/duplicate`)}async function K(t,n){return r.patch(`${s}/${t}`,{title:n})}async function U(t){return r.delete(`${s}/${t}`)}async function H(t,n){return r.post(`${s}/${t}/entry`,n)}async function z(t,n){return r.put(`${s}/${t}/entry`,n)}async function Q(t,n){return r.put(`${s}/${t}/batch`,n)}async function V(t,n){return r.patch(`${s}/${t}/reorder`,n)}async function J(t,n,a){return r.patch(`${s}/${t}/swap`,{from:n,to:a})}async function X(t,n){return r.patch(`${s}/${t}/applydelay/${n}`)}async function Y(t,n,a){return r.post(`${s}/${t}/clone/${n}`,a)}async function Z(t,n){return r.post(`${s}/${t}/group`,{ids:n})}async function tt(t,n){return r.post(`${s}/${t}/ungroup/${n}`)}async function nt(t,n){return r.delete(`${s}/${t}/entries`,{data:{ids:n}})}async function et(t){return r.delete(`${s}/${t}/all`)}const D="LAST";function v(t,n){const{metadata:a,process:e}=y(n);let o=a;const u={};for(const d of t.flatOrder){const w=t.entries[d];o=e(w),u[d]=o}return u[D]=o,u}function L(t,n){const{process:a}=y(n),e=[];for(const o of t.flatOrder){const u=t.entries[o],d={...u,...a(u)};e.push(d)}return e}function y(t){let n={previousEvent:null,latestEvent:null,previousEntryId:null,thisId:null,eventIndex:0,isPast:!!t,isNextDay:!1,totalGap:0,isLinkedToLoaded:!1,isLoaded:!1,groupId:null,groupColour:void 0,groupEntries:void 0,isFirstAfterGroup:!1};function a(e){return n=A(n,t,e),n}return{metadata:n,process:a}}function A(t,n,a){var o,u;const e={...t};return e.isNextDay=!1,e.isLoaded=!1,e.previousEntryId=e.thisId,e.thisId=a.id,e.previousEvent=e.latestEvent,a.id===n&&(e.isLoaded=!0,e.isPast=!1,e.isLinkedToLoaded=!0),R(a)?(e.groupId=a.id,e.groupColour=a.colour,e.groupEntries=a.entries.length):(a.parent!==e.groupId&&(e.groupId=a.parent,e.groupEntries=void 0,a.parent===null&&(e.groupColour=void 0)),m(a)&&(e.eventIndex+=1,e.isFirstAfterGroup=!!((o=e.previousEvent)!=null&&o.parent)&&a.parent===null,I(a)&&(e.isNextDay=M(a,e.previousEvent),!e.isPast&&!e.isLoaded&&(e.totalGap+=a.gap,e.isLinkedToLoaded=a.linkStart&&!((u=e.previousEvent)!=null&&u.countToEnd)&&e.isLinkedToLoaded),O(a,e.latestEvent)&&(e.latestEvent=a)))),e}const T={id:"default",title:"",order:[],flatOrder:[],entries:{},revision:-1};function l(){const{data:t,status:n,isError:a,refetch:e,isFetching:o}=g({queryKey:E,queryFn:({signal:u})=>b({signal:u}),refetchInterval:h});return{data:t??T,status:n,isError:a,refetch:e,isFetching:o}}function at(){const{data:t,status:n}=l(),a=p(),e=c.useMemo(()=>v(t,a),[t,a]);return{data:t,status:n,rundownMetadata:e}}function rt(){const{data:t,status:n}=l();return{data:c.useMemo(()=>t.revision===-1?[]:t.flatOrder.map(e=>t.entries[e]).filter(e=>e!==void 0),[t]),rundownId:t.id,status:n}}function k(){const{data:t,status:n}=l(),a=p();return{data:c.useMemo(()=>L(t,a),[t,a]),status:n}}function st(t){const{data:n,status:a}=k();return{data:c.useMemo(()=>n.filter(t),[n,t]),status:a}}function ot(t){const{data:n}=l();return t===null?null:n.entries[t]??null}export{z as A,Q as B,nt as C,et as D,X as E,tt as F,Z as G,V as H,J as I,i as S,k as a,I as b,st as c,rt as d,O as e,S as f,N as g,W as h,m as i,R as j,C as k,B as l,_ as m,U as n,x as o,j as p,F as q,K as r,L as s,at as t,l as u,ot as v,G as w,D as x,H as y,Y as z};
2
+ //# sourceMappingURL=useRundown-C6stroSA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRundown-C6stroSA.js","sources":["../../../../packages/types/src/definitions/core/OntimeEntry.ts","../../../../packages/types/src/utils/guards.ts","../../../../packages/utils/src/date-utils/checkIsNextDay.ts","../../../../packages/utils/src/date-utils/isNewLatest.ts","../../src/common/api/rundown.ts","../../src/common/utils/rundownMetadata.ts","../../src/common/hooks-query/useRundown.ts"],"sourcesContent":["import type { MaybeNumber } from '../../utils/utils.type.js';\nimport type { EndAction } from '../EndAction.type.js';\nimport type { TimerType } from '../TimerType.type.js';\nimport type { TimeStrategy } from '../TimeStrategy.type.js';\nimport type { Trigger } from './Automation.type.js';\nimport type { EntryCustomFields } from './CustomFields.type.js';\nimport type { Day } from './Temporal.js';\n\nexport type EntryId = string;\n\nexport enum SupportedEntry {\n Event = 'event',\n Delay = 'delay',\n Group = 'group',\n Milestone = 'milestone',\n}\n\nexport type OntimeBaseEvent = {\n type: SupportedEntry;\n id: EntryId;\n};\n\nexport type OntimeDelay = OntimeBaseEvent & {\n type: SupportedEntry.Delay;\n duration: number;\n parent: EntryId | null;\n};\n\nexport type OntimeMilestone = OntimeBaseEvent & {\n type: SupportedEntry.Milestone;\n cue: string;\n title: string;\n note: string;\n colour: string;\n custom: EntryCustomFields;\n parent: EntryId | null;\n // !==== RUNTIME METADATA ====! //\n revision: number;\n};\n\nexport type OntimeGroup = OntimeBaseEvent & {\n type: SupportedEntry.Group;\n title: string;\n note: string;\n entries: EntryId[];\n targetDuration: MaybeNumber;\n colour: string;\n custom: EntryCustomFields;\n // !==== RUNTIME METADATA ====! //\n revision: number;\n timeStart: MaybeNumber; // calculated at runtime\n timeEnd: MaybeNumber; // calculated at runtime\n duration: number; // calculated at runtime\n isFirstLinked: boolean; // calculated at runtime, whether the first event is linked\n};\n\nexport type OntimeEvent = OntimeBaseEvent & {\n type: SupportedEntry.Event;\n flag: boolean;\n cue: string;\n title: string;\n note: string;\n endAction: EndAction;\n timerType: TimerType;\n countToEnd: boolean;\n linkStart: boolean;\n timeStrategy: TimeStrategy;\n timeStart: number;\n timeEnd: number;\n duration: number;\n skip: boolean;\n colour: string;\n timeWarning: number;\n timeDanger: number;\n custom: EntryCustomFields;\n triggers: Trigger[];\n parent: EntryId | null;\n // !==== RUNTIME METADATA ====! //\n revision: number;\n delay: number; // calculated at runtime\n dayOffset: Day; // calculated at runtime\n gap: number; // calculated at runtime\n};\n\nexport type PlayableEvent = OntimeEvent & { skip: false };\nexport type TimeField = 'timeStart' | 'timeEnd' | 'duration';\nexport type OntimeEntry = OntimeDelay | OntimeGroup | OntimeEvent | OntimeMilestone;\n\n// we need to create a manual union type since keys cannot be used in type unions\nexport type OntimeEntryCommonKeys = keyof OntimeEvent | keyof OntimeDelay | keyof OntimeGroup | keyof OntimeMilestone;\n","import type { AutomationOutput, HTTPOutput, OntimeAction, OSCOutput } from '../definitions/core/Automation.type.js';\nimport type {\n OntimeDelay,\n OntimeEntry,\n OntimeEvent,\n OntimeGroup,\n OntimeMilestone,\n PlayableEvent,\n} from '../definitions/core/OntimeEntry.js';\nimport { SupportedEntry } from '../definitions/core/OntimeEntry.js';\nimport { type TimerLifeCycle, timerLifecycleValues } from '../definitions/core/TimerLifecycle.type.js';\n\ntype MaybeEvent = OntimeEntry | Partial<OntimeEntry> | null | undefined;\n\nexport function isOntimeEvent(event: MaybeEvent): event is OntimeEvent {\n return event?.type === SupportedEntry.Event;\n}\n\nexport function isPlayableEvent(event: OntimeEvent): event is PlayableEvent {\n return !event.skip;\n}\n\nexport function isOntimeDelay(event: MaybeEvent): event is OntimeDelay {\n return event?.type === SupportedEntry.Delay;\n}\n\nexport function isOntimeGroup(event: MaybeEvent): event is OntimeGroup {\n return event?.type === SupportedEntry.Group;\n}\n\nexport function isOntimeMilestone(event: MaybeEvent): event is OntimeMilestone {\n return event?.type === SupportedEntry.Milestone;\n}\n\ntype AnyKeys<T> = keyof T;\n\nexport function isKeyOfType<T extends object>(key: PropertyKey, obj: T): key is AnyKeys<T> {\n return key in obj;\n}\n\nexport function isOSCOutput(output: AutomationOutput): output is OSCOutput {\n return output.type === 'osc';\n}\n\nexport function isHTTPOutput(output: AutomationOutput): output is HTTPOutput {\n return output.type === 'http';\n}\n\nexport function isOntimeAction(output: AutomationOutput): output is OntimeAction {\n return output.type === 'ontime';\n}\n\nexport function isTimerLifeCycle(maybeCycle: unknown): maybeCycle is TimerLifeCycle {\n if (typeof maybeCycle !== 'string') return false;\n return timerLifecycleValues.includes(maybeCycle);\n}\n","import type { OntimeEvent } from 'ontime-types';\n\nimport { dayInMs } from './conversionUtils.js';\n\n/**\n * Utility function checks whether a given event is the day after from its predecessor\n */\nexport function checkIsNextDay(\n current: Pick<OntimeEvent, 'timeStart' | 'dayOffset'>,\n previous: Pick<OntimeEvent, 'timeStart' | 'duration' | 'dayOffset'> | null,\n): boolean {\n if (!previous) {\n return false;\n }\n\n // if the day offsets are the same it can't be the next day\n if (current.dayOffset <= previous.dayOffset) {\n return false;\n }\n\n // if the previous event crossed midnight then the current is the same day\n if (previous.timeStart + previous.duration > dayInMs) {\n return false;\n }\n\n return true;\n}\n","import type { OntimeEvent } from 'ontime-types';\n\nimport { dayInMs } from './conversionUtils.js';\n\n/**\n * Checks whether a new element is the latest in the list\n */\nexport function isNewLatest(\n currentEvent: Pick<OntimeEvent, 'timeStart' | 'duration' | 'dayOffset'>,\n previousEvent: Pick<OntimeEvent, 'timeStart' | 'duration' | 'dayOffset'> | null,\n) {\n // true if there is no previous\n if (!previousEvent) {\n return true;\n }\n\n const normalisedCurrentEnd = currentEvent.timeStart + currentEvent.duration + currentEvent.dayOffset * dayInMs;\n const normalisedPreviousEnd = previousEvent.timeStart + previousEvent.duration + previousEvent.dayOffset * dayInMs;\n\n return normalisedCurrentEnd >= normalisedPreviousEnd;\n}\n","import axios, { AxiosResponse } from 'axios';\nimport { EntryId, OntimeEntry, OntimeEvent, ProjectRundownsList, Rundown, TransientEventPayload } from 'ontime-types';\n\nimport { apiEntryUrl } from './constants';\nimport type { RequestOptions } from './requestOptions';\n\ntype RundownId = string;\nconst rundownPath = `${apiEntryUrl}/rundowns`;\n\n// #region operations on project rundowns =========================\n\n/**\n * HTTP request to fetch a list of existing rundowns\n */\nexport async function fetchProjectRundownList(options?: RequestOptions): Promise<ProjectRundownsList> {\n const res = await axios.get(rundownPath, { signal: options?.signal });\n return res.data;\n}\n\n/**\n * HTTP request to fetch all entries in the currently loaded rundown\n */\nexport async function fetchCurrentRundown(options?: RequestOptions): Promise<Rundown> {\n const res = await axios.get(`${rundownPath}/current`, { signal: options?.signal });\n if (!isValidRundown(res.data)) {\n throw new Error('Invalid rundown payload');\n }\n return res.data;\n\n function isValidRundown(x: any): x is Rundown {\n return (\n x &&\n typeof x === 'object' &&\n typeof x.id === 'string' &&\n Array.isArray(x.order) &&\n Array.isArray(x.flatOrder) &&\n x.entries &&\n typeof x.entries === 'object' &&\n typeof x.revision === 'number'\n );\n }\n}\n\n/**\n * HTTP request to switch the currently loaded rundown\n */\nexport async function loadRundown(rundownId: RundownId): Promise<AxiosResponse<ProjectRundownsList>> {\n return axios.post(`${rundownPath}/${rundownId}/load`);\n}\n\n/**\n * HTTP request to create a new rundown\n */\nexport async function createRundown(title: string): Promise<AxiosResponse<ProjectRundownsList>> {\n return axios.post(rundownPath, { title });\n}\n\n/**\n * HTTP request to duplicate an existing rundown\n */\nexport async function duplicateRundown(rundownId: RundownId): Promise<AxiosResponse<ProjectRundownsList>> {\n return axios.post(`${rundownPath}/${rundownId}/duplicate`);\n}\n\n/**\n * HTTP request to rename an existing rundown\n */\nexport async function renameRundown(rundownId: RundownId, title: string): Promise<AxiosResponse<ProjectRundownsList>> {\n return axios.patch(`${rundownPath}/${rundownId}`, { title });\n}\n\n/**\n * HTTP request to delete a rundown\n */\nexport async function deleteRundown(rundownId: RundownId): Promise<AxiosResponse<ProjectRundownsList>> {\n return axios.delete(`${rundownPath}/${rundownId}`);\n}\n\n// #endregion operations on project rundowns ======================\n// #region operations on rundown entries ==========================\n\n/**\n * HTTP request to post new entry\n */\nexport async function postAddEntry(\n rundownId: RundownId,\n data: TransientEventPayload,\n): Promise<AxiosResponse<OntimeEntry>> {\n return axios.post(`${rundownPath}/${rundownId}/entry`, data);\n}\n\n/**\n * HTTP request to edit an entry\n */\nexport async function putEditEntry(\n rundownId: RundownId,\n data: Partial<OntimeEntry>,\n): Promise<AxiosResponse<OntimeEntry>> {\n return axios.put(`${rundownPath}/${rundownId}/entry`, data);\n}\n\nexport type BatchEditEntry = {\n data: Partial<OntimeEvent>;\n ids: EntryId[];\n};\n\n/**\n * HTTP request to edit multiple events\n */\nexport async function putBatchEditEvents(rundownId: RundownId, data: BatchEditEntry): Promise<AxiosResponse<Rundown>> {\n return axios.put(`${rundownPath}/${rundownId}/batch`, data);\n}\n\nexport type ReorderEntry = {\n entryId: EntryId;\n destinationId: EntryId;\n order: 'before' | 'after' | 'insert';\n};\n\n/**\n * HTTP request to reorder an entry\n */\nexport async function patchReorderEntry(rundownId: RundownId, data: ReorderEntry): Promise<AxiosResponse<Rundown>> {\n return axios.patch(`${rundownPath}/${rundownId}/reorder`, data);\n}\n\n/**\n * HTTP request to swap two events\n */\nexport async function requestEventSwap(\n rundownId: RundownId,\n from: EntryId,\n to: EntryId,\n): Promise<AxiosResponse<Rundown>> {\n return axios.patch(`${rundownPath}/${rundownId}/swap`, { from, to });\n}\n\n/**\n * HTTP request to request application of delay\n */\nexport async function requestApplyDelay(rundownId: RundownId, delayId: EntryId): Promise<AxiosResponse<Rundown>> {\n return axios.patch(`${rundownPath}/${rundownId}/applydelay/${delayId}`);\n}\n\n/**\n * HTTP request for cloning an entry\n */\nexport async function postCloneEntry(\n rundownId: RundownId,\n entryId: EntryId,\n options?: { before?: EntryId; after?: EntryId },\n): Promise<AxiosResponse<Rundown>> {\n return axios.post(`${rundownPath}/${rundownId}/clone/${entryId}`, options);\n}\n\n/**\n * HTTP request for grouping a list of entries into a group\n */\nexport async function requestGroupEntries(rundownId: RundownId, entryIds: EntryId[]): Promise<AxiosResponse<Rundown>> {\n return axios.post(`${rundownPath}/${rundownId}/group`, { ids: entryIds });\n}\n\n/**\n * HTTP request for dissolving of a group\n */\nexport async function requestUngroup(rundownId: RundownId, groupId: EntryId): Promise<AxiosResponse<Rundown>> {\n return axios.post(`${rundownPath}/${rundownId}/ungroup/${groupId}`);\n}\n\n/**\n * HTTP request to delete entries of a given rundown\n */\nexport async function deleteEntries(rundownId: RundownId, entryIds: EntryId[]): Promise<AxiosResponse<Rundown>> {\n return axios.delete(`${rundownPath}/${rundownId}/entries`, { data: { ids: entryIds } });\n}\n\n/**\n * HTTP request to delete all entries of a given rundown\n */\nexport async function requestDeleteAll(rundownId: RundownId): Promise<AxiosResponse<Rundown>> {\n return axios.delete(`${rundownPath}/${rundownId}/all`);\n}\n\n// #endregion operations on rundown entries =======================\n","import {\n isOntimeEvent,\n isOntimeGroup,\n isPlayableEvent,\n MaybeString,\n OntimeDelay,\n OntimeEntry,\n OntimeEvent,\n OntimeMilestone,\n PlayableEvent,\n Rundown,\n} from 'ontime-types';\nimport { checkIsNextDay, isNewLatest } from 'ontime-utils';\n\nexport type RundownMetadata = {\n previousEvent: PlayableEvent | null; // The playableEvent from the previous iteration, used by indicators\n latestEvent: PlayableEvent | null; // The playableEvent most forwards in time processed so far\n previousEntryId: MaybeString; // previous entry is used to infer position in the rundown for new events\n thisId: MaybeString;\n eventIndex: number;\n isPast: boolean;\n isNextDay: boolean;\n totalGap: number;\n isLinkedToLoaded: boolean; // check if the event can link all the way back to the currently playing event\n isLoaded: boolean;\n groupId: MaybeString;\n groupColour: string | undefined;\n groupEntries: number | undefined;\n isFirstAfterGroup: boolean;\n};\n\nexport type ExtendedEntry<T extends OntimeEntry = OntimeEntry> = T & RundownMetadata;\n\nexport const lastMetadataKey = 'LAST';\n\nexport type RundownMetadataObject = Record<string, Readonly<RundownMetadata>>;\n\n/**\n * Generates a Rundown Metadata object from a rundown\n */\nexport function getRundownMetadata(\n data: Pick<Rundown, 'entries' | 'flatOrder'>,\n selectedEventId: MaybeString,\n): RundownMetadataObject {\n const { metadata, process } = initRundownMetadata(selectedEventId);\n // keep a single reference to the metadata which we override for every entry\n let lastSnapshot = metadata;\n const rundownMetadata: RundownMetadataObject = {};\n\n for (const id of data.flatOrder) {\n const entry = data.entries[id];\n lastSnapshot = process(entry);\n rundownMetadata[id] = lastSnapshot;\n }\n\n // ensure some blank data even for empty rundowns\n rundownMetadata[lastMetadataKey] = lastSnapshot;\n\n return rundownMetadata;\n}\n\nexport function getFlatRundownMetadata(\n data: Pick<Rundown, 'entries' | 'flatOrder'>,\n selectedEventId: MaybeString,\n): ExtendedEntry[] {\n const { process } = initRundownMetadata(selectedEventId);\n const flatRundown: ExtendedEntry[] = [];\n\n for (const id of data.flatOrder) {\n const entry = data.entries[id];\n const extendedEntry = { ...entry, ...process(entry) };\n flatRundown.push(extendedEntry);\n }\n\n return flatRundown;\n}\n\n/**\n * Creates a process function which aggregates the rundown metadata and event metadata\n */\nexport function initRundownMetadata(selectedEventId: MaybeString) {\n let rundownMeta: RundownMetadata = {\n previousEvent: null,\n latestEvent: null,\n previousEntryId: null,\n thisId: null,\n eventIndex: 0,\n isPast: Boolean(selectedEventId), // all events before the current selected are in the past\n isNextDay: false,\n totalGap: 0,\n isLinkedToLoaded: false,\n isLoaded: false,\n groupId: null,\n groupColour: undefined,\n groupEntries: undefined,\n isFirstAfterGroup: false,\n };\n\n function process(entry: OntimeEntry): Readonly<RundownMetadata> {\n const processedRundownMetadata = processEntry(rundownMeta, selectedEventId, entry);\n rundownMeta = processedRundownMetadata;\n return rundownMeta;\n }\n\n return { metadata: rundownMeta, process };\n}\n\n/**\n * Receives a rundown entry and processes its place in the rundown\n */\nfunction processEntry(\n rundownMetadata: RundownMetadata,\n selectedEventId: MaybeString,\n entry: Readonly<OntimeEntry>,\n): Readonly<RundownMetadata> {\n const processedData = { ...rundownMetadata };\n // initialise data to be overridden below\n processedData.isNextDay = false;\n processedData.isLoaded = false;\n\n processedData.previousEntryId = processedData.thisId; // thisId comes from the previous iteration\n processedData.thisId = entry.id; // we reassign thisId\n processedData.previousEvent = processedData.latestEvent;\n\n if (entry.id === selectedEventId) {\n processedData.isLoaded = true;\n processedData.isPast = false;\n processedData.isLinkedToLoaded = true;\n }\n\n if (isOntimeGroup(entry)) {\n processedData.groupId = entry.id;\n processedData.groupColour = entry.colour;\n processedData.groupEntries = entry.entries.length;\n } else {\n // for delays and groups, we insert the group metadata\n if ((entry as OntimeEvent | OntimeDelay | OntimeMilestone).parent !== processedData.groupId) {\n // if the parent is not the current group, we need to update the groupId\n processedData.groupId = (entry as OntimeEvent | OntimeDelay | OntimeMilestone).parent;\n processedData.groupEntries = undefined;\n if ((entry as OntimeEvent | OntimeDelay | OntimeMilestone).parent === null) {\n // if the entry has no parent, it cannot have a group colour\n processedData.groupColour = undefined;\n }\n }\n\n if (isOntimeEvent(entry)) {\n // event indexes are 1 based in UI\n processedData.eventIndex += 1;\n processedData.isFirstAfterGroup = Boolean(processedData.previousEvent?.parent) && entry.parent === null;\n\n if (isPlayableEvent(entry)) {\n processedData.isNextDay = checkIsNextDay(entry, processedData.previousEvent);\n \n if (!processedData.isPast && !processedData.isLoaded) {\n /**\n * isLinkToLoaded is a chain value that we maintain until we\n * a) find an unlinked event\n * b) find a countToEnd event\n */\n processedData.totalGap += entry.gap;\n processedData.isLinkedToLoaded =\n entry.linkStart && !processedData.previousEvent?.countToEnd && processedData.isLinkedToLoaded;\n }\n\n if (isNewLatest(entry, processedData.latestEvent)) {\n // this event is the forward most event in rundown, for next iteration\n processedData.latestEvent = entry;\n }\n }\n }\n }\n\n return processedData;\n}\n","import { useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { EntryId, OntimeEntry, Rundown } from 'ontime-types';\n\nimport { queryRefetchIntervalSlow } from '../../ontimeConfig';\nimport { RUNDOWN } from '../api/constants';\nimport { fetchCurrentRundown } from '../api/rundown';\nimport { useSelectedEventId } from '../hooks/useSocket';\nimport { ExtendedEntry, getFlatRundownMetadata, getRundownMetadata } from '../utils/rundownMetadata';\n\n// revision is -1 so that the remote revision is higher\nconst cachedRundownPlaceholder: Rundown = {\n id: 'default',\n title: '',\n order: [],\n flatOrder: [],\n entries: {},\n revision: -1,\n};\n\n/**\n * Normalised rundown data\n */\nexport default function useRundown() {\n const { data, status, isError, refetch, isFetching } = useQuery<Rundown>({\n queryKey: RUNDOWN,\n queryFn: ({ signal }) => fetchCurrentRundown({ signal }),\n refetchInterval: queryRefetchIntervalSlow,\n });\n\n return { data: data ?? cachedRundownPlaceholder, status, isError, refetch, isFetching };\n}\n\nexport function useRundownWithMetadata() {\n const { data, status } = useRundown();\n const selectedEventId = useSelectedEventId();\n const rundownMetadata = useMemo(() => getRundownMetadata(data, selectedEventId), [data, selectedEventId]);\n return { data, status, rundownMetadata };\n}\n\n/**\n * Provides access to a flat rundown\n * built from the order and rundown fields\n */\nexport function useFlatRundown() {\n const { data, status } = useRundown();\n\n const flatRundown = useMemo(() => {\n if (data.revision === -1) {\n return [];\n }\n return data.flatOrder.map((id) => data.entries[id]).filter((entry): entry is OntimeEntry => entry !== undefined);\n }, [data]);\n\n return { data: flatRundown, rundownId: data.id, status };\n}\n\nexport function useFlatRundownWithMetadata() {\n const { data, status } = useRundown();\n const selectedEventId = useSelectedEventId();\n\n const rundownWithMetadata = useMemo(() => getFlatRundownMetadata(data, selectedEventId), [data, selectedEventId]);\n return { data: rundownWithMetadata, status };\n}\n\n/**\n * Provides access to a partial rundown based on a filter callback\n *\n * Callers MUST memoize the callback with useCallback to prevent\n * re-filtering on every render.\n *\n */\nexport function usePartialRundown(cb: (event: ExtendedEntry<OntimeEntry>) => boolean) {\n const { data, status } = useFlatRundownWithMetadata();\n const filteredData = useMemo(() => {\n return data.filter(cb);\n }, [data, cb]);\n\n return { data: filteredData, status };\n}\n\n/**\n * Hook to get a specific entry by ID from the rundown\n */\nexport function useEntry(entryId: EntryId | null): OntimeEntry | null {\n const { data: rundown } = useRundown();\n\n if (entryId === null) return null;\n return rundown.entries[entryId] ?? null;\n}\n"],"names":["SupportedEntry","Event","Delay","Group","Milestone","isOntimeEvent","event","type","isPlayableEvent","skip","isOntimeDelay","isOntimeGroup","isOntimeMilestone","isKeyOfType","key","obj","isOSCOutput","output","isHTTPOutput","isOntimeAction","checkIsNextDay","current","previous","dayOffset","timeStart","duration","dayInMs","isNewLatest","currentEvent","previousEvent","normalisedCurrentEnd","normalisedPreviousEnd","rundownPath","apiEntryUrl","fetchProjectRundownList","options","axios","get","signal","data","fetchCurrentRundown","res","isValidRundown","Error","x","id","Array","isArray","order","flatOrder","entries","revision","loadRundown","rundownId","post","createRundown","title","duplicateRundown","renameRundown","patch","deleteRundown","delete","postAddEntry","putEditEntry","put","putBatchEditEvents","patchReorderEntry","requestEventSwap","from","to","requestApplyDelay","delayId","postCloneEntry","entryId","requestGroupEntries","entryIds","ids","requestUngroup","groupId","deleteEntries","requestDeleteAll","lastMetadataKey","getRundownMetadata","selectedEventId","metadata","process","initRundownMetadata","lastSnapshot","rundownMetadata","entry","getFlatRundownMetadata","flatRundown","extendedEntry","push","rundownMeta","latestEvent","previousEntryId","thisId","eventIndex","isPast","Boolean","isNextDay","totalGap","isLinkedToLoaded","isLoaded","groupColour","undefined","groupEntries","isFirstAfterGroup","processedRundownMetadata","processEntry","processedData","colour","length","parent","gap","linkStart","countToEnd","cachedRundownPlaceholder","useRundown","status","isError","refetch","isFetching","useQuery","queryKey","RUNDOWN","queryFn","refetchInterval","queryRefetchIntervalSlow","useRundownWithMetadata","useSelectedEventId","useMemo","useFlatRundown","map","filter","useFlatRundownWithMetadata","usePartialRundown","cb","useEntry","rundown"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{l as p,h as o,aG as g}from"./vendor-CKDP5hij.js";import{l as d}from"./useEventSelection-B9mbj1cM.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="cc9c16be-c9a7-4ef4-a2fc-bec22b96d206",e._sentryDebugIdIdentifier="sentry-dbid-cc9c16be-c9a7-4ef4-a2fc-bec22b96d206")}catch{}})();function m(e,t){return Object.values(e).includes(t)}const i="settings";function E(){const[e,t]=p(),n=o.useMemo(()=>e.get(i)??"project",[e]),c=o.useMemo(()=>!!e.get(i),[e]),[s,r]=n.split("__"),u=o.useCallback(()=>{e.delete(i),t(e)},[e,t]),a=o.useCallback(l=>{e.set(i,l),t(e)},[e,t]);return{isOpen:c,panel:s,location:r,setLocation:a,close:u}}const f="layout";var b=(e=>(e.CONTROL="control",e.PLANNING="planning",e.TRACKING="tracking",e))(b||{});function S(e){return m(b,e)?e:"control"}function G(){const[e,t]=p();return{layoutMode:S(e.get(f)),setLayoutMode:s=>{const r=new URLSearchParams(e);r.set(f,s),t(r,{replace:!0})}}}function h(e){const[t,n]=g({key:`rundown.${e}-editor-collapsed-groups`,defaultValue:[]}),c=o.useMemo(()=>new Set(t),[t]),s=o.useCallback(a=>c.has(a),[c]),r=o.useCallback(a=>{a&&n(l=>l.includes(a)?l:[...l,a])},[n]),u=o.useCallback(a=>{a&&n(l=>l.filter(y=>y!==a))},[n]);return{getIsCollapsed:s,collapseGroup:r,expandGroup:u}}function P(e){const{expandGroup:t}=h(e),n=d(s=>s.setSelectedEvents),c=d(s=>s.scrollToEntry);return o.useCallback(({id:s,index:r,parent:u})=>{t(u),n({id:s,index:r,selectMode:"click"}),requestAnimationFrame(()=>{c(s)})},[t,c,n])}export{b as E,G as a,P as b,h as c,E as u};
2
- //# sourceMappingURL=useSelectAndRevealEntry-Dd6MpVHe.js.map
1
+ import{l as p,h as o,aG as g}from"./vendor-Dt3_Fdfs.js";import{l as d}from"./useEventSelection-Cvdw9all.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="cc9c16be-c9a7-4ef4-a2fc-bec22b96d206",e._sentryDebugIdIdentifier="sentry-dbid-cc9c16be-c9a7-4ef4-a2fc-bec22b96d206")}catch{}})();function m(e,t){return Object.values(e).includes(t)}const i="settings";function E(){const[e,t]=p(),n=o.useMemo(()=>e.get(i)??"project",[e]),c=o.useMemo(()=>!!e.get(i),[e]),[s,r]=n.split("__"),u=o.useCallback(()=>{e.delete(i),t(e)},[e,t]),a=o.useCallback(l=>{e.set(i,l),t(e)},[e,t]);return{isOpen:c,panel:s,location:r,setLocation:a,close:u}}const f="layout";var b=(e=>(e.CONTROL="control",e.PLANNING="planning",e.TRACKING="tracking",e))(b||{});function S(e){return m(b,e)?e:"control"}function G(){const[e,t]=p();return{layoutMode:S(e.get(f)),setLayoutMode:s=>{const r=new URLSearchParams(e);r.set(f,s),t(r,{replace:!0})}}}function h(e){const[t,n]=g({key:`rundown.${e}-editor-collapsed-groups`,defaultValue:[]}),c=o.useMemo(()=>new Set(t),[t]),s=o.useCallback(a=>c.has(a),[c]),r=o.useCallback(a=>{a&&n(l=>l.includes(a)?l:[...l,a])},[n]),u=o.useCallback(a=>{a&&n(l=>l.filter(y=>y!==a))},[n]);return{getIsCollapsed:s,collapseGroup:r,expandGroup:u}}function P(e){const{expandGroup:t}=h(e),n=d(s=>s.setSelectedEvents),c=d(s=>s.scrollToEntry);return o.useCallback(({id:s,index:r,parent:u})=>{t(u),n({id:s,index:r,selectMode:"click"}),requestAnimationFrame(()=>{c(s)})},[t,c,n])}export{b as E,G as a,P as b,h as c,E as u};
2
+ //# sourceMappingURL=useSelectAndRevealEntry-D79sYFHr.js.map