@getontime/cli 4.0.0-beta.5 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/client/assets/Backstage-CAjkmeJm.js +2 -0
  2. package/client/assets/Backstage-CAjkmeJm.js.br +0 -0
  3. package/client/assets/Backstage-CAjkmeJm.js.gz +0 -0
  4. package/client/assets/Backstage-CAjkmeJm.js.map +1 -0
  5. package/client/assets/Countdown-ChuA9az_.js +2 -0
  6. package/client/assets/Countdown-ChuA9az_.js.br +0 -0
  7. package/client/assets/Countdown-ChuA9az_.js.gz +0 -0
  8. package/client/assets/{Countdown-BaaR4j9x.js.map → Countdown-ChuA9az_.js.map} +1 -1
  9. package/client/assets/CustomTranslationModal-C3R_2T5s.js +2 -0
  10. package/client/assets/CustomTranslationModal-C3R_2T5s.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-C3R_2T5s.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-CcNNjbmZ.js.map → CustomTranslationModal-C3R_2T5s.js.map} +1 -1
  13. package/client/assets/{DelayIndicator-DXDACqpc.js → DelayIndicator-vT7n8ypf.js} +2 -2
  14. package/client/assets/DelayIndicator-vT7n8ypf.js.br +0 -0
  15. package/client/assets/DelayIndicator-vT7n8ypf.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-DXDACqpc.js.map → DelayIndicator-vT7n8ypf.js.map} +1 -1
  17. package/client/assets/{EditorFeatureWrapper-CX6wzTmM.js → EditorFeatureWrapper-DHfuO3EA.js} +2 -2
  18. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-CX6wzTmM.js.map → EditorFeatureWrapper-DHfuO3EA.js.map} +1 -1
  21. package/client/assets/{EditorUtils-DxjFOwpn.js → EditorUtils-Da5ALK1P.js} +2 -2
  22. package/client/assets/EditorUtils-Da5ALK1P.js.br +0 -0
  23. package/client/assets/EditorUtils-Da5ALK1P.js.gz +0 -0
  24. package/client/assets/{EditorUtils-DxjFOwpn.js.map → EditorUtils-Da5ALK1P.js.map} +1 -1
  25. package/client/assets/{Empty-DiBXyIA8.js → Empty-gWT_HMeu.js} +2 -2
  26. package/client/assets/Empty-gWT_HMeu.js.br +0 -0
  27. package/client/assets/Empty-gWT_HMeu.js.gz +0 -0
  28. package/client/assets/{Empty-DiBXyIA8.js.map → Empty-gWT_HMeu.js.map} +1 -1
  29. package/client/assets/{EmptyPage-X6EO1Y5W.js → EmptyPage-Dcbg6rmF.js} +2 -2
  30. package/client/assets/EmptyPage-Dcbg6rmF.js.br +0 -0
  31. package/client/assets/EmptyPage-Dcbg6rmF.js.gz +0 -0
  32. package/client/assets/{EmptyPage-X6EO1Y5W.js.map → EmptyPage-Dcbg6rmF.js.map} +1 -1
  33. package/client/assets/{FollowButton-Cr-HA2-6.js → FollowButton-CSqJSvix.js} +2 -2
  34. package/client/assets/FollowButton-CSqJSvix.js.br +0 -0
  35. package/client/assets/FollowButton-CSqJSvix.js.gz +0 -0
  36. package/client/assets/{FollowButton-Cr-HA2-6.js.map → FollowButton-CSqJSvix.js.map} +1 -1
  37. package/client/assets/{MessageControlExport-VUkIayAJ.js → MessageControlExport-lXK21piH.js} +2 -2
  38. package/client/assets/MessageControlExport-lXK21piH.js.br +0 -0
  39. package/client/assets/MessageControlExport-lXK21piH.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-VUkIayAJ.js.map → MessageControlExport-lXK21piH.js.map} +1 -1
  41. package/client/assets/MilestoneEditor-Bge8xLrV.js +2 -0
  42. package/client/assets/MilestoneEditor-Bge8xLrV.js.br +0 -0
  43. package/client/assets/MilestoneEditor-Bge8xLrV.js.gz +0 -0
  44. package/client/assets/{MilestoneEditor-Da8oxrHI.js.map → MilestoneEditor-Bge8xLrV.js.map} +1 -1
  45. package/client/assets/Modal-BgJx3SNK.css +1 -0
  46. package/client/assets/Modal-BgJx3SNK.css.br +0 -0
  47. package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
  48. package/client/assets/Modal-C2sFA0zf.js +2 -0
  49. package/client/assets/Modal-C2sFA0zf.js.br +0 -0
  50. package/client/assets/Modal-C2sFA0zf.js.gz +0 -0
  51. package/client/assets/Modal-C2sFA0zf.js.map +1 -0
  52. package/client/assets/{MultiPartProgressBar-mGPuP1Wd.js → MultiPartProgressBar-D3jJZjb5.js} +2 -2
  53. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.br +0 -0
  54. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.gz +0 -0
  55. package/client/assets/{MultiPartProgressBar-mGPuP1Wd.js.map → MultiPartProgressBar-D3jJZjb5.js.map} +1 -1
  56. package/client/assets/OperatorExport-BUhxjLUx.js +2 -0
  57. package/client/assets/OperatorExport-BUhxjLUx.js.br +0 -0
  58. package/client/assets/OperatorExport-BUhxjLUx.js.gz +0 -0
  59. package/client/assets/OperatorExport-BUhxjLUx.js.map +1 -0
  60. package/client/assets/{OverviewWrapper-BMuW_wiO.js → OverviewWrapper-BveJ6GjK.js} +2 -2
  61. package/client/assets/OverviewWrapper-BveJ6GjK.js.br +0 -0
  62. package/client/assets/OverviewWrapper-BveJ6GjK.js.gz +0 -0
  63. package/client/assets/{OverviewWrapper-BMuW_wiO.js.map → OverviewWrapper-BveJ6GjK.js.map} +1 -1
  64. package/client/assets/{ProjectInfo-BYi1lzPk.js → ProjectInfo-z4k3cipS.js} +2 -2
  65. package/client/assets/ProjectInfo-z4k3cipS.js.br +0 -0
  66. package/client/assets/ProjectInfo-z4k3cipS.js.gz +0 -0
  67. package/client/assets/{ProjectInfo-BYi1lzPk.js.map → ProjectInfo-z4k3cipS.js.map} +1 -1
  68. package/client/assets/{ProtectRoute-DnUCrlh6.js → ProtectRoute-CrcWfOlG.js} +2 -2
  69. package/client/assets/ProtectRoute-CrcWfOlG.js.br +0 -0
  70. package/client/assets/ProtectRoute-CrcWfOlG.js.gz +0 -0
  71. package/client/assets/{ProtectRoute-DnUCrlh6.js.map → ProtectRoute-CrcWfOlG.js.map} +1 -1
  72. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js +2 -0
  73. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.br +0 -0
  74. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.gz +0 -0
  75. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.map +1 -0
  76. package/client/assets/ProtectedEditor-BoiAT_IR.css +1 -0
  77. package/client/assets/ProtectedEditor-BoiAT_IR.css.br +0 -0
  78. package/client/assets/ProtectedEditor-BoiAT_IR.css.gz +0 -0
  79. package/client/assets/ProtectedEditor-C_SYWpL2.js +3 -0
  80. package/client/assets/ProtectedEditor-C_SYWpL2.js.br +0 -0
  81. package/client/assets/ProtectedEditor-C_SYWpL2.js.gz +0 -0
  82. package/client/assets/ProtectedEditor-C_SYWpL2.js.map +1 -0
  83. package/client/assets/RundownEntry-D61IqkXb.js +2 -0
  84. package/client/assets/RundownEntry-D61IqkXb.js.br +0 -0
  85. package/client/assets/RundownEntry-D61IqkXb.js.gz +0 -0
  86. package/client/assets/{RundownEntry-Dl4Cb_pZ.js.map → RundownEntry-D61IqkXb.js.map} +1 -1
  87. package/client/assets/RundownExport-1zBZurIG.css +1 -0
  88. package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
  89. package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
  90. package/client/assets/RundownExport-C6YhMGOC.js +3 -0
  91. package/client/assets/RundownExport-C6YhMGOC.js.br +0 -0
  92. package/client/assets/RundownExport-C6YhMGOC.js.gz +0 -0
  93. package/client/assets/{RundownExport-BPDLhvsM.js.map → RundownExport-C6YhMGOC.js.map} +1 -1
  94. package/client/assets/{Select-CUjlJirY.js → Select-CedN80WS.js} +2 -2
  95. package/client/assets/Select-CedN80WS.js.br +0 -0
  96. package/client/assets/Select-CedN80WS.js.gz +0 -0
  97. package/client/assets/{Select-CUjlJirY.js.map → Select-CedN80WS.js.map} +1 -1
  98. package/client/assets/Studio-DUzPBS6P.js +2 -0
  99. package/client/assets/Studio-DUzPBS6P.js.br +0 -0
  100. package/client/assets/Studio-DUzPBS6P.js.gz +0 -0
  101. package/client/assets/{Studio-BLCIas53.js.map → Studio-DUzPBS6P.js.map} +1 -1
  102. package/client/assets/{StyleEditor-DTNiR-0P.js → StyleEditor-D2z65PB7.js} +2 -2
  103. package/client/assets/StyleEditor-D2z65PB7.js.br +0 -0
  104. package/client/assets/StyleEditor-D2z65PB7.js.gz +0 -0
  105. package/client/assets/{StyleEditor-DTNiR-0P.js.map → StyleEditor-D2z65PB7.js.map} +1 -1
  106. package/client/assets/SuperscriptTime-CIrcMcyg.js +2 -0
  107. package/client/assets/SuperscriptTime-CIrcMcyg.js.br +0 -0
  108. package/client/assets/SuperscriptTime-CIrcMcyg.js.gz +0 -0
  109. package/client/assets/SuperscriptTime-CIrcMcyg.js.map +1 -0
  110. package/client/assets/TimeElements-CALNfv6u.js +2 -0
  111. package/client/assets/TimeElements-CALNfv6u.js.br +0 -0
  112. package/client/assets/TimeElements-CALNfv6u.js.gz +0 -0
  113. package/client/assets/{TimeElements-rlwX9Mgy.js.map → TimeElements-CALNfv6u.js.map} +1 -1
  114. package/client/assets/{TimeInput-C0_Nl63x.js → TimeInput-Dg1naiy3.js} +2 -2
  115. package/client/assets/TimeInput-Dg1naiy3.js.br +0 -0
  116. package/client/assets/TimeInput-Dg1naiy3.js.gz +0 -0
  117. package/client/assets/{TimeInput-C0_Nl63x.js.map → TimeInput-Dg1naiy3.js.map} +1 -1
  118. package/client/assets/TimelinePage-Cwm0svjN.js +2 -0
  119. package/client/assets/TimelinePage-Cwm0svjN.js.br +0 -0
  120. package/client/assets/TimelinePage-Cwm0svjN.js.gz +0 -0
  121. package/client/assets/{TimelinePage-BC-pnISF.js.map → TimelinePage-Cwm0svjN.js.map} +1 -1
  122. package/client/assets/Timer-BVXskRjc.js +2 -0
  123. package/client/assets/Timer-BVXskRjc.js.br +0 -0
  124. package/client/assets/Timer-BVXskRjc.js.gz +0 -0
  125. package/client/assets/Timer-BVXskRjc.js.map +1 -0
  126. package/client/assets/Timer-BvEmZbmF.css +1 -0
  127. package/client/assets/Timer-BvEmZbmF.css.br +0 -0
  128. package/client/assets/Timer-BvEmZbmF.css.gz +0 -0
  129. package/client/assets/{TimerControlExport-C_Jbwxog.js → TimerControlExport-C8ECtLBd.js} +2 -2
  130. package/client/assets/TimerControlExport-C8ECtLBd.js.br +0 -0
  131. package/client/assets/TimerControlExport-C8ECtLBd.js.gz +0 -0
  132. package/client/assets/{TimerControlExport-C_Jbwxog.js.map → TimerControlExport-C8ECtLBd.js.map} +1 -1
  133. package/client/assets/{TitleCard-C-Tw72nZ.js → TitleCard-CZl9wSHS.js} +2 -2
  134. package/client/assets/TitleCard-CZl9wSHS.js.br +0 -0
  135. package/client/assets/TitleCard-CZl9wSHS.js.gz +0 -0
  136. package/client/assets/{TitleCard-C-Tw72nZ.js.map → TitleCard-CZl9wSHS.js.map} +1 -1
  137. package/client/assets/{Tooltip-BZrLdTBU.js → Tooltip-D9XRnwOW.js} +2 -2
  138. package/client/assets/Tooltip-D9XRnwOW.js.br +4 -0
  139. package/client/assets/Tooltip-D9XRnwOW.js.gz +0 -0
  140. package/client/assets/{Tooltip-BZrLdTBU.js.map → Tooltip-D9XRnwOW.js.map} +1 -1
  141. package/client/assets/{ViewLogo-CdsW41HC.js → ViewLogo-_3Z1hIHi.js} +2 -2
  142. package/client/assets/ViewLogo-_3Z1hIHi.js.br +0 -0
  143. package/client/assets/ViewLogo-_3Z1hIHi.js.gz +0 -0
  144. package/client/assets/{ViewLogo-CdsW41HC.js.map → ViewLogo-_3Z1hIHi.js.map} +1 -1
  145. package/client/assets/{ViewParamsEditor-kNKEOAwm.css → ViewParamsEditor-1Ok39npF.css} +1 -1
  146. package/client/assets/ViewParamsEditor-1Ok39npF.css.br +0 -0
  147. package/client/assets/ViewParamsEditor-1Ok39npF.css.gz +0 -0
  148. package/client/assets/{ViewParamsEditor-YoYxps2g.js → ViewParamsEditor-Bca1TIDW.js} +2 -2
  149. package/client/assets/ViewParamsEditor-Bca1TIDW.js.br +0 -0
  150. package/client/assets/ViewParamsEditor-Bca1TIDW.js.gz +0 -0
  151. package/client/assets/{ViewParamsEditor-YoYxps2g.js.map → ViewParamsEditor-Bca1TIDW.js.map} +1 -1
  152. package/client/assets/{dateConfig-CqC6Ta_8.js → dateConfig-DRQGMWDF.js} +2 -2
  153. package/client/assets/dateConfig-DRQGMWDF.js.br +0 -0
  154. package/client/assets/dateConfig-DRQGMWDF.js.gz +0 -0
  155. package/client/assets/{dateConfig-CqC6Ta_8.js.map → dateConfig-DRQGMWDF.js.map} +1 -1
  156. package/client/assets/{editorSettings-CL1TjKzU.js → editorSettings-BU0pTMSY.js} +2 -2
  157. package/client/assets/editorSettings-BU0pTMSY.js.br +0 -0
  158. package/client/assets/editorSettings-BU0pTMSY.js.gz +0 -0
  159. package/client/assets/{editorSettings-CL1TjKzU.js.map → editorSettings-BU0pTMSY.js.map} +1 -1
  160. package/client/assets/{getProgress-Dh-Yy44B.js → getProgress-Cw79NL_O.js} +2 -2
  161. package/client/assets/getProgress-Cw79NL_O.js.br +0 -0
  162. package/client/assets/getProgress-Cw79NL_O.js.gz +0 -0
  163. package/client/assets/{getProgress-Dh-Yy44B.js.map → getProgress-Cw79NL_O.js.map} +1 -1
  164. package/client/assets/index-BQEUaoAf.js +3 -0
  165. package/client/assets/index-BQEUaoAf.js.br +0 -0
  166. package/client/assets/index-BQEUaoAf.js.gz +0 -0
  167. package/client/assets/index-BQEUaoAf.js.map +1 -0
  168. package/client/assets/{index-pvMSlFrO.css → index-De0uf0Ta.css} +1 -1
  169. package/client/assets/index-De0uf0Ta.css.br +0 -0
  170. package/client/assets/index-De0uf0Ta.css.gz +0 -0
  171. package/client/assets/{offset-BnfjZ6JI.js → offset-DJAHqjFW.js} +2 -2
  172. package/client/assets/offset-DJAHqjFW.js.br +0 -0
  173. package/client/assets/offset-DJAHqjFW.js.gz +0 -0
  174. package/client/assets/{offset-BnfjZ6JI.js.map → offset-DJAHqjFW.js.map} +1 -1
  175. package/client/assets/{parseUserTime-DNXIMX9s.js → parseUserTime-BeTKj08M.js} +2 -2
  176. package/client/assets/parseUserTime-BeTKj08M.js.br +0 -0
  177. package/client/assets/parseUserTime-BeTKj08M.js.gz +0 -0
  178. package/client/assets/{parseUserTime-DNXIMX9s.js.map → parseUserTime-BeTKj08M.js.map} +1 -1
  179. package/client/assets/{playbackstate-DzSEaiNW.js → playbackstate-B_khF6xU.js} +2 -2
  180. package/client/assets/playbackstate-B_khF6xU.js.br +0 -0
  181. package/client/assets/playbackstate-B_khF6xU.js.gz +0 -0
  182. package/client/assets/{playbackstate-DzSEaiNW.js.map → playbackstate-B_khF6xU.js.map} +1 -1
  183. package/client/assets/{presentation.utils-BfcniGcl.js → presentation.utils-KwY-ACf7.js} +2 -2
  184. package/client/assets/presentation.utils-KwY-ACf7.js.br +0 -0
  185. package/client/assets/presentation.utils-KwY-ACf7.js.gz +0 -0
  186. package/client/assets/{presentation.utils-BfcniGcl.js.map → presentation.utils-KwY-ACf7.js.map} +1 -1
  187. package/client/assets/{rundownUtils-CPBsEZ2m.js → rundownUtils-BZHazkXR.js} +2 -2
  188. package/client/assets/rundownUtils-BZHazkXR.js.br +0 -0
  189. package/client/assets/rundownUtils-BZHazkXR.js.gz +0 -0
  190. package/client/assets/{rundownUtils-CPBsEZ2m.js.map → rundownUtils-BZHazkXR.js.map} +1 -1
  191. package/client/assets/{useCustomFields-DY13Ir96.js → useCustomFields-DqCYz8Kt.js} +2 -2
  192. package/client/assets/useCustomFields-DqCYz8Kt.js.br +0 -0
  193. package/client/assets/useCustomFields-DqCYz8Kt.js.gz +0 -0
  194. package/client/assets/{useCustomFields-DY13Ir96.js.map → useCustomFields-DqCYz8Kt.js.map} +1 -1
  195. package/client/assets/{useFollowComponent-C42-1XCu.js → useFollowComponent-Ctfhf2or.js} +2 -2
  196. package/client/assets/useFollowComponent-Ctfhf2or.js.br +0 -0
  197. package/client/assets/useFollowComponent-Ctfhf2or.js.gz +0 -0
  198. package/client/assets/{useFollowComponent-C42-1XCu.js.map → useFollowComponent-Ctfhf2or.js.map} +1 -1
  199. package/client/assets/{useProjectData-BF2F6qPB.js → useProjectData-C1hVamxc.js} +2 -2
  200. package/client/assets/useProjectData-C1hVamxc.js.br +0 -0
  201. package/client/assets/useProjectData-C1hVamxc.js.gz +0 -0
  202. package/client/assets/{useProjectData-BF2F6qPB.js.map → useProjectData-C1hVamxc.js.map} +1 -1
  203. package/client/assets/useReport-B4dMYcNL.js +2 -0
  204. package/client/assets/useReport-B4dMYcNL.js.br +0 -0
  205. package/client/assets/useReport-B4dMYcNL.js.gz +0 -0
  206. package/client/assets/{useReport-DPqY9XXp.js.map → useReport-B4dMYcNL.js.map} +1 -1
  207. package/client/assets/useRundown-BfpjcCEJ.js +2 -0
  208. package/client/assets/useRundown-BfpjcCEJ.js.br +0 -0
  209. package/client/assets/useRundown-BfpjcCEJ.js.gz +0 -0
  210. package/client/assets/{useRundown-uuXixjnX.js.map → useRundown-BfpjcCEJ.js.map} +1 -1
  211. package/client/assets/{useWindowTitle-BQ1kqXfk.js → useWindowTitle-DqdFTWns.js} +2 -2
  212. package/client/assets/useWindowTitle-DqdFTWns.js.br +0 -0
  213. package/client/assets/useWindowTitle-DqdFTWns.js.gz +0 -0
  214. package/client/assets/{useWindowTitle-BQ1kqXfk.js.map → useWindowTitle-DqdFTWns.js.map} +1 -1
  215. package/client/assets/{validateEvent-Cy-jEiwB.js → validateEvent-P9sf7C10.js} +2 -2
  216. package/client/assets/validateEvent-P9sf7C10.js.br +3 -0
  217. package/client/assets/validateEvent-P9sf7C10.js.gz +0 -0
  218. package/client/assets/{validateEvent-Cy-jEiwB.js.map → validateEvent-P9sf7C10.js.map} +1 -1
  219. package/client/assets/{vendor-Cnciq4o_.js → vendor-CCiSQ9k9.js} +3 -3
  220. package/client/assets/vendor-CCiSQ9k9.js.br +0 -0
  221. package/client/assets/vendor-CCiSQ9k9.js.gz +0 -0
  222. package/client/assets/{vendor-Cnciq4o_.js.map → vendor-CCiSQ9k9.js.map} +1 -1
  223. package/client/assets/{common.options-p5f_zJ2-.js → viewLoader.utils-CmM-4-pk.js} +2 -2
  224. package/client/assets/viewLoader.utils-CmM-4-pk.js.br +0 -0
  225. package/client/assets/viewLoader.utils-CmM-4-pk.js.gz +0 -0
  226. package/client/assets/viewLoader.utils-CmM-4-pk.js.map +1 -0
  227. package/client/index.html +3 -3
  228. package/external/demo/app.js +2 -2
  229. package/package.json +1 -1
  230. package/server/index.cjs +115 -106
  231. package/client/assets/Backstage-B-_iTDRg.js +0 -2
  232. package/client/assets/Backstage-B-_iTDRg.js.br +0 -0
  233. package/client/assets/Backstage-B-_iTDRg.js.gz +0 -0
  234. package/client/assets/Backstage-B-_iTDRg.js.map +0 -1
  235. package/client/assets/Countdown-BaaR4j9x.js +0 -2
  236. package/client/assets/Countdown-BaaR4j9x.js.br +0 -0
  237. package/client/assets/Countdown-BaaR4j9x.js.gz +0 -0
  238. package/client/assets/CustomTranslationModal-CcNNjbmZ.js +0 -2
  239. package/client/assets/CustomTranslationModal-CcNNjbmZ.js.br +0 -0
  240. package/client/assets/CustomTranslationModal-CcNNjbmZ.js.gz +0 -0
  241. package/client/assets/DelayIndicator-DXDACqpc.js.br +0 -0
  242. package/client/assets/DelayIndicator-DXDACqpc.js.gz +0 -0
  243. package/client/assets/DropdownMenu-Bn0VHzKx.js +0 -2
  244. package/client/assets/DropdownMenu-Bn0VHzKx.js.br +0 -0
  245. package/client/assets/DropdownMenu-Bn0VHzKx.js.gz +0 -0
  246. package/client/assets/DropdownMenu-Bn0VHzKx.js.map +0 -1
  247. package/client/assets/DropdownMenu-ByBDeesm.css +0 -1
  248. package/client/assets/DropdownMenu-ByBDeesm.css.br +0 -0
  249. package/client/assets/DropdownMenu-ByBDeesm.css.gz +0 -0
  250. package/client/assets/EditorFeatureWrapper-CX6wzTmM.js.br +0 -0
  251. package/client/assets/EditorFeatureWrapper-CX6wzTmM.js.gz +0 -0
  252. package/client/assets/EditorUtils-DxjFOwpn.js.br +0 -0
  253. package/client/assets/EditorUtils-DxjFOwpn.js.gz +0 -0
  254. package/client/assets/Empty-DiBXyIA8.js.br +0 -2
  255. package/client/assets/Empty-DiBXyIA8.js.gz +0 -0
  256. package/client/assets/EmptyPage-X6EO1Y5W.js.br +0 -0
  257. package/client/assets/EmptyPage-X6EO1Y5W.js.gz +0 -0
  258. package/client/assets/FollowButton-Cr-HA2-6.js.br +0 -0
  259. package/client/assets/FollowButton-Cr-HA2-6.js.gz +0 -0
  260. package/client/assets/MessageControlExport-VUkIayAJ.js.br +0 -0
  261. package/client/assets/MessageControlExport-VUkIayAJ.js.gz +0 -0
  262. package/client/assets/MilestoneEditor-Da8oxrHI.js +0 -2
  263. package/client/assets/MilestoneEditor-Da8oxrHI.js.br +0 -0
  264. package/client/assets/MilestoneEditor-Da8oxrHI.js.gz +0 -0
  265. package/client/assets/MultiPartProgressBar-mGPuP1Wd.js.br +0 -0
  266. package/client/assets/MultiPartProgressBar-mGPuP1Wd.js.gz +0 -0
  267. package/client/assets/OperatorExport-BeuWuV6I.js +0 -2
  268. package/client/assets/OperatorExport-BeuWuV6I.js.br +0 -0
  269. package/client/assets/OperatorExport-BeuWuV6I.js.gz +0 -0
  270. package/client/assets/OperatorExport-BeuWuV6I.js.map +0 -1
  271. package/client/assets/OverviewWrapper-BMuW_wiO.js.br +0 -0
  272. package/client/assets/OverviewWrapper-BMuW_wiO.js.gz +0 -0
  273. package/client/assets/ProjectInfo-BYi1lzPk.js.br +0 -0
  274. package/client/assets/ProjectInfo-BYi1lzPk.js.gz +0 -0
  275. package/client/assets/ProtectRoute-DnUCrlh6.js.br +0 -0
  276. package/client/assets/ProtectRoute-DnUCrlh6.js.gz +0 -0
  277. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js +0 -2
  278. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.br +0 -0
  279. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.gz +0 -0
  280. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.map +0 -1
  281. package/client/assets/ProtectedEditor-C4beOxz1.css +0 -1
  282. package/client/assets/ProtectedEditor-C4beOxz1.css.br +0 -0
  283. package/client/assets/ProtectedEditor-C4beOxz1.css.gz +0 -0
  284. package/client/assets/ProtectedEditor-KcsoZKKo.js +0 -3
  285. package/client/assets/ProtectedEditor-KcsoZKKo.js.br +0 -0
  286. package/client/assets/ProtectedEditor-KcsoZKKo.js.gz +0 -0
  287. package/client/assets/ProtectedEditor-KcsoZKKo.js.map +0 -1
  288. package/client/assets/RundownEntry-Dl4Cb_pZ.js +0 -2
  289. package/client/assets/RundownEntry-Dl4Cb_pZ.js.br +0 -0
  290. package/client/assets/RundownEntry-Dl4Cb_pZ.js.gz +0 -0
  291. package/client/assets/RundownExport-BPDLhvsM.js +0 -3
  292. package/client/assets/RundownExport-BPDLhvsM.js.br +0 -0
  293. package/client/assets/RundownExport-BPDLhvsM.js.gz +0 -0
  294. package/client/assets/RundownExport-CUtaG16H.css +0 -1
  295. package/client/assets/RundownExport-CUtaG16H.css.br +0 -0
  296. package/client/assets/RundownExport-CUtaG16H.css.gz +0 -0
  297. package/client/assets/Select-CUjlJirY.js.br +0 -0
  298. package/client/assets/Select-CUjlJirY.js.gz +0 -0
  299. package/client/assets/Studio-BLCIas53.js +0 -2
  300. package/client/assets/Studio-BLCIas53.js.br +0 -0
  301. package/client/assets/Studio-BLCIas53.js.gz +0 -0
  302. package/client/assets/StyleEditor-DTNiR-0P.js.br +0 -0
  303. package/client/assets/StyleEditor-DTNiR-0P.js.gz +0 -0
  304. package/client/assets/TimeElements-rlwX9Mgy.js +0 -2
  305. package/client/assets/TimeElements-rlwX9Mgy.js.br +0 -0
  306. package/client/assets/TimeElements-rlwX9Mgy.js.gz +0 -0
  307. package/client/assets/TimeInput-C0_Nl63x.js.br +0 -0
  308. package/client/assets/TimeInput-C0_Nl63x.js.gz +0 -0
  309. package/client/assets/TimelinePage-BC-pnISF.js +0 -2
  310. package/client/assets/TimelinePage-BC-pnISF.js.br +0 -0
  311. package/client/assets/TimelinePage-BC-pnISF.js.gz +0 -0
  312. package/client/assets/Timer-DGNfbBKM.css +0 -1
  313. package/client/assets/Timer-DGNfbBKM.css.br +0 -0
  314. package/client/assets/Timer-DGNfbBKM.css.gz +0 -0
  315. package/client/assets/Timer-DgmA0De-.js +0 -2
  316. package/client/assets/Timer-DgmA0De-.js.br +0 -0
  317. package/client/assets/Timer-DgmA0De-.js.gz +0 -0
  318. package/client/assets/Timer-DgmA0De-.js.map +0 -1
  319. package/client/assets/TimerControlExport-C_Jbwxog.js.br +0 -0
  320. package/client/assets/TimerControlExport-C_Jbwxog.js.gz +0 -0
  321. package/client/assets/TitleCard-C-Tw72nZ.js.br +0 -0
  322. package/client/assets/TitleCard-C-Tw72nZ.js.gz +0 -0
  323. package/client/assets/Tooltip-BZrLdTBU.js.br +0 -0
  324. package/client/assets/Tooltip-BZrLdTBU.js.gz +0 -0
  325. package/client/assets/ViewLogo-CdsW41HC.js.br +0 -0
  326. package/client/assets/ViewLogo-CdsW41HC.js.gz +0 -0
  327. package/client/assets/ViewParamsEditor-YoYxps2g.js.br +0 -0
  328. package/client/assets/ViewParamsEditor-YoYxps2g.js.gz +0 -0
  329. package/client/assets/ViewParamsEditor-kNKEOAwm.css.br +0 -0
  330. package/client/assets/ViewParamsEditor-kNKEOAwm.css.gz +0 -0
  331. package/client/assets/common.options-p5f_zJ2-.js.br +0 -0
  332. package/client/assets/common.options-p5f_zJ2-.js.gz +0 -0
  333. package/client/assets/common.options-p5f_zJ2-.js.map +0 -1
  334. package/client/assets/dateConfig-CqC6Ta_8.js.br +0 -0
  335. package/client/assets/dateConfig-CqC6Ta_8.js.gz +0 -0
  336. package/client/assets/editorSettings-CL1TjKzU.js.br +0 -0
  337. package/client/assets/editorSettings-CL1TjKzU.js.gz +0 -0
  338. package/client/assets/getProgress-Dh-Yy44B.js.br +0 -0
  339. package/client/assets/getProgress-Dh-Yy44B.js.gz +0 -0
  340. package/client/assets/index-DdPXqLQ6.js +0 -3
  341. package/client/assets/index-DdPXqLQ6.js.br +0 -0
  342. package/client/assets/index-DdPXqLQ6.js.gz +0 -0
  343. package/client/assets/index-DdPXqLQ6.js.map +0 -1
  344. package/client/assets/index-pvMSlFrO.css.br +0 -0
  345. package/client/assets/index-pvMSlFrO.css.gz +0 -0
  346. package/client/assets/offset-BnfjZ6JI.js.br +0 -2
  347. package/client/assets/offset-BnfjZ6JI.js.gz +0 -0
  348. package/client/assets/parseUserTime-DNXIMX9s.js.br +0 -0
  349. package/client/assets/parseUserTime-DNXIMX9s.js.gz +0 -0
  350. package/client/assets/playbackstate-DzSEaiNW.js.br +0 -0
  351. package/client/assets/playbackstate-DzSEaiNW.js.gz +0 -0
  352. package/client/assets/presentation.utils-BfcniGcl.js.br +0 -0
  353. package/client/assets/presentation.utils-BfcniGcl.js.gz +0 -0
  354. package/client/assets/rundownUtils-CPBsEZ2m.js.br +0 -0
  355. package/client/assets/rundownUtils-CPBsEZ2m.js.gz +0 -0
  356. package/client/assets/useCustomFields-DY13Ir96.js.br +0 -0
  357. package/client/assets/useCustomFields-DY13Ir96.js.gz +0 -0
  358. package/client/assets/useFollowComponent-C42-1XCu.js.br +0 -0
  359. package/client/assets/useFollowComponent-C42-1XCu.js.gz +0 -0
  360. package/client/assets/useProjectData-BF2F6qPB.js.br +0 -0
  361. package/client/assets/useProjectData-BF2F6qPB.js.gz +0 -0
  362. package/client/assets/useReport-DPqY9XXp.js +0 -2
  363. package/client/assets/useReport-DPqY9XXp.js.br +0 -0
  364. package/client/assets/useReport-DPqY9XXp.js.gz +0 -0
  365. package/client/assets/useRundown-uuXixjnX.js +0 -2
  366. package/client/assets/useRundown-uuXixjnX.js.br +0 -0
  367. package/client/assets/useRundown-uuXixjnX.js.gz +0 -0
  368. package/client/assets/useWindowTitle-BQ1kqXfk.js.br +0 -0
  369. package/client/assets/useWindowTitle-BQ1kqXfk.js.gz +0 -0
  370. package/client/assets/validateEvent-Cy-jEiwB.js.br +0 -0
  371. package/client/assets/validateEvent-Cy-jEiwB.js.gz +0 -0
  372. package/client/assets/vendor-Cnciq4o_.js.br +0 -0
  373. package/client/assets/vendor-Cnciq4o_.js.gz +0 -0
  374. package/client/assets/viewLoader.utils-CYlNKkLE.js +0 -2
  375. package/client/assets/viewLoader.utils-CYlNKkLE.js.br +0 -0
  376. package/client/assets/viewLoader.utils-CYlNKkLE.js.gz +0 -0
  377. package/client/assets/viewLoader.utils-CYlNKkLE.js.map +0 -1
  378. /package/client/assets/{viewLoader-Bk5IU6zG.css → SuperscriptTime-Bk5IU6zG.css} +0 -0
  379. /package/client/assets/{viewLoader-Bk5IU6zG.css.br → SuperscriptTime-Bk5IU6zG.css.br} +0 -0
  380. /package/client/assets/{viewLoader-Bk5IU6zG.css.gz → SuperscriptTime-Bk5IU6zG.css.gz} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"TimerControlExport-C_Jbwxog.js","sources":["../../../../packages/utils/src/validate-action/validatePlayback.ts","../../src/features/control/playback/tap-button/TapButton.tsx","../../src/features/control/playback/add-time/AddTime.tsx","../../src/features/control/playback/aux-timer/AuxTimer.tsx","../../src/features/control/playback/playback-buttons/PlaybackButtons.tsx","../../src/features/control/playback/timer-display/TimerDisplay.tsx","../../src/features/control/playback/playback-timer/PlaybackTimer.tsx","../../src/features/control/playback/PlaybackControl.tsx","../../src/features/control/playback/TimerControlExport.tsx"],"sourcesContent":["import { Playback, TimerPhase } from 'ontime-types';\n\n/**\n * Simple rules to determine whether a playback action is valid\n */\nexport function validatePlayback(currentPlayback: Playback, timerPhase: TimerPhase) {\n return {\n start: currentPlayback !== Playback.Stop && currentPlayback !== Playback.Play,\n pause: currentPlayback === Playback.Play,\n roll: currentPlayback !== Playback.Roll && timerPhase !== TimerPhase.Overtime,\n stop: currentPlayback !== Playback.Stop,\n reload: currentPlayback !== Playback.Stop && currentPlayback !== Playback.Roll,\n };\n}\n","import { ForwardedRef, forwardRef, PropsWithChildren } from 'react';\nimport { Playback } from 'ontime-types';\n\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './TapButton.module.scss';\n\ninterface TapButtonProps {\n disabled?: boolean;\n aspect?: 'normal' | 'square' | 'fill' | 'tight';\n free?: boolean;\n onClick: () => void;\n theme?: Playback | 'neutral';\n active?: boolean;\n className?: string;\n}\n\nconst TapButton = forwardRef((props: PropsWithChildren<TapButtonProps>, ref: ForwardedRef<HTMLButtonElement>) => {\n const { children, disabled, onClick, theme = 'neutral', aspect = 'normal', active, className } = props;\n\n return (\n <button\n className={cx([style.tapButton, className, style[theme], style[aspect], active && style.active])}\n disabled={disabled}\n type='button'\n onClick={onClick}\n ref={ref}\n >\n {children}\n </button>\n );\n});\n\nTapButton.displayName = 'TabButton';\nexport default TapButton;\n","import { IoAdd, IoRemove } from 'react-icons/io5';\nimport { useLocalStorage } from '@mantine/hooks';\nimport { Playback } from 'ontime-types';\nimport { MILLIS_PER_HOUR, parseUserTime } from 'ontime-utils';\n\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport { setPlayback } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './AddTime.module.scss';\n\ninterface AddTimeProps {\n playback: Playback;\n}\n\nexport default function AddTime(props: AddTimeProps) {\n const { playback } = props;\n const [timeInMs, setTime] = useLocalStorage({ key: 'add-time', defaultValue: 300_000 }); // 5 minutes\n\n const handleTimeChange = (_field: string, value: string) => {\n const newTimeInMs = parseUserTime(value);\n // cap add time to 1 hour\n setTime(Math.min(newTimeInMs, MILLIS_PER_HOUR));\n };\n\n const handleAddTime = (direction: 'add' | 'remove') => {\n // API expects input in milliseconds\n if (direction === 'add') {\n setPlayback.addTime(timeInMs);\n } else {\n setPlayback.addTime(-1 * timeInMs);\n }\n };\n\n const canAddTime = playback === Playback.Play || playback === Playback.Pause;\n const doDisableButtons = !canAddTime || timeInMs === 0;\n\n return (\n <div className={style.addTime}>\n <TimeInput name='addtime' submitHandler={handleTimeChange} time={timeInMs} placeholder='Add time' />\n <div className={style.addButtons}>\n <TapButton onClick={() => handleAddTime('remove')} disabled={doDisableButtons} className={style.tallButtons}>\n <IoRemove />\n </TapButton>\n <TapButton onClick={() => handleAddTime('add')} disabled={doDisableButtons} className={style.tallButtons}>\n <IoAdd />\n </TapButton>\n </div>\n </div>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoPause, IoPlay, IoStop } from 'react-icons/io5';\nimport { Playback, SimpleDirection, SimplePlayback } from 'ontime-types';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport { setAuxTimer, useAuxTimerControl, useAuxTimerTime } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './AuxTimer.module.scss';\n\ninterface AuxTimerProps {\n index: number;\n}\n\nexport function AuxTimer({ index }: AuxTimerProps) {\n const { playback, direction } = useAuxTimerControl(index);\n\n const { stop, setDirection } = setAuxTimer;\n\n const toggleDirection = () => {\n const newDirection = direction === SimpleDirection.CountDown ? SimpleDirection.CountUp : SimpleDirection.CountDown;\n setDirection(index, newDirection);\n };\n\n const isActive = playback !== SimplePlayback.Stop;\n const playbackAction = playback === SimplePlayback.Start ? 'pause' : 'play';\n\n return (\n <label className={style.label}>\n Aux Timer {index}\n <div className={style.controls}>\n <div className={style.input}>\n <AuxTimerInput index={index} isActive={isActive} />\n <TapButton onClick={toggleDirection} aspect='tight' disabled={isActive}>\n {direction === SimpleDirection.CountDown && <IoArrowDown data-testid={`aux-timer-direction-${index}`} />}\n {direction === SimpleDirection.CountUp && <IoArrowUp data-testid={`aux-timer-direction-${index}`} />}\n </TapButton>\n </div>\n <div className={style.twoSides}>\n <AuxTogglePlay index={index} action={playbackAction} />\n <TapButton onClick={() => stop(index)} theme={Playback.Stop} disabled={!isActive}>\n <IoStop data-testid={`aux-timer-stop-${index}`} />\n </TapButton>\n </div>\n </div>\n </label>\n );\n}\n\ninterface AuxTimerInputProps {\n index: number;\n isActive: boolean;\n}\n\nfunction AuxTimerInput({ index, isActive }: AuxTimerInputProps) {\n const newTimeInMs = useAuxTimerTime(index);\n const { setDuration } = setAuxTimer;\n\n const handleTimeUpdate = (_field: string, value: string) => {\n const newTimeInMs = parseUserTime(value);\n setDuration(index, newTimeInMs);\n };\n\n if (isActive) {\n return (\n <div className={style.fakeInput} data-testid={`time-label-aux${index}`}>\n {millisToString(newTimeInMs)}\n </div>\n );\n }\n\n return (\n <TimeInput submitHandler={handleTimeUpdate} name={`aux${index}`} time={newTimeInMs} placeholder={`Aux ${index}`} />\n );\n}\n\ninterface AuxTogglePlayProps {\n index: number;\n action: 'play' | 'pause';\n}\n\nfunction AuxTogglePlay({ index, action }: AuxTogglePlayProps) {\n const { start, pause } = setAuxTimer;\n\n if (action === 'play') {\n return (\n <TapButton onClick={() => start(index)} theme={Playback.Play}>\n <IoPlay data-testid={`aux-timer-start-${index}`} />\n </TapButton>\n );\n }\n\n return (\n <TapButton onClick={() => pause(index)} theme={Playback.Pause}>\n <IoPause data-testid={`aux-timer-pause-${index}`} />\n </TapButton>\n );\n}\n","import { useMemo } from 'react';\nimport { IoPause, IoPlay, IoPlaySkipBack, IoPlaySkipForward, IoReload, IoStop } from 'react-icons/io5';\nimport { Playback, TimerPhase } from 'ontime-types';\nimport { validatePlayback } from 'ontime-utils';\n\nimport { setPlayback } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './PlaybackButtons.module.scss';\n\ninterface PlaybackButtonsProps {\n playback: Playback;\n numEvents: number;\n selectedEventIndex: number | null;\n timerPhase: TimerPhase;\n}\n\nexport default function PlaybackButtons(props: PlaybackButtonsProps) {\n const { playback, numEvents, selectedEventIndex, timerPhase } = props;\n\n const isRolling = playback === Playback.Roll;\n const isPlaying = playback === Playback.Play;\n const isPaused = playback === Playback.Pause;\n const isArmed = playback === Playback.Armed;\n\n const isFirst = selectedEventIndex === 0;\n const isLast = selectedEventIndex === numEvents - 1;\n const noEvents = numEvents === 0;\n\n const disableGo = isRolling || noEvents;\n const disableNext = isRolling || noEvents || isLast;\n const disablePrev = isRolling || noEvents || isFirst;\n\n const playbackCan = validatePlayback(playback, timerPhase);\n const disableStart = !playbackCan.start;\n const disablePause = !playbackCan.pause;\n const disableRoll = !playbackCan.roll || noEvents;\n const disableStop = !playbackCan.stop;\n const disableReload = !playbackCan.reload;\n\n const [goModeAction, goModeText] = useMemo(() => {\n if (isArmed) {\n return [setPlayback.start, 'Start'];\n } else if (isLast) {\n return [setPlayback.stop, 'Finish'];\n } else if (selectedEventIndex === null) {\n return [setPlayback.startNext, 'Start'];\n }\n return [setPlayback.startNext, 'Next'];\n }, [isArmed, isLast, selectedEventIndex]);\n\n return (\n <div className={style.buttonContainer}>\n <TapButton disabled={disableGo} onClick={goModeAction} aspect='fill' className={style.go}>\n {goModeText}\n </TapButton>\n <div className={style.playbackContainer}>\n <TapButton onClick={setPlayback.start} disabled={disableStart} theme={Playback.Play} active={isPlaying}>\n <IoPlay />\n </TapButton>\n\n <TapButton onClick={setPlayback.pause} disabled={disablePause} theme={Playback.Pause} active={isPaused}>\n <IoPause />\n </TapButton>\n </div>\n <div className={style.transportContainer}>\n <TapButton onClick={setPlayback.previous} disabled={disablePrev}>\n <IoPlaySkipBack />\n </TapButton>\n <TapButton onClick={setPlayback.next} disabled={disableNext}>\n <IoPlaySkipForward />\n </TapButton>\n </div>\n <div className={style.extra}>\n <TapButton onClick={setPlayback.roll} disabled={disableRoll} theme={Playback.Roll} active={isRolling}>\n Roll\n </TapButton>\n <TapButton onClick={setPlayback.reload} disabled={disableReload}>\n <IoReload className={style.invertX} />\n </TapButton>\n <TapButton onClick={setPlayback.stop} disabled={disableStop} theme={Playback.Stop}>\n <IoStop />\n </TapButton>\n </div>\n </div>\n );\n}\n","import { MaybeNumber } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport { cx, timerPlaceholder } from '../../../../common/utils/styleUtils';\n\nimport style from './TimerDisplay.module.scss';\n\ninterface TimerDisplayProps {\n time: MaybeNumber;\n}\n\n/**\n * Displays time in ms in formatted timetag\n * Used in editor\n */\nexport default function TimerDisplay(props: TimerDisplayProps) {\n const { time } = props;\n\n const isNegative = (time ?? 0) < 0;\n const display =\n time == null ? timerPlaceholder : millisToString(time, { fallback: timerPlaceholder }).replace('-', '');\n const classes = cx([style.timer, isNegative ? style.finished : null, time === null && style.muted]);\n\n return <div className={classes}>{display}</div>;\n}\n","import { PropsWithChildren } from 'react';\nimport { MaybeNumber, Playback, TimerPhase } from 'ontime-types';\nimport { dayInMs, millisToString } from 'ontime-utils';\n\nimport AppLink from '../../../../common/components/link/app-link/AppLink';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useTimer } from '../../../../common/hooks/useSocket';\nimport useReport from '../../../../common/hooks-query/useReport';\nimport { formatDuration } from '../../../../common/utils/time';\nimport TimerDisplay from '../timer-display/TimerDisplay';\n\nimport style from './PlaybackTimer.module.scss';\n\nfunction resolveAddedTimeLabel(addedTime: number) {\n if (addedTime > 0) {\n return `Added ${formatDuration(addedTime, false)}`;\n }\n\n if (addedTime < 0) {\n return `Removed ${formatDuration(Math.abs(addedTime), false)}`;\n }\n\n return '';\n}\n\nexport default function PlaybackTimer({ children }: PropsWithChildren) {\n const timer = useTimer();\n\n const isRolling = timer.playback === Playback.Roll;\n const isWaiting = timer.phase === TimerPhase.Pending;\n const isOvertime = timer.phase === TimerPhase.Overtime;\n const hasAddedTime = Boolean(timer.addedTime);\n\n const rollLabel = isRolling ? 'Roll mode active' : '';\n\n const addedTimeLabel = resolveAddedTimeLabel(timer.addedTime);\n\n return (\n <div className={style.timeContainer}>\n <div className={style.indicators}>\n <Tooltip text={rollLabel} render={<div />} className={style.indicatorRoll} data-active={isRolling} />\n <div className={style.indicatorNegative} data-active={isOvertime} />\n <Tooltip text={addedTimeLabel} render={<div />} className={style.indicatorDelay} data-active={hasAddedTime} />\n </div>\n <TimerDisplay time={isWaiting ? timer.secondaryTimer : timer.current} />\n <div className={style.status}>\n {isWaiting ? (\n <span className={style.rolltag}>Roll: Countdown to start</span>\n ) : (\n <RunningStatus startedAt={timer.startedAt} expectedFinish={timer.expectedFinish} playback={timer.playback} />\n )}\n </div>\n {children}\n </div>\n );\n}\n\ninterface RunningStatusProps {\n startedAt: MaybeNumber;\n expectedFinish: MaybeNumber;\n playback: Playback;\n}\nfunction RunningStatus({ startedAt, expectedFinish, playback }: RunningStatusProps) {\n if (playback === Playback.Stop) {\n return <StoppedStatus />;\n }\n\n const started = millisToString(startedAt);\n const finishedMs = expectedFinish !== null ? expectedFinish % dayInMs : null;\n const finish = millisToString(finishedMs);\n\n return (\n <>\n <span className={style.start}>\n <span className={style.tag}>Started at</span>\n <span className={style.time}>{started}</span>\n </span>\n <span className={style.finish}>\n <span className={style.tag}>Expect end</span>\n <span className={style.time}>{finish}</span>\n </span>\n </>\n );\n}\n\nfunction StoppedStatus() {\n const { data } = useReport();\n const hasReport = Object.keys(data).length > 0;\n\n if (hasReport) {\n return <AppLink search='settings=sharing__report'>Go to report management</AppLink>;\n }\n\n return null;\n}\n","import { usePlaybackControl } from '../../../common/hooks/useSocket';\n\nimport AddTime from './add-time/AddTime';\nimport { AuxTimer } from './aux-timer/AuxTimer';\nimport PlaybackButtons from './playback-buttons/PlaybackButtons';\nimport PlaybackTimer from './playback-timer/PlaybackTimer';\n\nimport style from './PlaybackControl.module.scss';\n\nexport default function PlaybackControl() {\n const data = usePlaybackControl();\n\n return (\n <div className={style.mainContainer}>\n <PlaybackTimer>\n <AddTime playback={data.playback} />\n </PlaybackTimer>\n <PlaybackButtons\n playback={data.playback}\n numEvents={data.numEvents}\n selectedEventIndex={data.selectedEventIndex}\n timerPhase={data.timerPhase}\n />\n <div className={style.auxTimers}>\n <AuxTimer index={1} />\n <AuxTimer index={2} />\n <AuxTimer index={3} />\n </div>\n </div>\n );\n}\n","import { memo } from 'react';\n\nimport { Corner } from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\n\nimport PlaybackControl from './PlaybackControl';\n\nimport style from '../../../views/editor/Editor.module.scss';\n\nexport default memo(TimerControlExport);\nfunction TimerControlExport() {\n const isExtracted = window.location.pathname.includes('/timercontrol');\n\n return (\n <ProtectRoute permission='editor'>\n <div className={style.playback} data-testid='panel-timer-control'>\n {!isExtracted && <Corner onClick={(event) => handleLinks('timercontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings />}\n\n <div className={style.content}>\n <ErrorBoundary>\n <PlaybackControl />\n </ErrorBoundary>\n </div>\n </div>\n </ProtectRoute>\n );\n}\n"],"names":["validatePlayback","currentPlayback","timerPhase","Playback","TimerPhase","TapButton","forwardRef","props","ref","children","disabled","onClick","theme","aspect","active","className","jsx","cx","style","AddTime","playback","timeInMs","setTime","useLocalStorage","handleTimeChange","_field","value","newTimeInMs","parseUserTime","MILLIS_PER_HOUR","handleAddTime","direction","setPlayback","doDisableButtons","jsxs","TimeInput","IoRemove","IoAdd","AuxTimer","index","useAuxTimerControl","stop","setDirection","setAuxTimer","toggleDirection","newDirection","SimpleDirection","isActive","SimplePlayback","playbackAction","AuxTimerInput","IoArrowDown","IoArrowUp","AuxTogglePlay","IoStop","useAuxTimerTime","setDuration","handleTimeUpdate","millisToString","action","start","pause","IoPlay","IoPause","PlaybackButtons","numEvents","selectedEventIndex","isRolling","isPlaying","isPaused","isArmed","isFirst","isLast","noEvents","disableGo","disableNext","disablePrev","playbackCan","disableStart","disablePause","disableRoll","disableStop","disableReload","goModeAction","goModeText","useMemo","IoPlaySkipBack","IoPlaySkipForward","IoReload","TimerDisplay","time","isNegative","display","timerPlaceholder","classes","resolveAddedTimeLabel","addedTime","formatDuration","PlaybackTimer","timer","useTimer","isWaiting","isOvertime","hasAddedTime","rollLabel","addedTimeLabel","Tooltip","RunningStatus","startedAt","expectedFinish","StoppedStatus","started","finishedMs","dayInMs","finish","Fragment","data","useReport","AppLink","PlaybackControl","usePlaybackControl","memo","TimerControlExport","isExtracted","ProtectRoute","Corner","event","handleLinks","ViewNavigationMenu","ErrorBoundary"],"mappings":"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"}
