@getontime/cli 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/client/assets/{Backstage-ZSqb8OU6.js → Backstage-BhtXVpms.js} +2 -2
  2. package/client/assets/Backstage-BhtXVpms.js.br +0 -0
  3. package/client/assets/Backstage-BhtXVpms.js.gz +0 -0
  4. package/client/assets/{Backstage-ZSqb8OU6.js.map → Backstage-BhtXVpms.js.map} +1 -1
  5. package/client/assets/{Countdown-DVRZbeRP.js → Countdown-NmGi1KMx.js} +2 -2
  6. package/client/assets/Countdown-NmGi1KMx.js.br +0 -0
  7. package/client/assets/Countdown-NmGi1KMx.js.gz +0 -0
  8. package/client/assets/Countdown-NmGi1KMx.js.map +1 -0
  9. package/client/assets/{CustomTranslationModal-D_Cy0d_H.js → CustomTranslationModal-BBNxpds0.js} +2 -2
  10. package/client/assets/CustomTranslationModal-BBNxpds0.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-BBNxpds0.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-D_Cy0d_H.js.map → CustomTranslationModal-BBNxpds0.js.map} +1 -1
  13. package/client/assets/{DelayIndicator-B_JKLKYW.js → DelayIndicator-CFCDQ7FN.js} +2 -2
  14. package/client/assets/DelayIndicator-CFCDQ7FN.js.br +0 -0
  15. package/client/assets/DelayIndicator-CFCDQ7FN.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-B_JKLKYW.js.map → DelayIndicator-CFCDQ7FN.js.map} +1 -1
  17. package/client/assets/{EditorFeatureWrapper-DzBxDvRn.js → EditorFeatureWrapper-D55c8JBz.js} +2 -2
  18. package/client/assets/EditorFeatureWrapper-D55c8JBz.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-D55c8JBz.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-DzBxDvRn.js.map → EditorFeatureWrapper-D55c8JBz.js.map} +1 -1
  21. package/client/assets/{EditorUtils-De0umjb-.js → EditorUtils-CFE106qQ.js} +2 -2
  22. package/client/assets/EditorUtils-CFE106qQ.js.br +0 -0
  23. package/client/assets/EditorUtils-CFE106qQ.js.gz +0 -0
  24. package/client/assets/{EditorUtils-De0umjb-.js.map → EditorUtils-CFE106qQ.js.map} +1 -1
  25. package/client/assets/{Empty-BYF0tVRk.js → Empty-C-JO_XAr.js} +2 -2
  26. package/client/assets/Empty-C-JO_XAr.js.br +2 -0
  27. package/client/assets/Empty-C-JO_XAr.js.gz +0 -0
  28. package/client/assets/{Empty-BYF0tVRk.js.map → Empty-C-JO_XAr.js.map} +1 -1
  29. package/client/assets/{EmptyPage-DYH2bswA.js → EmptyPage-BSzsxpGg.js} +2 -2
  30. package/client/assets/EmptyPage-BSzsxpGg.js.br +1 -0
  31. package/client/assets/EmptyPage-BSzsxpGg.js.gz +0 -0
  32. package/client/assets/{EmptyPage-DYH2bswA.js.map → EmptyPage-BSzsxpGg.js.map} +1 -1
  33. package/client/assets/{FollowButton-DyWsvyFF.js → FollowButton-Mox6N4JW.js} +2 -2
  34. package/client/assets/FollowButton-Mox6N4JW.js.br +0 -0
  35. package/client/assets/FollowButton-Mox6N4JW.js.gz +0 -0
  36. package/client/assets/{FollowButton-DyWsvyFF.js.map → FollowButton-Mox6N4JW.js.map} +1 -1
  37. package/client/assets/MessageControlExport-BL2ip9qN.js +2 -0
  38. package/client/assets/MessageControlExport-BL2ip9qN.js.br +0 -0
  39. package/client/assets/MessageControlExport-BL2ip9qN.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-yLGU2dMq.js.map → MessageControlExport-BL2ip9qN.js.map} +1 -1
  41. package/client/assets/{MilestoneEditor-GkzJ-h1C.js → MilestoneEditor-DcWPGKNK.js} +2 -2
  42. package/client/assets/MilestoneEditor-DcWPGKNK.js.br +0 -0
  43. package/client/assets/MilestoneEditor-DcWPGKNK.js.gz +0 -0
  44. package/client/assets/{MilestoneEditor-GkzJ-h1C.js.map → MilestoneEditor-DcWPGKNK.js.map} +1 -1
  45. package/client/assets/Modal-D3tAPV2u.css +1 -0
  46. package/client/assets/Modal-D3tAPV2u.css.br +0 -0
  47. package/client/assets/Modal-D3tAPV2u.css.gz +0 -0
  48. package/client/assets/Modal-krcwDRb-.js +2 -0
  49. package/client/assets/Modal-krcwDRb-.js.br +0 -0
  50. package/client/assets/Modal-krcwDRb-.js.gz +0 -0
  51. package/client/assets/Modal-krcwDRb-.js.map +1 -0
  52. package/client/assets/{MultiPartProgressBar-BITERKS0.js → MultiPartProgressBar-BXQbpM-j.js} +2 -2
  53. package/client/assets/MultiPartProgressBar-BXQbpM-j.js.br +0 -0
  54. package/client/assets/MultiPartProgressBar-BXQbpM-j.js.gz +0 -0
  55. package/client/assets/{MultiPartProgressBar-BITERKS0.js.map → MultiPartProgressBar-BXQbpM-j.js.map} +1 -1
  56. package/client/assets/{OperatorExport-DMZ6eQfT.js → OperatorExport-C50KHBrD.js} +2 -2
  57. package/client/assets/OperatorExport-C50KHBrD.js.br +0 -0
  58. package/client/assets/OperatorExport-C50KHBrD.js.gz +0 -0
  59. package/client/assets/{OperatorExport-DMZ6eQfT.js.map → OperatorExport-C50KHBrD.js.map} +1 -1
  60. package/client/assets/OverviewWrapper-MGJ1uE5W.js +2 -0
  61. package/client/assets/OverviewWrapper-MGJ1uE5W.js.br +0 -0
  62. package/client/assets/OverviewWrapper-MGJ1uE5W.js.gz +0 -0
  63. package/client/assets/{OverviewWrapper-riM6vPno.js.map → OverviewWrapper-MGJ1uE5W.js.map} +1 -1
  64. package/client/assets/{ProjectInfo-DxtMq70a.js → ProjectInfo-CJ-GLvVG.js} +2 -2
  65. package/client/assets/ProjectInfo-CJ-GLvVG.js.br +0 -0
  66. package/client/assets/ProjectInfo-CJ-GLvVG.js.gz +0 -0
  67. package/client/assets/{ProjectInfo-DxtMq70a.js.map → ProjectInfo-CJ-GLvVG.js.map} +1 -1
  68. package/client/assets/{ProtectRoute-p1fmtLeu.js → ProtectRoute-DJ9xZnPI.js} +2 -2
  69. package/client/assets/ProtectRoute-DJ9xZnPI.js.br +0 -0
  70. package/client/assets/ProtectRoute-DJ9xZnPI.js.gz +0 -0
  71. package/client/assets/{ProtectRoute-p1fmtLeu.js.map → ProtectRoute-DJ9xZnPI.js.map} +1 -1
  72. package/client/assets/{ProtectedCuesheet-CvRnqT0z.js → ProtectedCuesheet-B8tg6Mmo.js} +2 -2
  73. package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.br +0 -0
  74. package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.gz +0 -0
  75. package/client/assets/{ProtectedCuesheet-CvRnqT0z.js.map → ProtectedCuesheet-B8tg6Mmo.js.map} +1 -1
  76. package/client/assets/ProtectedEditor-Bl4wV72N.js +3 -0
  77. package/client/assets/ProtectedEditor-Bl4wV72N.js.br +0 -0
  78. package/client/assets/ProtectedEditor-Bl4wV72N.js.gz +0 -0
  79. package/client/assets/ProtectedEditor-Bl4wV72N.js.map +1 -0
  80. package/client/assets/{RundownEntry-B1dSz1wu.js → RundownEntry-D9tXNXPy.js} +2 -2
  81. package/client/assets/RundownEntry-D9tXNXPy.js.br +0 -0
  82. package/client/assets/RundownEntry-D9tXNXPy.js.gz +0 -0
  83. package/client/assets/{RundownEntry-B1dSz1wu.js.map → RundownEntry-D9tXNXPy.js.map} +1 -1
  84. package/client/assets/RundownExport-1zBZurIG.css +1 -0
  85. package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
  86. package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
  87. package/client/assets/RundownExport-D6uAmFbb.js +3 -0
  88. package/client/assets/RundownExport-D6uAmFbb.js.br +0 -0
  89. package/client/assets/RundownExport-D6uAmFbb.js.gz +0 -0
  90. package/client/assets/RundownExport-D6uAmFbb.js.map +1 -0
  91. package/client/assets/{Select-niU9Razm.js → Select-BLA-yQMq.js} +2 -2
  92. package/client/assets/Select-BLA-yQMq.js.br +0 -0
  93. package/client/assets/Select-BLA-yQMq.js.gz +0 -0
  94. package/client/assets/{Select-niU9Razm.js.map → Select-BLA-yQMq.js.map} +1 -1
  95. package/client/assets/{Studio-CWdJq4bx.js → Studio-DbP92DTf.js} +2 -2
  96. package/client/assets/Studio-DbP92DTf.js.br +0 -0
  97. package/client/assets/Studio-DbP92DTf.js.gz +0 -0
  98. package/client/assets/{Studio-CWdJq4bx.js.map → Studio-DbP92DTf.js.map} +1 -1
  99. package/client/assets/{StyleEditor-BIFjHsgD.js → StyleEditor-DNjZ46Qf.js} +2 -2
  100. package/client/assets/StyleEditor-DNjZ46Qf.js.br +0 -0
  101. package/client/assets/StyleEditor-DNjZ46Qf.js.gz +0 -0
  102. package/client/assets/{StyleEditor-BIFjHsgD.js.map → StyleEditor-DNjZ46Qf.js.map} +1 -1
  103. package/client/assets/{SuperscriptTime-DCTyUARx.js → SuperscriptTime-C8ypTVpH.js} +2 -2
  104. package/client/assets/SuperscriptTime-C8ypTVpH.js.br +0 -0
  105. package/client/assets/SuperscriptTime-C8ypTVpH.js.gz +0 -0
  106. package/client/assets/{SuperscriptTime-DCTyUARx.js.map → SuperscriptTime-C8ypTVpH.js.map} +1 -1
  107. package/client/assets/{TimeElements-DBVGVx71.js → TimeElements-DlEBhXe0.js} +2 -2
  108. package/client/assets/TimeElements-DlEBhXe0.js.br +0 -0
  109. package/client/assets/TimeElements-DlEBhXe0.js.gz +0 -0
  110. package/client/assets/{TimeElements-DBVGVx71.js.map → TimeElements-DlEBhXe0.js.map} +1 -1
  111. package/client/assets/{TimeInput-wQ67FbW6.js → TimeInput-DU09ewqh.js} +2 -2
  112. package/client/assets/TimeInput-DU09ewqh.js.br +0 -0
  113. package/client/assets/TimeInput-DU09ewqh.js.gz +0 -0
  114. package/client/assets/{TimeInput-wQ67FbW6.js.map → TimeInput-DU09ewqh.js.map} +1 -1
  115. package/client/assets/{TimelinePage-DZefE2vQ.js → TimelinePage-DTwqRihn.js} +2 -2
  116. package/client/assets/TimelinePage-DTwqRihn.js.br +0 -0
  117. package/client/assets/TimelinePage-DTwqRihn.js.gz +0 -0
  118. package/client/assets/{TimelinePage-DZefE2vQ.js.map → TimelinePage-DTwqRihn.js.map} +1 -1
  119. package/client/assets/Timer-B7nk3TMf.css +1 -0
  120. package/client/assets/Timer-B7nk3TMf.css.br +0 -0
  121. package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
  122. package/client/assets/Timer-jjWAunJc.js +2 -0
  123. package/client/assets/Timer-jjWAunJc.js.br +0 -0
  124. package/client/assets/Timer-jjWAunJc.js.gz +0 -0
  125. package/client/assets/Timer-jjWAunJc.js.map +1 -0
  126. package/client/assets/TimerControlExport-i0ZDpUx7.js +2 -0
  127. package/client/assets/TimerControlExport-i0ZDpUx7.js.br +0 -0
  128. package/client/assets/TimerControlExport-i0ZDpUx7.js.gz +0 -0
  129. package/client/assets/{TimerControlExport-C1C_vBX4.js.map → TimerControlExport-i0ZDpUx7.js.map} +1 -1
  130. package/client/assets/{TitleCard-B4N-kCM3.js → TitleCard-BgOtucv6.js} +2 -2
  131. package/client/assets/TitleCard-BgOtucv6.js.br +0 -0
  132. package/client/assets/TitleCard-BgOtucv6.js.gz +0 -0
  133. package/client/assets/{TitleCard-B4N-kCM3.js.map → TitleCard-BgOtucv6.js.map} +1 -1
  134. package/client/assets/{Tooltip-DJ8Y4CO4.js → Tooltip-C0rGHLsB.js} +2 -2
  135. package/client/assets/Tooltip-C0rGHLsB.js.br +0 -0
  136. package/client/assets/Tooltip-C0rGHLsB.js.gz +0 -0
  137. package/client/assets/{Tooltip-DJ8Y4CO4.js.map → Tooltip-C0rGHLsB.js.map} +1 -1
  138. package/client/assets/{ViewLogo-Dd60EREE.js → ViewLogo--9miplQv.js} +2 -2
  139. package/client/assets/ViewLogo--9miplQv.js.br +0 -0
  140. package/client/assets/ViewLogo--9miplQv.js.gz +0 -0
  141. package/client/assets/{ViewLogo-Dd60EREE.js.map → ViewLogo--9miplQv.js.map} +1 -1
  142. package/client/assets/{ViewParamsEditor-BWEYbq_S.js → ViewParamsEditor-BFu_0oIb.js} +2 -2
  143. package/client/assets/ViewParamsEditor-BFu_0oIb.js.br +0 -0
  144. package/client/assets/ViewParamsEditor-BFu_0oIb.js.gz +0 -0
  145. package/client/assets/{ViewParamsEditor-BWEYbq_S.js.map → ViewParamsEditor-BFu_0oIb.js.map} +1 -1
  146. package/client/assets/{dateConfig-8rhb0Dbh.js → dateConfig-WYqMzV9D.js} +2 -2
  147. package/client/assets/dateConfig-WYqMzV9D.js.br +0 -0
  148. package/client/assets/dateConfig-WYqMzV9D.js.gz +0 -0
  149. package/client/assets/{dateConfig-8rhb0Dbh.js.map → dateConfig-WYqMzV9D.js.map} +1 -1
  150. package/client/assets/{editorSettings-LMnfWux6.js → editorSettings-CCHx-wCx.js} +2 -2
  151. package/client/assets/editorSettings-CCHx-wCx.js.br +0 -0
  152. package/client/assets/editorSettings-CCHx-wCx.js.gz +0 -0
  153. package/client/assets/{editorSettings-LMnfWux6.js.map → editorSettings-CCHx-wCx.js.map} +1 -1
  154. package/client/assets/{getProgress-CyJTu6f5.js → getProgress-B94Ieskb.js} +2 -2
  155. package/client/assets/getProgress-B94Ieskb.js.br +0 -0
  156. package/client/assets/getProgress-B94Ieskb.js.gz +0 -0
  157. package/client/assets/{getProgress-CyJTu6f5.js.map → getProgress-B94Ieskb.js.map} +1 -1
  158. package/client/assets/{index-5QAOtSTh.js → index-njXwwjfn.js} +3 -3
  159. package/client/assets/index-njXwwjfn.js.br +0 -0
  160. package/client/assets/index-njXwwjfn.js.gz +0 -0
  161. package/client/assets/{index-5QAOtSTh.js.map → index-njXwwjfn.js.map} +1 -1
  162. package/client/assets/{offset-CLDSqOP5.js → offset-D1q-72D-.js} +2 -2
  163. package/client/assets/offset-D1q-72D-.js.br +0 -0
  164. package/client/assets/offset-D1q-72D-.js.gz +0 -0
  165. package/client/assets/{offset-CLDSqOP5.js.map → offset-D1q-72D-.js.map} +1 -1
  166. package/client/assets/{parseUserTime-CCDHpp7D.js → parseUserTime-Bc1pSJR2.js} +2 -2
  167. package/client/assets/parseUserTime-Bc1pSJR2.js.br +0 -0
  168. package/client/assets/parseUserTime-Bc1pSJR2.js.gz +0 -0
  169. package/client/assets/{parseUserTime-CCDHpp7D.js.map → parseUserTime-Bc1pSJR2.js.map} +1 -1
  170. package/client/assets/{playbackstate-6lBh6omZ.js → playbackstate-BpzbtG9F.js} +2 -2
  171. package/client/assets/playbackstate-BpzbtG9F.js.br +0 -0
  172. package/client/assets/playbackstate-BpzbtG9F.js.gz +0 -0
  173. package/client/assets/{playbackstate-6lBh6omZ.js.map → playbackstate-BpzbtG9F.js.map} +1 -1
  174. package/client/assets/{presentation.utils-BUIuV_2e.js → presentation.utils-B2baBe3j.js} +2 -2
  175. package/client/assets/presentation.utils-B2baBe3j.js.br +0 -0
  176. package/client/assets/presentation.utils-B2baBe3j.js.gz +0 -0
  177. package/client/assets/{presentation.utils-BUIuV_2e.js.map → presentation.utils-B2baBe3j.js.map} +1 -1
  178. package/client/assets/{rundownUtils-Cnd2prRX.js → rundownUtils-H6xvQyre.js} +2 -2
  179. package/client/assets/rundownUtils-H6xvQyre.js.br +0 -0
  180. package/client/assets/rundownUtils-H6xvQyre.js.gz +0 -0
  181. package/client/assets/{rundownUtils-Cnd2prRX.js.map → rundownUtils-H6xvQyre.js.map} +1 -1
  182. package/client/assets/{useCustomFields-BuxKsqGS.js → useCustomFields-Da0Li7nQ.js} +2 -2
  183. package/client/assets/useCustomFields-Da0Li7nQ.js.br +0 -0
  184. package/client/assets/useCustomFields-Da0Li7nQ.js.gz +0 -0
  185. package/client/assets/{useCustomFields-BuxKsqGS.js.map → useCustomFields-Da0Li7nQ.js.map} +1 -1
  186. package/client/assets/{useFollowComponent-iGQv4zoS.js → useFollowComponent-Qo3FobyV.js} +2 -2
  187. package/client/assets/useFollowComponent-Qo3FobyV.js.br +0 -0
  188. package/client/assets/useFollowComponent-Qo3FobyV.js.gz +0 -0
  189. package/client/assets/{useFollowComponent-iGQv4zoS.js.map → useFollowComponent-Qo3FobyV.js.map} +1 -1
  190. package/client/assets/{useProjectData-CetvEK9E.js → useProjectData-DW06zQvF.js} +2 -2
  191. package/client/assets/useProjectData-DW06zQvF.js.br +0 -0
  192. package/client/assets/useProjectData-DW06zQvF.js.gz +0 -0
  193. package/client/assets/{useProjectData-CetvEK9E.js.map → useProjectData-DW06zQvF.js.map} +1 -1
  194. package/client/assets/{useReport-PEFRsOhF.js → useReport-DhFY2L8v.js} +2 -2
  195. package/client/assets/useReport-DhFY2L8v.js.br +0 -0
  196. package/client/assets/useReport-DhFY2L8v.js.gz +0 -0
  197. package/client/assets/{useReport-PEFRsOhF.js.map → useReport-DhFY2L8v.js.map} +1 -1
  198. package/client/assets/useRundown-ihoU8qBi.js +2 -0
  199. package/client/assets/useRundown-ihoU8qBi.js.br +0 -0
  200. package/client/assets/useRundown-ihoU8qBi.js.gz +0 -0
  201. package/client/assets/useRundown-ihoU8qBi.js.map +1 -0
  202. package/client/assets/{useWindowTitle-b5fN0StF.js → useWindowTitle-B2UzPuki.js} +2 -2
  203. package/client/assets/useWindowTitle-B2UzPuki.js.br +0 -0
  204. package/client/assets/useWindowTitle-B2UzPuki.js.gz +0 -0
  205. package/client/assets/{useWindowTitle-b5fN0StF.js.map → useWindowTitle-B2UzPuki.js.map} +1 -1
  206. package/client/assets/{validateEvent-Bvgk1E-Y.js → validateEvent-BJMwP_mq.js} +2 -2
  207. package/client/assets/validateEvent-BJMwP_mq.js.br +0 -0
  208. package/client/assets/validateEvent-BJMwP_mq.js.gz +0 -0
  209. package/client/assets/{validateEvent-Bvgk1E-Y.js.map → validateEvent-BJMwP_mq.js.map} +1 -1
  210. package/client/assets/{vendor-Cu5xgv5K.js → vendor-9UkPSc5K.js} +3 -3
  211. package/client/assets/vendor-9UkPSc5K.js.br +0 -0
  212. package/client/assets/vendor-9UkPSc5K.js.gz +0 -0
  213. package/client/assets/{vendor-Cu5xgv5K.js.map → vendor-9UkPSc5K.js.map} +1 -1
  214. package/client/assets/{viewLoader.utils-BPhACxyG.js → viewLoader.utils-DQGhrjSp.js} +2 -2
  215. package/client/assets/viewLoader.utils-DQGhrjSp.js.br +0 -0
  216. package/client/assets/viewLoader.utils-DQGhrjSp.js.gz +0 -0
  217. package/client/assets/{viewLoader.utils-BPhACxyG.js.map → viewLoader.utils-DQGhrjSp.js.map} +1 -1
  218. package/client/index.html +2 -2
  219. package/external/demo/app.js +2 -2
  220. package/package.json +1 -1
  221. package/server/index.cjs +97 -88
  222. package/client/assets/Backstage-ZSqb8OU6.js.br +0 -0
  223. package/client/assets/Backstage-ZSqb8OU6.js.gz +0 -0
  224. package/client/assets/Countdown-DVRZbeRP.js.br +0 -0
  225. package/client/assets/Countdown-DVRZbeRP.js.gz +0 -0
  226. package/client/assets/Countdown-DVRZbeRP.js.map +0 -1
  227. package/client/assets/CustomTranslationModal-D_Cy0d_H.js.br +0 -0
  228. package/client/assets/CustomTranslationModal-D_Cy0d_H.js.gz +0 -0
  229. package/client/assets/DelayIndicator-B_JKLKYW.js.br +0 -0
  230. package/client/assets/DelayIndicator-B_JKLKYW.js.gz +0 -0
  231. package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.br +0 -0
  232. package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.gz +0 -0
  233. package/client/assets/EditorUtils-De0umjb-.js.br +0 -0
  234. package/client/assets/EditorUtils-De0umjb-.js.gz +0 -0
  235. package/client/assets/Empty-BYF0tVRk.js.br +0 -2
  236. package/client/assets/Empty-BYF0tVRk.js.gz +0 -0
  237. package/client/assets/EmptyPage-DYH2bswA.js.br +0 -0
  238. package/client/assets/EmptyPage-DYH2bswA.js.gz +0 -0
  239. package/client/assets/FollowButton-DyWsvyFF.js.br +0 -0
  240. package/client/assets/FollowButton-DyWsvyFF.js.gz +0 -0
  241. package/client/assets/MessageControlExport-yLGU2dMq.js +0 -2
  242. package/client/assets/MessageControlExport-yLGU2dMq.js.br +0 -0
  243. package/client/assets/MessageControlExport-yLGU2dMq.js.gz +0 -0
  244. package/client/assets/MilestoneEditor-GkzJ-h1C.js.br +0 -0
  245. package/client/assets/MilestoneEditor-GkzJ-h1C.js.gz +0 -0
  246. package/client/assets/Modal-BKL-5GzU.js +0 -2
  247. package/client/assets/Modal-BKL-5GzU.js.br +0 -0
  248. package/client/assets/Modal-BKL-5GzU.js.gz +0 -0
  249. package/client/assets/Modal-BKL-5GzU.js.map +0 -1
  250. package/client/assets/Modal-BgJx3SNK.css +0 -1
  251. package/client/assets/Modal-BgJx3SNK.css.br +0 -0
  252. package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
  253. package/client/assets/MultiPartProgressBar-BITERKS0.js.br +0 -0
  254. package/client/assets/MultiPartProgressBar-BITERKS0.js.gz +0 -0
  255. package/client/assets/OperatorExport-DMZ6eQfT.js.br +0 -0
  256. package/client/assets/OperatorExport-DMZ6eQfT.js.gz +0 -0
  257. package/client/assets/OverviewWrapper-riM6vPno.js +0 -2
  258. package/client/assets/OverviewWrapper-riM6vPno.js.br +0 -0
  259. package/client/assets/OverviewWrapper-riM6vPno.js.gz +0 -0
  260. package/client/assets/ProjectInfo-DxtMq70a.js.br +0 -0
  261. package/client/assets/ProjectInfo-DxtMq70a.js.gz +0 -0
  262. package/client/assets/ProtectRoute-p1fmtLeu.js.br +0 -0
  263. package/client/assets/ProtectRoute-p1fmtLeu.js.gz +0 -0
  264. package/client/assets/ProtectedCuesheet-CvRnqT0z.js.br +0 -0
  265. package/client/assets/ProtectedCuesheet-CvRnqT0z.js.gz +0 -0
  266. package/client/assets/ProtectedEditor-D4UXj1xL.js +0 -3
  267. package/client/assets/ProtectedEditor-D4UXj1xL.js.br +0 -0
  268. package/client/assets/ProtectedEditor-D4UXj1xL.js.gz +0 -0
  269. package/client/assets/ProtectedEditor-D4UXj1xL.js.map +0 -1
  270. package/client/assets/RundownEntry-B1dSz1wu.js.br +0 -0
  271. package/client/assets/RundownEntry-B1dSz1wu.js.gz +0 -0
  272. package/client/assets/RundownExport-CUtaG16H.css +0 -1
  273. package/client/assets/RundownExport-CUtaG16H.css.br +0 -0
  274. package/client/assets/RundownExport-CUtaG16H.css.gz +0 -0
  275. package/client/assets/RundownExport-WjLpncYT.js +0 -3
  276. package/client/assets/RundownExport-WjLpncYT.js.br +0 -0
  277. package/client/assets/RundownExport-WjLpncYT.js.gz +0 -0
  278. package/client/assets/RundownExport-WjLpncYT.js.map +0 -1
  279. package/client/assets/Select-niU9Razm.js.br +0 -0
  280. package/client/assets/Select-niU9Razm.js.gz +0 -0
  281. package/client/assets/Studio-CWdJq4bx.js.br +0 -0
  282. package/client/assets/Studio-CWdJq4bx.js.gz +0 -0
  283. package/client/assets/StyleEditor-BIFjHsgD.js.br +0 -0
  284. package/client/assets/StyleEditor-BIFjHsgD.js.gz +0 -0
  285. package/client/assets/SuperscriptTime-DCTyUARx.js.br +0 -0
  286. package/client/assets/SuperscriptTime-DCTyUARx.js.gz +0 -0
  287. package/client/assets/TimeElements-DBVGVx71.js.br +0 -0
  288. package/client/assets/TimeElements-DBVGVx71.js.gz +0 -0
  289. package/client/assets/TimeInput-wQ67FbW6.js.br +0 -0
  290. package/client/assets/TimeInput-wQ67FbW6.js.gz +0 -0
  291. package/client/assets/TimelinePage-DZefE2vQ.js.br +0 -0
  292. package/client/assets/TimelinePage-DZefE2vQ.js.gz +0 -0
  293. package/client/assets/Timer-Bs450x86.js +0 -2
  294. package/client/assets/Timer-Bs450x86.js.br +0 -0
  295. package/client/assets/Timer-Bs450x86.js.gz +0 -0
  296. package/client/assets/Timer-Bs450x86.js.map +0 -1
  297. package/client/assets/Timer-DGNfbBKM.css +0 -1
  298. package/client/assets/Timer-DGNfbBKM.css.br +0 -0
  299. package/client/assets/Timer-DGNfbBKM.css.gz +0 -0
  300. package/client/assets/TimerControlExport-C1C_vBX4.js +0 -2
  301. package/client/assets/TimerControlExport-C1C_vBX4.js.br +0 -0
  302. package/client/assets/TimerControlExport-C1C_vBX4.js.gz +0 -0
  303. package/client/assets/TitleCard-B4N-kCM3.js.br +0 -0
  304. package/client/assets/TitleCard-B4N-kCM3.js.gz +0 -0
  305. package/client/assets/Tooltip-DJ8Y4CO4.js.br +0 -0
  306. package/client/assets/Tooltip-DJ8Y4CO4.js.gz +0 -0
  307. package/client/assets/ViewLogo-Dd60EREE.js.br +0 -0
  308. package/client/assets/ViewLogo-Dd60EREE.js.gz +0 -0
  309. package/client/assets/ViewParamsEditor-BWEYbq_S.js.br +0 -0
  310. package/client/assets/ViewParamsEditor-BWEYbq_S.js.gz +0 -0
  311. package/client/assets/dateConfig-8rhb0Dbh.js.br +0 -0
  312. package/client/assets/dateConfig-8rhb0Dbh.js.gz +0 -0
  313. package/client/assets/editorSettings-LMnfWux6.js.br +0 -0
  314. package/client/assets/editorSettings-LMnfWux6.js.gz +0 -0
  315. package/client/assets/getProgress-CyJTu6f5.js.br +0 -0
  316. package/client/assets/getProgress-CyJTu6f5.js.gz +0 -0
  317. package/client/assets/index-5QAOtSTh.js.br +0 -0
  318. package/client/assets/index-5QAOtSTh.js.gz +0 -0
  319. package/client/assets/offset-CLDSqOP5.js.br +0 -0
  320. package/client/assets/offset-CLDSqOP5.js.gz +0 -0
  321. package/client/assets/parseUserTime-CCDHpp7D.js.br +0 -0
  322. package/client/assets/parseUserTime-CCDHpp7D.js.gz +0 -0
  323. package/client/assets/playbackstate-6lBh6omZ.js.br +0 -0
  324. package/client/assets/playbackstate-6lBh6omZ.js.gz +0 -0
  325. package/client/assets/presentation.utils-BUIuV_2e.js.br +0 -0
  326. package/client/assets/presentation.utils-BUIuV_2e.js.gz +0 -0
  327. package/client/assets/rundownUtils-Cnd2prRX.js.br +0 -0
  328. package/client/assets/rundownUtils-Cnd2prRX.js.gz +0 -0
  329. package/client/assets/useCustomFields-BuxKsqGS.js.br +0 -0
  330. package/client/assets/useCustomFields-BuxKsqGS.js.gz +0 -0
  331. package/client/assets/useFollowComponent-iGQv4zoS.js.br +0 -0
  332. package/client/assets/useFollowComponent-iGQv4zoS.js.gz +0 -0
  333. package/client/assets/useProjectData-CetvEK9E.js.br +0 -0
  334. package/client/assets/useProjectData-CetvEK9E.js.gz +0 -0
  335. package/client/assets/useReport-PEFRsOhF.js.br +0 -0
  336. package/client/assets/useReport-PEFRsOhF.js.gz +0 -0
  337. package/client/assets/useRundown-D8CYATNi.js +0 -2
  338. package/client/assets/useRundown-D8CYATNi.js.br +0 -0
  339. package/client/assets/useRundown-D8CYATNi.js.gz +0 -0
  340. package/client/assets/useRundown-D8CYATNi.js.map +0 -1
  341. package/client/assets/useWindowTitle-b5fN0StF.js.br +0 -0
  342. package/client/assets/useWindowTitle-b5fN0StF.js.gz +0 -0
  343. package/client/assets/validateEvent-Bvgk1E-Y.js.br +0 -0
  344. package/client/assets/validateEvent-Bvgk1E-Y.js.gz +0 -0
  345. package/client/assets/vendor-Cu5xgv5K.js.br +0 -0
  346. package/client/assets/vendor-Cu5xgv5K.js.gz +0 -0
  347. package/client/assets/viewLoader.utils-BPhACxyG.js.br +0 -0
  348. package/client/assets/viewLoader.utils-BPhACxyG.js.gz +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timer-jjWAunJc.js","sources":["../../src/common/components/fit-text/fitText.utils.ts","../../src/common/components/fit-text/FitText.tsx","../../src/views/timer/timer.options.ts","../../src/views/timer/timer.utils.ts","../../src/views/timer/useTimerData.ts","../../src/views/timer/Timer.tsx"],"sourcesContent":["/**\n * @param low inclusive, must be true on predicate function\n * @param high exclusive,\n * @param predicate predicate function\n */\nexport const bsearch = (low: number, high: number, predicate: (mid: number) => boolean): number => {\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (mid === low) break;\n\n if (predicate(mid)) {\n low = mid;\n } else {\n high = mid;\n }\n }\n return low;\n};\n","/**\n * Copied from\n * https://github.com/namhong2001/react-textfit/blob/master/index.tsx\n */\n\nimport { HTMLAttributes, PropsWithChildren, useCallback, useEffect, useRef } from 'react';\n\nimport { bsearch } from './fitText.utils';\n\ninterface FitTextProps extends HTMLAttributes<HTMLDivElement> {\n mode?: 'single' | 'multi';\n min?: number; // inclusive\n max?: number; // inclusive\n}\n\nexport function FitText({\n children,\n mode = 'multi',\n min = 16,\n max = 256,\n ...elementProps\n}: PropsWithChildren<FitTextProps>) {\n const ref = useRef<HTMLDivElement>(null);\n\n const isOverflown = useCallback(() => {\n const el = ref.current;\n if (!el) return false;\n return el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;\n }, []);\n\n const setFontSize = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n\n const originVisibility = el.style.visibility;\n\n el.style.visibility = 'hidden';\n const fontSize = bsearch(min, max + 1, (mid) => {\n el.style.fontSize = `${mid}px`;\n return !isOverflown();\n });\n el.style.fontSize = `${fontSize}px`;\n el.style.visibility = originVisibility;\n }, [isOverflown, min, max]);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n setFontSize();\n const observer = new ResizeObserver(setFontSize);\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [children, mode, setFontSize]);\n\n return (\n <div\n ref={ref}\n style={{\n whiteSpace: mode === 'single' ? 'nowrap' : 'normal',\n }}\n {...elementProps}\n >\n {children}\n </div>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, TimerType } from 'ontime-types';\nimport { validateTimerType } from 'ontime-utils';\n\nimport type { SelectOption } from '../../common/components/select/Select';\nimport {\n getTimeOption,\n hideTimerSeconds,\n showLeadingZeros,\n} from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport { makeOptionsFromCustomFields } from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean, makeColourString } from '../../features/viewers/common/viewUtils';\n\n// manually match the properties of TimerType excluding the None\nconst timerDisplayOptions: SelectOption[] = [\n { value: 'no-overrides', label: 'No Overrides' },\n { value: TimerType.CountUp, label: 'Count Up' },\n { value: TimerType.CountDown, label: 'Count Down' },\n { value: TimerType.Clock, label: 'Clock' },\n];\n\nexport const getTimerOptions = (timeFormat: string, customFields: CustomFields): ViewOption[] => {\n const mainOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.TimerOptions,\n collapsible: true,\n options: [\n hideTimerSeconds,\n showLeadingZeros,\n {\n id: 'timerType',\n title: 'Timer type',\n description: 'Override the timer type',\n type: 'option',\n values: timerDisplayOptions,\n defaultValue: 'no-overrides',\n },\n {\n id: 'freezeOvertime',\n title: 'Freeze Overtime',\n description: 'If active, the timer will not count into negative numbers',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'freezeMessage',\n title: 'Freeze Message',\n description:\n 'An optional message to show when the timer is in overtime (must be set in combination with Freeze Overtime)',\n type: 'string',\n defaultValue: '',\n placeholder: 'e.g. Time is up!',\n },\n {\n id: 'hidePhase',\n title: 'Hide progress styles',\n description: 'Whether to suppress the progress styles (warning, danger and overtime)',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main text',\n description: 'Select the data source for the main text',\n type: 'option',\n values: mainOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary text',\n description: 'Select the data source for the secondary text',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hideClock',\n title: 'Hide Time Now',\n description: 'Hides the Time Now field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideCards',\n title: 'Hide Cards',\n description: 'Hides the Now and Next cards',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideProgress',\n title: 'Hide progress bar',\n description: 'Hides the progress bar',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideMessage',\n title: 'Hide Timer Message',\n description: 'Prevents displaying fullscreen messages in the timer',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideSecondary',\n title: 'Hide Auxiliary timer / Secondary message',\n description: 'Prevents the screen from displaying the secondary timer field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideLogo',\n title: 'Hide the project logo',\n description: 'Prevents the screen from displaying the given project logo',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.StyleOverride,\n collapsible: true,\n options: [\n {\n id: 'font',\n title: 'Font',\n description: 'Font family, will use the fonts available in the system',\n type: 'string',\n placeholder: 'Open Sans (default)',\n },\n {\n id: 'keyColour',\n title: 'Key Colour',\n description: 'Background or key colour for entire view. Default: #101010',\n type: 'colour',\n defaultValue: '101010',\n },\n {\n id: 'timerColour',\n title: 'Timer Colour',\n description: 'Timer colour. Default: #f6f6f6',\n type: 'colour',\n defaultValue: 'f6f6f6',\n },\n ],\n },\n ];\n};\n\ntype TimerOptions = {\n hideClock: boolean;\n hideCards: boolean;\n hideProgress: boolean;\n hideMessage: boolean;\n hideSecondary: boolean;\n hideLogo: boolean;\n hideTimerSeconds: boolean;\n removeLeadingZeros: boolean;\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n timerType?: TimerType;\n freezeOvertime: boolean;\n freezeMessage: string;\n hidePhase: boolean;\n font?: string;\n keyColour?: string;\n timerColour?: string;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallbacks are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): TimerOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Get timerType from either source\n const timerType = validateTimerType(getValue('timerType'), TimerType.None);\n\n return {\n hideClock: isStringBoolean(getValue('hideClock')),\n hideCards: isStringBoolean(getValue('hideCards')),\n hideProgress: isStringBoolean(getValue('hideProgress')),\n hideMessage: isStringBoolean(getValue('hideMessage')),\n hideSecondary: isStringBoolean(getValue('hideSecondary')),\n hideLogo: isStringBoolean(getValue('hideLogo')),\n hideTimerSeconds: isStringBoolean(getValue('hideTimerSeconds')),\n removeLeadingZeros: !isStringBoolean(getValue('showLeadingZeros')),\n\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n\n // none doesnt make sense as a configuration of the view\n timerType: timerType === TimerType.None ? undefined : timerType,\n freezeOvertime: isStringBoolean(getValue('freezeOvertime')),\n freezeMessage: getValue('freezeMessage') ?? '',\n hidePhase: isStringBoolean(getValue('hidePhase')),\n\n font: getValue('font') ?? undefined,\n keyColour: makeColourString(getValue('keyColour')),\n timerColour: makeColourString(getValue('timerColour')),\n };\n}\n\n/**\n * Hook exposes the timer view options\n */\nexport function useTimerOptions(): TimerOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { MaybeNumber, MessageState, OntimeEvent, Playback, TimerMessage, TimerPhase, TimerType } from 'ontime-types';\nimport { isPlaybackActive } from 'ontime-utils';\n\nimport { getFormattedTimer, getPropertyValue } from '../../features/viewers/common/viewUtils';\n\n/**\n * Whether a message should be shown\n */\nexport function getShowMessage(message: TimerMessage): boolean {\n return message.text !== '' && message.visible;\n}\n\n/**\n * Whether the playback is playing\n */\nexport function getIsPlaying(playback: Playback): boolean {\n return playback === Playback.Play || playback === Playback.Roll;\n}\n\n/**\n * Gets the total time from the duration and added time of an event\n */\nexport function getTotalTime(duration: MaybeNumber, addedTime: MaybeNumber): number {\n return (duration ?? 0) + (addedTime ?? 0);\n}\n\n/**\n * Whether the progress bar should be shown for this timer type\n */\nexport function getShowProgressBar(timerType: TimerType) {\n return timerType !== TimerType.None && timerType !== TimerType.Clock;\n}\n\n/**\n * Whether the clock should be shown with this timer type\n */\nexport function getShowClock(timerType: TimerType) {\n return timerType !== TimerType.Clock;\n}\n\nconst fontSizeMap: { [key: number]: number } = {\n 4: 28, // 9:01\n 5: 28, // -9:01, 10:01, 9 min\n 6: 25, // -10:01, 10 min\n 8: 18, // 23:01:01\n 9: 18, // -23:01:01\n};\n\n/**\n * Finds a font size that fits the timer in the screen\n * Unfortunately hand tweaked\n */\nexport function getEstimatedFontSize(stageTimer: string, secondaryContent?: string) {\n const stageTimerCharacters = stageTimer.length;\n let timerFontSize = (100 / (stageTimerCharacters - 1)) * 1.25;\n\n if (fontSizeMap[stageTimerCharacters]) {\n timerFontSize = fontSizeMap[stageTimerCharacters];\n }\n\n let externalFontSize = timerFontSize * 0.325;\n if (secondaryContent) {\n // we need to shrink the timer if the external is going to be there\n // this number has been tweaked to fit in a landscape mobile screen\n timerFontSize *= 0.6;\n if (secondaryContent.length > 25) {\n externalFontSize = (100 / (secondaryContent.length - 1)) * 1.8;\n }\n }\n\n return {\n timerFontSize,\n externalFontSize,\n };\n}\n\n/**\n * which, if any, modifier should be shown at any time\n */\nexport function getShowModifiers(\n timerType: TimerType,\n countToEnd: boolean,\n phase: TimerPhase,\n freezeOvertime: boolean,\n freezeMessage: string,\n hidePhase: boolean,\n) {\n if (hidePhase) {\n return {\n showEndMessage: false,\n showFinished: false,\n showWarning: false,\n showDanger: false,\n };\n }\n\n const showModifiers = timerType === TimerType.CountDown || countToEnd;\n if (!showModifiers) {\n return {\n showEndMessage: false,\n showFinished: false,\n showWarning: false,\n showDanger: false,\n };\n }\n\n return {\n showEndMessage: phase === TimerPhase.Overtime && freezeOvertime && freezeMessage !== '',\n showFinished: phase === TimerPhase.Overtime,\n showWarning: phase === TimerPhase.Warning,\n showDanger: phase === TimerPhase.Danger,\n };\n}\n\n/**\n * What, if anything, should be displayed in the secondary field\n */\nexport function getSecondaryDisplay(\n message: MessageState,\n currentAux: MaybeNumber,\n localisedMinutes: string,\n removeSeconds: boolean,\n removeLeadingZero: boolean,\n hideSecondary: boolean,\n): string | undefined {\n if (hideSecondary) {\n return;\n }\n if (\n message.timer.secondarySource === 'aux1' ||\n message.timer.secondarySource === 'aux2' ||\n message.timer.secondarySource === 'aux3'\n ) {\n return getFormattedTimer(currentAux, TimerType.CountDown, localisedMinutes, {\n removeSeconds,\n removeLeadingZero,\n });\n }\n if (message.timer.secondarySource === 'secondary' && message.secondary) {\n return message.secondary;\n }\n return;\n}\n\n/**\n * What should we be showing in the cards?\n */\nexport function getCardData(\n eventNow: OntimeEvent | null,\n eventNext: OntimeEvent | null,\n mainSource: keyof OntimeEvent | null,\n secondarySource: keyof OntimeEvent | null,\n playback: Playback,\n phase: TimerPhase,\n) {\n if (playback === Playback.Stop) {\n return {\n showNow: false,\n nowMain: undefined,\n nowSecondary: undefined,\n showNext: false,\n nextMain: undefined,\n nextSecondary: undefined,\n };\n }\n\n // pending roll timers would be classified as active\n const hasActiveTimer = isPlaybackActive(playback) && phase !== TimerPhase.Pending;\n\n // if we are loaded, we show the upcoming event as next\n const nowMain = hasActiveTimer ? getPropertyValue(eventNow, mainSource ?? 'title') : undefined;\n const nowSecondary = hasActiveTimer ? getPropertyValue(eventNow, secondarySource) : undefined;\n const nextMain = hasActiveTimer\n ? getPropertyValue(eventNext, mainSource ?? 'title')\n : getPropertyValue(eventNow, mainSource ?? 'title');\n const nextSecondary = hasActiveTimer\n ? getPropertyValue(eventNext, secondarySource)\n : getPropertyValue(eventNow, secondarySource);\n\n return {\n showNow: Boolean(nowMain) || Boolean(nowSecondary),\n nowMain,\n nowSecondary,\n showNext: Boolean(nextMain) || Boolean(nextSecondary),\n nextMain,\n nextSecondary,\n };\n}\n","import { CustomFields, ProjectData, Settings, ViewSettings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport useViewSettings from '../../common/hooks-query/useViewSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface TimerData {\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n viewSettings: ViewSettings;\n}\n\nexport function useTimerData(): ViewData<TimerData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: viewSettings, status: viewSettingsStatus } = useViewSettings();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n customFields,\n projectData,\n isMirrored,\n settings,\n viewSettings,\n },\n status: aggregateQueryStatus([projectDataStatus, viewSettingsStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useMemo } from 'react';\nimport { OntimeView } from 'ontime-types';\n\nimport { FitText } from '../../common/components/fit-text/FitText';\nimport MultiPartProgressBar from '../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport TitleCard from '../../common/components/title-card/TitleCard';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useTimerSocket } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getFormattedTimer, getTimerByType } from '../../features/viewers/common/viewUtils';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport { getTimerColour } from '../utils/presentation.utils';\n\nimport { getTimerOptions, useTimerOptions } from './timer.options';\nimport {\n getCardData,\n getEstimatedFontSize,\n getIsPlaying,\n getSecondaryDisplay,\n getShowClock,\n getShowMessage,\n getShowModifiers,\n getShowProgressBar,\n getTotalTime,\n} from './timer.utils';\nimport { TimerData, useTimerData } from './useTimerData';\n\nimport './Timer.scss';\n\nexport default function TimerLoader() {\n const { data, status } = useTimerData();\n\n useWindowTitle('Timer');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Timer {...data} />;\n}\n\nfunction Timer({ customFields, projectData, isMirrored, settings, viewSettings }: TimerData) {\n const { eventNext, eventNow, message, time, clock, timerTypeNow, countToEndNow, auxTimer } = useTimerSocket();\n const {\n hideClock,\n hideCards,\n hideProgress,\n hideMessage,\n hideSecondary,\n hideLogo,\n hideTimerSeconds,\n removeLeadingZeros,\n mainSource,\n secondarySource,\n timerType,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n font,\n keyColour,\n timerColour,\n } = useTimerOptions();\n\n const { getLocalizedString } = useTranslation();\n const localisedMinutes = getLocalizedString('common.minutes');\n\n // gather modifiers\n const viewTimerType = timerType ?? timerTypeNow;\n const showOverlay = getShowMessage(message.timer);\n const { showEndMessage, showFinished, showWarning, showDanger } = getShowModifiers(\n timerTypeNow,\n countToEndNow,\n time.phase,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n );\n const isPlaying = getIsPlaying(time.playback);\n const showClock = !hideClock && getShowClock(viewTimerType);\n const showProgressBar = !hideProgress && getShowProgressBar(viewTimerType);\n\n // gather card data\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n mainSource,\n secondarySource,\n time.playback,\n time.phase,\n );\n\n // gather timer data\n const totalTime = getTotalTime(time.duration, time.addedTime);\n const formattedClock = formatTime(clock);\n const stageTimer = getTimerByType(freezeOvertime, timerTypeNow, countToEndNow, clock, time, timerType);\n const display = getFormattedTimer(stageTimer, viewTimerType, localisedMinutes, {\n removeSeconds: hideTimerSeconds,\n removeLeadingZero: removeLeadingZeros,\n });\n\n const currentAux = (() => {\n if (message.timer.secondarySource === 'aux1') {\n return auxTimer.aux1;\n }\n if (message.timer.secondarySource === 'aux2') {\n return auxTimer.aux2;\n }\n if (message.timer.secondarySource === 'aux3') {\n return auxTimer.aux3;\n }\n return null;\n })();\n\n const secondaryContent = getSecondaryDisplay(\n message,\n currentAux,\n localisedMinutes,\n hideTimerSeconds,\n removeLeadingZeros,\n hideSecondary,\n );\n\n // gather presentation styles\n const resolvedTimerColour = getTimerColour(viewSettings, timerColour, showWarning, showDanger);\n const { timerFontSize, externalFontSize } = getEstimatedFontSize(display, secondaryContent);\n const userStyles = {\n ...(keyColour && { '--timer-bg': keyColour }),\n ...(resolvedTimerColour && { '--timer-colour': resolvedTimerColour }),\n ...(font && { '--timer-font': font }),\n };\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const timerOptions = useMemo(() => getTimerOptions(defaultFormat, customFields), [customFields, defaultFormat]);\n\n return (\n <div\n data-testid='timer-view'\n className={cx(['stage-timer', isMirrored && 'mirror', showFinished && 'stage-timer--finished'])}\n style={userStyles}\n >\n {!hideLogo && projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n\n <ViewParamsEditor target={OntimeView.Timer} viewOptions={timerOptions} />\n\n <div className={cx(['blackout', message.timer.blackout && 'blackout--active'])} />\n\n {!hideMessage && (\n <div className={cx(['message-overlay', showOverlay && 'message-overlay--active'])}>\n <FitText mode='multi' min={32} max={256} className={cx(['message', message.timer.blink && 'blink'])}>\n {message.timer.text}\n </FitText>\n </div>\n )}\n\n {showClock && (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='clock' />\n </div>\n )}\n\n <div className={cx(['timer-container', message.timer.blink && !showOverlay && 'blink'])}>\n {showEndMessage ? (\n <FitText mode='multi' min={64} max={256} className='end-message'>\n {freezeMessage}\n </FitText>\n ) : (\n <div\n className={cx(['timer', !isPlaying && 'timer--paused', showFinished && 'timer--finished'])}\n style={{ fontSize: `${timerFontSize}vw` }}\n data-type={viewTimerType}\n data-phase={time.phase}\n >\n {display}\n </div>\n )}\n <div\n className={cx(['secondary', !secondaryContent && 'secondary--hidden'])}\n style={{ fontSize: `${externalFontSize}vw` }}\n >\n {secondaryContent}\n </div>\n </div>\n\n {showProgressBar && (\n <MultiPartProgressBar\n className={cx(['progress-container', !isPlaying && 'progress-container--paused'])}\n now={time.current}\n complete={totalTime}\n normalColor={viewSettings.normalColor}\n warning={eventNow?.timeWarning}\n warningColor={viewSettings.warningColor}\n danger={eventNow?.timeDanger}\n dangerColor={viewSettings.dangerColor}\n hideOvertime={!showFinished}\n />\n )}\n\n {!hideCards && (\n <>\n {showNow && <TitleCard className='event now' label='now' title={nowMain} secondary={nowSecondary} />}\n {showNext && <TitleCard className='event next' label='next' title={nextMain} secondary={nextSecondary} />}\n </>\n )}\n </div>\n );\n}\n"],"names":["bsearch","low","high","predicate","mid","FitText","children","mode","min","max","elementProps","ref","useRef","isOverflown","useCallback","el","setFontSize","originVisibility","fontSize","useEffect","observer","jsx","timerDisplayOptions","TimerType","getTimerOptions","timeFormat","customFields","mainOptions","makeOptionsFromCustomFields","secondaryOptions","OptionTitle","getTimeOption","hideTimerSeconds","showLeadingZeros","getOptionsFromParams","searchParams","defaultValues","getValue","key","timerType","validateTimerType","isStringBoolean","makeColourString","useTimerOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","getShowMessage","message","getIsPlaying","playback","Playback","getTotalTime","duration","addedTime","getShowProgressBar","getShowClock","fontSizeMap","getEstimatedFontSize","stageTimer","secondaryContent","stageTimerCharacters","timerFontSize","externalFontSize","getShowModifiers","countToEnd","phase","freezeOvertime","freezeMessage","hidePhase","TimerPhase","getSecondaryDisplay","currentAux","localisedMinutes","removeSeconds","removeLeadingZero","hideSecondary","getFormattedTimer","getCardData","eventNow","eventNext","mainSource","secondarySource","hasActiveTimer","isPlaybackActive","nowMain","getPropertyValue","nowSecondary","nextMain","nextSecondary","useTimerData","isMirrored","useViewOptionsStore","state","projectData","projectDataStatus","useProjectData","viewSettings","viewSettingsStatus","useViewSettings","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","TimerLoader","data","status","useWindowTitle","Loader","EmptyPage","Timer","time","clock","timerTypeNow","countToEndNow","auxTimer","useTimerSocket","hideClock","hideCards","hideProgress","hideMessage","hideLogo","removeLeadingZeros","font","keyColour","timerColour","getLocalizedString","useTranslation","viewTimerType","showOverlay","showEndMessage","showFinished","showWarning","showDanger","isPlaying","showClock","showProgressBar","showNow","showNext","totalTime","formattedClock","formatTime","getTimerByType","display","resolvedTimerColour","getTimerColour","userStyles","defaultFormat","getDefaultFormat","timerOptions","jsxs","cx","ViewLogo","ViewParamsEditor","OntimeView","SuperscriptTime","MultiPartProgressBar","Fragment","TitleCard"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{h as w,j as t,ax as W,bK as Y,T as Z,aL as tt,x as et,bL as $,bM as q,bN as E,bO as st,bP as at,bQ as nt}from"./vendor-9UkPSc5K.js";import{C as it}from"./EditorUtils-CFE106qQ.js";import{b as n,a as T,i as M,H as ot,bB as c,bC as lt,bD as P,bE as h,bF as I,bG as rt,y as g,bg as S,J as ct,l as A,r as dt,bH as mt,av as ut,bv as xt,b6 as pt,bw as _t}from"./index-njXwwjfn.js";import{P as bt}from"./ProtectRoute-DJ9xZnPI.js";import{T as z,A as ht}from"./TimeInput-DU09ewqh.js";import{p as L}from"./parseUserTime-Bc1pSJR2.js";import{T as R}from"./Tooltip-C0rGHLsB.js";import{u as yt}from"./useReport-DhFY2L8v.js";import{s as B}from"./Editor.module-DvV2efYs.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]="feb26a1e-b919-4a09-a97c-e027a3c6bb53",e._sentryDebugIdIdentifier="sentry-dbid-feb26a1e-b919-4a09-a97c-e027a3c6bb53")}catch{}})();function jt(e,s){return{start:e!==n.Stop&&e!==n.Play,pause:e===n.Play,roll:e!==n.Roll&&s!==T.Overtime,stop:e!==n.Stop,reload:e!==n.Stop&&e!==n.Roll}}const ft="_blink_yewzx_1",vt="_fourtyfive_yewzx_13",gt="_tapButton_yewzx_17",kt="_neutral_yewzx_29",Ct="_active_yewzx_51",Nt="_play_yewzx_66",Tt="_roll_yewzx_93",wt="_pause_yewzx_120",It="_ontime_yewzx_147",Pt="_stop_yewzx_174",St="_square_yewzx_201",At="_tight_yewzx_206",Rt="_fill_yewzx_211",f={blink:ft,fourtyfive:vt,tapButton:gt,neutral:kt,active:Ct,play:Nt,roll:Tt,pause:wt,ontime:It,stop:Pt,square:St,tight:At,fill:Rt},r=w.forwardRef((e,s)=>{const{children:a,disabled:i,onClick:l,theme:o="neutral",aspect:m="normal",active:u,className:x}=e;return t.jsx("button",{className:M([f.tapButton,x,f[o],f[m],u&&f.active]),disabled:i,type:"button",onClick:l,ref:s,children:a})});r.displayName="TabButton";const Bt="_addTime_18oax_17",Dt="_addButtons_18oax_24",$t="_tallButtons_18oax_30",v={addTime:Bt,addButtons:Dt,tallButtons:$t};function qt(e){const{playback:s}=e,[a,i]=W({key:"add-time",defaultValue:3e5}),l=(x,k)=>{const _=L(k);i(Math.min(_,ot))},o=x=>{x==="add"?c.addTime(a):c.addTime(-1*a)},u=!(s===n.Play||s===n.Pause)||a===0;return t.jsxs("div",{className:v.addTime,children:[t.jsx(z,{name:"addtime",submitHandler:l,time:a,placeholder:"Add time"}),t.jsxs("div",{className:v.addButtons,children:[t.jsx(r,{onClick:()=>o("remove"),disabled:u,className:v.tallButtons,children:t.jsx(Y,{})}),t.jsx(r,{onClick:()=>o("add"),disabled:u,className:v.tallButtons,children:t.jsx(Z,{})})]})]})}const Et="_label_u5jlo_17",Mt="_controls_u5jlo_24",zt="_input_u5jlo_28",Lt="_twoSides_u5jlo_34",Ft="_fakeInput_u5jlo_42",y={label:Et,controls:Mt,input:zt,twoSides:Lt,fakeInput:Ft};function C({index:e}){const{playback:s,direction:a}=lt(e),{stop:i,setDirection:l}=I,o=()=>{const x=a===h.CountDown?h.CountUp:h.CountDown;l(e,x)},m=s!==P.Stop,u=s===P.Start?"pause":"play";return t.jsxs("label",{className:y.label,children:["Aux Timer ",e,t.jsxs("div",{className:y.controls,children:[t.jsxs("div",{className:y.input,children:[t.jsx(Ot,{index:e,isActive:m}),t.jsxs(r,{onClick:o,aspect:"tight",disabled:m,children:[a===h.CountDown&&t.jsx(tt,{"data-testid":`aux-timer-direction-${e}`}),a===h.CountUp&&t.jsx(et,{"data-testid":`aux-timer-direction-${e}`})]})]}),t.jsxs("div",{className:y.twoSides,children:[t.jsx(Ut,{index:e,action:u}),t.jsx(r,{onClick:()=>i(e),theme:n.Stop,disabled:!m,children:t.jsx($,{"data-testid":`aux-timer-stop-${e}`})})]})]})]})}function Ot({index:e,isActive:s}){const a=rt(e),{setDuration:i}=I,l=(o,m)=>{const u=L(m);i(e,u)};return s?t.jsx("div",{className:y.fakeInput,"data-testid":`time-label-aux${e}`,children:g(a)}):t.jsx(z,{submitHandler:l,name:`aux${e}`,time:a,placeholder:`Aux ${e}`})}function Ut({index:e,action:s}){const{start:a,pause:i}=I;return s==="play"?t.jsx(r,{onClick:()=>a(e),theme:n.Play,children:t.jsx(q,{"data-testid":`aux-timer-start-${e}`})}):t.jsx(r,{onClick:()=>i(e),theme:n.Pause,children:t.jsx(E,{"data-testid":`aux-timer-pause-${e}`})})}const Ht="_buttonContainer_1mqxq_17",Xt="_go_1mqxq_25",Gt="_playbackContainer_1mqxq_30",Vt="_transportContainer_1mqxq_37",Jt="_extra_1mqxq_44",Kt="_invertX_1mqxq_51",p={buttonContainer:Ht,go:Xt,playbackContainer:Gt,transportContainer:Vt,extra:Jt,invertX:Kt};function Qt(e){const{playback:s,numEvents:a,selectedEventIndex:i,timerPhase:l}=e,o=s===n.Roll,m=s===n.Play,u=s===n.Pause,x=s===n.Armed,k=i===0,_=i===a-1,j=a===0,F=o||j,O=o||j||_,U=o||j||k,b=jt(s,l),H=!b.start,X=!b.pause,G=!b.roll||j,V=!b.stop,J=!b.reload,[K,Q]=w.useMemo(()=>x?[c.start,"Start"]:_?[c.stop,"Finish"]:i===null?[c.startNext,"Start"]:[c.startNext,"Next"],[x,_,i]);return t.jsxs("div",{className:p.buttonContainer,children:[t.jsx(r,{disabled:F,onClick:K,aspect:"fill",className:p.go,children:Q}),t.jsxs("div",{className:p.playbackContainer,children:[t.jsx(r,{onClick:c.start,disabled:H,theme:n.Play,active:m,children:t.jsx(q,{})}),t.jsx(r,{onClick:c.pause,disabled:X,theme:n.Pause,active:u,children:t.jsx(E,{})})]}),t.jsxs("div",{className:p.transportContainer,children:[t.jsx(r,{onClick:c.previous,disabled:U,children:t.jsx(st,{})}),t.jsx(r,{onClick:c.next,disabled:O,children:t.jsx(at,{})})]}),t.jsxs("div",{className:p.extra,children:[t.jsx(r,{onClick:c.roll,disabled:G,theme:n.Roll,active:o,children:"Roll"}),t.jsx(r,{onClick:c.reload,disabled:J,children:t.jsx(nt,{className:p.invertX})}),t.jsx(r,{onClick:c.stop,disabled:V,theme:n.Stop,children:t.jsx($,{})})]})]})}const Wt="_timer_1f17d_21",Yt="_finished_1f17d_33",Zt="_muted_1f17d_36",N={timer:Wt,finished:Yt,muted:Zt};function te(e){const{time:s}=e,a=(s??0)<0,i=s==null?S:g(s,{fallback:S}).replace("-",""),l=M([N.timer,a?N.finished:null,s===null&&N.muted]);return t.jsx("div",{className:l,children:i})}const ee="_timeContainer_g12ye_17",se="_indicators_g12ye_25",ae="_indicatorRoll_g12ye_34",ne="_indicatorDelay_g12ye_35",ie="_indicatorNegative_g12ye_36",oe="_status_g12ye_65",le="_tag_g12ye_73",re="_time_g12ye_17",ce="_rolltag_g12ye_84",d={timeContainer:ee,indicators:se,indicatorRoll:ae,indicatorDelay:ne,indicatorNegative:ie,status:oe,tag:le,time:re,rolltag:ce};function de(e){return e>0?`Added ${A(e,!1)}`:e<0?`Removed ${A(Math.abs(e),!1)}`:""}function me({children:e}){const s=ct(),a=s.playback===n.Roll,i=s.phase===T.Pending,l=s.phase===T.Overtime,o=!!s.addedTime,m=a?"Roll mode active":"",u=de(s.addedTime);return t.jsxs("div",{className:d.timeContainer,children:[t.jsxs("div",{className:d.indicators,children:[t.jsx(R,{text:m,render:t.jsx("div",{}),className:d.indicatorRoll,"data-active":a}),t.jsx("div",{className:d.indicatorNegative,"data-active":l}),t.jsx(R,{text:u,render:t.jsx("div",{}),className:d.indicatorDelay,"data-active":o})]}),t.jsx(te,{time:i?s.secondaryTimer:s.current}),t.jsx("div",{className:d.status,children:i?t.jsx("span",{className:d.rolltag,children:"Roll: Countdown to start"}):t.jsx(ue,{startedAt:s.startedAt,expectedFinish:s.expectedFinish,playback:s.playback})}),e]})}function ue({startedAt:e,expectedFinish:s,playback:a}){if(a===n.Stop)return t.jsx(xe,{});const i=g(e),l=s!==null?s%dt:null,o=g(l);return t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:d.start,children:[t.jsx("span",{className:d.tag,children:"Started at"}),t.jsx("span",{className:d.time,children:i})]}),t.jsxs("span",{className:d.finish,children:[t.jsx("span",{className:d.tag,children:"Expect end"}),t.jsx("span",{className:d.time,children:o})]})]})}function xe(){const{data:e}=yt();return Object.keys(e).length>0?t.jsx(ht,{search:"settings=sharing__report",children:"Go to report management"}):null}const pe="_mainContainer_1qlxm_17",_e="_auxTimers_1qlxm_22",D={mainContainer:pe,auxTimers:_e};function be(){const e=mt();return t.jsxs("div",{className:D.mainContainer,children:[t.jsx(me,{children:t.jsx(qt,{playback:e.playback})}),t.jsx(Qt,{playback:e.playback,numEvents:e.numEvents,selectedEventIndex:e.selectedEventIndex,timerPhase:e.timerPhase}),t.jsxs("div",{className:D.auxTimers,children:[t.jsx(C,{index:1}),t.jsx(C,{index:2}),t.jsx(C,{index:3})]})]})}const we=w.memo(he);function he(){const e=window.location.pathname.includes("/timercontrol");return t.jsx(bt,{permission:"editor",children:t.jsxs("div",{className:B.playback,"data-testid":"panel-timer-control",children:[!e&&t.jsx(it,{onClick:s=>ut("timercontrol",s)}),e&&t.jsx(xt,{suppressSettings:!0,isNavigationLocked:pt()}),t.jsx("div",{className:B.content,children:t.jsx(_t,{children:t.jsx(be,{})})})]})})}export{we as default};
2
+ //# sourceMappingURL=TimerControlExport-i0ZDpUx7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimerControlExport-C1C_vBX4.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-i0ZDpUx7.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';\nimport { getIsNavigationLocked } from '../../../externals';\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 isNavigationLocked={getIsNavigationLocked()} />}\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","getIsNavigationLocked","ErrorBoundary"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{h as o,j as t}from"./vendor-Cu5xgv5K.js";import{f,i as d}from"./index-5QAOtSTh.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-B4N-kCM3.js.map
1
+ import{h as o,j as t}from"./vendor-9UkPSc5K.js";import{f,i as d}from"./index-njXwwjfn.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-BgOtucv6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TitleCard-B4N-kCM3.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-BgOtucv6.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-Cu5xgv5K.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-DJ8Y4CO4.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-9UkPSc5K.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-C0rGHLsB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip-DJ8Y4CO4.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-C0rGHLsB.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-Cu5xgv5K.js";import{K as t}from"./index-5QAOtSTh.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-Dd60EREE.js.map
1
+ import{j as n}from"./vendor-9UkPSc5K.js";import{K as t}from"./index-njXwwjfn.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--9miplQv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewLogo-Dd60EREE.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--9miplQv.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,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-Cu5xgv5K.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-5QAOtSTh.js";import{C as q,I as Z}from"./useWindowTitle-b5fN0StF.js";import{S as G}from"./Select-niU9Razm.js";import{d as J,S as K}from"./useProjectData-CetvEK9E.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-BWEYbq_S.js.map
1
+ import{l as j,j as a,h as d,ax as k,aT as N,D as V,p as E,q as D,s as F,G as $,t as I}from"./vendor-9UkPSc5K.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 v,c as U,bh as B,ai as W}from"./index-njXwwjfn.js";import{C as q,I as Z}from"./useWindowTitle-B2UzPuki.js";import{S as G}from"./Select-BLA-yQMq.js";import{d as J,S as K}from"./useProjectData-DW06zQvF.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]="febe8e87-d847-429f-9c29-c4086796e76a",e._sentryDebugIdIdentifier="sentry-dbid-febe8e87-d847-429f-9c29-c4086796e76a")}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},x=e=>e.startsWith("#")?e:`#${e}`;function ce({name:e,value:s}){const[n,t]=d.useState(()=>x(s));return d.useEffect(()=>{t(x(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",xe="_title_r3z5t_41",ve="_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:xe,description:ve,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-BFu_0oIb.js.map