1
+ {"version":3,"file":"TimerControlExport-C8ECtLBd.js","sources":["../../../../packages/utils/src/validate-action/validatePlayback.ts","../../src/features/control/playback/tap-button/TapButton.tsx","../../src/features/control/playback/add-time/AddTime.tsx","../../src/features/control/playback/aux-timer/AuxTimer.tsx","../../src/features/control/playback/playback-buttons/PlaybackButtons.tsx","../../src/features/control/playback/timer-display/TimerDisplay.tsx","../../src/features/control/playback/playback-timer/PlaybackTimer.tsx","../../src/features/control/playback/PlaybackControl.tsx","../../src/features/control/playback/TimerControlExport.tsx"],"sourcesContent":["import { Playback, TimerPhase } from 'ontime-types';\n\n/**\n * Simple rules to determine whether a playback action is valid\n */\nexport function validatePlayback(currentPlayback: Playback, timerPhase: TimerPhase) {\n return {\n start: currentPlayback !== Playback.Stop && currentPlayback !== Playback.Play,\n pause: currentPlayback === Playback.Play,\n roll: currentPlayback !== Playback.Roll && timerPhase !== TimerPhase.Overtime,\n stop: currentPlayback !== Playback.Stop,\n reload: currentPlayback !== Playback.Stop && currentPlayback !== Playback.Roll,\n };\n}\n","import { ForwardedRef, forwardRef, PropsWithChildren } from 'react';\nimport { Playback } from 'ontime-types';\n\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './TapButton.module.scss';\n\ninterface TapButtonProps {\n disabled?: boolean;\n aspect?: 'normal' | 'square' | 'fill' | 'tight';\n free?: boolean;\n onClick: () => void;\n theme?: Playback | 'neutral';\n active?: boolean;\n className?: string;\n}\n\nconst TapButton = forwardRef((props: PropsWithChildren<TapButtonProps>, ref: ForwardedRef<HTMLButtonElement>) => {\n const { children, disabled, onClick, theme = 'neutral', aspect = 'normal', active, className } = props;\n\n return (\n <button\n className={cx([style.tapButton, className, style[theme], style[aspect], active && style.active])}\n disabled={disabled}\n type='button'\n onClick={onClick}\n ref={ref}\n >\n {children}\n </button>\n );\n});\n\nTapButton.displayName = 'TabButton';\nexport default TapButton;\n","import { IoAdd, IoRemove } from 'react-icons/io5';\nimport { useLocalStorage } from '@mantine/hooks';\nimport { Playback } from 'ontime-types';\nimport { MILLIS_PER_HOUR, parseUserTime } from 'ontime-utils';\n\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport { setPlayback } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './AddTime.module.scss';\n\ninterface AddTimeProps {\n playback: Playback;\n}\n\nexport default function AddTime(props: AddTimeProps) {\n const { playback } = props;\n const [timeInMs, setTime] = useLocalStorage({ key: 'add-time', defaultValue: 300_000 }); // 5 minutes\n\n const handleTimeChange = (_field: string, value: string) => {\n const newTimeInMs = parseUserTime(value);\n // cap add time to 1 hour\n setTime(Math.min(newTimeInMs, MILLIS_PER_HOUR));\n };\n\n const handleAddTime = (direction: 'add' | 'remove') => {\n // API expects input in milliseconds\n if (direction === 'add') {\n setPlayback.addTime(timeInMs);\n } else {\n setPlayback.addTime(-1 * timeInMs);\n }\n };\n\n const canAddTime = playback === Playback.Play || playback === Playback.Pause;\n const doDisableButtons = !canAddTime || timeInMs === 0;\n\n return (\n <div className={style.addTime}>\n <TimeInput name='addtime' submitHandler={handleTimeChange} time={timeInMs} placeholder='Add time' />\n <div className={style.addButtons}>\n <TapButton onClick={() => handleAddTime('remove')} disabled={doDisableButtons} className={style.tallButtons}>\n <IoRemove />\n </TapButton>\n <TapButton onClick={() => handleAddTime('add')} disabled={doDisableButtons} className={style.tallButtons}>\n <IoAdd />\n </TapButton>\n </div>\n </div>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoPause, IoPlay, IoStop } from 'react-icons/io5';\nimport { Playback, SimpleDirection, SimplePlayback } from 'ontime-types';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport { setAuxTimer, useAuxTimerControl, useAuxTimerTime } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './AuxTimer.module.scss';\n\ninterface AuxTimerProps {\n index: number;\n}\n\nexport function AuxTimer({ index }: AuxTimerProps) {\n const { playback, direction } = useAuxTimerControl(index);\n\n const { stop, setDirection } = setAuxTimer;\n\n const toggleDirection = () => {\n const newDirection = direction === SimpleDirection.CountDown ? SimpleDirection.CountUp : SimpleDirection.CountDown;\n setDirection(index, newDirection);\n };\n\n const isActive = playback !== SimplePlayback.Stop;\n const playbackAction = playback === SimplePlayback.Start ? 'pause' : 'play';\n\n return (\n <label className={style.label}>\n Aux Timer {index}\n <div className={style.controls}>\n <div className={style.input}>\n <AuxTimerInput index={index} isActive={isActive} />\n <TapButton onClick={toggleDirection} aspect='tight' disabled={isActive}>\n {direction === SimpleDirection.CountDown && <IoArrowDown data-testid={`aux-timer-direction-${index}`} />}\n {direction === SimpleDirection.CountUp && <IoArrowUp data-testid={`aux-timer-direction-${index}`} />}\n </TapButton>\n </div>\n <div className={style.twoSides}>\n <AuxTogglePlay index={index} action={playbackAction} />\n <TapButton onClick={() => stop(index)} theme={Playback.Stop} disabled={!isActive}>\n <IoStop data-testid={`aux-timer-stop-${index}`} />\n </TapButton>\n </div>\n </div>\n </label>\n );\n}\n\ninterface AuxTimerInputProps {\n index: number;\n isActive: boolean;\n}\n\nfunction AuxTimerInput({ index, isActive }: AuxTimerInputProps) {\n const newTimeInMs = useAuxTimerTime(index);\n const { setDuration } = setAuxTimer;\n\n const handleTimeUpdate = (_field: string, value: string) => {\n const newTimeInMs = parseUserTime(value);\n setDuration(index, newTimeInMs);\n };\n\n if (isActive) {\n return (\n <div className={style.fakeInput} data-testid={`time-label-aux${index}`}>\n {millisToString(newTimeInMs)}\n </div>\n );\n }\n\n return (\n <TimeInput submitHandler={handleTimeUpdate} name={`aux${index}`} time={newTimeInMs} placeholder={`Aux ${index}`} />\n );\n}\n\ninterface AuxTogglePlayProps {\n index: number;\n action: 'play' | 'pause';\n}\n\nfunction AuxTogglePlay({ index, action }: AuxTogglePlayProps) {\n const { start, pause } = setAuxTimer;\n\n if (action === 'play') {\n return (\n <TapButton onClick={() => start(index)} theme={Playback.Play}>\n <IoPlay data-testid={`aux-timer-start-${index}`} />\n </TapButton>\n );\n }\n\n return (\n <TapButton onClick={() => pause(index)} theme={Playback.Pause}>\n <IoPause data-testid={`aux-timer-pause-${index}`} />\n </TapButton>\n );\n}\n","import { useMemo } from 'react';\nimport { IoPause, IoPlay, IoPlaySkipBack, IoPlaySkipForward, IoReload, IoStop } from 'react-icons/io5';\nimport { Playback, TimerPhase } from 'ontime-types';\nimport { validatePlayback } from 'ontime-utils';\n\nimport { setPlayback } from '../../../../common/hooks/useSocket';\nimport TapButton from '../tap-button/TapButton';\n\nimport style from './PlaybackButtons.module.scss';\n\ninterface PlaybackButtonsProps {\n playback: Playback;\n numEvents: number;\n selectedEventIndex: number | null;\n timerPhase: TimerPhase;\n}\n\nexport default function PlaybackButtons(props: PlaybackButtonsProps) {\n const { playback, numEvents, selectedEventIndex, timerPhase } = props;\n\n const isRolling = playback === Playback.Roll;\n const isPlaying = playback === Playback.Play;\n const isPaused = playback === Playback.Pause;\n const isArmed = playback === Playback.Armed;\n\n const isFirst = selectedEventIndex === 0;\n const isLast = selectedEventIndex === numEvents - 1;\n const noEvents = numEvents === 0;\n\n const disableGo = isRolling || noEvents;\n const disableNext = isRolling || noEvents || isLast;\n const disablePrev = isRolling || noEvents || isFirst;\n\n const playbackCan = validatePlayback(playback, timerPhase);\n const disableStart = !playbackCan.start;\n const disablePause = !playbackCan.pause;\n const disableRoll = !playbackCan.roll || noEvents;\n const disableStop = !playbackCan.stop;\n const disableReload = !playbackCan.reload;\n\n const [goModeAction, goModeText] = useMemo(() => {\n if (isArmed) {\n return [setPlayback.start, 'Start'];\n } else if (isLast) {\n return [setPlayback.stop, 'Finish'];\n } else if (selectedEventIndex === null) {\n return [setPlayback.startNext, 'Start'];\n }\n return [setPlayback.startNext, 'Next'];\n }, [isArmed, isLast, selectedEventIndex]);\n\n return (\n <div className={style.buttonContainer}>\n <TapButton disabled={disableGo} onClick={goModeAction} aspect='fill' className={style.go}>\n {goModeText}\n </TapButton>\n <div className={style.playbackContainer}>\n <TapButton onClick={setPlayback.start} disabled={disableStart} theme={Playback.Play} active={isPlaying}>\n <IoPlay />\n </TapButton>\n\n <TapButton onClick={setPlayback.pause} disabled={disablePause} theme={Playback.Pause} active={isPaused}>\n <IoPause />\n </TapButton>\n </div>\n <div className={style.transportContainer}>\n <TapButton onClick={setPlayback.previous} disabled={disablePrev}>\n <IoPlaySkipBack />\n </TapButton>\n <TapButton onClick={setPlayback.next} disabled={disableNext}>\n <IoPlaySkipForward />\n </TapButton>\n </div>\n <div className={style.extra}>\n <TapButton onClick={setPlayback.roll} disabled={disableRoll} theme={Playback.Roll} active={isRolling}>\n Roll\n </TapButton>\n <TapButton onClick={setPlayback.reload} disabled={disableReload}>\n <IoReload className={style.invertX} />\n </TapButton>\n <TapButton onClick={setPlayback.stop} disabled={disableStop} theme={Playback.Stop}>\n <IoStop />\n </TapButton>\n </div>\n </div>\n );\n}\n","import { MaybeNumber } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport { cx, timerPlaceholder } from '../../../../common/utils/styleUtils';\n\nimport style from './TimerDisplay.module.scss';\n\ninterface TimerDisplayProps {\n time: MaybeNumber;\n}\n\n/**\n * Displays time in ms in formatted timetag\n * Used in editor\n */\nexport default function TimerDisplay(props: TimerDisplayProps) {\n const { time } = props;\n\n const isNegative = (time ?? 0) < 0;\n const display =\n time == null ? timerPlaceholder : millisToString(time, { fallback: timerPlaceholder }).replace('-', '');\n const classes = cx([style.timer, isNegative ? style.finished : null, time === null && style.muted]);\n\n return <div className={classes}>{display}</div>;\n}\n","import { PropsWithChildren } from 'react';\nimport { MaybeNumber, Playback, TimerPhase } from 'ontime-types';\nimport { dayInMs, millisToString } from 'ontime-utils';\n\nimport AppLink from '../../../../common/components/link/app-link/AppLink';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useTimer } from '../../../../common/hooks/useSocket';\nimport useReport from '../../../../common/hooks-query/useReport';\nimport { formatDuration } from '../../../../common/utils/time';\nimport TimerDisplay from '../timer-display/TimerDisplay';\n\nimport style from './PlaybackTimer.module.scss';\n\nfunction resolveAddedTimeLabel(addedTime: number) {\n if (addedTime > 0) {\n return `Added ${formatDuration(addedTime, false)}`;\n }\n\n if (addedTime < 0) {\n return `Removed ${formatDuration(Math.abs(addedTime), false)}`;\n }\n\n return '';\n}\n\nexport default function PlaybackTimer({ children }: PropsWithChildren) {\n const timer = useTimer();\n\n const isRolling = timer.playback === Playback.Roll;\n const isWaiting = timer.phase === TimerPhase.Pending;\n const isOvertime = timer.phase === TimerPhase.Overtime;\n const hasAddedTime = Boolean(timer.addedTime);\n\n const rollLabel = isRolling ? 'Roll mode active' : '';\n\n const addedTimeLabel = resolveAddedTimeLabel(timer.addedTime);\n\n return (\n <div className={style.timeContainer}>\n <div className={style.indicators}>\n <Tooltip text={rollLabel} render={<div />} className={style.indicatorRoll} data-active={isRolling} />\n <div className={style.indicatorNegative} data-active={isOvertime} />\n <Tooltip text={addedTimeLabel} render={<div />} className={style.indicatorDelay} data-active={hasAddedTime} />\n </div>\n <TimerDisplay time={isWaiting ? timer.secondaryTimer : timer.current} />\n <div className={style.status}>\n {isWaiting ? (\n <span className={style.rolltag}>Roll: Countdown to start</span>\n ) : (\n <RunningStatus startedAt={timer.startedAt} expectedFinish={timer.expectedFinish} playback={timer.playback} />\n )}\n </div>\n {children}\n </div>\n );\n}\n\ninterface RunningStatusProps {\n startedAt: MaybeNumber;\n expectedFinish: MaybeNumber;\n playback: Playback;\n}\nfunction RunningStatus({ startedAt, expectedFinish, playback }: RunningStatusProps) {\n if (playback === Playback.Stop) {\n return <StoppedStatus />;\n }\n\n const started = millisToString(startedAt);\n const finishedMs = expectedFinish !== null ? expectedFinish % dayInMs : null;\n const finish = millisToString(finishedMs);\n\n return (\n <>\n <span className={style.start}>\n <span className={style.tag}>Started at</span>\n <span className={style.time}>{started}</span>\n </span>\n <span className={style.finish}>\n <span className={style.tag}>Expect end</span>\n <span className={style.time}>{finish}</span>\n </span>\n </>\n );\n}\n\nfunction StoppedStatus() {\n const { data } = useReport();\n const hasReport = Object.keys(data).length > 0;\n\n if (hasReport) {\n return <AppLink search='settings=sharing__report'>Go to report management</AppLink>;\n }\n\n return null;\n}\n","import { usePlaybackControl } from '../../../common/hooks/useSocket';\n\nimport AddTime from './add-time/AddTime';\nimport { AuxTimer } from './aux-timer/AuxTimer';\nimport PlaybackButtons from './playback-buttons/PlaybackButtons';\nimport PlaybackTimer from './playback-timer/PlaybackTimer';\n\nimport style from './PlaybackControl.module.scss';\n\nexport default function PlaybackControl() {\n const data = usePlaybackControl();\n\n return (\n <div className={style.mainContainer}>\n <PlaybackTimer>\n <AddTime playback={data.playback} />\n </PlaybackTimer>\n <PlaybackButtons\n playback={data.playback}\n numEvents={data.numEvents}\n selectedEventIndex={data.selectedEventIndex}\n timerPhase={data.timerPhase}\n />\n <div className={style.auxTimers}>\n <AuxTimer index={1} />\n <AuxTimer index={2} />\n <AuxTimer index={3} />\n </div>\n </div>\n );\n}\n","import { memo } from 'react';\n\nimport { Corner } from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\n\nimport PlaybackControl from './PlaybackControl';\n\nimport style from '../../../views/editor/Editor.module.scss';\n\nexport default memo(TimerControlExport);\nfunction TimerControlExport() {\n const isExtracted = window.location.pathname.includes('/timercontrol');\n\n return (\n <ProtectRoute permission='editor'>\n <div className={style.playback} data-testid='panel-timer-control'>\n {!isExtracted && <Corner onClick={(event) => handleLinks('timercontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings />}\n\n <div className={style.content}>\n <ErrorBoundary>\n <PlaybackControl />\n </ErrorBoundary>\n </div>\n </div>\n </ProtectRoute>\n );\n}\n"],"names":["validatePlayback","currentPlayback","timerPhase","Playback","TimerPhase","TapButton","forwardRef","props","ref","children","disabled","onClick","theme","aspect","active","className","jsx","cx","style","AddTime","playback","timeInMs","setTime","useLocalStorage","handleTimeChange","_field","value","newTimeInMs","parseUserTime","MILLIS_PER_HOUR","handleAddTime","direction","setPlayback","doDisableButtons","jsxs","TimeInput","IoRemove","IoAdd","AuxTimer","index","useAuxTimerControl","stop","setDirection","setAuxTimer","toggleDirection","newDirection","SimpleDirection","isActive","SimplePlayback","playbackAction","AuxTimerInput","IoArrowDown","IoArrowUp","AuxTogglePlay","IoStop","useAuxTimerTime","setDuration","handleTimeUpdate","millisToString","action","start","pause","IoPlay","IoPause","PlaybackButtons","numEvents","selectedEventIndex","isRolling","isPlaying","isPaused","isArmed","isFirst","isLast","noEvents","disableGo","disableNext","disablePrev","playbackCan","disableStart","disablePause","disableRoll","disableStop","disableReload","goModeAction","goModeText","useMemo","IoPlaySkipBack","IoPlaySkipForward","IoReload","TimerDisplay","time","isNegative","display","timerPlaceholder","classes","resolveAddedTimeLabel","addedTime","formatDuration","PlaybackTimer","timer","useTimer","isWaiting","isOvertime","hasAddedTime","rollLabel","addedTimeLabel","Tooltip","RunningStatus","startedAt","expectedFinish","StoppedStatus","started","finishedMs","dayInMs","finish","Fragment","data","useReport","AppLink","PlaybackControl","usePlaybackControl","memo","TimerControlExport","isExtracted","ProtectRoute","Corner","event","handleLinks","ViewNavigationMenu","ErrorBoundary"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{h as o,j as t}from"./vendor-Cnciq4o_.js";import{f,i as d}from"./index-DdPXqLQ6.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]="29859e0e-217f-40fd-a5bb-3eb2e5252a5d",e._sentryDebugIdIdentifier="sentry-dbid-29859e0e-217f-40fd-a5bb-3eb2e5252a5d")}catch{}})();const b=o.forwardRef((e,a)=>{const{label:s,title:n,secondary:r,className:l=""}=e,{getLocalizedString:i}=f(),c=s==="now";return t.jsxs("div",{className:d(["title-card",l]),ref:a,children:[t.jsx("span",{className:"title-card__title",children:n}),t.jsx("span",{className:d(["title-card__label",c&&"title-card__label--accent"]),children:s&&i(`common.${s}`)}),t.jsx("div",{className:"title-card__secondary",children:r})]})});b.displayName="TitleCard";export{b as T};
2
- //# sourceMappingURL=TitleCard-C-Tw72nZ.js.map
1
+ import{h as o,j as t}from"./vendor-CCiSQ9k9.js";import{f,i as d}from"./index-BQEUaoAf.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]="29859e0e-217f-40fd-a5bb-3eb2e5252a5d",e._sentryDebugIdIdentifier="sentry-dbid-29859e0e-217f-40fd-a5bb-3eb2e5252a5d")}catch{}})();const b=o.forwardRef((e,a)=>{const{label:s,title:n,secondary:r,className:l=""}=e,{getLocalizedString:i}=f(),c=s==="now";return t.jsxs("div",{className:d(["title-card",l]),ref:a,children:[t.jsx("span",{className:"title-card__title",children:n}),t.jsx("span",{className:d(["title-card__label",c&&"title-card__label--accent"]),children:s&&i(`common.${s}`)}),t.jsx("div",{className:"title-card__secondary",children:r})]})});b.displayName="TitleCard";export{b as T};
2
+ //# sourceMappingURL=TitleCard-CZl9wSHS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TitleCard-C-Tw72nZ.js","sources":["../../src/common/components/title-card/TitleCard.tsx"],"sourcesContent":["import { ForwardedRef, forwardRef } from 'react';\n\nimport { useTranslation } from '../../../translation/TranslationProvider';\nimport { cx } from '../../utils/styleUtils';\n\nimport './TitleCard.scss';\n\ninterface TitleCardProps {\n title?: string;\n label?: 'now' | 'next';\n secondary?: string;\n className?: string;\n}\n\nconst TitleCard = forwardRef((props: TitleCardProps, ref: ForwardedRef<HTMLDivElement>) => {\n const { label, title, secondary, className = '' } = props;\n const { getLocalizedString } = useTranslation();\n\n const accent = label === 'now';\n\n return (\n <div className={cx(['title-card', className])} ref={ref}>\n <span className='title-card__title'>{title}</span>\n <span className={cx(['title-card__label', accent && 'title-card__label--accent'])}>\n {label && getLocalizedString(`common.${label}`)}\n </span>\n <div className='title-card__secondary'>{secondary}</div>\n </div>\n );\n});\n\nTitleCard.displayName = 'TitleCard';\nexport default TitleCard;\n"],"names":["TitleCard","forwardRef","props","ref","label","title","secondary","className","getLocalizedString","useTranslation","accent","jsxs","cx","jsx"],"mappings":"obAcA,MAAMA,EAAYC,EAAA,WAAW,CAACC,EAAuBC,IAAsC,CACzF,KAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,UAAAC,EAAW,UAAAC,EAAY,IAAOL,EAC9C,CAAE,mBAAAM,CAAmB,EAAIC,EAAe,EAExCC,EAASN,IAAU,MAGvB,OAAAO,OAAC,OAAI,UAAWC,EAAG,CAAC,aAAcL,CAAS,CAAC,EAAG,IAAAJ,EAC7C,SAAA,CAACU,EAAA,IAAA,OAAA,CAAK,UAAU,oBAAqB,SAAMR,EAAA,EAC1CQ,EAAA,IAAA,OAAA,CAAK,UAAWD,EAAG,CAAC,oBAAqBF,GAAU,2BAA2B,CAAC,EAC7E,SAASN,GAAAI,EAAmB,UAAUJ,CAAK,EAAE,EAChD,EACCS,EAAA,IAAA,MAAA,CAAI,UAAU,wBAAyB,SAAUP,CAAA,CAAA,CAAA,EACpD,CAEJ,CAAC,EAEDN,EAAU,YAAc"}
1
+ {"version":3,"file":"TitleCard-CZl9wSHS.js","sources":["../../src/common/components/title-card/TitleCard.tsx"],"sourcesContent":["import { ForwardedRef, forwardRef } from 'react';\n\nimport { useTranslation } from '../../../translation/TranslationProvider';\nimport { cx } from '../../utils/styleUtils';\n\nimport './TitleCard.scss';\n\ninterface TitleCardProps {\n title?: string;\n label?: 'now' | 'next';\n secondary?: string;\n className?: string;\n}\n\nconst TitleCard = forwardRef((props: TitleCardProps, ref: ForwardedRef<HTMLDivElement>) => {\n const { label, title, secondary, className = '' } = props;\n const { getLocalizedString } = useTranslation();\n\n const accent = label === 'now';\n\n return (\n <div className={cx(['title-card', className])} ref={ref}>\n <span className='title-card__title'>{title}</span>\n <span className={cx(['title-card__label', accent && 'title-card__label--accent'])}>\n {label && getLocalizedString(`common.${label}`)}\n </span>\n <div className='title-card__secondary'>{secondary}</div>\n </div>\n );\n});\n\nTitleCard.displayName = 'TitleCard';\nexport default TitleCard;\n"],"names":["TitleCard","forwardRef","props","ref","label","title","secondary","className","getLocalizedString","useTranslation","accent","jsxs","cx","jsx"],"mappings":"obAcA,MAAMA,EAAYC,EAAA,WAAW,CAACC,EAAuBC,IAAsC,CACzF,KAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,UAAAC,EAAW,UAAAC,EAAY,IAAOL,EAC9C,CAAE,mBAAAM,CAAmB,EAAIC,EAAe,EAExCC,EAASN,IAAU,MAGvB,OAAAO,OAAC,OAAI,UAAWC,EAAG,CAAC,aAAcL,CAAS,CAAC,EAAG,IAAAJ,EAC7C,SAAA,CAACU,EAAA,IAAA,OAAA,CAAK,UAAU,oBAAqB,SAAMR,EAAA,EAC1CQ,EAAA,IAAA,OAAA,CAAK,UAAWD,EAAG,CAAC,oBAAqBF,GAAU,2BAA2B,CAAC,EAC7E,SAASN,GAAAI,EAAmB,UAAUJ,CAAK,EAAE,EAChD,EACCS,EAAA,IAAA,MAAA,CAAI,UAAU,wBAAyB,SAAUP,CAAA,CAAA,CAAA,EACpD,CAEJ,CAAC,EAEDN,EAAU,YAAc"}
@@ -1,2 +1,2 @@
1
- import{j as t,c8 as i,c9 as n,ca as l,cb as r,cc as d,cd as c}from"./vendor-Cnciq4o_.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new o.Error().stack;s&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[s]="3e203f56-12c5-43f1-8384-929f7670b2ac",o._sentryDebugIdIdentifier="sentry-dbid-3e203f56-12c5-43f1-8384-929f7670b2ac")}catch{}})();const f="_tooltip_1391b_17",a={tooltip:f};function b({text:o,children:s,...e}){return t.jsxs(i,{children:[t.jsx(n,{...e,children:s}),t.jsx(l,{children:t.jsx(r,{side:"bottom",sideOffset:4,children:t.jsxs(d,{className:a.tooltip,children:[t.jsx(c,{}),o]})})})]})}export{b as T};
2
- //# sourceMappingURL=Tooltip-BZrLdTBU.js.map
1
+ import{j as t,c8 as i,c9 as n,ca as l,cb as r,cc as d,cd as c}from"./vendor-CCiSQ9k9.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new o.Error().stack;s&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[s]="3e203f56-12c5-43f1-8384-929f7670b2ac",o._sentryDebugIdIdentifier="sentry-dbid-3e203f56-12c5-43f1-8384-929f7670b2ac")}catch{}})();const f="_tooltip_1391b_17",a={tooltip:f};function b({text:o,children:s,...e}){return t.jsxs(i,{children:[t.jsx(n,{...e,children:s}),t.jsx(l,{children:t.jsx(r,{side:"bottom",sideOffset:4,children:t.jsxs(d,{className:a.tooltip,children:[t.jsx(c,{}),o]})})})]})}export{b as T};
2
+ //# sourceMappingURL=Tooltip-D9XRnwOW.js.map
@@ -0,0 +1,4 @@
1
+ � dZN���rts�����d�aɜ-_^XY��EY#'���j�n�]���i|xA,�,��=�p!�Q<��O2CV `����
2
+ ���;��A��86�ǟ���5e�hl'�� ~L���Gz%.�n~1�(���*�W��@�������w�Ž ���v�%j��5�R����C�?�P��7 Ca��
3
+ �E� ��c2�x��0��f�����{�H����=G�ލ�Ki�ꍼ�'�L���2��b>������^\�����j�
4
+ E+� �XS��W�����.���2)��Q��;���>�H�L��A˰�B�:�়�� �},�زy�וy�(O)�+s��M���S��y�uF�f*�Ϩ��/?� >(|&7
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip-BZrLdTBU.js","sources":["../../src/common/components/tooltip/Tooltip.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\nimport { Tooltip as BaseTooltip } from '@base-ui-components/react/tooltip';\n\nimport style from './Tooltip.module.scss';\n\ninterface TooltipProps extends BaseTooltip.Trigger.Props {\n text: string;\n}\n\nexport default function Tooltip({ text, children, ...triggerProps }: PropsWithChildren<TooltipProps>) {\n return (\n <BaseTooltip.Root>\n <BaseTooltip.Trigger {...triggerProps}>{children}</BaseTooltip.Trigger>\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner side='bottom' sideOffset={4}>\n <BaseTooltip.Popup className={style.tooltip}>\n <BaseTooltip.Arrow />\n {text}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n}\n"],"names":["Tooltip","text","children","triggerProps","jsxs","BaseTooltip.Root","jsx","BaseTooltip.Trigger","BaseTooltip.Portal","BaseTooltip.Positioner","BaseTooltip.Popup","style","BaseTooltip.Arrow"],"mappings":"6dASA,SAAwBA,EAAQ,CAAE,KAAAC,EAAM,SAAAC,EAAU,GAAGC,GAAiD,CAElG,OAAAC,EAAA,KAACC,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAqB,GAAGJ,EAAe,SAAAD,CAAS,CAAA,QAChDM,EAAA,CACC,SAACF,EAAA,IAAAG,EAAA,CAAuB,KAAK,SAAS,WAAY,EAChD,SAACL,EAAAA,KAAAM,EAAA,CAAkB,UAAWC,EAAM,QAClC,SAAA,CAACL,EAAA,IAAAM,EAAA,EAAkB,EAClBX,CAAA,CACH,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"Tooltip-D9XRnwOW.js","sources":["../../src/common/components/tooltip/Tooltip.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\nimport { Tooltip as BaseTooltip } from '@base-ui-components/react/tooltip';\n\nimport style from './Tooltip.module.scss';\n\ninterface TooltipProps extends BaseTooltip.Trigger.Props {\n text: string;\n}\n\nexport default function Tooltip({ text, children, ...triggerProps }: PropsWithChildren<TooltipProps>) {\n return (\n <BaseTooltip.Root>\n <BaseTooltip.Trigger {...triggerProps}>{children}</BaseTooltip.Trigger>\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner side='bottom' sideOffset={4}>\n <BaseTooltip.Popup className={style.tooltip}>\n <BaseTooltip.Arrow />\n {text}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n );\n}\n"],"names":["Tooltip","text","children","triggerProps","jsxs","BaseTooltip.Root","jsx","BaseTooltip.Trigger","BaseTooltip.Portal","BaseTooltip.Positioner","BaseTooltip.Popup","style","BaseTooltip.Arrow"],"mappings":"6dASA,SAAwBA,EAAQ,CAAE,KAAAC,EAAM,SAAAC,EAAU,GAAGC,GAAiD,CAElG,OAAAC,EAAA,KAACC,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAqB,GAAGJ,EAAe,SAAAD,CAAS,CAAA,QAChDM,EAAA,CACC,SAACF,EAAA,IAAAG,EAAA,CAAuB,KAAK,SAAS,WAAY,EAChD,SAACL,EAAAA,KAAAM,EAAA,CAAkB,UAAWC,EAAM,QAClC,SAAA,CAACL,EAAA,IAAAM,EAAA,EAAkB,EAClBX,CAAA,CACH,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as n}from"./vendor-Cnciq4o_.js";import{K as t}from"./index-DdPXqLQ6.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},o=new e.Error().stack;o&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[o]="8aa200f6-d28e-4b17-9248-a3b00508174d",e._sentryDebugIdIdentifier="sentry-dbid-8aa200f6-d28e-4b17-9248-a3b00508174d")}catch{}})();function r(e){const{name:o,className:s}=e;return n.jsx("div",{className:s,children:n.jsx("img",{alt:"",src:`${t}/${o}`,className:"viewLogo"})})}export{r as V};
2
- //# sourceMappingURL=ViewLogo-CdsW41HC.js.map
1
+ import{j as n}from"./vendor-CCiSQ9k9.js";import{K as t}from"./index-BQEUaoAf.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},o=new e.Error().stack;o&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[o]="8aa200f6-d28e-4b17-9248-a3b00508174d",e._sentryDebugIdIdentifier="sentry-dbid-8aa200f6-d28e-4b17-9248-a3b00508174d")}catch{}})();function r(e){const{name:o,className:s}=e;return n.jsx("div",{className:s,children:n.jsx("img",{alt:"",src:`${t}/${o}`,className:"viewLogo"})})}export{r as V};
2
+ //# sourceMappingURL=ViewLogo-_3Z1hIHi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewLogo-CdsW41HC.js","sources":["../../src/common/components/view-logo/ViewLogo.tsx"],"sourcesContent":["import { projectLogoPath } from '../../api/constants';\n\nimport './ViewLogo.scss';\n\ninterface ViewLogoProps {\n name: string;\n className: string;\n}\n\nexport default function ViewLogo(props: ViewLogoProps) {\n const { name, className } = props;\n\n // we wrap the image in a div to help maintain the aspect ratio\n return (\n <div className={className}>\n <img alt='' src={`${projectLogoPath}/${name}`} className='viewLogo' />\n </div>\n );\n}\n"],"names":["ViewLogo","props","name","className","jsx","projectLogoPath"],"mappings":"2aASA,SAAwBA,EAASC,EAAsB,CAC/C,KAAA,CAAE,KAAAC,EAAM,UAAAC,CAAA,EAAcF,EAG5B,OACGG,EAAA,IAAA,MAAA,CAAI,UAAAD,EACH,SAAAC,MAAC,OAAI,IAAI,GAAG,IAAK,GAAGC,CAAe,IAAIH,CAAI,GAAI,UAAU,UAAW,CAAA,EACtE,CAEJ"}
1
+ {"version":3,"file":"ViewLogo-_3Z1hIHi.js","sources":["../../src/common/components/view-logo/ViewLogo.tsx"],"sourcesContent":["import { projectLogoPath } from '../../api/constants';\n\nimport './ViewLogo.scss';\n\ninterface ViewLogoProps {\n name: string;\n className: string;\n}\n\nexport default function ViewLogo(props: ViewLogoProps) {\n const { name, className } = props;\n\n // we wrap the image in a div to help maintain the aspect ratio\n return (\n <div className={className}>\n <img alt='' src={`${projectLogoPath}/${name}`} className='viewLogo' />\n </div>\n );\n}\n"],"names":["ViewLogo","props","name","className","jsx","projectLogoPath"],"mappings":"2aASA,SAAwBA,EAASC,EAAsB,CAC/C,KAAA,CAAE,KAAAC,EAAM,UAAAC,CAAA,EAAcF,EAG5B,OACGG,EAAA,IAAA,MAAA,CAAI,UAAAD,EACH,SAAAC,MAAC,OAAI,IAAI,GAAG,IAAK,GAAGC,CAAe,IAAIH,CAAI,GAAI,UAAU,UAAW,CAAA,EACtE,CAEJ"}
@@ -1 +1 @@
1
- ._blink_gc8wt_1{animation:_blink_gc8wt_1 1s step-start infinite}@keyframes _blink_gc8wt_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_gc8wt_13{transform:rotate(45deg)}._presetSection_gc8wt_17{background-color:#101010;display:flex;flex-direction:column;gap:.25rem;padding:1rem .5rem;margin-bottom:1rem;max-height:10rem;overflow-y:auto;scrollbar-gutter:stable}._preset_gc8wt_17{display:flex;align-items:center;gap:.5rem}._preset_gc8wt_17._active_gc8wt_34{color:#578af4}._presetActions_gc8wt_38{margin-left:auto}._blink_4jmjk_1{animation:_blink_4jmjk_1 1s step-start infinite}@keyframes _blink_4jmjk_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_4jmjk_13{transform:rotate(45deg)}._inline_4jmjk_17{display:flex;align-items:center;gap:.5rem}._input_4jmjk_23{color:#e2e2e2;border:1px solid transparent;border-radius:3px;background-color:#262626;padding:0 1rem;font-size:1rem;height:2.5rem;outline:none}._input_4jmjk_23:hover{background-color:#2d2d2d}._input_4jmjk_23:focus{background-color:#404040;color:#f6f6f6;border:1px solid #578AF4}._blink_1b4uk_1{animation:_blink_1b4uk_1 1s step-start infinite}@keyframes _blink_1b4uk_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1b4uk_13{transform:rotate(45deg)}._inline_1b4uk_17{display:inline-flex;align-items:center;flex-wrap:wrap;gap:1rem}._toggleSelect_1b4uk_24{display:flex;align-items:center;gap:.25rem;padding-inline:.5rem;height:2.5rem;background:#303030;color:#f6f6f6;line-height:1em;border-radius:3px}._toggleSelect_1b4uk_24:hover:not(:disabled):not(:active){background:#404040;color:#578af4}._toggleSelect_1b4uk_24:active:not(:disabled){background:#2d2d2d;border-color:#202020}._toggleSelect_1b4uk_24:after{content:"";margin-left:.25rem;width:.75em;height:.75em;background:var(--user-bg);border-radius:50%}._empty_1b4uk_52{color:#f6f6f6}._blink_r3z5t_1{animation:_blink_r3z5t_1 1s step-start infinite}@keyframes _blink_r3z5t_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_r3z5t_13{transform:rotate(45deg)}._section_r3z5t_17{color:#f6f6f6;font-size:1rem}._sectionHeader_r3z5t_22{display:flex;justify-content:space-between;align-items:center;height:2rem}._sectionHeader_r3z5t_22._collapsible_r3z5t_28{cursor:pointer}._label_r3z5t_32{margin-top:1rem;font-size:calc(1rem - 2px);color:#b1b1b1;display:flex;flex-direction:column;gap:.25rem}._title_r3z5t_41{font-size:calc(1rem - 2px);display:block;width:100%}._description_r3z5t_47{font-size:calc(1rem - 2px);display:block;color:#6c6c6c}._closed_r3z5t_53{transition:rotate .3s cubic-bezier(.45,1.005,0,1.005);rotate:0deg}._open_r3z5t_58{transition:rotate .3s cubic-bezier(.45,1.005,0,1.005);rotate:180deg}._hidden_r3z5t_63{display:none}._blink_19ylt_1{animation:_blink_19ylt_1 1s step-start infinite}@keyframes _blink_19ylt_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_19ylt_13{transform:rotate(45deg)}._drawerFooter_19ylt_17{display:flex;justify-content:end;gap:1rem}._drawerFooter_19ylt_17 button{padding:0 2em}._backdrop_19ylt_26{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000000b3;transition:opacity .3s cubic-bezier(.45,1.005,0,1.005)}._backdrop_19ylt_26[data-starting-style],._backdrop_19ylt_26[data-ending-style]{opacity:0}._drawer_19ylt_17{box-sizing:border-box;position:fixed;top:0;right:0;bottom:0;width:40rem;max-width:100vw;height:100vh;display:flex;flex-direction:column;padding-block:1rem 1.5rem;background-color:#202020;color:#f6f6f6;border-left:1px solid #2d2d2d}._drawer_19ylt_17[data-open]{transform:translate(0);transition:transform .3s cubic-bezier(.45,1.005,0,1.005)}._drawer_19ylt_17[data-starting-style],._drawer_19ylt_17[data-ending-style]{transform:translate(100%);transition:transform .5s cubic-bezier(.45,1.005,0,1.005)}@media (max-width: 500px){._drawer_19ylt_17{width:100vw}}._header_19ylt_66{padding-inline:1rem;display:flex;align-items:center;justify-content:space-between;height:3.5rem;font-weight:600;font-size:1.25rem}._body_19ylt_76{flex:1;padding-inline:1rem;padding-bottom:10vh;overflow-y:auto}._footer_19ylt_83{display:flex;padding-inline:1rem;gap:1rem;align-items:center;justify-content:flex-end}._sectionList_19ylt_91{display:flex;flex-direction:column;gap:2rem;padding-right:.5rem}._info_19ylt_98{margin-bottom:1rem}
1
+ ._blink_gc8wt_1{animation:_blink_gc8wt_1 1s step-start infinite}@keyframes _blink_gc8wt_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_gc8wt_13{transform:rotate(45deg)}._presetSection_gc8wt_17{background-color:#101010;display:flex;flex-direction:column;gap:.25rem;padding:1rem .5rem;margin-bottom:1rem;max-height:10rem;overflow-y:auto;scrollbar-gutter:stable}._preset_gc8wt_17{display:flex;align-items:center;gap:.5rem}._preset_gc8wt_17._active_gc8wt_34{color:#578af4}._presetActions_gc8wt_38{margin-left:auto}._blink_4jmjk_1{animation:_blink_4jmjk_1 1s step-start infinite}@keyframes _blink_4jmjk_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_4jmjk_13{transform:rotate(45deg)}._inline_4jmjk_17{display:flex;align-items:center;gap:.5rem}._input_4jmjk_23{color:#e2e2e2;border:1px solid transparent;border-radius:3px;background-color:#262626;padding:0 1rem;font-size:1rem;height:2.5rem;outline:none}._input_4jmjk_23:hover{background-color:#2d2d2d}._input_4jmjk_23:focus{background-color:#404040;color:#f6f6f6;border:1px solid #578AF4}._blink_1b4uk_1{animation:_blink_1b4uk_1 1s step-start infinite}@keyframes _blink_1b4uk_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1b4uk_13{transform:rotate(45deg)}._inline_1b4uk_17{display:inline-flex;align-items:center;flex-wrap:wrap;gap:1rem}._toggleSelect_1b4uk_24{display:flex;align-items:center;gap:.25rem;padding-inline:.5rem;height:2.5rem;background:#303030;color:#f6f6f6;line-height:1em;border-radius:3px}._toggleSelect_1b4uk_24:hover:not(:disabled):not(:active){background:#404040;color:#578af4}._toggleSelect_1b4uk_24:active:not(:disabled){background:#2d2d2d;border-color:#202020}._toggleSelect_1b4uk_24:after{content:"";margin-left:.25rem;width:.75em;height:.75em;background:var(--user-bg);border-radius:50%}._empty_1b4uk_52{color:#f6f6f6}._blink_r3z5t_1{animation:_blink_r3z5t_1 1s step-start infinite}@keyframes _blink_r3z5t_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_r3z5t_13{transform:rotate(45deg)}._section_r3z5t_17{color:#f6f6f6;font-size:1rem}._sectionHeader_r3z5t_22{display:flex;justify-content:space-between;align-items:center;height:2rem}._sectionHeader_r3z5t_22._collapsible_r3z5t_28{cursor:pointer}._label_r3z5t_32{margin-top:1rem;font-size:calc(1rem - 2px);color:#b1b1b1;display:flex;flex-direction:column;gap:.25rem}._title_r3z5t_41{font-size:calc(1rem - 2px);display:block;width:100%}._description_r3z5t_47{font-size:calc(1rem - 2px);display:block;color:#6c6c6c}._closed_r3z5t_53{transition:rotate .3s cubic-bezier(.45,1.005,0,1.005);rotate:0deg}._open_r3z5t_58{transition:rotate .3s cubic-bezier(.45,1.005,0,1.005);rotate:180deg}._hidden_r3z5t_63{display:none}._blink_1pnpt_1{animation:_blink_1pnpt_1 1s step-start infinite}@keyframes _blink_1pnpt_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1pnpt_13{transform:rotate(45deg)}._drawerFooter_1pnpt_17{display:flex;justify-content:end;gap:1rem}._drawerFooter_1pnpt_17 button{padding:0 2em}._backdrop_1pnpt_26{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000000b3;transition:opacity .3s cubic-bezier(.45,1.005,0,1.005)}._backdrop_1pnpt_26[data-starting-style],._backdrop_1pnpt_26[data-ending-style]{opacity:0}._drawer_1pnpt_17{box-sizing:border-box;position:fixed;top:0;right:0;bottom:0;width:40rem;max-width:100vw;height:100vh;height:100dvh;display:flex;flex-direction:column;padding-block:1rem 1.5rem;background-color:#202020;color:#f6f6f6;border-left:1px solid #2d2d2d}._drawer_1pnpt_17[data-open]{transform:translate(0);transition:transform .3s cubic-bezier(.45,1.005,0,1.005)}._drawer_1pnpt_17[data-starting-style],._drawer_1pnpt_17[data-ending-style]{transform:translate(100%);transition:transform .5s cubic-bezier(.45,1.005,0,1.005)}@media (max-width: 500px){._drawer_1pnpt_17{width:100vw}}._header_1pnpt_67{padding-inline:1rem;display:flex;align-items:center;justify-content:space-between;height:3.5rem;font-weight:600;font-size:1.25rem}._body_1pnpt_77{flex:1;padding-inline:1rem;padding-bottom:10vh;overflow-y:auto}._footer_1pnpt_84{display:flex;padding-inline:1rem;gap:1rem;align-items:center;justify-content:flex-end}._sectionList_1pnpt_92{display:flex;flex-direction:column;gap:2rem;padding-right:.5rem}._info_1pnpt_99{margin-bottom:1rem}
@@ -1,2 +1,2 @@
1
- import{l as j,j as a,h as d,aw as k,aT as N,D as V,p as E,q as D,s as F,G as $,t as I}from"./vendor-Cnciq4o_.js";import{bg as z,i as b,B as S,T as p,A as L,bh as A,g as M,M as H,y as T,z as O,bc as R,af as v,c as U,bi as B,ai as W}from"./index-DdPXqLQ6.js";import{C as q,I as Z}from"./useWindowTitle-BQ1kqXfk.js";import{S as G}from"./Select-CUjlJirY.js";import{d as J,S as K}from"./useProjectData-BF2F6qPB.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="f71f7914-b765-49a7-a3f8-ef58fac43068",e._sentryDebugIdIdentifier="sentry-dbid-f71f7914-b765-49a7-a3f8-ef58fac43068")}catch{}})();function Re(e,s=[],n=!0){const t=[...s];for(const[r,o]of Object.entries(e))n&&o.type==="image"||t.push({value:`custom-${r}`,label:`Custom: ${o.label}`});return t}function Ue(e,s=!0){const n=[];for(const[t,r]of Object.entries(e))s&&r.type==="image"||n.push({value:t,label:r.label,colour:r.colour||"transparent"});return n}function Be(e,s=[]){const n=e.custom.map((t,r)=>({value:`${r}-${t.title}`,label:t.title}));return[...s,...n]}function Q(e){return e.startsWith("#")?e.substring(1):e}function X(e){const s={defaultValues:{},colorFields:new Set,booleanFields:new Set,isPersistedField:new Set,persistedValues:{}};return e.forEach(n=>{n.options.forEach(t=>{t.type==="persist"?(s.isPersistedField.add(t.id),t.values&&(s.persistedValues[t.id]=t.values)):s.defaultValues[t.id]=String(t.defaultValue),t.type==="colour"?s.colorFields.add(t.id):t.type==="boolean"&&s.booleanFields.add(t.id)})}),s}function Y(e,s){const n=new URLSearchParams,t=new Set,r=X(s),o=(i,l)=>{const c=`${i}:${l}`;t.has(c)||(t.add(c),n.append(i,l))};return Object.entries(r.persistedValues).forEach(([i,l])=>{l.forEach(c=>{c&&o(i,c)})}),Object.entries(e).forEach(([i,l])=>{typeof l=="string"&&l.length&&(r.isPersistedField.has(i)&&(Array.from(t).forEach(c=>{c.startsWith(`${i}:`)&&t.delete(c)}),n.delete(i)),l.split(",").forEach(c=>{const m=r.colorFields.has(i)?Q(c):r.booleanFields.has(i)?c==="on"?"true":"false":c;(r.isPersistedField.has(i)||r.defaultValues[i]!==m)&&o(i,m)}))}),n}const ee="_presetSection_gc8wt_17",se="_preset_gc8wt_17",te="_active_gc8wt_34",ne="_presetActions_gc8wt_38",g={presetSection:ee,preset:se,active:te,presetActions:ne};function ae({target:e}){const{viewPresets:s}=z(e),[n,t]=j(),r=o=>{const i=new URLSearchParams(o.search);i.set("alias",o.alias),t(i)};return s.length===0?null:a.jsx("div",{className:g.presetSection,children:s.map(o=>{const i=n.get("alias")===o.alias;return a.jsxs("div",{className:b([g.preset,i&&g.active]),children:[a.jsx("div",{children:o.alias}),a.jsx(S,{variant:i?"ghosted":"subtle-white",onClick:()=>r(o),disabled:i,className:g.presetActions,children:i?"Applied":"Apply"})]},o.alias)})})}var x=(e=>(e.ClockOptions="Clock Options",e.TimerOptions="Timer Options",e.DataSources="Data sources",e.ElementVisibility="Element visibility",e.BehaviourOptions="View behaviour",e.StyleOverride="View style override",e.Animation="View animation",e.Schedule="Schedule options",e.Hidden="Hidden options",e))(x||{});function We(e,s,n,t,r,o){if(!r)return null;const i=o??s;if(n)return r.current===null?null:e?Math.max(r.current,0):r.current;switch(i){case p.CountDown:return r.current===null?null:e?Math.max(r.current,0):r.current;case p.CountUp:return Math.abs(r.elapsed??0);case p.Clock:return t;case p.None:return null;default:return null}}function re(e){return e===null?!1:(e==null?void 0:e.toLowerCase())==="true"||e==="1"}function qe(e){if(e)return e.startsWith("#")?e:`#${e}`}function Ze(e,s){var n;if(!(!e||typeof s!="string"||s==="none")){if(s.startsWith("custom-")){const t=s.split("custom-")[1];return(n=e.custom)==null?void 0:n[t]}return e[s]}}function Ge(e,s,n,t){if(e==null||s===p.None)return t.removeSeconds?L:A;if(s===p.Clock)return M(e);let r=e;t.removeSeconds&&r<-1e3&&s!==p.CountUp&&(r-=H);let o=T(r,{direction:s});return t.removeLeadingZero&&(o=O(o)),t.removeSeconds&&(o=oe(o,n)),o}function oe(e,s){return e=R(e),e.length<3?`${e} ${s}`:e}const ie="_inline_4jmjk_17",le={inline:ie},y=e=>e.startsWith("#")?e:`#${e}`;function ce({name:e,value:s}){const[n,t]=d.useState(()=>y(s));return d.useEffect(()=>{t(y(s))},[s]),a.jsxs("div",{className:le.inline,children:[a.jsx(J,{color:n,onChange:t,alwaysDisplayColor:!0}),a.jsx("span",{children:n}),a.jsx("input",{type:"hidden",name:e,value:n})]})}const ue="_inline_1b4uk_17",de="_toggleSelect_1b4uk_24",fe="_empty_1b4uk_52",_={inline:ue,toggleSelect:de,empty:fe};function w({paramField:e}){const[s]=j(),{id:n,type:t,defaultValue:r}=e;if(t==="persist")return!e.values||!e.values.length?null:a.jsx("input",{hidden:!0,name:n,readOnly:!0,value:e.values.join(",")});if(t==="option"){const c=s.get(n)||r;return e.values.length===0?a.jsx("span",{className:_.empty,children:"No options available"}):a.jsx(pe,{id:n,initialValue:c,options:e.values})}if(t==="multi-option"){const l=s.getAll(n);return a.jsx(me,{paramField:e,options:l.length?l:e.defaultValue??[""]})}if(t==="boolean")return a.jsx(he,{id:n,initialValue:re(s.get(n))??r});if(t==="number"){const{placeholder:l}=e,c=s.get(n)??r;return a.jsx(v,{height:"large",type:"number",step:"any",name:n,defaultValue:c,placeholder:l})}if(t==="colour")return a.jsx(ce,{name:n,value:s.get(n)??r});const o=s.get(n)??r??"",{placeholder:i}=e;return a.jsx(ge,{id:n,initialValue:o,placeholder:i})}function me({paramField:e,options:s}){const{id:n,values:t}=e,[r,o]=d.useState(s);d.useEffect(()=>{o(s)},[s]);const i=(l,c)=>{o(c?m=>[...m,l]:m=>m.filter(u=>u!==l))};return t.length===0?a.jsx("span",{className:_.empty,children:"No options available"}):a.jsxs(a.Fragment,{children:[a.jsx("input",{name:n,hidden:!0,readOnly:!0,value:r.join(",")}),a.jsx("div",{className:_.inline,children:t.map(l=>a.jsxs("label",{className:_.toggleSelect,style:{"--user-bg":l.colour},children:[a.jsx(q,{checked:r.includes(l.value),onCheckedChange:c=>i(l.value,c)}),l.label]},l.value))})]})}function he({id:e,initialValue:s}){const[n,t]=d.useState(s);return d.useEffect(()=>{t(s)},[s]),a.jsx(K,{size:"large",name:e,checked:n,onCheckedChange:t})}function pe({id:e,initialValue:s,options:n}){const[t,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),a.jsx(G,{size:"large",name:e,options:n,value:t,onValueChange:o=>r(o)})}function ge({id:e,initialValue:s,...n}){const[t,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),a.jsx(v,{height:"large",name:e,value:t,onChange:o=>r(o.target.value),...n})}const _e="_section_r3z5t_17",be="_sectionHeader_r3z5t_22",Se="_collapsible_r3z5t_28",je="_label_r3z5t_32",ye="_title_r3z5t_41",ve="_description_r3z5t_47",xe="_closed_r3z5t_53",we="_open_r3z5t_58",Ce="_hidden_r3z5t_63",f={section:_e,sectionHeader:be,collapsible:Se,label:je,title:ye,description:ve,closed:xe,open:we,hidden:Ce};function Pe({title:e,collapsible:s,options:n}){const[t,r]=k({key:`params-${e}`,defaultValue:!1}),o=()=>{s&&r(i=>!i)};return a.jsx("section",{className:f.section,children:e===x.Hidden?a.jsx(Ne,{options:n}):a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:b([f.sectionHeader,s&&f.collapsible]),onClick:o,children:[e,s&&a.jsx(N,{className:b([t?f.closed:f.open])})]}),a.jsx(ke,{options:n,collapsed:t})]})})}function ke({options:e,collapsed:s}){return a.jsx(a.Fragment,{children:e.map(n=>a.jsxs("label",{className:b([f.label,s&&f.hidden]),children:[a.jsx("span",{className:f.title,children:n.title}),a.jsx("span",{className:f.description,children:n.description}),a.jsx(w,{paramField:n})]},n.title))})}function Ne({options:e}){return a.jsx(a.Fragment,{children:e.map((s,n)=>a.jsx(w,{paramField:s},s.title+n))})}const Ve="_backdrop_19ylt_26",Ee="_drawer_19ylt_17",De="_header_19ylt_66",Fe="_body_19ylt_76",$e="_footer_19ylt_83",Ie="_sectionList_19ylt_91",ze="_info_19ylt_98",h={backdrop:Ve,drawer:Ee,header:De,body:Fe,footer:$e,sectionList:Ie,info:ze},Je=d.memo(Le);function Le({target:e,viewOptions:s}){const[n,t]=j(),{data:r}=U(),{isOpen:o,close:i}=B(),l=()=>{i()},c=()=>{t()},m=u=>{u.preventDefault();const C=Object.fromEntries(new FormData(u.currentTarget)),P=Y(C,s);t(P)};return a.jsx(V,{open:o,onOpenChange:u=>{u||l()},children:a.jsxs(E,{children:[a.jsx(D,{className:h.backdrop}),a.jsxs(F,{className:h.drawer,children:[a.jsxs("div",{className:h.header,children:[a.jsx($,{children:"Customise"}),a.jsx(W,{variant:"subtle-white",size:"large","data-testid":"close-view-params",onClick:l,children:a.jsx(I,{})})]}),a.jsxs("div",{className:h.body,children:[r.overrideStyles&&a.jsx(Z,{className:h.info,children:"This view style is being modified by a custom CSS file."}),a.jsx(ae,{target:e}),a.jsx("form",{id:"edit-params-form",onSubmit:m,className:h.sectionList,children:s.map(u=>a.jsx(Pe,{title:u.title,collapsible:u.collapsible,options:u.options},u.title))})]}),a.jsxs("div",{className:h.footer,children:[a.jsx(S,{variant:"subtle",size:"large",onClick:c,type:"reset",children:"Reset to default"}),a.jsx(S,{variant:"primary",size:"large",form:"edit-params-form",type:"submit","data-testid":"apply-view-params",children:"Apply"})]})]})]})})}export{x as O,Je as V,qe as a,Ge as b,We as c,Be as d,Ue as e,Ze as g,re as i,Re as m};
2
- //# sourceMappingURL=ViewParamsEditor-YoYxps2g.js.map
1
+ import{l as j,j as a,h as d,aw as k,aT as N,D as V,p as E,q as D,s as F,G as $,t as I}from"./vendor-CCiSQ9k9.js";import{bf as z,i as b,B as S,T as p,A as L,bg as A,g as M,M as H,y as T,z as O,bc as R,af as x,c as U,bh as B,ai as W}from"./index-BQEUaoAf.js";import{C as q,I as Z}from"./useWindowTitle-DqdFTWns.js";import{S as G}from"./Select-CedN80WS.js";import{d as J,S as K}from"./useProjectData-C1hVamxc.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="d0536033-2cd2-4b3e-abeb-8525bd470621",e._sentryDebugIdIdentifier="sentry-dbid-d0536033-2cd2-4b3e-abeb-8525bd470621")}catch{}})();function Re(e,s=[],n=!0){const t=[...s];for(const[r,o]of Object.entries(e))n&&o.type==="image"||t.push({value:`custom-${r}`,label:`Custom: ${o.label}`});return t}function Ue(e,s=!0){const n=[];for(const[t,r]of Object.entries(e))s&&r.type==="image"||n.push({value:t,label:r.label,colour:r.colour||"transparent"});return n}function Be(e,s=[]){const n=e.custom.map((t,r)=>({value:`${r}-${t.title}`,label:t.title}));return[...s,...n]}function Q(e){return e.startsWith("#")?e.substring(1):e}function X(e){const s={defaultValues:{},colorFields:new Set,booleanFields:new Set,isPersistedField:new Set,persistedValues:{}};return e.forEach(n=>{n.options.forEach(t=>{t.type==="persist"?(s.isPersistedField.add(t.id),t.values&&(s.persistedValues[t.id]=t.values)):s.defaultValues[t.id]=String(t.defaultValue),t.type==="colour"?s.colorFields.add(t.id):t.type==="boolean"&&s.booleanFields.add(t.id)})}),s}function Y(e,s){const n=new URLSearchParams,t=new Set,r=X(s),o=(i,l)=>{const c=`${i}:${l}`;t.has(c)||(t.add(c),n.append(i,l))};return Object.entries(r.persistedValues).forEach(([i,l])=>{l.forEach(c=>{c&&o(i,c)})}),Object.entries(e).forEach(([i,l])=>{typeof l=="string"&&l.length&&(r.isPersistedField.has(i)&&(Array.from(t).forEach(c=>{c.startsWith(`${i}:`)&&t.delete(c)}),n.delete(i)),l.split(",").forEach(c=>{const m=r.colorFields.has(i)?Q(c):r.booleanFields.has(i)?c==="on"?"true":"false":c;(r.isPersistedField.has(i)||r.defaultValues[i]!==m)&&o(i,m)}))}),n}const ee="_presetSection_gc8wt_17",se="_preset_gc8wt_17",te="_active_gc8wt_34",ne="_presetActions_gc8wt_38",g={presetSection:ee,preset:se,active:te,presetActions:ne};function ae({target:e}){const{viewPresets:s}=z(e),[n,t]=j(),r=o=>{const i=new URLSearchParams(o.search);i.set("alias",o.alias),t(i)};return s.length===0?null:a.jsx("div",{className:g.presetSection,children:s.map(o=>{const i=n.get("alias")===o.alias;return a.jsxs("div",{className:b([g.preset,i&&g.active]),children:[a.jsx("div",{children:o.alias}),a.jsx(S,{variant:i?"ghosted":"subtle-white",onClick:()=>r(o),disabled:i,className:g.presetActions,children:i?"Applied":"Apply"})]},o.alias)})})}var y=(e=>(e.ClockOptions="Clock Options",e.TimerOptions="Timer Options",e.DataSources="Data sources",e.ElementVisibility="Element visibility",e.BehaviourOptions="View behaviour",e.StyleOverride="View style override",e.Animation="View animation",e.Schedule="Schedule options",e.Hidden="Hidden options",e))(y||{});function We(e,s,n,t,r,o){if(!r)return null;const i=o??s;if(n)return r.current===null?null:e?Math.max(r.current,0):r.current;switch(i){case p.CountDown:return r.current===null?null:e?Math.max(r.current,0):r.current;case p.CountUp:return Math.abs(r.elapsed??0);case p.Clock:return t;case p.None:return null;default:return null}}function re(e){return e===null?!1:(e==null?void 0:e.toLowerCase())==="true"||e==="1"}function qe(e){if(e)return e.startsWith("#")?e:`#${e}`}function Ze(e,s){var n;if(!(!e||typeof s!="string"||s==="none")){if(s.startsWith("custom-")){const t=s.split("custom-")[1];return(n=e.custom)==null?void 0:n[t]}return e[s]}}function Ge(e,s,n,t){if(e==null||s===p.None)return t.removeSeconds?L:A;if(s===p.Clock)return M(e);let r=e;t.removeSeconds&&r<-1e3&&s!==p.CountUp&&(r-=H);let o=T(r,{direction:s});return t.removeLeadingZero&&(o=O(o)),t.removeSeconds&&(o=oe(o,n)),o}function oe(e,s){return e=R(e),e.length<3?`${e} ${s}`:e}const ie="_inline_4jmjk_17",le={inline:ie},v=e=>e.startsWith("#")?e:`#${e}`;function ce({name:e,value:s}){const[n,t]=d.useState(()=>v(s));return d.useEffect(()=>{t(v(s))},[s]),a.jsxs("div",{className:le.inline,children:[a.jsx(J,{color:n,onChange:t,alwaysDisplayColor:!0}),a.jsx("span",{children:n}),a.jsx("input",{type:"hidden",name:e,value:n})]})}const ue="_inline_1b4uk_17",de="_toggleSelect_1b4uk_24",fe="_empty_1b4uk_52",_={inline:ue,toggleSelect:de,empty:fe};function w({paramField:e}){const[s]=j(),{id:n,type:t,defaultValue:r}=e;if(t==="persist")return!e.values||!e.values.length?null:a.jsx("input",{hidden:!0,name:n,readOnly:!0,value:e.values.join(",")});if(t==="option"){const c=s.get(n)||r;return e.values.length===0?a.jsx("span",{className:_.empty,children:"No options available"}):a.jsx(pe,{id:n,initialValue:c,options:e.values})}if(t==="multi-option"){const l=s.getAll(n);return a.jsx(me,{paramField:e,options:l.length?l:e.defaultValue??[""]})}if(t==="boolean")return a.jsx(he,{id:n,initialValue:re(s.get(n))??r});if(t==="number"){const{placeholder:l}=e,c=s.get(n)??r;return a.jsx(x,{height:"large",type:"number",step:"any",name:n,defaultValue:c,placeholder:l})}if(t==="colour")return a.jsx(ce,{name:n,value:s.get(n)??r});const o=s.get(n)??r??"",{placeholder:i}=e;return a.jsx(ge,{id:n,initialValue:o,placeholder:i})}function me({paramField:e,options:s}){const{id:n,values:t}=e,[r,o]=d.useState(s);d.useEffect(()=>{o(s)},[s]);const i=(l,c)=>{o(c?m=>[...m,l]:m=>m.filter(u=>u!==l))};return t.length===0?a.jsx("span",{className:_.empty,children:"No options available"}):a.jsxs(a.Fragment,{children:[a.jsx("input",{name:n,hidden:!0,readOnly:!0,value:r.join(",")}),a.jsx("div",{className:_.inline,children:t.map(l=>a.jsxs("label",{className:_.toggleSelect,style:{"--user-bg":l.colour},children:[a.jsx(q,{checked:r.includes(l.value),onCheckedChange:c=>i(l.value,c)}),l.label]},l.value))})]})}function he({id:e,initialValue:s}){const[n,t]=d.useState(s);return d.useEffect(()=>{t(s)},[s]),a.jsx(K,{size:"large",name:e,checked:n,onCheckedChange:t})}function pe({id:e,initialValue:s,options:n}){const[t,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),a.jsx(G,{size:"large",name:e,options:n,value:t,onValueChange:o=>r(o)})}function ge({id:e,initialValue:s,...n}){const[t,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),a.jsx(x,{height:"large",name:e,value:t,onChange:o=>r(o.target.value),...n})}const _e="_section_r3z5t_17",be="_sectionHeader_r3z5t_22",Se="_collapsible_r3z5t_28",je="_label_r3z5t_32",ve="_title_r3z5t_41",xe="_description_r3z5t_47",ye="_closed_r3z5t_53",we="_open_r3z5t_58",Ce="_hidden_r3z5t_63",f={section:_e,sectionHeader:be,collapsible:Se,label:je,title:ve,description:xe,closed:ye,open:we,hidden:Ce};function Pe({title:e,collapsible:s,options:n}){const[t,r]=k({key:`params-${e}`,defaultValue:!1}),o=()=>{s&&r(i=>!i)};return a.jsx("section",{className:f.section,children:e===y.Hidden?a.jsx(Ne,{options:n}):a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:b([f.sectionHeader,s&&f.collapsible]),onClick:o,children:[e,s&&a.jsx(N,{className:b([t?f.closed:f.open])})]}),a.jsx(ke,{options:n,collapsed:t})]})})}function ke({options:e,collapsed:s}){return a.jsx(a.Fragment,{children:e.map(n=>a.jsxs("label",{className:b([f.label,s&&f.hidden]),children:[a.jsx("span",{className:f.title,children:n.title}),a.jsx("span",{className:f.description,children:n.description}),a.jsx(w,{paramField:n})]},n.title))})}function Ne({options:e}){return a.jsx(a.Fragment,{children:e.map((s,n)=>a.jsx(w,{paramField:s},s.title+n))})}const Ve="_backdrop_1pnpt_26",Ee="_drawer_1pnpt_17",De="_header_1pnpt_67",Fe="_body_1pnpt_77",$e="_footer_1pnpt_84",Ie="_sectionList_1pnpt_92",ze="_info_1pnpt_99",h={backdrop:Ve,drawer:Ee,header:De,body:Fe,footer:$e,sectionList:Ie,info:ze},Je=d.memo(Le);function Le({target:e,viewOptions:s}){const[n,t]=j(),{data:r}=U(),{isOpen:o,close:i}=B(),l=()=>{i()},c=()=>{t()},m=u=>{u.preventDefault();const C=Object.fromEntries(new FormData(u.currentTarget)),P=Y(C,s);t(P)};return a.jsx(V,{open:o,onOpenChange:u=>{u||l()},children:a.jsxs(E,{children:[a.jsx(D,{className:h.backdrop}),a.jsxs(F,{className:h.drawer,children:[a.jsxs("div",{className:h.header,children:[a.jsx($,{children:"Customise"}),a.jsx(W,{variant:"subtle-white",size:"large","data-testid":"close-view-params",onClick:l,children:a.jsx(I,{})})]}),a.jsxs("div",{className:h.body,children:[r.overrideStyles&&a.jsx(Z,{className:h.info,children:"This view style is being modified by a custom CSS file."}),a.jsx(ae,{target:e}),a.jsx("form",{id:"edit-params-form",onSubmit:m,className:h.sectionList,children:s.map(u=>a.jsx(Pe,{title:u.title,collapsible:u.collapsible,options:u.options},u.title))})]}),a.jsxs("div",{className:h.footer,children:[a.jsx(S,{variant:"subtle",size:"large",onClick:c,type:"reset",children:"Reset to default"}),a.jsx(S,{variant:"primary",size:"large",form:"edit-params-form",type:"submit","data-testid":"apply-view-params",children:"Apply"})]})]})]})})}export{y as O,Je as V,qe as a,Ge as b,We as c,Be as d,Ue as e,Ze as g,re as i,Re as m};
2
+ //# sourceMappingURL=ViewParamsEditor-Bca1TIDW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewParamsEditor-YoYxps2g.js","sources":["../../src/common/components/view-params-editor/viewParams.utils.ts","../../src/common/components/view-params-editor/ViewParamsPresets.tsx","../../src/common/components/view-params-editor/constants.ts","../../src/features/viewers/common/viewUtils.ts","../../src/common/components/view-params-editor/InlineColourPicker.tsx","../../src/common/components/view-params-editor/ParamInput.tsx","../../src/common/components/view-params-editor/ViewParamsSection.tsx","../../src/common/components/view-params-editor/ViewParamsEditor.tsx"],"sourcesContent":["import type { CustomFields, ProjectData } from 'ontime-types';\n\nimport type { SelectOption } from '../select/Select';\n\nimport type { MultiselectOption, ViewOption } from './viewParams.types';\n\n/**\n * Creates a list of custom fields for a select\n * Filters out image type custom fields\n */\nexport function makeOptionsFromCustomFields(\n customFields: CustomFields,\n additionalOptions: SelectOption[] = [],\n filterImageType = true,\n): SelectOption[] {\n const options: SelectOption[] = [...additionalOptions];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: `custom-${key}`,\n label: `Custom: ${value.label}`,\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a multiselect component from custom fields\n * Filters out image type custom fields\n */\nexport function makeCustomFieldSelectOptions(customFields: CustomFields, filterImageType = true): MultiselectOption[] {\n const options: MultiselectOption[] = [];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: key,\n label: value.label,\n colour: value.colour || 'transparent',\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a select element that displays project custom data\n */\nexport function makeProjectDataOptions(\n projectData: ProjectData,\n additionalOptions: SelectOption[] = [],\n): SelectOption[] {\n const generatedOptions = projectData.custom.map((entry, index) => {\n return {\n value: `${index}-${entry.title}`,\n label: entry.title,\n };\n });\n\n return [...additionalOptions, ...generatedOptions];\n}\n\ntype ViewParamsObj = { [key: string]: string | FormDataEntryValue };\n\n/**\n * Utility remove the # character from a hex string\n */\nfunction sanitiseColour(colour: string) {\n if (colour.startsWith('#')) {\n return colour.substring(1);\n }\n return colour;\n}\n\ntype FieldMetadata = {\n defaultValues: Record<string, string>;\n colorFields: Set<string>;\n booleanFields: Set<string>;\n isPersistedField: Set<string>;\n persistedValues: Record<string, string[]>;\n};\n\n/**\n * Utility collects metadata about fields from view options\n * - where are the default values\n * - which fields are colours\n * - which fields are persisted\n */\nfunction collectFieldMetadata(paramFields: ViewOption[]): FieldMetadata {\n const metadata: FieldMetadata = {\n defaultValues: {},\n colorFields: new Set(),\n booleanFields: new Set(),\n isPersistedField: new Set(),\n persistedValues: {},\n };\n\n paramFields.forEach((section) => {\n section.options.forEach((option) => {\n if (option.type === 'persist') {\n metadata.isPersistedField.add(option.id);\n if (option.values) {\n metadata.persistedValues[option.id] = option.values;\n }\n } else {\n metadata.defaultValues[option.id] = String(option.defaultValue);\n }\n\n if (option.type === 'colour') {\n metadata.colorFields.add(option.id);\n } else if (option.type === 'boolean') {\n metadata.booleanFields.add(option.id);\n }\n });\n });\n\n return metadata;\n}\n\n/**\n * Makes a new URLSearchParams object from the given params object\n * @param paramsObj - The object containing parameters to be converted\n * @param paramFields - The view options that define the parameters\n * @returns A new URLSearchParams object with the parameters\n */\nexport function getURLSearchParamsFromObj(paramsObj: ViewParamsObj, paramFields: ViewOption[]) {\n const newSearchParams = new URLSearchParams();\n const addedPairs = new Set<string>();\n const metadata = collectFieldMetadata(paramFields);\n\n // Utility function to safely add params without duplicates\n const addUniqueParam = (id: string, value: string) => {\n const pair = `${id}:${value}`;\n if (!addedPairs.has(pair)) {\n addedPairs.add(pair);\n newSearchParams.append(id, value);\n }\n };\n\n // First add all persisted values\n Object.entries(metadata.persistedValues).forEach(([id, values]) => {\n values.forEach((value) => {\n if (value) {\n addUniqueParam(id, value);\n }\n });\n });\n\n // Then process user-provided values\n Object.entries(paramsObj).forEach(([id, value]) => {\n if (typeof value === 'string' && value.length) {\n // For persisted fields, clear existing values before adding new ones\n if (metadata.isPersistedField.has(id)) {\n // Clear tracking of previous values for this field\n Array.from(addedPairs).forEach((pair) => {\n if (pair.startsWith(`${id}:`)) {\n addedPairs.delete(pair);\n }\n });\n newSearchParams.delete(id);\n }\n\n // Process and add new values\n value.split(',').forEach((v) => {\n // some field types need extra processing\n const processedValue = (() => {\n if (metadata.colorFields.has(id)) {\n return sanitiseColour(v);\n }\n if (metadata.booleanFields.has(id)) {\n return v === 'on' ? 'true' : 'false';\n }\n return v;\n })();\n if (metadata.isPersistedField.has(id) || metadata.defaultValues[id] !== processedValue) {\n addUniqueParam(id, processedValue);\n }\n });\n }\n });\n\n return newSearchParams;\n}\n","import { useSearchParams } from 'react-router';\nimport { OntimeView, URLPreset } from 'ontime-types';\n\nimport { useViewUrlPresets } from '../../hooks-query/useUrlPresets';\nimport { cx } from '../../utils/styleUtils';\nimport Button from '../buttons/Button';\n\nimport style from './ViewParamsPresets.module.scss';\n\n/**\n * Shows a list of presets for the current view\n */\nexport function ViewParamsPresets({ target }: { target: OntimeView }) {\n const { viewPresets } = useViewUrlPresets(target);\n const [searchParams, setSearchParams] = useSearchParams();\n\n const handleRecall = (preset: URLPreset) => {\n const newSearch = new URLSearchParams(preset.search);\n newSearch.set('alias', preset.alias);\n setSearchParams(newSearch);\n };\n\n if (viewPresets.length === 0) {\n return null;\n }\n\n return (\n <div className={style.presetSection}>\n {viewPresets.map((preset) => {\n const active = searchParams.get('alias') === preset.alias;\n return (\n <div key={preset.alias} className={cx([style.preset, active && style.active])}>\n <div>{preset.alias}</div>\n <Button\n variant={active ? 'ghosted' : 'subtle-white'}\n onClick={() => handleRecall(preset)}\n disabled={active}\n className={style.presetActions}\n >\n {active ? 'Applied' : 'Apply'}\n </Button>\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * Gathers possible titles for view options\n */\nexport enum OptionTitle {\n ClockOptions = 'Clock Options',\n TimerOptions = 'Timer Options',\n DataSources = 'Data sources',\n ElementVisibility = 'Element visibility',\n BehaviourOptions = 'View behaviour',\n StyleOverride = 'View style override',\n Animation = 'View animation',\n Schedule = 'Schedule options',\n\n /** rendered as hidden inputs */\n Hidden = 'Hidden options',\n}\n","import { MaybeNumber, MaybeString, OntimeEvent, TimerState, TimerType } from 'ontime-types';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString, removeLeadingZero, removeSeconds } from 'ontime-utils';\n\nimport { timerPlaceholder, timerPlaceholderMin } from '../../../common/utils/styleUtils';\nimport { formatTime } from '../../../common/utils/time';\n\n/**\n * Gathers all options that affect which timer is displayed and selects the correct data source to display\n * it also handles edge cases such as freezing on end\n */\nexport function getTimerByType(\n freezeEnd: boolean,\n timerTypeNow: TimerType,\n countToEndNow: boolean,\n clock: number,\n timerObject: Pick<TimerState, 'current' | 'elapsed'>,\n timerTypeOverride?: TimerType,\n): number | null {\n if (!timerObject) {\n return null;\n }\n\n const viewTimerType = timerTypeOverride ?? timerTypeNow;\n\n if (countToEndNow) {\n if (timerObject.current === null) {\n return null;\n }\n return freezeEnd ? Math.max(timerObject.current, 0) : timerObject.current;\n }\n\n switch (viewTimerType) {\n case TimerType.CountDown:\n if (timerObject.current === null) {\n return null;\n }\n return freezeEnd ? Math.max(timerObject.current, 0) : timerObject.current;\n case TimerType.CountUp:\n return Math.abs(timerObject.elapsed ?? 0);\n case TimerType.Clock:\n return clock;\n case TimerType.None:\n return null;\n default: {\n viewTimerType satisfies never;\n return null;\n }\n }\n}\n\n/**\n * Parses a string to semantically verify if it represents a true value\n * Used in the context of parsing search params and local storage items which can be strings or null\n */\nexport function isStringBoolean(text: string | null) {\n if (text === null) {\n return false;\n }\n return text?.toLowerCase() === 'true' || text === '1';\n}\n\n/**\n * Prepares a colour string for use in views\n * Colours in params do not have the #prefix\n */\nexport function makeColourString(hex: string | null): string | undefined {\n if (!hex) {\n return undefined;\n }\n // ensure the hex starts with a #\n return hex.startsWith('#') ? hex : `#${hex}`;\n}\n\n/**\n * Retrieves a dynamic property from an event\n * Considers custom fields\n */\nexport function getPropertyValue(event: OntimeEvent | null, property: MaybeString): string | undefined {\n if (!event || typeof property !== 'string' || property === 'none') {\n return undefined;\n }\n\n if (property.startsWith('custom-')) {\n const field = property.split('custom-')[1];\n return event.custom?.[field];\n }\n\n return event[property as keyof OntimeEvent] as string;\n}\n\ntype FormattingOptions = {\n removeSeconds: boolean;\n removeLeadingZero: boolean;\n};\n\nexport function getFormattedTimer(\n timer: MaybeNumber,\n timerType: TimerType,\n localisedMinutes: string,\n options: FormattingOptions,\n): string {\n if (timer == null || timerType === TimerType.None) {\n return options.removeSeconds ? timerPlaceholderMin : timerPlaceholder;\n }\n\n if (timerType === TimerType.Clock) {\n return formatTime(timer);\n }\n\n let timeToParse = timer;\n if (options.removeSeconds) {\n const isNegative = timeToParse < -MILLIS_PER_SECOND && timerType !== TimerType.CountUp;\n if (isNegative) {\n // in negative numbers, we need to round down\n timeToParse -= MILLIS_PER_MINUTE;\n }\n }\n\n let display = millisToString(timeToParse, { direction: timerType });\n if (options.removeLeadingZero) {\n display = removeLeadingZero(display);\n }\n\n if (options.removeSeconds) {\n display = formatDisplayWithMinutes(display, localisedMinutes);\n }\n return display;\n}\n\nfunction formatDisplayWithMinutes(display: string, localisedMinutes: string): string {\n display = removeSeconds(display);\n return display.length < 3 ? `${display} ${localisedMinutes}` : display;\n}\n","import { useEffect, useState } from 'react';\n\nimport SwatchPicker from '../input/colour-input/SwatchPicker';\n\nimport style from './InlineColourPicker.module.scss';\n\ninterface InlineColourPickerProps {\n name: string;\n value: string;\n}\n\nconst ensureHex = (value: string) => {\n if (!value.startsWith('#')) {\n return `#${value}`;\n }\n return value;\n};\n\nexport default function InlineColourPicker({ name, value }: InlineColourPickerProps) {\n const [colour, setColour] = useState(() => ensureHex(value));\n\n useEffect(() => {\n setColour(ensureHex(value));\n }, [value]);\n\n return (\n <div className={style.inline}>\n <SwatchPicker color={colour} onChange={setColour} alwaysDisplayColor />\n <span>{colour}</span>\n <input type='hidden' name={name} value={colour} />\n </div>\n );\n}\n","import { ComponentProps, useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { isStringBoolean } from '../../../features/viewers/common/viewUtils';\nimport Checkbox from '../checkbox/Checkbox';\nimport Input from '../input/input/Input';\nimport Select, { SelectOption } from '../select/Select';\nimport Switch from '../switch/Switch';\n\nimport InlineColourPicker from './InlineColourPicker';\nimport { ParamField } from './viewParams.types';\n\nimport style from './ParamInput.module.scss';\n\ninterface ParamInputProps {\n paramField: ParamField;\n}\n\nexport default function ParamInput({ paramField }: ParamInputProps) {\n const [searchParams] = useSearchParams();\n const { id, type, defaultValue } = paramField;\n\n if (type === 'persist') {\n if (!paramField.values || !paramField.values.length) {\n return null;\n }\n return <input hidden name={id} readOnly value={paramField.values.join(',')} />;\n }\n\n if (type === 'option') {\n const optionFromParams = searchParams.get(id);\n const defaultOptionValue = optionFromParams || defaultValue;\n\n if (paramField.values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return <ControlledSelect id={id} initialValue={defaultOptionValue} options={paramField.values} />;\n }\n\n if (type === 'multi-option') {\n const optionFromParams = searchParams.getAll(id);\n\n return (\n <MultiOption\n paramField={paramField}\n options={optionFromParams.length ? optionFromParams : paramField.defaultValue ?? ['']}\n />\n );\n }\n\n if (type === 'boolean') {\n return <ControlledSwitch id={id} initialValue={isStringBoolean(searchParams.get(id)) ?? defaultValue} />;\n }\n\n if (type === 'number') {\n const { placeholder } = paramField;\n const defaultNumberValue = searchParams.get(id) ?? defaultValue;\n\n return (\n <Input\n height='large'\n type='number'\n step='any'\n name={id}\n defaultValue={defaultNumberValue}\n placeholder={placeholder}\n />\n );\n }\n\n if (type === 'colour') {\n return <InlineColourPicker name={id} value={searchParams.get(id) ?? defaultValue} />;\n }\n\n const defaultStringValue = searchParams.get(id) ?? defaultValue ?? '';\n const { placeholder } = paramField;\n\n return <ControlledInput id={id} initialValue={defaultStringValue} placeholder={placeholder} />;\n}\n\ninterface EditFormMultiOptionProps {\n paramField: ParamField & { type: 'multi-option' };\n options: string[];\n}\n\nfunction MultiOption({ paramField, options }: EditFormMultiOptionProps) {\n const { id, values } = paramField;\n const [paramState, setParamState] = useState<string[]>(options);\n\n // synchronise options\n useEffect(() => {\n setParamState(options);\n }, [options]);\n\n const toggleValue = (value: string, checked: boolean) => {\n if (checked) {\n setParamState((prev) => [...prev, value]);\n } else {\n setParamState((prev) => prev.filter((v) => v !== value));\n }\n };\n\n if (values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return (\n <>\n <input name={id} hidden readOnly value={paramState.join(',')} />\n <div className={style.inline}>\n {values.map((option) => {\n return (\n <label\n key={option.value}\n className={style.toggleSelect}\n style={{\n '--user-bg': option.colour,\n }}\n >\n <Checkbox\n checked={paramState.includes(option.value)}\n onCheckedChange={(checked) => toggleValue(option.value, checked as boolean)}\n />\n {option.label}\n </label>\n );\n })}\n </div>\n </>\n );\n}\n\ninterface ControlledSwitchProps {\n id: string;\n initialValue: boolean;\n}\nfunction ControlledSwitch({ id, initialValue }: ControlledSwitchProps) {\n const [checked, setChecked] = useState(initialValue);\n\n // synchronise checked state\n useEffect(() => {\n setChecked(initialValue);\n }, [initialValue]);\n\n return <Switch size='large' name={id} checked={checked} onCheckedChange={setChecked} />;\n}\n\ninterface ControlledSelectProps {\n id: string;\n initialValue?: string;\n options: SelectOption[];\n}\nfunction ControlledSelect({ id, initialValue, options }: ControlledSelectProps) {\n const [selected, setSelected] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setSelected(initialValue);\n }, [initialValue]);\n\n return (\n <Select size='large' name={id} options={options} value={selected} onValueChange={(value) => setSelected(value)} />\n );\n}\n\ninterface ControlledInputProps<T extends number | string> extends ComponentProps<typeof Input> {\n id: string;\n initialValue: T;\n}\nfunction ControlledInput<T extends number | string>({ id, initialValue, ...inputProps }: ControlledInputProps<T>) {\n const [value, setValue] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n return (\n <Input\n height='large'\n name={id}\n value={value}\n onChange={(event) => setValue(event.target.value as T)}\n {...inputProps}\n />\n );\n}\n","import { IoChevronDown } from 'react-icons/io5';\nimport { useLocalStorage } from '@mantine/hooks';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport { OptionTitle } from './constants';\nimport ParamInput from './ParamInput';\nimport { type ParamField } from './viewParams.types';\n\nimport style from './ViewParamsSection.module.scss';\n\ninterface ViewParamsSectionProps {\n title: string;\n collapsible?: boolean;\n options: ParamField[];\n}\n\nexport default function ViewParamsSection({ title, collapsible, options }: ViewParamsSectionProps) {\n const [collapsed, setCollapsed] = useLocalStorage({ key: `params-${title}`, defaultValue: false });\n\n const handleCollapse = () => {\n if (collapsible) {\n setCollapsed((prev) => !prev);\n }\n };\n\n return (\n <section className={style.section}>\n {title === OptionTitle.Hidden ? (\n <HiddenContents options={options} />\n ) : (\n <>\n <div className={cx([style.sectionHeader, collapsible && style.collapsible])} onClick={handleCollapse}>\n {title}\n {collapsible && <IoChevronDown className={cx([collapsed ? style.closed : style.open])} />}\n </div>\n <SectionContents options={options} collapsed={collapsed} />\n </>\n )}\n </section>\n );\n}\n\ninterface SectionContentsProps {\n options: ParamField[];\n collapsed: boolean;\n}\n\nfunction SectionContents({ options, collapsed }: SectionContentsProps) {\n return (\n <>\n {options.map((option) => {\n return (\n <label key={option.title} className={cx([style.label, collapsed && style.hidden])}>\n <span className={style.title}>{option.title}</span>\n <span className={style.description}>{option.description}</span>\n <ParamInput paramField={option} />\n </label>\n );\n })}\n </>\n );\n}\n\nfunction HiddenContents({ options }: { options: ParamField[] }) {\n return (\n <>\n {options.map((option, index) => {\n return <ParamInput key={option.title + index} paramField={option} />;\n })}\n </>\n );\n}\n","import { FormEvent, memo } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { useSearchParams } from 'react-router';\nimport { Dialog } from '@base-ui-components/react/dialog';\nimport { OntimeView } from 'ontime-types';\n\nimport useViewSettings from '../../hooks-query/useViewSettings';\nimport Button from '../buttons/Button';\nimport IconButton from '../buttons/IconButton';\nimport Info from '../info/Info';\n\nimport { ViewOption } from './viewParams.types';\nimport { getURLSearchParamsFromObj } from './viewParams.utils';\nimport { useViewParamsEditorStore } from './viewParamsEditor.store';\nimport { ViewParamsPresets } from './ViewParamsPresets';\nimport ViewParamsSection from './ViewParamsSection';\n\nimport style from './ViewParamsEditor.module.scss';\n\ninterface EditFormDrawerProps {\n target: OntimeView;\n viewOptions: ViewOption[];\n}\n\nexport default memo(ViewParamsEditor);\nfunction ViewParamsEditor({ target, viewOptions }: EditFormDrawerProps) {\n const [_, setSearchParams] = useSearchParams();\n const { data: viewSettings } = useViewSettings();\n const { isOpen, close } = useViewParamsEditorStore();\n\n const handleClose = () => {\n close();\n };\n\n const resetParams = () => {\n setSearchParams();\n };\n\n const onParamsFormSubmit = (formEvent: FormEvent<HTMLFormElement>) => {\n formEvent.preventDefault();\n\n const newParamsObject = Object.fromEntries(new FormData(formEvent.currentTarget));\n const newSearchParams = getURLSearchParamsFromObj(newParamsObject, viewOptions);\n setSearchParams(newSearchParams);\n };\n\n return (\n <Dialog.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n handleClose();\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Backdrop className={style.backdrop} />\n <Dialog.Popup className={style.drawer}>\n <div className={style.header}>\n <Dialog.Title>Customise</Dialog.Title>\n <IconButton variant='subtle-white' size='large' data-testid='close-view-params' onClick={handleClose}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {viewSettings.overrideStyles && (\n <Info className={style.info}>This view style is being modified by a custom CSS file.</Info>\n )}\n <ViewParamsPresets target={target} />\n <form id='edit-params-form' onSubmit={onParamsFormSubmit} className={style.sectionList}>\n {viewOptions.map((section) => (\n <ViewParamsSection\n key={section.title}\n title={section.title}\n collapsible={section.collapsible}\n options={section.options}\n />\n ))}\n </form>\n </div>\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={resetParams} type='reset'>\n Reset to default\n </Button>\n <Button\n variant='primary'\n size='large'\n form='edit-params-form'\n type='submit'\n data-testid='apply-view-params'\n >\n Apply\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n"],"names":["makeOptionsFromCustomFields","customFields","additionalOptions","filterImageType","options","key","value","makeCustomFieldSelectOptions","makeProjectDataOptions","projectData","generatedOptions","entry","index","sanitiseColour","colour","collectFieldMetadata","paramFields","metadata","section","option","getURLSearchParamsFromObj","paramsObj","newSearchParams","addedPairs","addUniqueParam","id","pair","values","v","processedValue","ViewParamsPresets","target","viewPresets","useViewUrlPresets","searchParams","setSearchParams","useSearchParams","handleRecall","preset","newSearch","jsx","style","active","jsxs","cx","Button","OptionTitle","getTimerByType","freezeEnd","timerTypeNow","countToEndNow","clock","timerObject","timerTypeOverride","viewTimerType","TimerType","isStringBoolean","text","makeColourString","hex","getPropertyValue","event","property","field","_a","getFormattedTimer","timer","timerType","localisedMinutes","timerPlaceholderMin","timerPlaceholder","formatTime","timeToParse","MILLIS_PER_MINUTE","display","millisToString","removeLeadingZero","formatDisplayWithMinutes","removeSeconds","ensureHex","InlineColourPicker","name","setColour","useState","useEffect","SwatchPicker","ParamInput","paramField","type","defaultValue","defaultOptionValue","ControlledSelect","optionFromParams","MultiOption","ControlledSwitch","placeholder","defaultNumberValue","Input","defaultStringValue","ControlledInput","paramState","setParamState","toggleValue","checked","prev","Fragment","Checkbox","initialValue","setChecked","Switch","selected","setSelected","Select","inputProps","setValue","ViewParamsSection","title","collapsible","collapsed","setCollapsed","useLocalStorage","handleCollapse","HiddenContents","IoChevronDown","SectionContents","memo","ViewParamsEditor","viewOptions","_","viewSettings","useViewSettings","isOpen","close","useViewParamsEditorStore","handleClose","resetParams","onParamsFormSubmit","formEvent","newParamsObject","Dialog.Root","open","Dialog.Portal","Dialog.Backdrop","Dialog.Popup","Dialog.Title","IconButton","IoClose","Info"],"mappings":"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"}
1
+ {"version":3,"file":"ViewParamsEditor-Bca1TIDW.js","sources":["../../src/common/components/view-params-editor/viewParams.utils.ts","../../src/common/components/view-params-editor/ViewParamsPresets.tsx","../../src/common/components/view-params-editor/constants.ts","../../src/features/viewers/common/viewUtils.ts","../../src/common/components/view-params-editor/InlineColourPicker.tsx","../../src/common/components/view-params-editor/ParamInput.tsx","../../src/common/components/view-params-editor/ViewParamsSection.tsx","../../src/common/components/view-params-editor/ViewParamsEditor.tsx"],"sourcesContent":["import type { CustomFields, ProjectData } from 'ontime-types';\n\nimport type { SelectOption } from '../select/Select';\n\nimport type { MultiselectOption, ViewOption } from './viewParams.types';\n\n/**\n * Creates a list of custom fields for a select\n * Filters out image type custom fields\n */\nexport function makeOptionsFromCustomFields(\n customFields: CustomFields,\n additionalOptions: SelectOption[] = [],\n filterImageType = true,\n): SelectOption[] {\n const options: SelectOption[] = [...additionalOptions];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: `custom-${key}`,\n label: `Custom: ${value.label}`,\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a multiselect component from custom fields\n * Filters out image type custom fields\n */\nexport function makeCustomFieldSelectOptions(customFields: CustomFields, filterImageType = true): MultiselectOption[] {\n const options: MultiselectOption[] = [];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: key,\n label: value.label,\n colour: value.colour || 'transparent',\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a select element that displays project custom data\n */\nexport function makeProjectDataOptions(\n projectData: ProjectData,\n additionalOptions: SelectOption[] = [],\n): SelectOption[] {\n const generatedOptions = projectData.custom.map((entry, index) => {\n return {\n value: `${index}-${entry.title}`,\n label: entry.title,\n };\n });\n\n return [...additionalOptions, ...generatedOptions];\n}\n\ntype ViewParamsObj = { [key: string]: string | FormDataEntryValue };\n\n/**\n * Utility remove the # character from a hex string\n */\nfunction sanitiseColour(colour: string) {\n if (colour.startsWith('#')) {\n return colour.substring(1);\n }\n return colour;\n}\n\ntype FieldMetadata = {\n defaultValues: Record<string, string>;\n colorFields: Set<string>;\n booleanFields: Set<string>;\n isPersistedField: Set<string>;\n persistedValues: Record<string, string[]>;\n};\n\n/**\n * Utility collects metadata about fields from view options\n * - where are the default values\n * - which fields are colours\n * - which fields are persisted\n */\nfunction collectFieldMetadata(paramFields: ViewOption[]): FieldMetadata {\n const metadata: FieldMetadata = {\n defaultValues: {},\n colorFields: new Set(),\n booleanFields: new Set(),\n isPersistedField: new Set(),\n persistedValues: {},\n };\n\n paramFields.forEach((section) => {\n section.options.forEach((option) => {\n if (option.type === 'persist') {\n metadata.isPersistedField.add(option.id);\n if (option.values) {\n metadata.persistedValues[option.id] = option.values;\n }\n } else {\n metadata.defaultValues[option.id] = String(option.defaultValue);\n }\n\n if (option.type === 'colour') {\n metadata.colorFields.add(option.id);\n } else if (option.type === 'boolean') {\n metadata.booleanFields.add(option.id);\n }\n });\n });\n\n return metadata;\n}\n\n/**\n * Makes a new URLSearchParams object from the given params object\n * @param paramsObj - The object containing parameters to be converted\n * @param paramFields - The view options that define the parameters\n * @returns A new URLSearchParams object with the parameters\n */\nexport function getURLSearchParamsFromObj(paramsObj: ViewParamsObj, paramFields: ViewOption[]) {\n const newSearchParams = new URLSearchParams();\n const addedPairs = new Set<string>();\n const metadata = collectFieldMetadata(paramFields);\n\n // Utility function to safely add params without duplicates\n const addUniqueParam = (id: string, value: string) => {\n const pair = `${id}:${value}`;\n if (!addedPairs.has(pair)) {\n addedPairs.add(pair);\n newSearchParams.append(id, value);\n }\n };\n\n // First add all persisted values\n Object.entries(metadata.persistedValues).forEach(([id, values]) => {\n values.forEach((value) => {\n if (value) {\n addUniqueParam(id, value);\n }\n });\n });\n\n // Then process user-provided values\n Object.entries(paramsObj).forEach(([id, value]) => {\n if (typeof value === 'string' && value.length) {\n // For persisted fields, clear existing values before adding new ones\n if (metadata.isPersistedField.has(id)) {\n // Clear tracking of previous values for this field\n Array.from(addedPairs).forEach((pair) => {\n if (pair.startsWith(`${id}:`)) {\n addedPairs.delete(pair);\n }\n });\n newSearchParams.delete(id);\n }\n\n // Process and add new values\n value.split(',').forEach((v) => {\n // some field types need extra processing\n const processedValue = (() => {\n if (metadata.colorFields.has(id)) {\n return sanitiseColour(v);\n }\n if (metadata.booleanFields.has(id)) {\n return v === 'on' ? 'true' : 'false';\n }\n return v;\n })();\n if (metadata.isPersistedField.has(id) || metadata.defaultValues[id] !== processedValue) {\n addUniqueParam(id, processedValue);\n }\n });\n }\n });\n\n return newSearchParams;\n}\n","import { useSearchParams } from 'react-router';\nimport { OntimeView, URLPreset } from 'ontime-types';\n\nimport { useViewUrlPresets } from '../../hooks-query/useUrlPresets';\nimport { cx } from '../../utils/styleUtils';\nimport Button from '../buttons/Button';\n\nimport style from './ViewParamsPresets.module.scss';\n\n/**\n * Shows a list of presets for the current view\n */\nexport function ViewParamsPresets({ target }: { target: OntimeView }) {\n const { viewPresets } = useViewUrlPresets(target);\n const [searchParams, setSearchParams] = useSearchParams();\n\n const handleRecall = (preset: URLPreset) => {\n const newSearch = new URLSearchParams(preset.search);\n newSearch.set('alias', preset.alias);\n setSearchParams(newSearch);\n };\n\n if (viewPresets.length === 0) {\n return null;\n }\n\n return (\n <div className={style.presetSection}>\n {viewPresets.map((preset) => {\n const active = searchParams.get('alias') === preset.alias;\n return (\n <div key={preset.alias} className={cx([style.preset, active && style.active])}>\n <div>{preset.alias}</div>\n <Button\n variant={active ? 'ghosted' : 'subtle-white'}\n onClick={() => handleRecall(preset)}\n disabled={active}\n className={style.presetActions}\n >\n {active ? 'Applied' : 'Apply'}\n </Button>\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * Gathers possible titles for view options\n */\nexport enum OptionTitle {\n ClockOptions = 'Clock Options',\n TimerOptions = 'Timer Options',\n DataSources = 'Data sources',\n ElementVisibility = 'Element visibility',\n BehaviourOptions = 'View behaviour',\n StyleOverride = 'View style override',\n Animation = 'View animation',\n Schedule = 'Schedule options',\n\n /** rendered as hidden inputs */\n Hidden = 'Hidden options',\n}\n","import { MaybeNumber, MaybeString, OntimeEvent, TimerState, TimerType } from 'ontime-types';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString, removeLeadingZero, removeSeconds } from 'ontime-utils';\n\nimport { timerPlaceholder, timerPlaceholderMin } from '../../../common/utils/styleUtils';\nimport { formatTime } from '../../../common/utils/time';\n\n/**\n * Gathers all options that affect which timer is displayed and selects the correct data source to display\n * it also handles edge cases such as freezing on end\n */\nexport function getTimerByType(\n freezeEnd: boolean,\n timerTypeNow: TimerType,\n countToEndNow: boolean,\n clock: number,\n timerObject: Pick<TimerState, 'current' | 'elapsed'>,\n timerTypeOverride?: TimerType,\n): number | null {\n if (!timerObject) {\n return null;\n }\n\n const viewTimerType = timerTypeOverride ?? timerTypeNow;\n\n if (countToEndNow) {\n if (timerObject.current === null) {\n return null;\n }\n return freezeEnd ? Math.max(timerObject.current, 0) : timerObject.current;\n }\n\n switch (viewTimerType) {\n case TimerType.CountDown:\n if (timerObject.current === null) {\n return null;\n }\n return freezeEnd ? Math.max(timerObject.current, 0) : timerObject.current;\n case TimerType.CountUp:\n return Math.abs(timerObject.elapsed ?? 0);\n case TimerType.Clock:\n return clock;\n case TimerType.None:\n return null;\n default: {\n viewTimerType satisfies never;\n return null;\n }\n }\n}\n\n/**\n * Parses a string to semantically verify if it represents a true value\n * Used in the context of parsing search params and local storage items which can be strings or null\n */\nexport function isStringBoolean(text: string | null) {\n if (text === null) {\n return false;\n }\n return text?.toLowerCase() === 'true' || text === '1';\n}\n\n/**\n * Prepares a colour string for use in views\n * Colours in params do not have the #prefix\n */\nexport function makeColourString(hex: string | null): string | undefined {\n if (!hex) {\n return undefined;\n }\n // ensure the hex starts with a #\n return hex.startsWith('#') ? hex : `#${hex}`;\n}\n\n/**\n * Retrieves a dynamic property from an event\n * Considers custom fields\n */\nexport function getPropertyValue(event: OntimeEvent | null, property: MaybeString): string | undefined {\n if (!event || typeof property !== 'string' || property === 'none') {\n return undefined;\n }\n\n if (property.startsWith('custom-')) {\n const field = property.split('custom-')[1];\n return event.custom?.[field];\n }\n\n return event[property as keyof OntimeEvent] as string;\n}\n\ntype FormattingOptions = {\n removeSeconds: boolean;\n removeLeadingZero: boolean;\n};\n\nexport function getFormattedTimer(\n timer: MaybeNumber,\n timerType: TimerType,\n localisedMinutes: string,\n options: FormattingOptions,\n): string {\n if (timer == null || timerType === TimerType.None) {\n return options.removeSeconds ? timerPlaceholderMin : timerPlaceholder;\n }\n\n if (timerType === TimerType.Clock) {\n return formatTime(timer);\n }\n\n let timeToParse = timer;\n if (options.removeSeconds) {\n const isNegative = timeToParse < -MILLIS_PER_SECOND && timerType !== TimerType.CountUp;\n if (isNegative) {\n // in negative numbers, we need to round down\n timeToParse -= MILLIS_PER_MINUTE;\n }\n }\n\n let display = millisToString(timeToParse, { direction: timerType });\n if (options.removeLeadingZero) {\n display = removeLeadingZero(display);\n }\n\n if (options.removeSeconds) {\n display = formatDisplayWithMinutes(display, localisedMinutes);\n }\n return display;\n}\n\nfunction formatDisplayWithMinutes(display: string, localisedMinutes: string): string {\n display = removeSeconds(display);\n return display.length < 3 ? `${display} ${localisedMinutes}` : display;\n}\n","import { useEffect, useState } from 'react';\n\nimport SwatchPicker from '../input/colour-input/SwatchPicker';\n\nimport style from './InlineColourPicker.module.scss';\n\ninterface InlineColourPickerProps {\n name: string;\n value: string;\n}\n\nconst ensureHex = (value: string) => {\n if (!value.startsWith('#')) {\n return `#${value}`;\n }\n return value;\n};\n\nexport default function InlineColourPicker({ name, value }: InlineColourPickerProps) {\n const [colour, setColour] = useState(() => ensureHex(value));\n\n useEffect(() => {\n setColour(ensureHex(value));\n }, [value]);\n\n return (\n <div className={style.inline}>\n <SwatchPicker color={colour} onChange={setColour} alwaysDisplayColor />\n <span>{colour}</span>\n <input type='hidden' name={name} value={colour} />\n </div>\n );\n}\n","import { ComponentProps, useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { isStringBoolean } from '../../../features/viewers/common/viewUtils';\nimport Checkbox from '../checkbox/Checkbox';\nimport Input from '../input/input/Input';\nimport Select, { SelectOption } from '../select/Select';\nimport Switch from '../switch/Switch';\n\nimport InlineColourPicker from './InlineColourPicker';\nimport { ParamField } from './viewParams.types';\n\nimport style from './ParamInput.module.scss';\n\ninterface ParamInputProps {\n paramField: ParamField;\n}\n\nexport default function ParamInput({ paramField }: ParamInputProps) {\n const [searchParams] = useSearchParams();\n const { id, type, defaultValue } = paramField;\n\n if (type === 'persist') {\n if (!paramField.values || !paramField.values.length) {\n return null;\n }\n return <input hidden name={id} readOnly value={paramField.values.join(',')} />;\n }\n\n if (type === 'option') {\n const optionFromParams = searchParams.get(id);\n const defaultOptionValue = optionFromParams || defaultValue;\n\n if (paramField.values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return <ControlledSelect id={id} initialValue={defaultOptionValue} options={paramField.values} />;\n }\n\n if (type === 'multi-option') {\n const optionFromParams = searchParams.getAll(id);\n\n return (\n <MultiOption\n paramField={paramField}\n options={optionFromParams.length ? optionFromParams : paramField.defaultValue ?? ['']}\n />\n );\n }\n\n if (type === 'boolean') {\n return <ControlledSwitch id={id} initialValue={isStringBoolean(searchParams.get(id)) ?? defaultValue} />;\n }\n\n if (type === 'number') {\n const { placeholder } = paramField;\n const defaultNumberValue = searchParams.get(id) ?? defaultValue;\n\n return (\n <Input\n height='large'\n type='number'\n step='any'\n name={id}\n defaultValue={defaultNumberValue}\n placeholder={placeholder}\n />\n );\n }\n\n if (type === 'colour') {\n return <InlineColourPicker name={id} value={searchParams.get(id) ?? defaultValue} />;\n }\n\n const defaultStringValue = searchParams.get(id) ?? defaultValue ?? '';\n const { placeholder } = paramField;\n\n return <ControlledInput id={id} initialValue={defaultStringValue} placeholder={placeholder} />;\n}\n\ninterface EditFormMultiOptionProps {\n paramField: ParamField & { type: 'multi-option' };\n options: string[];\n}\n\nfunction MultiOption({ paramField, options }: EditFormMultiOptionProps) {\n const { id, values } = paramField;\n const [paramState, setParamState] = useState<string[]>(options);\n\n // synchronise options\n useEffect(() => {\n setParamState(options);\n }, [options]);\n\n const toggleValue = (value: string, checked: boolean) => {\n if (checked) {\n setParamState((prev) => [...prev, value]);\n } else {\n setParamState((prev) => prev.filter((v) => v !== value));\n }\n };\n\n if (values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return (\n <>\n <input name={id} hidden readOnly value={paramState.join(',')} />\n <div className={style.inline}>\n {values.map((option) => {\n return (\n <label\n key={option.value}\n className={style.toggleSelect}\n style={{\n '--user-bg': option.colour,\n }}\n >\n <Checkbox\n checked={paramState.includes(option.value)}\n onCheckedChange={(checked) => toggleValue(option.value, checked as boolean)}\n />\n {option.label}\n </label>\n );\n })}\n </div>\n </>\n );\n}\n\ninterface ControlledSwitchProps {\n id: string;\n initialValue: boolean;\n}\nfunction ControlledSwitch({ id, initialValue }: ControlledSwitchProps) {\n const [checked, setChecked] = useState(initialValue);\n\n // synchronise checked state\n useEffect(() => {\n setChecked(initialValue);\n }, [initialValue]);\n\n return <Switch size='large' name={id} checked={checked} onCheckedChange={setChecked} />;\n}\n\ninterface ControlledSelectProps {\n id: string;\n initialValue?: string;\n options: SelectOption[];\n}\nfunction ControlledSelect({ id, initialValue, options }: ControlledSelectProps) {\n const [selected, setSelected] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setSelected(initialValue);\n }, [initialValue]);\n\n return (\n <Select size='large' name={id} options={options} value={selected} onValueChange={(value) => setSelected(value)} />\n );\n}\n\ninterface ControlledInputProps<T extends number | string> extends ComponentProps<typeof Input> {\n id: string;\n initialValue: T;\n}\nfunction ControlledInput<T extends number | string>({ id, initialValue, ...inputProps }: ControlledInputProps<T>) {\n const [value, setValue] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n return (\n <Input\n height='large'\n name={id}\n value={value}\n onChange={(event) => setValue(event.target.value as T)}\n {...inputProps}\n />\n );\n}\n","import { IoChevronDown } from 'react-icons/io5';\nimport { useLocalStorage } from '@mantine/hooks';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport { OptionTitle } from './constants';\nimport ParamInput from './ParamInput';\nimport { type ParamField } from './viewParams.types';\n\nimport style from './ViewParamsSection.module.scss';\n\ninterface ViewParamsSectionProps {\n title: string;\n collapsible?: boolean;\n options: ParamField[];\n}\n\nexport default function ViewParamsSection({ title, collapsible, options }: ViewParamsSectionProps) {\n const [collapsed, setCollapsed] = useLocalStorage({ key: `params-${title}`, defaultValue: false });\n\n const handleCollapse = () => {\n if (collapsible) {\n setCollapsed((prev) => !prev);\n }\n };\n\n return (\n <section className={style.section}>\n {title === OptionTitle.Hidden ? (\n <HiddenContents options={options} />\n ) : (\n <>\n <div className={cx([style.sectionHeader, collapsible && style.collapsible])} onClick={handleCollapse}>\n {title}\n {collapsible && <IoChevronDown className={cx([collapsed ? style.closed : style.open])} />}\n </div>\n <SectionContents options={options} collapsed={collapsed} />\n </>\n )}\n </section>\n );\n}\n\ninterface SectionContentsProps {\n options: ParamField[];\n collapsed: boolean;\n}\n\nfunction SectionContents({ options, collapsed }: SectionContentsProps) {\n return (\n <>\n {options.map((option) => {\n return (\n <label key={option.title} className={cx([style.label, collapsed && style.hidden])}>\n <span className={style.title}>{option.title}</span>\n <span className={style.description}>{option.description}</span>\n <ParamInput paramField={option} />\n </label>\n );\n })}\n </>\n );\n}\n\nfunction HiddenContents({ options }: { options: ParamField[] }) {\n return (\n <>\n {options.map((option, index) => {\n return <ParamInput key={option.title + index} paramField={option} />;\n })}\n </>\n );\n}\n","import { FormEvent, memo } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { useSearchParams } from 'react-router';\nimport { Dialog } from '@base-ui-components/react/dialog';\nimport { OntimeView } from 'ontime-types';\n\nimport useViewSettings from '../../hooks-query/useViewSettings';\nimport Button from '../buttons/Button';\nimport IconButton from '../buttons/IconButton';\nimport Info from '../info/Info';\n\nimport { ViewOption } from './viewParams.types';\nimport { getURLSearchParamsFromObj } from './viewParams.utils';\nimport { useViewParamsEditorStore } from './viewParamsEditor.store';\nimport { ViewParamsPresets } from './ViewParamsPresets';\nimport ViewParamsSection from './ViewParamsSection';\n\nimport style from './ViewParamsEditor.module.scss';\n\ninterface EditFormDrawerProps {\n target: OntimeView;\n viewOptions: ViewOption[];\n}\n\nexport default memo(ViewParamsEditor);\nfunction ViewParamsEditor({ target, viewOptions }: EditFormDrawerProps) {\n const [_, setSearchParams] = useSearchParams();\n const { data: viewSettings } = useViewSettings();\n const { isOpen, close } = useViewParamsEditorStore();\n\n const handleClose = () => {\n close();\n };\n\n const resetParams = () => {\n setSearchParams();\n };\n\n const onParamsFormSubmit = (formEvent: FormEvent<HTMLFormElement>) => {\n formEvent.preventDefault();\n\n const newParamsObject = Object.fromEntries(new FormData(formEvent.currentTarget));\n const newSearchParams = getURLSearchParamsFromObj(newParamsObject, viewOptions);\n setSearchParams(newSearchParams);\n };\n\n return (\n <Dialog.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n handleClose();\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Backdrop className={style.backdrop} />\n <Dialog.Popup className={style.drawer}>\n <div className={style.header}>\n <Dialog.Title>Customise</Dialog.Title>\n <IconButton variant='subtle-white' size='large' data-testid='close-view-params' onClick={handleClose}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {viewSettings.overrideStyles && (\n <Info className={style.info}>This view style is being modified by a custom CSS file.</Info>\n )}\n <ViewParamsPresets target={target} />\n <form id='edit-params-form' onSubmit={onParamsFormSubmit} className={style.sectionList}>\n {viewOptions.map((section) => (\n <ViewParamsSection\n key={section.title}\n title={section.title}\n collapsible={section.collapsible}\n options={section.options}\n />\n ))}\n </form>\n </div>\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={resetParams} type='reset'>\n Reset to default\n </Button>\n <Button\n variant='primary'\n size='large'\n form='edit-params-form'\n type='submit'\n data-testid='apply-view-params'\n >\n Apply\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n"],"names":["makeOptionsFromCustomFields","customFields","additionalOptions","filterImageType","options","key","value","makeCustomFieldSelectOptions","makeProjectDataOptions","projectData","generatedOptions","entry","index","sanitiseColour","colour","collectFieldMetadata","paramFields","metadata","section","option","getURLSearchParamsFromObj","paramsObj","newSearchParams","addedPairs","addUniqueParam","id","pair","values","v","processedValue","ViewParamsPresets","target","viewPresets","useViewUrlPresets","searchParams","setSearchParams","useSearchParams","handleRecall","preset","newSearch","jsx","style","active","jsxs","cx","Button","OptionTitle","getTimerByType","freezeEnd","timerTypeNow","countToEndNow","clock","timerObject","timerTypeOverride","viewTimerType","TimerType","isStringBoolean","text","makeColourString","hex","getPropertyValue","event","property","field","_a","getFormattedTimer","timer","timerType","localisedMinutes","timerPlaceholderMin","timerPlaceholder","formatTime","timeToParse","MILLIS_PER_MINUTE","display","millisToString","removeLeadingZero","formatDisplayWithMinutes","removeSeconds","ensureHex","InlineColourPicker","name","setColour","useState","useEffect","SwatchPicker","ParamInput","paramField","type","defaultValue","defaultOptionValue","ControlledSelect","optionFromParams","MultiOption","ControlledSwitch","placeholder","defaultNumberValue","Input","defaultStringValue","ControlledInput","paramState","setParamState","toggleValue","checked","prev","Fragment","Checkbox","initialValue","setChecked","Switch","selected","setSelected","Select","inputProps","setValue","ViewParamsSection","title","collapsible","collapsed","setCollapsed","useLocalStorage","handleCollapse","HiddenContents","IoChevronDown","SectionContents","memo","ViewParamsEditor","viewOptions","_","viewSettings","useViewSettings","isOpen","close","useViewParamsEditorStore","handleClose","resetParams","onParamsFormSubmit","formEvent","newParamsObject","Dialog.Root","open","Dialog.Portal","Dialog.Backdrop","Dialog.Popup","Dialog.Title","IconButton","IoClose","Info"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{O as ie,h as v,P as b}from"./vendor-Cnciq4o_.js";import{j as D,i as h,v as ae,w as oe,x as se,y as de,z as ue,A as ce,B as le,C as fe,D as ye,E as Ee,S as we,F as pe}from"./useRundown-uuXixjnX.js";import{T as _}from"./validateEvent-Cy-jEiwB.js";import{ax as o,b8 as me,by as g,r as ve,be as ge,M as B,bz as R,H as be}from"./index-DdPXqLQ6.js";import{u as Ie}from"./editorSettings-CL1TjKzU.js";import{p as M}from"./parseUserTime-DNXIMX9s.js";import{s as he}from"./rundownUtils-CPBsEZ2m.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},y=new n.Error().stack;y&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[y]="fbe5a3e4-0992-4074-a64d-e72b9a44df5d",n._sentryDebugIdIdentifier="sentry-dbid-fbe5a3e4-0992-4074-a64d-e72b9a44df5d")}catch{}})();function Re(n,y){const c=[];for(let s=0;s<n.length;s++){const E=y[n[s]];E&&(D(E)?(c.push(E.id),c.push(...E.entries),c.push(`end-${E.id}`)):c.push(E.id))}return c}function Fe(n,y,c,s){return n==="end-group"?c==="after":n==="group"?!(c!==void 0&&c==="after"&&!s):y===null}function De(n,y,c){const s=c[n],E=y.indexOf(n),f=y[E-1];if(!f)return"parent"in s&&s.parent!==null?{destinationId:s.parent,order:"before"}:{destinationId:null,order:"before"};if(D(s)){const d=c[f];return"parent"in d&&d.parent!==null?{destinationId:d.parent,order:"before"}:{destinationId:f,order:"before"}}const l=c[f],p=s.parent;return D(l)?p===null?{destinationId:f,order:"insert"}:{destinationId:f,order:"before"}:h(l)&&l.parent!==null&&p===null?{destinationId:f,order:"after"}:{destinationId:f,order:"before"}}function Qe(n,y,c){const s=c[n],E=y.indexOf(n),f=y[E+1];if("parent"in s&&s.parent!==null){const I=c[s.parent];if(D(I)&&I.entries[I.entries.length-1]===n)return{destinationId:s.parent,order:"after"}}if(!f)return{destinationId:null,order:"after"};if(D(s)){if(s.entries.includes(f)){const I=E+s.entries.length+1,Q=y[I];return Q?{destinationId:Q,order:"after"}:{destinationId:null,order:"after"}}return{destinationId:f,order:"after"}}const l=c[f],p=s.parent;return D(l)&&p===null?l.entries.length===0?{destinationId:f,order:"insert"}:{destinationId:l.entries[0],order:"before"}:(h(l)?l.parent:null)!==null&&p===null?{destinationId:f,order:"after"}:{destinationId:f,order:"after"}}function Se(n,y){const c=[];for(const s of y)n.includes(s)&&c.push(s);return c}const Te=()=>{const n=ie(),{linkPrevious:y,defaultTimeStrategy:c,defaultDuration:s,defaultWarnTime:E,defaultDangerTime:f,defaultTimerType:l,defaultEndAction:p}=Ie(),d=v.useCallback(()=>n.getQueryData(o),[n]),I=v.useCallback(r=>{const t=d();if(t!=null&&t.entries)return t.entries[r]},[d]),{mutateAsync:Q}=b({mutationFn:([r,t])=>ae(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>n.invalidateQueries({queryKey:o})}),j=v.useCallback(async(r,t)=>{const e=d(),i=e==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");const a={...r,id:me()};if(h(a)){if(t!=null&&t.lastEventId){const u=e.entries[t==null?void 0:t.lastEventId];h(u)&&(a.timeStart=u.timeEnd)}a.linkStart=(t==null?void 0:t.linkPrevious)??y,a.duration===void 0&&a.timeEnd===void 0&&(a.duration=M(s)),a.timeDanger===void 0&&(a.timeDanger=M(f)),a.timeWarning===void 0&&(a.timeWarning=M(E)),a.timerType===void 0&&(a.timerType=l),a.endAction===void 0&&(a.endAction=p),a.timeStrategy===void 0&&(a.timeStrategy=c)}t!=null&&t.after&&(a.after=t.after),t!=null&&t.before&&(a.before=t.before);try{await Q([i,a])}catch(u){g("Failed adding event",u)}},[d,y,s,f,E,l,p,c,Q]),{mutateAsync:F}=b({mutationFn:([r,t])=>oe(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>n.invalidateQueries({queryKey:o})}),H=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await F([e,r])}catch(e){g("Error cloning entry",e)}},[F,d]),{mutateAsync:q}=b({mutationFn:([r,t])=>se(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o),i=t.id;if(e&&i){const a={...e.entries};a[i]={...a[i],...t},n.setQueryData(o,{id:e.id,title:e.title,order:e.order,flatOrder:e.flatOrder,entries:a,revision:-1})}return{previousData:e,newEvent:t}},onError:(r,t,e)=>{e!=null&&e.previousData&&n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:async()=>{await n.invalidateQueries({queryKey:o})}}),z=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await q([e,r])}catch(e){g("Error updating event",e)}},[d,q]),V=v.useCallback(async(r,t,e,i)=>{var k;const a=(k=d())==null?void 0:k.id;if(!a)throw new Error("Rundown not initialised");if(!i&&e==="")return;const u={id:r};i?t==="timeEnd"?(u.timeStrategy=e===""?_.LockDuration:_.LockEnd,u.timeEnd=e===""?void 0:w()):t==="duration"?(u.timeStrategy=e===""?_.LockEnd:_.LockDuration,u.duration=e===""?void 0:w()):t==="timeStart"&&(u.linkStart=e==="",u.timeStart=e===""?void 0:w()):u[t]=w();try{await q([a,u])}catch(m){g("Error updating event",m)}function w(){let m=0;if(e==="p"||e==="prev"||e==="previous")m=S();else if(e.startsWith("+")||e.startsWith("p+")||e.startsWith("p +")){const A=e.substring(1);m=S()+M(A)}else m=M(e);return Math.min(m,ve-ge)}function S(){const m=n.getQueryData(o);if(!(m!=null&&m.order)||!(m!=null&&m.entries))return 0;const A=m.order.indexOf(r);if(A===0)return 0;let $=0;for(let K=A-1;K>=0;K--){const N=m.entries[m.order[K]];if(h(N)){$=N.timeEnd;break}}return $}},[d,q,n]),{mutateAsync:T}=b({mutationFn:([r,t])=>de(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o);if(e){const i=new Set(t.ids),a={...e.entries};i.forEach(u=>{if(Object.hasOwn(a,u)){const w=a[u];h(w)&&(a[u]={...w,...t})}}),n.setQueryData(o,{id:e.id,title:e.title,order:e.order,flatOrder:e.flatOrder,entries:a,revision:-1})}return{previousRundown:e}},onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousRundown)}}),J=v.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await T([i,{data:r,ids:t}])}catch(i){g("Error updating events",i)}},[T,d]),{mutateAsync:L}=b({mutationFn:([r,t])=>ue(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o);if(e){const{entries:i,order:a,flatOrder:u}=Me(t,e);n.setQueryData(o,{id:e.id,title:e.title,order:a,flatOrder:u,entries:i,revision:-1})}return{previousData:e}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),X=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await L([e,r])}catch(e){g("Error deleting event",e)}},[L,d]),{mutateAsync:P}=b({mutationFn:([r])=>ce(r),onMutate:async()=>{await n.cancelQueries({queryKey:o});const r=n.getQueryData(o);return n.setQueryData(o,{id:(r==null?void 0:r.id)??"default",title:(r==null?void 0:r.title)??"",order:[],flatOrder:[],entries:{},revision:-1}),{previousData:r}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),Y=v.useCallback(async()=>{var r;try{const t=(r=d())==null?void 0:r.id;if(!t)throw new Error("Rundown not initialised");await P([t])}catch(t){g("Error deleting events",t)}},[P,d]),{mutateAsync:G}=b({mutationFn:([r,t])=>le(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),Z=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await G([e,r])}catch(e){g("Error applying delay",e)}},[G,d]),{mutateAsync:U}=b({mutationFn:([r,t])=>fe(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>n.invalidateQueries({queryKey:o})}),x=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await U([e,r])}catch(e){g("Error dissolving group",e)}},[d,U]),{mutateAsync:C}=b({mutationFn:([r,t])=>ye(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>n.invalidateQueries({queryKey:o})}),ee=v.useCallback(async r=>{if(r.length!==0)try{const t=d(),e=t==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");if(r.length===1)await C([e,r]);else{const i=Se(r,t.flatOrder);await C([e,i])}}catch(t){g("Error grouping entries",t)}},[d,C]),{mutateAsync:O}=b({mutationFn:([r,t])=>Ee(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>{n.invalidateQueries({queryKey:o})}}),te=v.useCallback(async(r,t)=>{var e;try{const i=d(),a=i==null?void 0:i.id;if(!a)throw new Error("Rundown not initialised");const{destinationId:u,order:w}=t==="up"?De(r,i.flatOrder,i.entries):Qe(r,i.flatOrder,i.entries);return u?(await O([a,{entryId:r,destinationId:u,order:w}]),((e=i.entries[u])==null?void 0:e.type)===we.Group?u:void 0):void 0}catch(i){g("Error re-ordering event",i)}},[d,O]),re=v.useCallback(async(r,t,e)=>{var i;try{const a=(i=d())==null?void 0:i.id;if(!a)throw new Error("Rundown not initialised");await O([a,{entryId:r,destinationId:t,order:e}])}catch(a){throw g("Error re-ordering event",a),a}},[d,O]),{mutateAsync:W}=b({mutationFn:([r,t,e])=>pe(r,t,e),onMutate:async([r,t,e])=>{await n.cancelQueries({queryKey:o});const i=n.getQueryData(o);if(i){const a={...i.entries},u=i.entries[t],w=i.entries[e];if(!h(u)||!h(w))return;const[S,k]=he(u,w);a[t]=S,a[e]=k,n.setQueryData(o,{id:i.id,title:i.title,order:i.order,flatOrder:i.flatOrder,entries:a,revision:-1})}return{previousData:i}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),ne=v.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await W([i,r,t])}catch(i){g("Error re-ordering event",i)}},[d,W]);return{addEntry:j,applyDelay:Z,batchUpdateEvents:J,clone:H,deleteEntry:X,deleteAllEntries:Y,ungroup:x,getEntryById:I,groupEntries:ee,move:te,reorderEntry:re,swapEvents:ne,updateEntry:z,updateTimer:V}};function Me(n,y){const c={...y.entries};let s=[...y.order],E=[...y.flatOrder];for(let l=0;l<n.length;l++){const p=c[n[l]];f(p)}function f(l){if(D(l)||!l.parent)s=s.filter(p=>p!==l.id);else{const p=c[l.parent];p&&D(p)&&(p.entries=p.entries.filter(d=>d!==l.id))}delete c[l.id],E=E.filter(p=>p!==l.id)}return{entries:c,order:s,flatOrder:E}}function Le(n,y="compact"){if(n==null||n===0)return"";const c=n<0,s=Math.abs(n),E=y==="compact",f=E?"+":"delayed by ",l=E?"-":"ahead by ";return s<B?`${c?l:f}${R(s,"s")} sec`:s<be&&s%B===0?`${c?l:f}${R(s,"m")} min`:`${c?l:f}${R(s,"HH:mm:ss")}`}export{Re as a,Fe as c,Le as m,Te as u};
2
- //# sourceMappingURL=dateConfig-CqC6Ta_8.js.map
1
+ import{O as ie,h as v,P as b}from"./vendor-CCiSQ9k9.js";import{j as D,i as h,v as ae,w as oe,x as se,y as de,z as ue,A as ce,B as le,C as fe,D as ye,E as Ee,S as we,F as pe}from"./useRundown-BfpjcCEJ.js";import{T as _}from"./validateEvent-P9sf7C10.js";import{ax as o,b8 as me,by as g,r as ve,be as ge,M as B,bz as R,H as be}from"./index-BQEUaoAf.js";import{u as Ie}from"./editorSettings-BU0pTMSY.js";import{p as M}from"./parseUserTime-BeTKj08M.js";import{s as he}from"./rundownUtils-BZHazkXR.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},y=new n.Error().stack;y&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[y]="fbe5a3e4-0992-4074-a64d-e72b9a44df5d",n._sentryDebugIdIdentifier="sentry-dbid-fbe5a3e4-0992-4074-a64d-e72b9a44df5d")}catch{}})();function Re(n,y){const c=[];for(let s=0;s<n.length;s++){const E=y[n[s]];E&&(D(E)?(c.push(E.id),c.push(...E.entries),c.push(`end-${E.id}`)):c.push(E.id))}return c}function Fe(n,y,c,s){return n==="end-group"?c==="after":n==="group"?!(c!==void 0&&c==="after"&&!s):y===null}function De(n,y,c){const s=c[n],E=y.indexOf(n),f=y[E-1];if(!f)return"parent"in s&&s.parent!==null?{destinationId:s.parent,order:"before"}:{destinationId:null,order:"before"};if(D(s)){const d=c[f];return"parent"in d&&d.parent!==null?{destinationId:d.parent,order:"before"}:{destinationId:f,order:"before"}}const l=c[f],p=s.parent;return D(l)?p===null?{destinationId:f,order:"insert"}:{destinationId:f,order:"before"}:h(l)&&l.parent!==null&&p===null?{destinationId:f,order:"after"}:{destinationId:f,order:"before"}}function Qe(n,y,c){const s=c[n],E=y.indexOf(n),f=y[E+1];if("parent"in s&&s.parent!==null){const I=c[s.parent];if(D(I)&&I.entries[I.entries.length-1]===n)return{destinationId:s.parent,order:"after"}}if(!f)return{destinationId:null,order:"after"};if(D(s)){if(s.entries.includes(f)){const I=E+s.entries.length+1,Q=y[I];return Q?{destinationId:Q,order:"after"}:{destinationId:null,order:"after"}}return{destinationId:f,order:"after"}}const l=c[f],p=s.parent;return D(l)&&p===null?l.entries.length===0?{destinationId:f,order:"insert"}:{destinationId:l.entries[0],order:"before"}:(h(l)?l.parent:null)!==null&&p===null?{destinationId:f,order:"after"}:{destinationId:f,order:"after"}}function Se(n,y){const c=[];for(const s of y)n.includes(s)&&c.push(s);return c}const Te=()=>{const n=ie(),{linkPrevious:y,defaultTimeStrategy:c,defaultDuration:s,defaultWarnTime:E,defaultDangerTime:f,defaultTimerType:l,defaultEndAction:p}=Ie(),d=v.useCallback(()=>n.getQueryData(o),[n]),I=v.useCallback(r=>{const t=d();if(t!=null&&t.entries)return t.entries[r]},[d]),{mutateAsync:Q}=b({mutationFn:([r,t])=>ae(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>n.invalidateQueries({queryKey:o})}),j=v.useCallback(async(r,t)=>{const e=d(),i=e==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");const a={...r,id:me()};if(h(a)){if(t!=null&&t.lastEventId){const u=e.entries[t==null?void 0:t.lastEventId];h(u)&&(a.timeStart=u.timeEnd)}a.linkStart=(t==null?void 0:t.linkPrevious)??y,a.duration===void 0&&a.timeEnd===void 0&&(a.duration=M(s)),a.timeDanger===void 0&&(a.timeDanger=M(f)),a.timeWarning===void 0&&(a.timeWarning=M(E)),a.timerType===void 0&&(a.timerType=l),a.endAction===void 0&&(a.endAction=p),a.timeStrategy===void 0&&(a.timeStrategy=c)}t!=null&&t.after&&(a.after=t.after),t!=null&&t.before&&(a.before=t.before);try{await Q([i,a])}catch(u){g("Failed adding event",u)}},[d,y,s,f,E,l,p,c,Q]),{mutateAsync:F}=b({mutationFn:([r,t])=>oe(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>n.invalidateQueries({queryKey:o})}),H=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await F([e,r])}catch(e){g("Error cloning entry",e)}},[F,d]),{mutateAsync:q}=b({mutationFn:([r,t])=>se(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o),i=t.id;if(e&&i){const a={...e.entries};a[i]={...a[i],...t},n.setQueryData(o,{id:e.id,title:e.title,order:e.order,flatOrder:e.flatOrder,entries:a,revision:-1})}return{previousData:e,newEvent:t}},onError:(r,t,e)=>{e!=null&&e.previousData&&n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:async()=>{await n.invalidateQueries({queryKey:o})}}),z=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await q([e,r])}catch(e){g("Error updating event",e)}},[d,q]),V=v.useCallback(async(r,t,e,i)=>{var k;const a=(k=d())==null?void 0:k.id;if(!a)throw new Error("Rundown not initialised");if(!i&&e==="")return;const u={id:r};i?t==="timeEnd"?(u.timeStrategy=e===""?_.LockDuration:_.LockEnd,u.timeEnd=e===""?void 0:w()):t==="duration"?(u.timeStrategy=e===""?_.LockEnd:_.LockDuration,u.duration=e===""?void 0:w()):t==="timeStart"&&(u.linkStart=e==="",u.timeStart=e===""?void 0:w()):u[t]=w();try{await q([a,u])}catch(m){g("Error updating event",m)}function w(){let m=0;if(e==="p"||e==="prev"||e==="previous")m=S();else if(e.startsWith("+")||e.startsWith("p+")||e.startsWith("p +")){const A=e.substring(1);m=S()+M(A)}else m=M(e);return Math.min(m,ve-ge)}function S(){const m=n.getQueryData(o);if(!(m!=null&&m.order)||!(m!=null&&m.entries))return 0;const A=m.order.indexOf(r);if(A===0)return 0;let $=0;for(let K=A-1;K>=0;K--){const N=m.entries[m.order[K]];if(h(N)){$=N.timeEnd;break}}return $}},[d,q,n]),{mutateAsync:T}=b({mutationFn:([r,t])=>de(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o);if(e){const i=new Set(t.ids),a={...e.entries};i.forEach(u=>{if(Object.hasOwn(a,u)){const w=a[u];h(w)&&(a[u]={...w,...t})}}),n.setQueryData(o,{id:e.id,title:e.title,order:e.order,flatOrder:e.flatOrder,entries:a,revision:-1})}return{previousRundown:e}},onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousRundown)}}),J=v.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await T([i,{data:r,ids:t}])}catch(i){g("Error updating events",i)}},[T,d]),{mutateAsync:L}=b({mutationFn:([r,t])=>ue(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o);if(e){const{entries:i,order:a,flatOrder:u}=Me(t,e);n.setQueryData(o,{id:e.id,title:e.title,order:a,flatOrder:u,entries:i,revision:-1})}return{previousData:e}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),X=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await L([e,r])}catch(e){g("Error deleting event",e)}},[L,d]),{mutateAsync:P}=b({mutationFn:([r])=>ce(r),onMutate:async()=>{await n.cancelQueries({queryKey:o});const r=n.getQueryData(o);return n.setQueryData(o,{id:(r==null?void 0:r.id)??"default",title:(r==null?void 0:r.title)??"",order:[],flatOrder:[],entries:{},revision:-1}),{previousData:r}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),Y=v.useCallback(async()=>{var r;try{const t=(r=d())==null?void 0:r.id;if(!t)throw new Error("Rundown not initialised");await P([t])}catch(t){g("Error deleting events",t)}},[P,d]),{mutateAsync:G}=b({mutationFn:([r,t])=>le(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),Z=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await G([e,r])}catch(e){g("Error applying delay",e)}},[G,d]),{mutateAsync:U}=b({mutationFn:([r,t])=>fe(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>n.invalidateQueries({queryKey:o})}),x=v.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await U([e,r])}catch(e){g("Error dissolving group",e)}},[d,U]),{mutateAsync:C}=b({mutationFn:([r,t])=>ye(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>n.invalidateQueries({queryKey:o})}),ee=v.useCallback(async r=>{if(r.length!==0)try{const t=d(),e=t==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");if(r.length===1)await C([e,r]);else{const i=Se(r,t.flatOrder);await C([e,i])}}catch(t){g("Error grouping entries",t)}},[d,C]),{mutateAsync:O}=b({mutationFn:([r,t])=>Ee(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>{n.invalidateQueries({queryKey:o})}}),te=v.useCallback(async(r,t)=>{var e;try{const i=d(),a=i==null?void 0:i.id;if(!a)throw new Error("Rundown not initialised");const{destinationId:u,order:w}=t==="up"?De(r,i.flatOrder,i.entries):Qe(r,i.flatOrder,i.entries);return u?(await O([a,{entryId:r,destinationId:u,order:w}]),((e=i.entries[u])==null?void 0:e.type)===we.Group?u:void 0):void 0}catch(i){g("Error re-ordering event",i)}},[d,O]),re=v.useCallback(async(r,t,e)=>{var i;try{const a=(i=d())==null?void 0:i.id;if(!a)throw new Error("Rundown not initialised");await O([a,{entryId:r,destinationId:t,order:e}])}catch(a){throw g("Error re-ordering event",a),a}},[d,O]),{mutateAsync:W}=b({mutationFn:([r,t,e])=>pe(r,t,e),onMutate:async([r,t,e])=>{await n.cancelQueries({queryKey:o});const i=n.getQueryData(o);if(i){const a={...i.entries},u=i.entries[t],w=i.entries[e];if(!h(u)||!h(w))return;const[S,k]=he(u,w);a[t]=S,a[e]=k,n.setQueryData(o,{id:i.id,title:i.title,order:i.order,flatOrder:i.flatOrder,entries:a,revision:-1})}return{previousData:i}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),ne=v.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await W([i,r,t])}catch(i){g("Error re-ordering event",i)}},[d,W]);return{addEntry:j,applyDelay:Z,batchUpdateEvents:J,clone:H,deleteEntry:X,deleteAllEntries:Y,ungroup:x,getEntryById:I,groupEntries:ee,move:te,reorderEntry:re,swapEvents:ne,updateEntry:z,updateTimer:V}};function Me(n,y){const c={...y.entries};let s=[...y.order],E=[...y.flatOrder];for(let l=0;l<n.length;l++){const p=c[n[l]];f(p)}function f(l){if(D(l)||!l.parent)s=s.filter(p=>p!==l.id);else{const p=c[l.parent];p&&D(p)&&(p.entries=p.entries.filter(d=>d!==l.id))}delete c[l.id],E=E.filter(p=>p!==l.id)}return{entries:c,order:s,flatOrder:E}}function Le(n,y="compact"){if(n==null||n===0)return"";const c=n<0,s=Math.abs(n),E=y==="compact",f=E?"+":"delayed by ",l=E?"-":"ahead by ";return s<B?`${c?l:f}${R(s,"s")} sec`:s<be&&s%B===0?`${c?l:f}${R(s,"m")} min`:`${c?l:f}${R(s,"HH:mm:ss")}`}export{Re as a,Fe as c,Le as m,Te as u};
2
+ //# sourceMappingURL=dateConfig-DRQGMWDF.js.map