@getontime/cli 4.3.0 → 4.3.1

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 (353) hide show
  1. package/client/assets/{Backstage-CDH53Q_N.js → Backstage-D2lEbqUt.js} +2 -2
  2. package/client/assets/Backstage-D2lEbqUt.js.br +0 -0
  3. package/client/assets/Backstage-D2lEbqUt.js.gz +0 -0
  4. package/client/assets/{Backstage-CDH53Q_N.js.map → Backstage-D2lEbqUt.js.map} +1 -1
  5. package/client/assets/{Countdown-B-MuMf1C.js → Countdown-VV03STbF.js} +2 -2
  6. package/client/assets/Countdown-VV03STbF.js.br +0 -0
  7. package/client/assets/Countdown-VV03STbF.js.gz +0 -0
  8. package/client/assets/{Countdown-B-MuMf1C.js.map → Countdown-VV03STbF.js.map} +1 -1
  9. package/client/assets/{CustomTranslationModal-DiQbmcgD.js → CustomTranslationModal-D1nM9W1Z.js} +2 -2
  10. package/client/assets/CustomTranslationModal-D1nM9W1Z.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-D1nM9W1Z.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-DiQbmcgD.js.map → CustomTranslationModal-D1nM9W1Z.js.map} +1 -1
  13. package/client/assets/{DelayIndicator-D--91EO3.js → DelayIndicator-Co5rMYw9.js} +2 -2
  14. package/client/assets/DelayIndicator-Co5rMYw9.js.br +0 -0
  15. package/client/assets/DelayIndicator-Co5rMYw9.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-D--91EO3.js.map → DelayIndicator-Co5rMYw9.js.map} +1 -1
  17. package/client/assets/{EditorFeatureWrapper-DwXUAV4k.js → EditorFeatureWrapper-_t_4D7Es.js} +2 -2
  18. package/client/assets/EditorFeatureWrapper-_t_4D7Es.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-_t_4D7Es.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-DwXUAV4k.js.map → EditorFeatureWrapper-_t_4D7Es.js.map} +1 -1
  21. package/client/assets/{EditorUtils-DuKjlUkF.js → EditorUtils-C3QoonjM.js} +2 -2
  22. package/client/assets/EditorUtils-C3QoonjM.js.br +0 -0
  23. package/client/assets/EditorUtils-C3QoonjM.js.gz +0 -0
  24. package/client/assets/{EditorUtils-DuKjlUkF.js.map → EditorUtils-C3QoonjM.js.map} +1 -1
  25. package/client/assets/{Empty-CJbZxh45.js → Empty-DJMjfXnt.js} +2 -2
  26. package/client/assets/Empty-DJMjfXnt.js.br +2 -0
  27. package/client/assets/Empty-DJMjfXnt.js.gz +0 -0
  28. package/client/assets/{Empty-CJbZxh45.js.map → Empty-DJMjfXnt.js.map} +1 -1
  29. package/client/assets/{EmptyPage-Bc358YpE.js → EmptyPage-BlXZqoIr.js} +2 -2
  30. package/client/assets/EmptyPage-BlXZqoIr.js.br +0 -0
  31. package/client/assets/EmptyPage-BlXZqoIr.js.gz +0 -0
  32. package/client/assets/{EmptyPage-Bc358YpE.js.map → EmptyPage-BlXZqoIr.js.map} +1 -1
  33. package/client/assets/{FollowButton-C6Fvaqh0.js → FollowButton-Dy5n1J2c.js} +2 -2
  34. package/client/assets/FollowButton-Dy5n1J2c.js.br +0 -0
  35. package/client/assets/FollowButton-Dy5n1J2c.js.gz +0 -0
  36. package/client/assets/{FollowButton-C6Fvaqh0.js.map → FollowButton-Dy5n1J2c.js.map} +1 -1
  37. package/client/assets/{MessageControlExport-GmOrvUik.js → MessageControlExport-CWQX8mH0.js} +3 -3
  38. package/client/assets/MessageControlExport-CWQX8mH0.js.br +0 -0
  39. package/client/assets/MessageControlExport-CWQX8mH0.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-GmOrvUik.js.map → MessageControlExport-CWQX8mH0.js.map} +1 -1
  41. package/client/assets/{MilestoneEditor-BA0PVIQh.js → MilestoneEditor-CxWZdQ1B.js} +2 -2
  42. package/client/assets/MilestoneEditor-CxWZdQ1B.js.br +0 -0
  43. package/client/assets/MilestoneEditor-CxWZdQ1B.js.gz +0 -0
  44. package/client/assets/{MilestoneEditor-BA0PVIQh.js.map → MilestoneEditor-CxWZdQ1B.js.map} +1 -1
  45. package/client/assets/{Modal-BKx0PDGT.js → Modal-ePA-Go14.js} +2 -2
  46. package/client/assets/Modal-ePA-Go14.js.br +0 -0
  47. package/client/assets/Modal-ePA-Go14.js.gz +0 -0
  48. package/client/assets/{Modal-BKx0PDGT.js.map → Modal-ePA-Go14.js.map} +1 -1
  49. package/client/assets/{MultiPartProgressBar-BXdLxJpy.js → MultiPartProgressBar-GQaCHX4z.js} +2 -2
  50. package/client/assets/MultiPartProgressBar-GQaCHX4z.js.br +0 -0
  51. package/client/assets/MultiPartProgressBar-GQaCHX4z.js.gz +0 -0
  52. package/client/assets/{MultiPartProgressBar-BXdLxJpy.js.map → MultiPartProgressBar-GQaCHX4z.js.map} +1 -1
  53. package/client/assets/{OperatorExport-X7-qi2jv.js → OperatorExport-CRS08UXj.js} +2 -2
  54. package/client/assets/OperatorExport-CRS08UXj.js.br +0 -0
  55. package/client/assets/OperatorExport-CRS08UXj.js.gz +0 -0
  56. package/client/assets/{OperatorExport-X7-qi2jv.js.map → OperatorExport-CRS08UXj.js.map} +1 -1
  57. package/client/assets/{OverviewWrapper-BQb2xl_N.js → OverviewWrapper-BNRb3Ub_.js} +2 -2
  58. package/client/assets/OverviewWrapper-BNRb3Ub_.js.br +0 -0
  59. package/client/assets/OverviewWrapper-BNRb3Ub_.js.gz +0 -0
  60. package/client/assets/{OverviewWrapper-BQb2xl_N.js.map → OverviewWrapper-BNRb3Ub_.js.map} +1 -1
  61. package/client/assets/{PipHost-CvtlZIn7.js → PipHost-DNfEY6RN.js} +2 -2
  62. package/client/assets/PipHost-DNfEY6RN.js.br +0 -0
  63. package/client/assets/PipHost-DNfEY6RN.js.gz +0 -0
  64. package/client/assets/{PipHost-CvtlZIn7.js.map → PipHost-DNfEY6RN.js.map} +1 -1
  65. package/client/assets/{ProjectInfo-1tw48NHZ.js → ProjectInfo-KPf-pM8y.js} +2 -2
  66. package/client/assets/ProjectInfo-KPf-pM8y.js.br +0 -0
  67. package/client/assets/ProjectInfo-KPf-pM8y.js.gz +0 -0
  68. package/client/assets/{ProjectInfo-1tw48NHZ.js.map → ProjectInfo-KPf-pM8y.js.map} +1 -1
  69. package/client/assets/{ProtectRoute-BH-QvsU0.js → ProtectRoute-DW_vXgYI.js} +2 -2
  70. package/client/assets/ProtectRoute-DW_vXgYI.js.br +0 -0
  71. package/client/assets/ProtectRoute-DW_vXgYI.js.gz +0 -0
  72. package/client/assets/{ProtectRoute-BH-QvsU0.js.map → ProtectRoute-DW_vXgYI.js.map} +1 -1
  73. package/client/assets/{ProtectedCuesheet-CYBIcg1c.js → ProtectedCuesheet-CCVDLsK-.js} +2 -2
  74. package/client/assets/ProtectedCuesheet-CCVDLsK-.js.br +0 -0
  75. package/client/assets/ProtectedCuesheet-CCVDLsK-.js.gz +0 -0
  76. package/client/assets/{ProtectedCuesheet-CYBIcg1c.js.map → ProtectedCuesheet-CCVDLsK-.js.map} +1 -1
  77. package/client/assets/{ProtectedEditor-D_A75byA.js → ProtectedEditor-Ddu9vBS8.js} +3 -3
  78. package/client/assets/ProtectedEditor-Ddu9vBS8.js.br +0 -0
  79. package/client/assets/ProtectedEditor-Ddu9vBS8.js.gz +0 -0
  80. package/client/assets/ProtectedEditor-Ddu9vBS8.js.map +1 -0
  81. package/client/assets/{RundownEntry-bkqwx57t.js → RundownEntry-CpspmKD0.js} +2 -2
  82. package/client/assets/RundownEntry-CpspmKD0.js.br +0 -0
  83. package/client/assets/RundownEntry-CpspmKD0.js.gz +0 -0
  84. package/client/assets/{RundownEntry-bkqwx57t.js.map → RundownEntry-CpspmKD0.js.map} +1 -1
  85. package/client/assets/{RundownExport-EorsanA0.js → RundownExport-DhCryTUp.js} +3 -3
  86. package/client/assets/RundownExport-DhCryTUp.js.br +0 -0
  87. package/client/assets/RundownExport-DhCryTUp.js.gz +0 -0
  88. package/client/assets/{RundownExport-EorsanA0.js.map → RundownExport-DhCryTUp.js.map} +1 -1
  89. package/client/assets/{Select-BGGVCKqU.js → Select-ASOzxGFV.js} +2 -2
  90. package/client/assets/Select-ASOzxGFV.js.br +0 -0
  91. package/client/assets/Select-ASOzxGFV.js.gz +0 -0
  92. package/client/assets/{Select-BGGVCKqU.js.map → Select-ASOzxGFV.js.map} +1 -1
  93. package/client/assets/{Studio-BjNZ4l-W.js → Studio-D7evHV2Q.js} +2 -2
  94. package/client/assets/Studio-D7evHV2Q.js.br +0 -0
  95. package/client/assets/Studio-D7evHV2Q.js.gz +0 -0
  96. package/client/assets/{Studio-BjNZ4l-W.js.map → Studio-D7evHV2Q.js.map} +1 -1
  97. package/client/assets/{StyleEditor-CpciRLYh.js → StyleEditor-DYybY9tA.js} +2 -2
  98. package/client/assets/StyleEditor-DYybY9tA.js.br +0 -0
  99. package/client/assets/StyleEditor-DYybY9tA.js.gz +0 -0
  100. package/client/assets/{StyleEditor-CpciRLYh.js.map → StyleEditor-DYybY9tA.js.map} +1 -1
  101. package/client/assets/{SuperscriptPeriod-DsPdWN_s.js → SuperscriptPeriod-NmBzJhFK.js} +2 -2
  102. package/client/assets/SuperscriptPeriod-NmBzJhFK.js.br +0 -0
  103. package/client/assets/SuperscriptPeriod-NmBzJhFK.js.gz +0 -0
  104. package/client/assets/{SuperscriptPeriod-DsPdWN_s.js.map → SuperscriptPeriod-NmBzJhFK.js.map} +1 -1
  105. package/client/assets/{SuperscriptTime-CA6S2R55.js → SuperscriptTime-CA_8XRM6.js} +2 -2
  106. package/client/assets/SuperscriptTime-CA_8XRM6.js.br +0 -0
  107. package/client/assets/SuperscriptTime-CA_8XRM6.js.gz +0 -0
  108. package/client/assets/{SuperscriptTime-CA6S2R55.js.map → SuperscriptTime-CA_8XRM6.js.map} +1 -1
  109. package/client/assets/{SwatchPicker-Cm5Eicvv.js → SwatchPicker-C8eFQKBd.js} +2 -2
  110. package/client/assets/SwatchPicker-C8eFQKBd.js.br +0 -0
  111. package/client/assets/SwatchPicker-C8eFQKBd.js.gz +0 -0
  112. package/client/assets/{SwatchPicker-Cm5Eicvv.js.map → SwatchPicker-C8eFQKBd.js.map} +1 -1
  113. package/client/assets/{TimeElements-DbclWDbU.js → TimeElements-D3dl9gAM.js} +2 -2
  114. package/client/assets/TimeElements-D3dl9gAM.js.br +0 -0
  115. package/client/assets/TimeElements-D3dl9gAM.js.gz +0 -0
  116. package/client/assets/{TimeElements-DbclWDbU.js.map → TimeElements-D3dl9gAM.js.map} +1 -1
  117. package/client/assets/{TimeInput-C8DQoFXv.js → TimeInput-DR-NCEhH.js} +2 -2
  118. package/client/assets/TimeInput-DR-NCEhH.js.br +0 -0
  119. package/client/assets/TimeInput-DR-NCEhH.js.gz +0 -0
  120. package/client/assets/{TimeInput-C8DQoFXv.js.map → TimeInput-DR-NCEhH.js.map} +1 -1
  121. package/client/assets/{TimelinePage-Cgtl1qNp.js → TimelinePage-BfTV9IdT.js} +2 -2
  122. package/client/assets/TimelinePage-BfTV9IdT.js.br +0 -0
  123. package/client/assets/TimelinePage-BfTV9IdT.js.gz +0 -0
  124. package/client/assets/{TimelinePage-Cgtl1qNp.js.map → TimelinePage-BfTV9IdT.js.map} +1 -1
  125. package/client/assets/{Timer-BbixOGdj.js → Timer-DvqDm4yX.js} +2 -2
  126. package/client/assets/Timer-DvqDm4yX.js.br +0 -0
  127. package/client/assets/Timer-DvqDm4yX.js.gz +0 -0
  128. package/client/assets/{Timer-BbixOGdj.js.map → Timer-DvqDm4yX.js.map} +1 -1
  129. package/client/assets/{TimerControlExport-Dx3SSGNG.js → TimerControlExport-CQQ2KxqK.js} +2 -2
  130. package/client/assets/TimerControlExport-CQQ2KxqK.js.br +0 -0
  131. package/client/assets/TimerControlExport-CQQ2KxqK.js.gz +0 -0
  132. package/client/assets/{TimerControlExport-Dx3SSGNG.js.map → TimerControlExport-CQQ2KxqK.js.map} +1 -1
  133. package/client/assets/{TitleCard-Xdr7xwzU.js → TitleCard-AESdy7kI.js} +2 -2
  134. package/client/assets/TitleCard-AESdy7kI.js.br +0 -0
  135. package/client/assets/TitleCard-AESdy7kI.js.gz +0 -0
  136. package/client/assets/{TitleCard-Xdr7xwzU.js.map → TitleCard-AESdy7kI.js.map} +1 -1
  137. package/client/assets/{Tooltip-B5vsLcFu.js → Tooltip-BTK4bJkV.js} +2 -2
  138. package/client/assets/Tooltip-BTK4bJkV.js.br +0 -0
  139. package/client/assets/Tooltip-BTK4bJkV.js.gz +0 -0
  140. package/client/assets/{Tooltip-B5vsLcFu.js.map → Tooltip-BTK4bJkV.js.map} +1 -1
  141. package/client/assets/ViewLogo-BZVUUIZA.js +2 -0
  142. package/client/assets/ViewLogo-BZVUUIZA.js.br +0 -0
  143. package/client/assets/ViewLogo-BZVUUIZA.js.gz +0 -0
  144. package/client/assets/ViewLogo-BZVUUIZA.js.map +1 -0
  145. package/client/assets/{ViewParamsEditor-C2-TRP6e.js → ViewParamsEditor-CBnRitZ4.js} +2 -2
  146. package/client/assets/ViewParamsEditor-CBnRitZ4.js.br +0 -0
  147. package/client/assets/ViewParamsEditor-CBnRitZ4.js.gz +0 -0
  148. package/client/assets/{ViewParamsEditor-C2-TRP6e.js.map → ViewParamsEditor-CBnRitZ4.js.map} +1 -1
  149. package/client/assets/{dateConfig-D7xim1t4.js → dateConfig-Crm-Cu2y.js} +2 -2
  150. package/client/assets/dateConfig-Crm-Cu2y.js.br +0 -0
  151. package/client/assets/dateConfig-Crm-Cu2y.js.gz +0 -0
  152. package/client/assets/{dateConfig-D7xim1t4.js.map → dateConfig-Crm-Cu2y.js.map} +1 -1
  153. package/client/assets/{editorSettings-D2f7e1a6.js → editorSettings-CRJwIW7V.js} +2 -2
  154. package/client/assets/editorSettings-CRJwIW7V.js.br +0 -0
  155. package/client/assets/editorSettings-CRJwIW7V.js.gz +0 -0
  156. package/client/assets/{editorSettings-D2f7e1a6.js.map → editorSettings-CRJwIW7V.js.map} +1 -1
  157. package/client/assets/{getProgress-cLuBFPjh.js → getProgress-fD6vhbNF.js} +2 -2
  158. package/client/assets/getProgress-fD6vhbNF.js.br +0 -0
  159. package/client/assets/getProgress-fD6vhbNF.js.gz +0 -0
  160. package/client/assets/{getProgress-cLuBFPjh.js.map → getProgress-fD6vhbNF.js.map} +1 -1
  161. package/client/assets/{index-B81u4hxi.js → index-B1K7rED_.js} +3 -3
  162. package/client/assets/index-B1K7rED_.js.br +0 -0
  163. package/client/assets/index-B1K7rED_.js.gz +0 -0
  164. package/client/assets/index-B1K7rED_.js.map +1 -0
  165. package/client/assets/{index-D6S93MXv.css → index-BAvwULMi.css} +1 -1
  166. package/client/assets/index-BAvwULMi.css.br +0 -0
  167. package/client/assets/{index-D6S93MXv.css.gz → index-BAvwULMi.css.gz} +0 -0
  168. package/client/assets/{offset-R98EXhWK.js → offset-FplkvYRD.js} +2 -2
  169. package/client/assets/offset-FplkvYRD.js.br +0 -0
  170. package/client/assets/offset-FplkvYRD.js.gz +0 -0
  171. package/client/assets/{offset-R98EXhWK.js.map → offset-FplkvYRD.js.map} +1 -1
  172. package/client/assets/{parseUserTime-YeFR8t3F.js → parseUserTime-0pNWLcr0.js} +2 -2
  173. package/client/assets/parseUserTime-0pNWLcr0.js.br +0 -0
  174. package/client/assets/parseUserTime-0pNWLcr0.js.gz +0 -0
  175. package/client/assets/{parseUserTime-YeFR8t3F.js.map → parseUserTime-0pNWLcr0.js.map} +1 -1
  176. package/client/assets/{playbackstate-CPQdnF-k.js → playbackstate-1HCEpVh5.js} +2 -2
  177. package/client/assets/playbackstate-1HCEpVh5.js.br +0 -0
  178. package/client/assets/playbackstate-1HCEpVh5.js.gz +0 -0
  179. package/client/assets/{playbackstate-CPQdnF-k.js.map → playbackstate-1HCEpVh5.js.map} +1 -1
  180. package/client/assets/{presentation.utils-Cl-L3pHN.js → presentation.utils-CLt2UhON.js} +2 -2
  181. package/client/assets/presentation.utils-CLt2UhON.js.br +0 -0
  182. package/client/assets/presentation.utils-CLt2UhON.js.gz +0 -0
  183. package/client/assets/{presentation.utils-Cl-L3pHN.js.map → presentation.utils-CLt2UhON.js.map} +1 -1
  184. package/client/assets/{rundownUtils-CtVGQDQn.js → rundownUtils-D1oJpMdx.js} +2 -2
  185. package/client/assets/rundownUtils-D1oJpMdx.js.br +0 -0
  186. package/client/assets/rundownUtils-D1oJpMdx.js.gz +0 -0
  187. package/client/assets/{rundownUtils-CtVGQDQn.js.map → rundownUtils-D1oJpMdx.js.map} +1 -1
  188. package/client/assets/{timer.utils-rGyI9NYa.js → timer.utils-FiqT1yNa.js} +2 -2
  189. package/client/assets/timer.utils-FiqT1yNa.js.br +0 -0
  190. package/client/assets/timer.utils-FiqT1yNa.js.gz +0 -0
  191. package/client/assets/{timer.utils-rGyI9NYa.js.map → timer.utils-FiqT1yNa.js.map} +1 -1
  192. package/client/assets/{useCustomFields-k4piRt9n.js → useCustomFields-nW-_Zyfw.js} +2 -2
  193. package/client/assets/useCustomFields-nW-_Zyfw.js.br +0 -0
  194. package/client/assets/useCustomFields-nW-_Zyfw.js.gz +0 -0
  195. package/client/assets/{useCustomFields-k4piRt9n.js.map → useCustomFields-nW-_Zyfw.js.map} +1 -1
  196. package/client/assets/{useFollowComponent-B7vvPzG2.js → useFollowComponent-4cbKEsVz.js} +2 -2
  197. package/client/assets/useFollowComponent-4cbKEsVz.js.br +0 -0
  198. package/client/assets/useFollowComponent-4cbKEsVz.js.gz +0 -0
  199. package/client/assets/{useFollowComponent-B7vvPzG2.js.map → useFollowComponent-4cbKEsVz.js.map} +1 -1
  200. package/client/assets/{useProjectData-DdgKoYzk.js → useProjectData-DP-pr73E.js} +2 -2
  201. package/client/assets/useProjectData-DP-pr73E.js.br +0 -0
  202. package/client/assets/useProjectData-DP-pr73E.js.gz +0 -0
  203. package/client/assets/{useProjectData-DdgKoYzk.js.map → useProjectData-DP-pr73E.js.map} +1 -1
  204. package/client/assets/{useReport-DSuFnUb9.js → useReport-6XA_s2Vc.js} +2 -2
  205. package/client/assets/useReport-6XA_s2Vc.js.br +0 -0
  206. package/client/assets/useReport-6XA_s2Vc.js.gz +0 -0
  207. package/client/assets/{useReport-DSuFnUb9.js.map → useReport-6XA_s2Vc.js.map} +1 -1
  208. package/client/assets/{useRundown-Bn6ZPsz0.js → useRundown-BGhL8DEI.js} +2 -2
  209. package/client/assets/useRundown-BGhL8DEI.js.br +0 -0
  210. package/client/assets/useRundown-BGhL8DEI.js.gz +0 -0
  211. package/client/assets/{useRundown-Bn6ZPsz0.js.map → useRundown-BGhL8DEI.js.map} +1 -1
  212. package/client/assets/{useWindowTitle-Bpmo_HzW.js → useWindowTitle-ahZQIheF.js} +2 -2
  213. package/client/assets/useWindowTitle-ahZQIheF.js.br +0 -0
  214. package/client/assets/useWindowTitle-ahZQIheF.js.gz +0 -0
  215. package/client/assets/{useWindowTitle-Bpmo_HzW.js.map → useWindowTitle-ahZQIheF.js.map} +1 -1
  216. package/client/assets/{validateEvent-Do8yE_DJ.js → validateEvent-jVIMKhmx.js} +2 -2
  217. package/client/assets/validateEvent-jVIMKhmx.js.br +0 -0
  218. package/client/assets/validateEvent-jVIMKhmx.js.gz +0 -0
  219. package/client/assets/{validateEvent-Do8yE_DJ.js.map → validateEvent-jVIMKhmx.js.map} +1 -1
  220. package/client/assets/{vendor-q6fv0YT2.js → vendor-DmGkEtRj.js} +2 -2
  221. package/client/assets/vendor-DmGkEtRj.js.br +0 -0
  222. package/client/assets/vendor-DmGkEtRj.js.gz +0 -0
  223. package/client/assets/{vendor-q6fv0YT2.js.map → vendor-DmGkEtRj.js.map} +1 -1
  224. package/client/assets/{viewLoader.utils-b42scp-I.js → viewLoader.utils-Bniie8Op.js} +2 -2
  225. package/client/assets/viewLoader.utils-Bniie8Op.js.br +0 -0
  226. package/client/assets/viewLoader.utils-Bniie8Op.js.gz +0 -0
  227. package/client/assets/{viewLoader.utils-b42scp-I.js.map → viewLoader.utils-Bniie8Op.js.map} +1 -1
  228. package/client/assets/{viewUtils-B8Dr4GHH.js → viewUtils-VNLYoR28.js} +2 -2
  229. package/client/assets/viewUtils-VNLYoR28.js.br +0 -0
  230. package/client/assets/viewUtils-VNLYoR28.js.gz +0 -0
  231. package/client/assets/{viewUtils-B8Dr4GHH.js.map → viewUtils-VNLYoR28.js.map} +1 -1
  232. package/client/index.html +3 -3
  233. package/package.json +1 -1
  234. package/server/index.cjs +74 -74
  235. package/client/assets/Backstage-CDH53Q_N.js.br +0 -0
  236. package/client/assets/Backstage-CDH53Q_N.js.gz +0 -0
  237. package/client/assets/Countdown-B-MuMf1C.js.br +0 -0
  238. package/client/assets/Countdown-B-MuMf1C.js.gz +0 -0
  239. package/client/assets/CustomTranslationModal-DiQbmcgD.js.br +0 -0
  240. package/client/assets/CustomTranslationModal-DiQbmcgD.js.gz +0 -0
  241. package/client/assets/DelayIndicator-D--91EO3.js.br +0 -0
  242. package/client/assets/DelayIndicator-D--91EO3.js.gz +0 -0
  243. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.br +0 -0
  244. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.gz +0 -0
  245. package/client/assets/EditorUtils-DuKjlUkF.js.br +0 -0
  246. package/client/assets/EditorUtils-DuKjlUkF.js.gz +0 -0
  247. package/client/assets/Empty-CJbZxh45.js.br +0 -0
  248. package/client/assets/Empty-CJbZxh45.js.gz +0 -0
  249. package/client/assets/EmptyPage-Bc358YpE.js.br +0 -5
  250. package/client/assets/EmptyPage-Bc358YpE.js.gz +0 -0
  251. package/client/assets/FollowButton-C6Fvaqh0.js.br +0 -0
  252. package/client/assets/FollowButton-C6Fvaqh0.js.gz +0 -0
  253. package/client/assets/MessageControlExport-GmOrvUik.js.br +0 -0
  254. package/client/assets/MessageControlExport-GmOrvUik.js.gz +0 -0
  255. package/client/assets/MilestoneEditor-BA0PVIQh.js.br +0 -0
  256. package/client/assets/MilestoneEditor-BA0PVIQh.js.gz +0 -0
  257. package/client/assets/Modal-BKx0PDGT.js.br +0 -0
  258. package/client/assets/Modal-BKx0PDGT.js.gz +0 -0
  259. package/client/assets/MultiPartProgressBar-BXdLxJpy.js.br +0 -0
  260. package/client/assets/MultiPartProgressBar-BXdLxJpy.js.gz +0 -0
  261. package/client/assets/OperatorExport-X7-qi2jv.js.br +0 -0
  262. package/client/assets/OperatorExport-X7-qi2jv.js.gz +0 -0
  263. package/client/assets/OverviewWrapper-BQb2xl_N.js.br +0 -0
  264. package/client/assets/OverviewWrapper-BQb2xl_N.js.gz +0 -0
  265. package/client/assets/PipHost-CvtlZIn7.js.br +0 -0
  266. package/client/assets/PipHost-CvtlZIn7.js.gz +0 -0
  267. package/client/assets/ProjectInfo-1tw48NHZ.js.br +0 -0
  268. package/client/assets/ProjectInfo-1tw48NHZ.js.gz +0 -0
  269. package/client/assets/ProtectRoute-BH-QvsU0.js.br +0 -0
  270. package/client/assets/ProtectRoute-BH-QvsU0.js.gz +0 -0
  271. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.br +0 -0
  272. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.gz +0 -0
  273. package/client/assets/ProtectedEditor-D_A75byA.js.br +0 -0
  274. package/client/assets/ProtectedEditor-D_A75byA.js.gz +0 -0
  275. package/client/assets/ProtectedEditor-D_A75byA.js.map +0 -1
  276. package/client/assets/RundownEntry-bkqwx57t.js.br +0 -0
  277. package/client/assets/RundownEntry-bkqwx57t.js.gz +0 -0
  278. package/client/assets/RundownExport-EorsanA0.js.br +0 -0
  279. package/client/assets/RundownExport-EorsanA0.js.gz +0 -0
  280. package/client/assets/Select-BGGVCKqU.js.br +0 -0
  281. package/client/assets/Select-BGGVCKqU.js.gz +0 -0
  282. package/client/assets/Studio-BjNZ4l-W.js.br +0 -0
  283. package/client/assets/Studio-BjNZ4l-W.js.gz +0 -0
  284. package/client/assets/StyleEditor-CpciRLYh.js.br +0 -0
  285. package/client/assets/StyleEditor-CpciRLYh.js.gz +0 -0
  286. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.br +0 -0
  287. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.gz +0 -0
  288. package/client/assets/SuperscriptTime-CA6S2R55.js.br +0 -0
  289. package/client/assets/SuperscriptTime-CA6S2R55.js.gz +0 -0
  290. package/client/assets/SwatchPicker-Cm5Eicvv.js.br +0 -0
  291. package/client/assets/SwatchPicker-Cm5Eicvv.js.gz +0 -0
  292. package/client/assets/TimeElements-DbclWDbU.js.br +0 -0
  293. package/client/assets/TimeElements-DbclWDbU.js.gz +0 -0
  294. package/client/assets/TimeInput-C8DQoFXv.js.br +0 -0
  295. package/client/assets/TimeInput-C8DQoFXv.js.gz +0 -0
  296. package/client/assets/TimelinePage-Cgtl1qNp.js.br +0 -0
  297. package/client/assets/TimelinePage-Cgtl1qNp.js.gz +0 -0
  298. package/client/assets/Timer-BbixOGdj.js.br +0 -0
  299. package/client/assets/Timer-BbixOGdj.js.gz +0 -0
  300. package/client/assets/TimerControlExport-Dx3SSGNG.js.br +0 -0
  301. package/client/assets/TimerControlExport-Dx3SSGNG.js.gz +0 -0
  302. package/client/assets/TitleCard-Xdr7xwzU.js.br +0 -0
  303. package/client/assets/TitleCard-Xdr7xwzU.js.gz +0 -0
  304. package/client/assets/Tooltip-B5vsLcFu.js.br +0 -0
  305. package/client/assets/Tooltip-B5vsLcFu.js.gz +0 -0
  306. package/client/assets/ViewLogo-G7EosFIr.js +0 -2
  307. package/client/assets/ViewLogo-G7EosFIr.js.br +0 -0
  308. package/client/assets/ViewLogo-G7EosFIr.js.gz +0 -0
  309. package/client/assets/ViewLogo-G7EosFIr.js.map +0 -1
  310. package/client/assets/ViewParamsEditor-C2-TRP6e.js.br +0 -0
  311. package/client/assets/ViewParamsEditor-C2-TRP6e.js.gz +0 -0
  312. package/client/assets/dateConfig-D7xim1t4.js.br +0 -0
  313. package/client/assets/dateConfig-D7xim1t4.js.gz +0 -0
  314. package/client/assets/editorSettings-D2f7e1a6.js.br +0 -0
  315. package/client/assets/editorSettings-D2f7e1a6.js.gz +0 -0
  316. package/client/assets/getProgress-cLuBFPjh.js.br +0 -0
  317. package/client/assets/getProgress-cLuBFPjh.js.gz +0 -0
  318. package/client/assets/index-B81u4hxi.js.br +0 -0
  319. package/client/assets/index-B81u4hxi.js.gz +0 -0
  320. package/client/assets/index-B81u4hxi.js.map +0 -1
  321. package/client/assets/index-D6S93MXv.css.br +0 -0
  322. package/client/assets/offset-R98EXhWK.js.br +0 -0
  323. package/client/assets/offset-R98EXhWK.js.gz +0 -0
  324. package/client/assets/parseUserTime-YeFR8t3F.js.br +0 -0
  325. package/client/assets/parseUserTime-YeFR8t3F.js.gz +0 -0
  326. package/client/assets/playbackstate-CPQdnF-k.js.br +0 -0
  327. package/client/assets/playbackstate-CPQdnF-k.js.gz +0 -0
  328. package/client/assets/presentation.utils-Cl-L3pHN.js.br +0 -0
  329. package/client/assets/presentation.utils-Cl-L3pHN.js.gz +0 -0
  330. package/client/assets/rundownUtils-CtVGQDQn.js.br +0 -0
  331. package/client/assets/rundownUtils-CtVGQDQn.js.gz +0 -0
  332. package/client/assets/timer.utils-rGyI9NYa.js.br +0 -0
  333. package/client/assets/timer.utils-rGyI9NYa.js.gz +0 -0
  334. package/client/assets/useCustomFields-k4piRt9n.js.br +0 -0
  335. package/client/assets/useCustomFields-k4piRt9n.js.gz +0 -0
  336. package/client/assets/useFollowComponent-B7vvPzG2.js.br +0 -0
  337. package/client/assets/useFollowComponent-B7vvPzG2.js.gz +0 -0
  338. package/client/assets/useProjectData-DdgKoYzk.js.br +0 -0
  339. package/client/assets/useProjectData-DdgKoYzk.js.gz +0 -0
  340. package/client/assets/useReport-DSuFnUb9.js.br +0 -0
  341. package/client/assets/useReport-DSuFnUb9.js.gz +0 -0
  342. package/client/assets/useRundown-Bn6ZPsz0.js.br +0 -0
  343. package/client/assets/useRundown-Bn6ZPsz0.js.gz +0 -0
  344. package/client/assets/useWindowTitle-Bpmo_HzW.js.br +0 -0
  345. package/client/assets/useWindowTitle-Bpmo_HzW.js.gz +0 -0
  346. package/client/assets/validateEvent-Do8yE_DJ.js.br +0 -3
  347. package/client/assets/validateEvent-Do8yE_DJ.js.gz +0 -0
  348. package/client/assets/vendor-q6fv0YT2.js.br +0 -0
  349. package/client/assets/vendor-q6fv0YT2.js.gz +0 -0
  350. package/client/assets/viewLoader.utils-b42scp-I.js.br +0 -0
  351. package/client/assets/viewLoader.utils-b42scp-I.js.gz +0 -0
  352. package/client/assets/viewUtils-B8Dr4GHH.js.br +0 -0
  353. package/client/assets/viewUtils-B8Dr4GHH.js.gz +0 -0
@@ -1,2 +1,2 @@
1
- import{h as w,j as t,ay as Q,bK as W,T as Y,av as Z,y as tt,bL as D,bM as $,bN as q,bO as et,bP as st,bQ as at}from"./vendor-q6fv0YT2.js";import{P as nt,C as ot}from"./EditorUtils-DuKjlUkF.js";import{h as n,y as N,e as E,I as it,bF as c,bG as lt,bH as P,bI as h,bJ as I,bK as rt,m as g,bk as A,K as ct,k as S,s as dt,bL as mt,ax as ut,bz as xt,b8 as _t,bA as pt}from"./index-B81u4hxi.js";import{P as bt}from"./ProtectRoute-BH-QvsU0.js";import{T as z,A as ht}from"./TimeInput-C8DQoFXv.js";import{p as M}from"./parseUserTime-YeFR8t3F.js";import{T as R}from"./Tooltip-B5vsLcFu.js";import{u as yt}from"./useReport-DSuFnUb9.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]="d17d0725-44f7-4804-b0f9-20e9540bebb7",e._sentryDebugIdIdentifier="sentry-dbid-d17d0725-44f7-4804-b0f9-20e9540bebb7")}catch{}})();function jt(e,s){return{start:e!==n.Stop&&e!==n.Play,pause:e===n.Play,roll:e!==n.Roll&&s!==N.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",Tt="_play_yewzx_66",Nt="_roll_yewzx_93",wt="_pause_yewzx_120",It="_ontime_yewzx_147",Pt="_stop_yewzx_174",At="_square_yewzx_201",St="_tight_yewzx_206",Rt="_fill_yewzx_211",f={blink:ft,fourtyfive:vt,tapButton:gt,neutral:kt,active:Ct,play:Tt,roll:Nt,pause:wt,ontime:It,stop:Pt,square:At,tight:St,fill:Rt},r=w.forwardRef((e,s)=>{const{children:a,disabled:o,onClick:l,theme:i="neutral",aspect:m="normal",active:u,className:x}=e;return t.jsx("button",{className:E([f.tapButton,x,f[i],f[m],u&&f.active]),disabled:o,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,o]=Q({key:"add-time",defaultValue:3e5}),l=(x,k)=>{const p=M(k);o(Math.min(p,it))},i=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:()=>i("remove"),disabled:u,className:v.tallButtons,children:t.jsx(W,{})}),t.jsx(r,{onClick:()=>i("add"),disabled:u,className:v.tallButtons,children:t.jsx(Y,{})})]})]})}const Et="_label_tat6w_17",zt="_controls_tat6w_24",Mt="_input_tat6w_28",Lt="_twoSides_tat6w_34",Ft="_fakeInput_tat6w_42",y={label:Et,controls:zt,input:Mt,twoSides:Lt,fakeInput:Ft};function C({index:e}){const{playback:s,direction:a}=lt(e),{stop:o,setDirection:l}=I,i=()=>{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:i,aspect:"tight",disabled:m,children:[a===h.CountDown&&t.jsx(Z,{"data-testid":`aux-timer-direction-${e}`}),a===h.CountUp&&t.jsx(tt,{"data-testid":`aux-timer-direction-${e}`})]})]}),t.jsxs("div",{className:y.twoSides,children:[t.jsx(Ut,{index:e,action:u}),t.jsx(r,{onClick:()=>o(e),theme:n.Stop,disabled:!m,children:t.jsx(D,{"data-testid":`aux-timer-stop-${e}`})})]})]})]})}function Ot({index:e,isActive:s}){const a=rt(e),{setDuration:o}=I,l=(i,m)=>{const u=M(m);o(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:o}=I;return s==="play"?t.jsx(r,{onClick:()=>a(e),theme:n.Play,children:t.jsx($,{"data-testid":`aux-timer-start-${e}`})}):t.jsx(r,{onClick:()=>o(e),theme:n.Pause,children:t.jsx(q,{"data-testid":`aux-timer-pause-${e}`})})}const Ht="_buttonContainer_1mqxq_17",Xt="_go_1mqxq_25",Gt="_playbackContainer_1mqxq_30",Kt="_transportContainer_1mqxq_37",Vt="_extra_1mqxq_44",Jt="_invertX_1mqxq_51",_={buttonContainer:Ht,go:Xt,playbackContainer:Gt,transportContainer:Kt,extra:Vt,invertX:Jt};function Qt(e){const{playback:s,numEvents:a,selectedEventIndex:o,timerPhase:l}=e,i=s===n.Roll,m=s===n.Play,u=s===n.Pause,x=s===n.Armed,k=o===0,p=o===a-1,j=a===0,L=i||j,F=i||j||p,O=i||j||k,b=jt(s,l),U=!b.start,H=!b.pause,X=!b.roll||j,G=!b.stop,K=!b.reload,[V,J]=w.useMemo(()=>x?[c.start,"Start"]:p?[c.stop,"Finish"]:o===null?[c.startNext,"Start"]:[c.startNext,"Next"],[x,p,o]);return t.jsxs("div",{className:_.buttonContainer,children:[t.jsx(r,{disabled:L,onClick:V,aspect:"fill",className:_.go,children:J}),t.jsxs("div",{className:_.playbackContainer,children:[t.jsx(r,{onClick:c.start,disabled:U,theme:n.Play,active:m,children:t.jsx($,{})}),t.jsx(r,{onClick:c.pause,disabled:H,theme:n.Pause,active:u,children:t.jsx(q,{})})]}),t.jsxs("div",{className:_.transportContainer,children:[t.jsx(r,{onClick:c.previous,disabled:O,children:t.jsx(et,{})}),t.jsx(r,{onClick:c.next,disabled:F,children:t.jsx(st,{})})]}),t.jsxs("div",{className:_.extra,children:[t.jsx(r,{onClick:c.roll,disabled:X,theme:n.Roll,active:i,children:"Roll"}),t.jsx(r,{onClick:c.reload,disabled:K,children:t.jsx(at,{className:_.invertX})}),t.jsx(r,{onClick:c.stop,disabled:G,theme:n.Stop,children:t.jsx(D,{})})]})]})}const Wt="_timer_1f17d_21",Yt="_finished_1f17d_33",Zt="_muted_1f17d_36",T={timer:Wt,finished:Yt,muted:Zt};function te(e){const{time:s}=e,a=(s??0)<0,o=s==null?A:g(s,{fallback:A}).replace("-",""),l=E([T.timer,a?T.finished:null,s===null&&T.muted]);return t.jsx("div",{className:l,children:o})}const ee="_timeContainer_b9r86_17",se="_indicators_b9r86_25",ae="_indicatorRoll_b9r86_34",ne="_indicatorDelay_b9r86_35",oe="_indicatorNegative_b9r86_36",ie="_status_b9r86_65",le="_tag_b9r86_72",re="_time_b9r86_17",ce="_rolltag_b9r86_84",d={timeContainer:ee,indicators:se,indicatorRoll:ae,indicatorDelay:ne,indicatorNegative:oe,status:ie,tag:le,time:re,rolltag:ce};function de(e){return e>0?`Added ${S(e,!1)}`:e<0?`Removed ${S(Math.abs(e),!1)}`:""}function me({children:e}){const s=ct(),a=s.playback===n.Roll,o=s.phase===N.Pending,l=s.phase===N.Overtime,i=!!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":i})]}),t.jsx(te,{time:o?s.secondaryTimer:s.current}),t.jsx("div",{className:d.status,children:o?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 o=g(e),l=s!==null?s%dt:null,i=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:o})]}),t.jsxs("span",{className:d.finish,children:[t.jsx("span",{className:d.tag,children:"Expect end"}),t.jsx("span",{className:d.time,children:i})]})]})}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 _e="_mainContainer_1qlxm_17",pe="_auxTimers_1qlxm_22",B={mainContainer:_e,auxTimers:pe};function be(){const e=mt();return t.jsxs("div",{className:B.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:B.auxTimers,children:[t.jsx(C,{index:1}),t.jsx(C,{index:2}),t.jsx(C,{index:3})]})]})}const he="_content_hnvy8_17",ye={content:he},Ie=w.memo(je);function je(){const e=window.location.pathname.includes("/timercontrol");return t.jsx(bt,{permission:"editor",children:t.jsxs(nt,{"data-testid":"panel-timer-control",children:[!e&&t.jsx(ot,{onClick:s=>ut("timercontrol",s)}),e&&t.jsx(xt,{suppressSettings:!0,isNavigationLocked:_t()}),t.jsx("div",{className:ye.content,children:t.jsx(pt,{children:t.jsx(be,{})})})]})})}export{Ie as default};
2
- //# sourceMappingURL=TimerControlExport-Dx3SSGNG.js.map
1
+ import{h as w,j as t,ay as Q,bK as W,T as Y,av as Z,y as tt,bL as D,bM as $,bN as q,bO as et,bP as st,bQ as at}from"./vendor-DmGkEtRj.js";import{P as nt,C as ot}from"./EditorUtils-C3QoonjM.js";import{h as n,y as N,e as E,I as it,bF as c,bG as lt,bH as P,bI as h,bJ as I,bK as rt,m as g,bk as A,K as ct,k as S,s as dt,bL as mt,ax as ut,bz as xt,b8 as _t,bA as pt}from"./index-B1K7rED_.js";import{P as bt}from"./ProtectRoute-DW_vXgYI.js";import{T as z,A as ht}from"./TimeInput-DR-NCEhH.js";import{p as M}from"./parseUserTime-0pNWLcr0.js";import{T as R}from"./Tooltip-BTK4bJkV.js";import{u as yt}from"./useReport-6XA_s2Vc.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]="d17d0725-44f7-4804-b0f9-20e9540bebb7",e._sentryDebugIdIdentifier="sentry-dbid-d17d0725-44f7-4804-b0f9-20e9540bebb7")}catch{}})();function jt(e,s){return{start:e!==n.Stop&&e!==n.Play,pause:e===n.Play,roll:e!==n.Roll&&s!==N.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",Tt="_play_yewzx_66",Nt="_roll_yewzx_93",wt="_pause_yewzx_120",It="_ontime_yewzx_147",Pt="_stop_yewzx_174",At="_square_yewzx_201",St="_tight_yewzx_206",Rt="_fill_yewzx_211",f={blink:ft,fourtyfive:vt,tapButton:gt,neutral:kt,active:Ct,play:Tt,roll:Nt,pause:wt,ontime:It,stop:Pt,square:At,tight:St,fill:Rt},r=w.forwardRef((e,s)=>{const{children:a,disabled:o,onClick:l,theme:i="neutral",aspect:m="normal",active:u,className:x}=e;return t.jsx("button",{className:E([f.tapButton,x,f[i],f[m],u&&f.active]),disabled:o,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,o]=Q({key:"add-time",defaultValue:3e5}),l=(x,k)=>{const p=M(k);o(Math.min(p,it))},i=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:()=>i("remove"),disabled:u,className:v.tallButtons,children:t.jsx(W,{})}),t.jsx(r,{onClick:()=>i("add"),disabled:u,className:v.tallButtons,children:t.jsx(Y,{})})]})]})}const Et="_label_tat6w_17",zt="_controls_tat6w_24",Mt="_input_tat6w_28",Lt="_twoSides_tat6w_34",Ft="_fakeInput_tat6w_42",y={label:Et,controls:zt,input:Mt,twoSides:Lt,fakeInput:Ft};function C({index:e}){const{playback:s,direction:a}=lt(e),{stop:o,setDirection:l}=I,i=()=>{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:i,aspect:"tight",disabled:m,children:[a===h.CountDown&&t.jsx(Z,{"data-testid":`aux-timer-direction-${e}`}),a===h.CountUp&&t.jsx(tt,{"data-testid":`aux-timer-direction-${e}`})]})]}),t.jsxs("div",{className:y.twoSides,children:[t.jsx(Ut,{index:e,action:u}),t.jsx(r,{onClick:()=>o(e),theme:n.Stop,disabled:!m,children:t.jsx(D,{"data-testid":`aux-timer-stop-${e}`})})]})]})]})}function Ot({index:e,isActive:s}){const a=rt(e),{setDuration:o}=I,l=(i,m)=>{const u=M(m);o(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:o}=I;return s==="play"?t.jsx(r,{onClick:()=>a(e),theme:n.Play,children:t.jsx($,{"data-testid":`aux-timer-start-${e}`})}):t.jsx(r,{onClick:()=>o(e),theme:n.Pause,children:t.jsx(q,{"data-testid":`aux-timer-pause-${e}`})})}const Ht="_buttonContainer_1mqxq_17",Xt="_go_1mqxq_25",Gt="_playbackContainer_1mqxq_30",Kt="_transportContainer_1mqxq_37",Vt="_extra_1mqxq_44",Jt="_invertX_1mqxq_51",_={buttonContainer:Ht,go:Xt,playbackContainer:Gt,transportContainer:Kt,extra:Vt,invertX:Jt};function Qt(e){const{playback:s,numEvents:a,selectedEventIndex:o,timerPhase:l}=e,i=s===n.Roll,m=s===n.Play,u=s===n.Pause,x=s===n.Armed,k=o===0,p=o===a-1,j=a===0,L=i||j,F=i||j||p,O=i||j||k,b=jt(s,l),U=!b.start,H=!b.pause,X=!b.roll||j,G=!b.stop,K=!b.reload,[V,J]=w.useMemo(()=>x?[c.start,"Start"]:p?[c.stop,"Finish"]:o===null?[c.startNext,"Start"]:[c.startNext,"Next"],[x,p,o]);return t.jsxs("div",{className:_.buttonContainer,children:[t.jsx(r,{disabled:L,onClick:V,aspect:"fill",className:_.go,children:J}),t.jsxs("div",{className:_.playbackContainer,children:[t.jsx(r,{onClick:c.start,disabled:U,theme:n.Play,active:m,children:t.jsx($,{})}),t.jsx(r,{onClick:c.pause,disabled:H,theme:n.Pause,active:u,children:t.jsx(q,{})})]}),t.jsxs("div",{className:_.transportContainer,children:[t.jsx(r,{onClick:c.previous,disabled:O,children:t.jsx(et,{})}),t.jsx(r,{onClick:c.next,disabled:F,children:t.jsx(st,{})})]}),t.jsxs("div",{className:_.extra,children:[t.jsx(r,{onClick:c.roll,disabled:X,theme:n.Roll,active:i,children:"Roll"}),t.jsx(r,{onClick:c.reload,disabled:K,children:t.jsx(at,{className:_.invertX})}),t.jsx(r,{onClick:c.stop,disabled:G,theme:n.Stop,children:t.jsx(D,{})})]})]})}const Wt="_timer_1f17d_21",Yt="_finished_1f17d_33",Zt="_muted_1f17d_36",T={timer:Wt,finished:Yt,muted:Zt};function te(e){const{time:s}=e,a=(s??0)<0,o=s==null?A:g(s,{fallback:A}).replace("-",""),l=E([T.timer,a?T.finished:null,s===null&&T.muted]);return t.jsx("div",{className:l,children:o})}const ee="_timeContainer_b9r86_17",se="_indicators_b9r86_25",ae="_indicatorRoll_b9r86_34",ne="_indicatorDelay_b9r86_35",oe="_indicatorNegative_b9r86_36",ie="_status_b9r86_65",le="_tag_b9r86_72",re="_time_b9r86_17",ce="_rolltag_b9r86_84",d={timeContainer:ee,indicators:se,indicatorRoll:ae,indicatorDelay:ne,indicatorNegative:oe,status:ie,tag:le,time:re,rolltag:ce};function de(e){return e>0?`Added ${S(e,!1)}`:e<0?`Removed ${S(Math.abs(e),!1)}`:""}function me({children:e}){const s=ct(),a=s.playback===n.Roll,o=s.phase===N.Pending,l=s.phase===N.Overtime,i=!!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":i})]}),t.jsx(te,{time:o?s.secondaryTimer:s.current}),t.jsx("div",{className:d.status,children:o?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 o=g(e),l=s!==null?s%dt:null,i=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:o})]}),t.jsxs("span",{className:d.finish,children:[t.jsx("span",{className:d.tag,children:"Expect end"}),t.jsx("span",{className:d.time,children:i})]})]})}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 _e="_mainContainer_1qlxm_17",pe="_auxTimers_1qlxm_22",B={mainContainer:_e,auxTimers:pe};function be(){const e=mt();return t.jsxs("div",{className:B.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:B.auxTimers,children:[t.jsx(C,{index:1}),t.jsx(C,{index:2}),t.jsx(C,{index:3})]})]})}const he="_content_hnvy8_17",ye={content:he},Ie=w.memo(je);function je(){const e=window.location.pathname.includes("/timercontrol");return t.jsx(bt,{permission:"editor",children:t.jsxs(nt,{"data-testid":"panel-timer-control",children:[!e&&t.jsx(ot,{onClick:s=>ut("timercontrol",s)}),e&&t.jsx(xt,{suppressSettings:!0,isNavigationLocked:_t()}),t.jsx("div",{className:ye.content,children:t.jsx(pt,{children:t.jsx(be,{})})})]})})}export{Ie as default};
2
+ //# sourceMappingURL=TimerControlExport-CQQ2KxqK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimerControlExport-Dx3SSGNG.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 * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { getIsNavigationLocked } from '../../../externals';\n\nimport PlaybackControl from './PlaybackControl';\n\nimport style from './TimerControlExport.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 <Editor.Panel data-testid='panel-timer-control'>\n {!isExtracted && <Editor.CornerExtract 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 </Editor.Panel>\n </ProtectRoute>\n );\n}\n"],"names":["validatePlayback","currentPlayback","timerPhase","start","Playback","Stop","Play","pause","roll","Roll","TimerPhase","Overtime","stop","reload","TapButton","forwardRef","props","ref","children","disabled","onClick","theme","aspect","active","className","jsx","cx","style","tapButton","displayName","AddTime","playback","timeInMs","setTime","useLocalStorage","key","defaultValue","handleTimeChange","_field","value","newTimeInMs","parseUserTime","Math","min","MILLIS_PER_HOUR","handleAddTime","direction","setPlayback","addTime","doDisableButtons","Pause","jsxs","TimeInput","addButtons","tallButtons","IoRemove","IoAdd","AuxTimer","index","useAuxTimerControl","setDirection","setAuxTimer","toggleDirection","newDirection","SimpleDirection","CountDown","CountUp","isActive","SimplePlayback","playbackAction","Start","label","controls","input","AuxTimerInput","IoArrowDown","IoArrowUp","twoSides","AuxTogglePlay","IoStop","useAuxTimerTime","setDuration","handleTimeUpdate","fakeInput","millisToString","action","IoPlay","IoPause","PlaybackButtons","numEvents","selectedEventIndex","isRolling","isPlaying","isPaused","isArmed","Armed","isFirst","isLast","noEvents","disableGo","disableNext","disablePrev","playbackCan","disableStart","disablePause","disableRoll","disableStop","disableReload","goModeAction","goModeText","useMemo","startNext","buttonContainer","go","playbackContainer","transportContainer","previous","IoPlaySkipBack","next","IoPlaySkipForward","extra","IoReload","invertX","TimerDisplay","time","isNegative","display","timerPlaceholder","fallback","replace","classes","timer","finished","muted","resolveAddedTimeLabel","addedTime","formatDuration","abs","PlaybackTimer","useTimer","isWaiting","phase","Pending","isOvertime","hasAddedTime","Boolean","rollLabel","addedTimeLabel","timeContainer","indicators","Tooltip","indicatorRoll","indicatorNegative","indicatorDelay","secondaryTimer","current","status","rolltag","RunningStatus","startedAt","expectedFinish","StoppedStatus","started","finishedMs","dayInMs","finish","Fragment","tag","data","useReport","Object","keys","length","AppLink","PlaybackControl","usePlaybackControl","mainContainer","auxTimers","memo","TimerControlExport","isExtracted","window","location","pathname","includes","ProtectRoute","Editor.Panel","Editor.CornerExtract","handleLinks","event","ViewNavigationMenu","getIsNavigationLocked","content","ErrorBoundary"],"mappings":"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"}
1
+ {"version":3,"file":"TimerControlExport-CQQ2KxqK.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 * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { getIsNavigationLocked } from '../../../externals';\n\nimport PlaybackControl from './PlaybackControl';\n\nimport style from './TimerControlExport.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 <Editor.Panel data-testid='panel-timer-control'>\n {!isExtracted && <Editor.CornerExtract 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 </Editor.Panel>\n </ProtectRoute>\n );\n}\n"],"names":["validatePlayback","currentPlayback","timerPhase","start","Playback","Stop","Play","pause","roll","Roll","TimerPhase","Overtime","stop","reload","TapButton","forwardRef","props","ref","children","disabled","onClick","theme","aspect","active","className","jsx","cx","style","tapButton","displayName","AddTime","playback","timeInMs","setTime","useLocalStorage","key","defaultValue","handleTimeChange","_field","value","newTimeInMs","parseUserTime","Math","min","MILLIS_PER_HOUR","handleAddTime","direction","setPlayback","addTime","doDisableButtons","Pause","jsxs","TimeInput","addButtons","tallButtons","IoRemove","IoAdd","AuxTimer","index","useAuxTimerControl","setDirection","setAuxTimer","toggleDirection","newDirection","SimpleDirection","CountDown","CountUp","isActive","SimplePlayback","playbackAction","Start","label","controls","input","AuxTimerInput","IoArrowDown","IoArrowUp","twoSides","AuxTogglePlay","IoStop","useAuxTimerTime","setDuration","handleTimeUpdate","fakeInput","millisToString","action","IoPlay","IoPause","PlaybackButtons","numEvents","selectedEventIndex","isRolling","isPlaying","isPaused","isArmed","Armed","isFirst","isLast","noEvents","disableGo","disableNext","disablePrev","playbackCan","disableStart","disablePause","disableRoll","disableStop","disableReload","goModeAction","goModeText","useMemo","startNext","buttonContainer","go","playbackContainer","transportContainer","previous","IoPlaySkipBack","next","IoPlaySkipForward","extra","IoReload","invertX","TimerDisplay","time","isNegative","display","timerPlaceholder","fallback","replace","classes","timer","finished","muted","resolveAddedTimeLabel","addedTime","formatDuration","abs","PlaybackTimer","useTimer","isWaiting","phase","Pending","isOvertime","hasAddedTime","Boolean","rollLabel","addedTimeLabel","timeContainer","indicators","Tooltip","indicatorRoll","indicatorNegative","indicatorDelay","secondaryTimer","current","status","rolltag","RunningStatus","startedAt","expectedFinish","StoppedStatus","started","finishedMs","dayInMs","finish","Fragment","tag","data","useReport","Object","keys","length","AppLink","PlaybackControl","usePlaybackControl","mainContainer","auxTimers","memo","TimerControlExport","isExtracted","window","location","pathname","includes","ProtectRoute","Editor.Panel","Editor.CornerExtract","handleLinks","event","ViewNavigationMenu","getIsNavigationLocked","content","ErrorBoundary"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{h as o,j as t}from"./vendor-q6fv0YT2.js";import{d as f,e as n}from"./index-B81u4hxi.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]="730f5ea8-2753-4e71-b032-7d755a9f78cc",e._sentryDebugIdIdentifier="sentry-dbid-730f5ea8-2753-4e71-b032-7d755a9f78cc")}catch{}})();const b=o.forwardRef((e,a)=>{const{label:s,title:d,secondary:r,className:l=""}=e,{getLocalizedString:c}=f(),i=s==="now";return t.jsxs("div",{className:n(["title-card",l]),ref:a,children:[t.jsx("span",{className:"title-card__title",children:d}),t.jsx("span",{className:n(["title-card__label",i&&"title-card__label--accent"]),children:s&&c(`common.${s}`)}),t.jsx("div",{className:"title-card__secondary",children:r})]})});b.displayName="TitleCard";export{b as T};
2
- //# sourceMappingURL=TitleCard-Xdr7xwzU.js.map
1
+ import{h as o,j as t}from"./vendor-DmGkEtRj.js";import{d as f,e as n}from"./index-B1K7rED_.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]="730f5ea8-2753-4e71-b032-7d755a9f78cc",e._sentryDebugIdIdentifier="sentry-dbid-730f5ea8-2753-4e71-b032-7d755a9f78cc")}catch{}})();const b=o.forwardRef((e,a)=>{const{label:s,title:d,secondary:r,className:l=""}=e,{getLocalizedString:c}=f(),i=s==="now";return t.jsxs("div",{className:n(["title-card",l]),ref:a,children:[t.jsx("span",{className:"title-card__title",children:d}),t.jsx("span",{className:n(["title-card__label",i&&"title-card__label--accent"]),children:s&&c(`common.${s}`)}),t.jsx("div",{className:"title-card__secondary",children:r})]})});b.displayName="TitleCard";export{b as T};
2
+ //# sourceMappingURL=TitleCard-AESdy7kI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TitleCard-Xdr7xwzU.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","displayName"],"mappings":"ybAcA,MAAMA,EAAYC,EAAAA,WAAW,CAACC,EAAuBC,IAAsC,CACnF,KAAA,CAAEC,MAAAA,EAAOC,MAAAA,EAAOC,UAAAA,EAAWC,UAAAA,EAAY,EAAA,EAAOL,EAC9C,CAAEM,mBAAAA,GAAuBC,EAAe,EAExCC,EAASN,IAAU,MAGvB,OAAAO,OAAC,OAAI,UAAWC,EAAG,CAAC,aAAcL,CAAS,CAAC,EAAG,IAAAJ,EAC7C,SAAA,CAACU,EAAA,IAAA,OAAA,CAAK,UAAU,oBAAqBR,SAAMA,EAAA,EAC1CQ,EAAA,IAAA,OAAA,CAAK,UAAWD,EAAG,CAAC,oBAAqBF,GAAU,2BAA2B,CAAC,EAC7EN,SAASI,GAAAA,EAAmB,UAAUJ,CAAK,EAAE,EAChD,EACCS,EAAA,IAAA,MAAA,CAAI,UAAU,wBAAyBP,SAAUA,CAAA,CAAA,CAAA,EACpD,CAEJ,CAAC,EAEDN,EAAUc,YAAc"}
1
+ {"version":3,"file":"TitleCard-AESdy7kI.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","displayName"],"mappings":"ybAcA,MAAMA,EAAYC,EAAAA,WAAW,CAACC,EAAuBC,IAAsC,CACnF,KAAA,CAAEC,MAAAA,EAAOC,MAAAA,EAAOC,UAAAA,EAAWC,UAAAA,EAAY,EAAA,EAAOL,EAC9C,CAAEM,mBAAAA,GAAuBC,EAAe,EAExCC,EAASN,IAAU,MAGvB,OAAAO,OAAC,OAAI,UAAWC,EAAG,CAAC,aAAcL,CAAS,CAAC,EAAG,IAAAJ,EAC7C,SAAA,CAACU,EAAA,IAAA,OAAA,CAAK,UAAU,oBAAqBR,SAAMA,EAAA,EAC1CQ,EAAA,IAAA,OAAA,CAAK,UAAWD,EAAG,CAAC,oBAAqBF,GAAU,2BAA2B,CAAC,EAC7EN,SAASI,GAAAA,EAAmB,UAAUJ,CAAK,EAAE,EAChD,EACCS,EAAA,IAAA,MAAA,CAAI,UAAU,wBAAyBP,SAAUA,CAAA,CAAA,CAAA,EACpD,CAEJ,CAAC,EAEDN,EAAUc,YAAc"}
@@ -1,2 +1,2 @@
1
- import{j as t,c9 as i,ca as d,cb as n,cc as l,cd as r,ce as f}from"./vendor-q6fv0YT2.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new o.Error().stack;e&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[e]="dd76daff-cbf6-4529-90b0-61ead47f83eb",o._sentryDebugIdIdentifier="sentry-dbid-dd76daff-cbf6-4529-90b0-61ead47f83eb")}catch{}})();const a="_tooltip_1391b_17",c={tooltip:a};function b({text:o,children:e,...s}){return t.jsxs(i,{children:[t.jsx(d,{...s,children:e}),t.jsx(n,{children:t.jsx(l,{side:"bottom",sideOffset:4,children:t.jsxs(r,{className:c.tooltip,children:[t.jsx(f,{}),o]})})})]})}export{b as T};
2
- //# sourceMappingURL=Tooltip-B5vsLcFu.js.map
1
+ import{j as t,c9 as i,ca as d,cb as n,cc as l,cd as r,ce as f}from"./vendor-DmGkEtRj.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new o.Error().stack;e&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[e]="dd76daff-cbf6-4529-90b0-61ead47f83eb",o._sentryDebugIdIdentifier="sentry-dbid-dd76daff-cbf6-4529-90b0-61ead47f83eb")}catch{}})();const a="_tooltip_1391b_17",c={tooltip:a};function b({text:o,children:e,...s}){return t.jsxs(i,{children:[t.jsx(d,{...s,children:e}),t.jsx(n,{children:t.jsx(l,{side:"bottom",sideOffset:4,children:t.jsxs(r,{className:c.tooltip,children:[t.jsx(f,{}),o]})})})]})}export{b as T};
2
+ //# sourceMappingURL=Tooltip-BTK4bJkV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip-B5vsLcFu.js","sources":["../../src/common/components/tooltip/Tooltip.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\nimport { Tooltip as BaseTooltip } from '@base-ui/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","tooltip","BaseTooltip.Arrow"],"mappings":"6dASA,SAAwBA,EAAQ,CAAEC,KAAAA,EAAMC,SAAAA,EAAU,GAAGC,CAA8C,EAAG,CAElG,OAAAC,EAAA,KAACC,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAwBJ,GAAAA,EAAeD,SAAAA,CAAS,CAAA,QAChDM,EAAA,CACC,SAACF,EAAA,IAAAG,EAAA,CAAuB,KAAK,SAAS,WAAY,EAChD,SAACL,EAAAA,KAAAM,EAAA,CAAkB,UAAWC,EAAMC,QAClC,SAAA,CAACN,EAAA,IAAAO,EAAA,EAAiB,EACjBZ,CAAAA,CACH,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"Tooltip-BTK4bJkV.js","sources":["../../src/common/components/tooltip/Tooltip.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\nimport { Tooltip as BaseTooltip } from '@base-ui/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","tooltip","BaseTooltip.Arrow"],"mappings":"6dASA,SAAwBA,EAAQ,CAAEC,KAAAA,EAAMC,SAAAA,EAAU,GAAGC,CAA8C,EAAG,CAElG,OAAAC,EAAA,KAACC,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAwBJ,GAAAA,EAAeD,SAAAA,CAAS,CAAA,QAChDM,EAAA,CACC,SAACF,EAAA,IAAAG,EAAA,CAAuB,KAAK,SAAS,WAAY,EAChD,SAACL,EAAAA,KAAAM,EAAA,CAAkB,UAAWC,EAAMC,QAClC,SAAA,CAACN,EAAA,IAAAO,EAAA,EAAiB,EACjBZ,CAAAA,CACH,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EACF,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{h as a,j as o}from"./vendor-DmGkEtRj.js";import{N as s}from"./index-B1K7rED_.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new e.Error().stack;r&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[r]="6bf22d2d-1cd6-4a1c-a028-becb64aafaad",e._sentryDebugIdIdentifier="sentry-dbid-6bf22d2d-1cd6-4a1c-a028-becb64aafaad")}catch{}})();function f({name:e,className:r}){const n=a.useRef(null),t=()=>{n.current&&(n.current.style.display="none")};return o.jsx("div",{className:r,children:o.jsx("img",{ref:n,alt:"",src:`${s}/${e}`,className:"viewLogo",onError:t})})}export{f as V};
2
+ //# sourceMappingURL=ViewLogo-BZVUUIZA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewLogo-BZVUUIZA.js","sources":["../../src/common/components/view-logo/ViewLogo.tsx"],"sourcesContent":["import { useRef } from 'react';\n\nimport { projectLogoPath } from '../../api/constants';\n\nimport './ViewLogo.scss';\n\ninterface ViewLogoProps {\n name: string;\n className: string;\n}\n\nexport default function ViewLogo({ name, className }: ViewLogoProps) {\n const imageRef = useRef<HTMLImageElement>(null);\n\n const hideImage = () => {\n if (!imageRef.current) return;\n\n imageRef.current.style.display = 'none';\n };\n\n // we wrap the image in a div to help maintain the aspect ratio\n return (\n <div className={className}>\n <img ref={imageRef} alt='' src={`${projectLogoPath}/${name}`} className='viewLogo' onError={hideImage} />\n </div>\n );\n}\n"],"names":["ViewLogo","name","className","imageRef","useRef","hideImage","current","style","display","projectLogoPath"],"mappings":"kbAWA,SAAwBA,EAAS,CAAEC,KAAAA,EAAMC,UAAAA,CAAyB,EAAG,CAC7DC,MAAAA,EAAWC,SAAyB,IAAI,EAExCC,EAAYA,IAAM,CACjBF,EAASG,UAELA,EAAAA,QAAQC,MAAMC,QAAU,OACnC,EAGA,aACG,MAAI,CAAA,UAAAN,EACH,eAAC,MAAI,CAAA,IAAKC,EAAU,IAAI,GAAG,IAAK,GAAGM,CAAe,IAAIR,CAAI,GAAI,UAAU,WAAW,QAASI,EAAU,CACxG,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{l as x,j as t,h as d,ay as k,aT as V,D as N,q as E,s as D,t as F,G as I,v as O}from"./vendor-q6fv0YT2.js";import{bi as $,e as g,B as j,ah as y,a as A,bj as H,D as z,ak as L}from"./index-B81u4hxi.js";import{C as R,I as B}from"./useWindowTitle-Bpmo_HzW.js";import{i as q}from"./viewUtils-B8Dr4GHH.js";import{S as U}from"./Select-BGGVCKqU.js";import{b as W,S as M}from"./SwatchPicker-Cm5Eicvv.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]="244a2dff-e9fb-4d0a-97b3-fe7f981db9a1",e._sentryDebugIdIdentifier="sentry-dbid-244a2dff-e9fb-4d0a-97b3-fe7f981db9a1")}catch{}})();function Ae(e,s=[],n=!0){const a=[...s];for(const[r,i]of Object.entries(e))n&&i.type==="image"||a.push({value:`custom-${r}`,label:`Custom: ${i.label}`});return a}function He(e,s=!0){const n=[];for(const[a,r]of Object.entries(e))s&&r.type==="image"||n.push({value:a,label:r.label,colour:r.colour});return n}function ze(e,s=[]){const n=e.custom.map((a,r)=>({value:`${r}-${a.title}`,label:a.title}));return[...s,...n]}function G(e){return e.startsWith("#")?e.substring(1):e}function J(e){const s={defaultValues:{},colorFields:new Set,booleanFields:new Set,isPersistedField:new Set,persistedValues:{}};return e.forEach(n=>{n.options.forEach(a=>{a.type==="persist"?(s.isPersistedField.add(a.id),a.values&&(s.persistedValues[a.id]=a.values)):s.defaultValues[a.id]=String(a.defaultValue),a.type==="colour"?s.colorFields.add(a.id):a.type==="boolean"&&s.booleanFields.add(a.id)})}),s}function K(e,s){const n=new URLSearchParams,a=new Set,r=J(s),i=(o,l)=>{const c=`${o}:${l}`;a.has(c)||(a.add(c),n.append(o,l))};return Object.entries(r.persistedValues).forEach(([o,l])=>{l.forEach(c=>{c&&i(o,c)})}),Object.entries(e).forEach(([o,l])=>{typeof l=="string"&&l.length&&(r.isPersistedField.has(o)&&(Array.from(a).forEach(c=>{c.startsWith(`${o}:`)&&a.delete(c)}),n.delete(o)),l.split(",").forEach(c=>{const m=r.colorFields.has(o)?G(c):r.booleanFields.has(o)?c==="on"?"true":"false":c;(r.isPersistedField.has(o)||r.defaultValues[o]!==m)&&i(o,m)}))}),n}const Q="_presetSection_gc8wt_17",T="_preset_gc8wt_17",X="_active_gc8wt_34",Y="_presetActions_gc8wt_38",p={presetSection:Q,preset:T,active:X,presetActions:Y};function Z({target:e}){const{viewPresets:s}=$(e),[n,a]=x(),r=i=>{const o=new URLSearchParams(i.search);o.set("alias",i.alias),a(o)};return s.length===0?null:t.jsx("div",{className:p.presetSection,children:s.map(i=>{const o=n.get("alias")===i.alias;return t.jsxs("div",{className:g([p.preset,o&&p.active]),children:[t.jsx("div",{children:i.alias}),t.jsx(j,{variant:o?"ghosted":"subtle-white",onClick:()=>r(i),disabled:o,className:p.presetActions,children:o?"Applied":"Apply"})]},i.alias)})})}var v=(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))(v||{});const ee="_inline_4jmjk_17",se={inline:ee},S=e=>e.startsWith("#")?e:`#${e}`;function te({name:e,value:s}){const[n,a]=d.useState(()=>S(s));return d.useEffect(()=>{a(S(s))},[s]),t.jsxs("div",{className:se.inline,children:[t.jsx(W,{color:n,onChange:a,alwaysDisplayColor:!0}),t.jsx("span",{children:n}),t.jsx("input",{type:"hidden",name:e,value:n})]})}const ae="_inline_7qz4u_17",ne="_toggleSelect_7qz4u_24",re="_empty_7qz4u_52",_={inline:ae,toggleSelect:ne,empty:re};function w({paramField:e}){const[s]=x(),{id:n,type:a,defaultValue:r}=e;if(a==="persist")return!e.values||!e.values.length?null:t.jsx("input",{hidden:!0,name:n,readOnly:!0,value:e.values.join(",")});if(a==="option"){const c=s.get(n)||r;return e.values.length===0?t.jsx("span",{className:_.empty,children:"No options available"}):t.jsx(le,{id:n,initialValue:c,options:e.values})}if(a==="multi-option"){const l=s.getAll(n);return t.jsx(oe,{paramField:e,options:l.length?l:e.defaultValue??[""]})}if(a==="boolean")return t.jsx(ie,{id:n,initialValue:q(s.get(n))??r});if(a==="number"){const{placeholder:l}=e,c=s.get(n)??r;return t.jsx(y,{height:"large",type:"number",step:"any",name:n,defaultValue:c,placeholder:l})}if(a==="colour")return t.jsx(te,{name:n,value:s.get(n)??r});const i=s.get(n)??r??"",{placeholder:o}=e;return t.jsx(ce,{id:n,initialValue:i,placeholder:o})}function oe({paramField:e,options:s}){const{id:n,values:a}=e,[r,i]=d.useState(s);d.useEffect(()=>{i(s)},[s]);const o=(l,c)=>{i(c?m=>[...m,l]:m=>m.filter(b=>b!==l))};return a.length===0?t.jsx("span",{className:_.empty,children:"No options available"}):t.jsxs(t.Fragment,{children:[t.jsx("input",{name:n,hidden:!0,readOnly:!0,value:r.join(",")}),t.jsx("div",{className:_.inline,children:a.map(l=>t.jsxs("label",{className:_.toggleSelect,style:{"--user-bg":l.colour},children:[t.jsx(R,{checked:r.includes(l.value),onCheckedChange:c=>o(l.value,c)}),l.label]},l.value))})]})}function ie({id:e,initialValue:s}){const[n,a]=d.useState(s);return d.useEffect(()=>{a(s)},[s]),t.jsx(M,{size:"large",name:e,checked:n,onCheckedChange:a})}function le({id:e,initialValue:s,options:n}){const[a,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),t.jsx(U,{size:"large",name:e,options:n,value:a,onValueChange:i=>{i!==null&&r(i)}})}function ce({id:e,initialValue:s,...n}){const[a,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),t.jsx(y,{height:"large",name:e,value:a,onChange:i=>r(i.target.value),...n})}const de="_section_1ssto_17",ue="_sectionHeader_1ssto_22",fe="_collapsible_1ssto_28",me="_label_1ssto_32",he="_title_1ssto_41",pe="_description_1ssto_47",_e="_closed_1ssto_53",ge="_open_1ssto_58",be="_hidden_1ssto_63",f={section:de,sectionHeader:ue,collapsible:fe,label:me,title:he,description:pe,closed:_e,open:ge,hidden:be};function je({title:e,collapsible:s,options:n}){const[a,r]=k({key:`params-${e}`,defaultValue:!1}),i=()=>{s&&r(o=>!o)};return t.jsx("section",{className:f.section,children:e===v.Hidden?t.jsx(Se,{options:n}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:g([f.sectionHeader,s&&f.collapsible]),onClick:i,children:[e,s&&t.jsx(V,{className:g([a?f.closed:f.open])})]}),t.jsx(xe,{options:n,collapsed:a})]})})}function xe({options:e,collapsed:s}){return t.jsx(t.Fragment,{children:e.map(n=>t.jsxs("label",{className:g([f.label,s&&f.hidden]),children:[t.jsx("span",{className:f.title,children:n.title}),t.jsx("span",{className:f.description,children:n.description}),t.jsx(w,{paramField:n})]},n.title))})}function Se({options:e}){return t.jsx(t.Fragment,{children:e.map((s,n)=>t.jsx(w,{paramField:s},s.title+n))})}const ye="_backdrop_1pnpt_26",ve="_drawer_1pnpt_17",we="_header_1pnpt_67",Pe="_body_1pnpt_77",Ce="_footer_1pnpt_84",ke="_sectionList_1pnpt_92",Ve="_info_1pnpt_99",h={backdrop:ye,drawer:ve,header:we,body:Pe,footer:Ce,sectionList:ke,info:Ve},Le=d.memo(Ne);function Ne({target:e,viewOptions:s}){const[n,a]=x(),{data:r}=A(),{isOpen:i,close:o}=H(),l=z(),c=()=>{o()},m=()=>{a()},b=u=>{u.preventDefault();const P=Object.fromEntries(new FormData(u.currentTarget)),C=K(P,s);a(C),l&&o()};return t.jsx(N,{open:i,onOpenChange:u=>{u||c()},children:t.jsxs(E,{children:[t.jsx(D,{className:h.backdrop}),t.jsxs(F,{className:h.drawer,children:[t.jsxs("div",{className:h.header,children:[t.jsx(I,{children:"Customise"}),t.jsx(L,{variant:"subtle-white",size:"large","data-testid":"close-view-params",onClick:c,children:t.jsx(O,{})})]}),t.jsxs("div",{className:h.body,children:[r.overrideStyles&&t.jsx(B,{className:h.info,children:"This view style is being modified by a custom CSS file."}),t.jsx(Z,{target:e}),t.jsx("form",{id:"edit-params-form",onSubmit:b,className:h.sectionList,children:s.map(u=>t.jsx(je,{title:u.title,collapsible:u.collapsible,options:u.options},u.title))})]}),t.jsxs("div",{className:h.footer,children:[t.jsx(j,{variant:"subtle",size:"large",onClick:m,type:"reset",children:"Reset to default"}),t.jsx(j,{variant:"primary",size:"large",form:"edit-params-form",type:"submit","data-testid":"apply-view-params",children:"Apply"})]})]})]})})}export{v as O,Le as V,ze as a,He as b,Ae as m};
2
- //# sourceMappingURL=ViewParamsEditor-C2-TRP6e.js.map
1
+ import{l as x,j as t,h as d,ay as k,aT as V,D as N,q as E,s as D,t as F,G as I,v as O}from"./vendor-DmGkEtRj.js";import{bi as $,e as g,B as j,ah as y,a as A,bj as H,D as z,ak as L}from"./index-B1K7rED_.js";import{C as R,I as B}from"./useWindowTitle-ahZQIheF.js";import{i as q}from"./viewUtils-VNLYoR28.js";import{S as U}from"./Select-ASOzxGFV.js";import{b as W,S as M}from"./SwatchPicker-C8eFQKBd.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]="244a2dff-e9fb-4d0a-97b3-fe7f981db9a1",e._sentryDebugIdIdentifier="sentry-dbid-244a2dff-e9fb-4d0a-97b3-fe7f981db9a1")}catch{}})();function Ae(e,s=[],n=!0){const a=[...s];for(const[r,i]of Object.entries(e))n&&i.type==="image"||a.push({value:`custom-${r}`,label:`Custom: ${i.label}`});return a}function He(e,s=!0){const n=[];for(const[a,r]of Object.entries(e))s&&r.type==="image"||n.push({value:a,label:r.label,colour:r.colour});return n}function ze(e,s=[]){const n=e.custom.map((a,r)=>({value:`${r}-${a.title}`,label:a.title}));return[...s,...n]}function G(e){return e.startsWith("#")?e.substring(1):e}function J(e){const s={defaultValues:{},colorFields:new Set,booleanFields:new Set,isPersistedField:new Set,persistedValues:{}};return e.forEach(n=>{n.options.forEach(a=>{a.type==="persist"?(s.isPersistedField.add(a.id),a.values&&(s.persistedValues[a.id]=a.values)):s.defaultValues[a.id]=String(a.defaultValue),a.type==="colour"?s.colorFields.add(a.id):a.type==="boolean"&&s.booleanFields.add(a.id)})}),s}function K(e,s){const n=new URLSearchParams,a=new Set,r=J(s),i=(o,l)=>{const c=`${o}:${l}`;a.has(c)||(a.add(c),n.append(o,l))};return Object.entries(r.persistedValues).forEach(([o,l])=>{l.forEach(c=>{c&&i(o,c)})}),Object.entries(e).forEach(([o,l])=>{typeof l=="string"&&l.length&&(r.isPersistedField.has(o)&&(Array.from(a).forEach(c=>{c.startsWith(`${o}:`)&&a.delete(c)}),n.delete(o)),l.split(",").forEach(c=>{const m=r.colorFields.has(o)?G(c):r.booleanFields.has(o)?c==="on"?"true":"false":c;(r.isPersistedField.has(o)||r.defaultValues[o]!==m)&&i(o,m)}))}),n}const Q="_presetSection_gc8wt_17",T="_preset_gc8wt_17",X="_active_gc8wt_34",Y="_presetActions_gc8wt_38",p={presetSection:Q,preset:T,active:X,presetActions:Y};function Z({target:e}){const{viewPresets:s}=$(e),[n,a]=x(),r=i=>{const o=new URLSearchParams(i.search);o.set("alias",i.alias),a(o)};return s.length===0?null:t.jsx("div",{className:p.presetSection,children:s.map(i=>{const o=n.get("alias")===i.alias;return t.jsxs("div",{className:g([p.preset,o&&p.active]),children:[t.jsx("div",{children:i.alias}),t.jsx(j,{variant:o?"ghosted":"subtle-white",onClick:()=>r(i),disabled:o,className:p.presetActions,children:o?"Applied":"Apply"})]},i.alias)})})}var v=(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))(v||{});const ee="_inline_4jmjk_17",se={inline:ee},S=e=>e.startsWith("#")?e:`#${e}`;function te({name:e,value:s}){const[n,a]=d.useState(()=>S(s));return d.useEffect(()=>{a(S(s))},[s]),t.jsxs("div",{className:se.inline,children:[t.jsx(W,{color:n,onChange:a,alwaysDisplayColor:!0}),t.jsx("span",{children:n}),t.jsx("input",{type:"hidden",name:e,value:n})]})}const ae="_inline_7qz4u_17",ne="_toggleSelect_7qz4u_24",re="_empty_7qz4u_52",_={inline:ae,toggleSelect:ne,empty:re};function w({paramField:e}){const[s]=x(),{id:n,type:a,defaultValue:r}=e;if(a==="persist")return!e.values||!e.values.length?null:t.jsx("input",{hidden:!0,name:n,readOnly:!0,value:e.values.join(",")});if(a==="option"){const c=s.get(n)||r;return e.values.length===0?t.jsx("span",{className:_.empty,children:"No options available"}):t.jsx(le,{id:n,initialValue:c,options:e.values})}if(a==="multi-option"){const l=s.getAll(n);return t.jsx(oe,{paramField:e,options:l.length?l:e.defaultValue??[""]})}if(a==="boolean")return t.jsx(ie,{id:n,initialValue:q(s.get(n))??r});if(a==="number"){const{placeholder:l}=e,c=s.get(n)??r;return t.jsx(y,{height:"large",type:"number",step:"any",name:n,defaultValue:c,placeholder:l})}if(a==="colour")return t.jsx(te,{name:n,value:s.get(n)??r});const i=s.get(n)??r??"",{placeholder:o}=e;return t.jsx(ce,{id:n,initialValue:i,placeholder:o})}function oe({paramField:e,options:s}){const{id:n,values:a}=e,[r,i]=d.useState(s);d.useEffect(()=>{i(s)},[s]);const o=(l,c)=>{i(c?m=>[...m,l]:m=>m.filter(b=>b!==l))};return a.length===0?t.jsx("span",{className:_.empty,children:"No options available"}):t.jsxs(t.Fragment,{children:[t.jsx("input",{name:n,hidden:!0,readOnly:!0,value:r.join(",")}),t.jsx("div",{className:_.inline,children:a.map(l=>t.jsxs("label",{className:_.toggleSelect,style:{"--user-bg":l.colour},children:[t.jsx(R,{checked:r.includes(l.value),onCheckedChange:c=>o(l.value,c)}),l.label]},l.value))})]})}function ie({id:e,initialValue:s}){const[n,a]=d.useState(s);return d.useEffect(()=>{a(s)},[s]),t.jsx(M,{size:"large",name:e,checked:n,onCheckedChange:a})}function le({id:e,initialValue:s,options:n}){const[a,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),t.jsx(U,{size:"large",name:e,options:n,value:a,onValueChange:i=>{i!==null&&r(i)}})}function ce({id:e,initialValue:s,...n}){const[a,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),t.jsx(y,{height:"large",name:e,value:a,onChange:i=>r(i.target.value),...n})}const de="_section_1ssto_17",ue="_sectionHeader_1ssto_22",fe="_collapsible_1ssto_28",me="_label_1ssto_32",he="_title_1ssto_41",pe="_description_1ssto_47",_e="_closed_1ssto_53",ge="_open_1ssto_58",be="_hidden_1ssto_63",f={section:de,sectionHeader:ue,collapsible:fe,label:me,title:he,description:pe,closed:_e,open:ge,hidden:be};function je({title:e,collapsible:s,options:n}){const[a,r]=k({key:`params-${e}`,defaultValue:!1}),i=()=>{s&&r(o=>!o)};return t.jsx("section",{className:f.section,children:e===v.Hidden?t.jsx(Se,{options:n}):t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:g([f.sectionHeader,s&&f.collapsible]),onClick:i,children:[e,s&&t.jsx(V,{className:g([a?f.closed:f.open])})]}),t.jsx(xe,{options:n,collapsed:a})]})})}function xe({options:e,collapsed:s}){return t.jsx(t.Fragment,{children:e.map(n=>t.jsxs("label",{className:g([f.label,s&&f.hidden]),children:[t.jsx("span",{className:f.title,children:n.title}),t.jsx("span",{className:f.description,children:n.description}),t.jsx(w,{paramField:n})]},n.title))})}function Se({options:e}){return t.jsx(t.Fragment,{children:e.map((s,n)=>t.jsx(w,{paramField:s},s.title+n))})}const ye="_backdrop_1pnpt_26",ve="_drawer_1pnpt_17",we="_header_1pnpt_67",Pe="_body_1pnpt_77",Ce="_footer_1pnpt_84",ke="_sectionList_1pnpt_92",Ve="_info_1pnpt_99",h={backdrop:ye,drawer:ve,header:we,body:Pe,footer:Ce,sectionList:ke,info:Ve},Le=d.memo(Ne);function Ne({target:e,viewOptions:s}){const[n,a]=x(),{data:r}=A(),{isOpen:i,close:o}=H(),l=z(),c=()=>{o()},m=()=>{a()},b=u=>{u.preventDefault();const P=Object.fromEntries(new FormData(u.currentTarget)),C=K(P,s);a(C),l&&o()};return t.jsx(N,{open:i,onOpenChange:u=>{u||c()},children:t.jsxs(E,{children:[t.jsx(D,{className:h.backdrop}),t.jsxs(F,{className:h.drawer,children:[t.jsxs("div",{className:h.header,children:[t.jsx(I,{children:"Customise"}),t.jsx(L,{variant:"subtle-white",size:"large","data-testid":"close-view-params",onClick:c,children:t.jsx(O,{})})]}),t.jsxs("div",{className:h.body,children:[r.overrideStyles&&t.jsx(B,{className:h.info,children:"This view style is being modified by a custom CSS file."}),t.jsx(Z,{target:e}),t.jsx("form",{id:"edit-params-form",onSubmit:b,className:h.sectionList,children:s.map(u=>t.jsx(je,{title:u.title,collapsible:u.collapsible,options:u.options},u.title))})]}),t.jsxs("div",{className:h.footer,children:[t.jsx(j,{variant:"subtle",size:"large",onClick:m,type:"reset",children:"Reset to default"}),t.jsx(j,{variant:"primary",size:"large",form:"edit-params-form",type:"submit","data-testid":"apply-view-params",children:"Apply"})]})]})]})})}export{v as O,Le as V,ze as a,He as b,Ae as m};
2
+ //# sourceMappingURL=ViewParamsEditor-CBnRitZ4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewParamsEditor-C2-TRP6e.js","sources":["../../src/common/components/view-params-editor/viewParams.utils.ts","../../src/common/components/view-params-editor/ViewParamsPresets.tsx","../../src/common/components/view-params-editor/constants.ts","../../src/common/components/view-params-editor/InlineColourPicker.tsx","../../src/common/components/view-params-editor/ParamInput.tsx","../../src/common/components/view-params-editor/ViewParamsSection.tsx","../../src/common/components/view-params-editor/ViewParamsEditor.tsx"],"sourcesContent":["import type { CustomFields, ProjectData } from 'ontime-types';\n\nimport type { SelectOption } from '../select/Select';\n\nimport type { MultiselectOption, ViewOption } from './viewParams.types';\n\n/**\n * Creates a list of custom fields for a select\n * Filters out image type custom fields\n */\nexport function makeOptionsFromCustomFields(\n customFields: CustomFields,\n additionalOptions: SelectOption[] = [],\n filterImageType = true,\n): SelectOption[] {\n const options: SelectOption[] = [...additionalOptions];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: `custom-${key}`,\n label: `Custom: ${value.label}`,\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a multiselect component from custom fields\n * Filters out image type custom fields\n */\nexport function makeCustomFieldSelectOptions(customFields: CustomFields, filterImageType = true): MultiselectOption[] {\n const options: MultiselectOption[] = [];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: key,\n label: value.label,\n colour: value.colour,\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a select element that displays project custom data\n */\nexport function makeProjectDataOptions(\n projectData: ProjectData,\n additionalOptions: SelectOption[] = [],\n): SelectOption[] {\n const generatedOptions = projectData.custom.map((entry, index) => {\n return {\n value: `${index}-${entry.title}`,\n label: entry.title,\n };\n });\n\n return [...additionalOptions, ...generatedOptions];\n}\n\ntype ViewParamsObj = { [key: string]: string | FormDataEntryValue };\n\n/**\n * Utility remove the # character from a hex string\n */\nfunction sanitiseColour(colour: string) {\n if (colour.startsWith('#')) {\n return colour.substring(1);\n }\n return colour;\n}\n\ntype FieldMetadata = {\n defaultValues: Record<string, string>;\n colorFields: Set<string>;\n booleanFields: Set<string>;\n isPersistedField: Set<string>;\n persistedValues: Record<string, string[]>;\n};\n\n/**\n * Utility collects metadata about fields from view options\n * - where are the default values\n * - which fields are colours\n * - which fields are persisted\n */\nfunction collectFieldMetadata(paramFields: ViewOption[]): FieldMetadata {\n const metadata: FieldMetadata = {\n defaultValues: {},\n colorFields: new Set(),\n booleanFields: new Set(),\n isPersistedField: new Set(),\n persistedValues: {},\n };\n\n paramFields.forEach((section) => {\n section.options.forEach((option) => {\n if (option.type === 'persist') {\n metadata.isPersistedField.add(option.id);\n if (option.values) {\n metadata.persistedValues[option.id] = option.values;\n }\n } else {\n metadata.defaultValues[option.id] = String(option.defaultValue);\n }\n\n if (option.type === 'colour') {\n metadata.colorFields.add(option.id);\n } else if (option.type === 'boolean') {\n metadata.booleanFields.add(option.id);\n }\n });\n });\n\n return metadata;\n}\n\n/**\n * Makes a new URLSearchParams object from the given params object\n * @param paramsObj - The object containing parameters to be converted\n * @param paramFields - The view options that define the parameters\n * @returns A new URLSearchParams object with the parameters\n */\nexport function getURLSearchParamsFromObj(paramsObj: ViewParamsObj, paramFields: ViewOption[]) {\n const newSearchParams = new URLSearchParams();\n const addedPairs = new Set<string>();\n const metadata = collectFieldMetadata(paramFields);\n\n // Utility function to safely add params without duplicates\n const addUniqueParam = (id: string, value: string) => {\n const pair = `${id}:${value}`;\n if (!addedPairs.has(pair)) {\n addedPairs.add(pair);\n newSearchParams.append(id, value);\n }\n };\n\n // First add all persisted values\n Object.entries(metadata.persistedValues).forEach(([id, values]) => {\n values.forEach((value) => {\n if (value) {\n addUniqueParam(id, value);\n }\n });\n });\n\n // Then process user-provided values\n Object.entries(paramsObj).forEach(([id, value]) => {\n if (typeof value === 'string' && value.length) {\n // For persisted fields, clear existing values before adding new ones\n if (metadata.isPersistedField.has(id)) {\n // Clear tracking of previous values for this field\n Array.from(addedPairs).forEach((pair) => {\n if (pair.startsWith(`${id}:`)) {\n addedPairs.delete(pair);\n }\n });\n newSearchParams.delete(id);\n }\n\n // Process and add new values\n value.split(',').forEach((v) => {\n // some field types need extra processing\n const processedValue = (() => {\n if (metadata.colorFields.has(id)) {\n return sanitiseColour(v);\n }\n if (metadata.booleanFields.has(id)) {\n return v === 'on' ? 'true' : 'false';\n }\n return v;\n })();\n if (metadata.isPersistedField.has(id) || metadata.defaultValues[id] !== processedValue) {\n addUniqueParam(id, processedValue);\n }\n });\n }\n });\n\n return newSearchParams;\n}\n","import { useSearchParams } from 'react-router';\nimport { OntimeView, URLPreset } from 'ontime-types';\n\nimport { useViewUrlPresets } from '../../hooks-query/useUrlPresets';\nimport { cx } from '../../utils/styleUtils';\nimport Button from '../buttons/Button';\n\nimport style from './ViewParamsPresets.module.scss';\n\n/**\n * Shows a list of presets for the current view\n */\nexport function ViewParamsPresets({ target }: { target: OntimeView }) {\n const { viewPresets } = useViewUrlPresets(target);\n const [searchParams, setSearchParams] = useSearchParams();\n\n const handleRecall = (preset: URLPreset) => {\n const newSearch = new URLSearchParams(preset.search);\n newSearch.set('alias', preset.alias);\n setSearchParams(newSearch);\n };\n\n if (viewPresets.length === 0) {\n return null;\n }\n\n return (\n <div className={style.presetSection}>\n {viewPresets.map((preset) => {\n const active = searchParams.get('alias') === preset.alias;\n return (\n <div key={preset.alias} className={cx([style.preset, active && style.active])}>\n <div>{preset.alias}</div>\n <Button\n variant={active ? 'ghosted' : 'subtle-white'}\n onClick={() => handleRecall(preset)}\n disabled={active}\n className={style.presetActions}\n >\n {active ? 'Applied' : 'Apply'}\n </Button>\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * Gathers possible titles for view options\n */\nexport enum OptionTitle {\n ClockOptions = 'Clock Options',\n TimerOptions = 'Timer Options',\n DataSources = 'Data sources',\n ElementVisibility = 'Element visibility',\n BehaviourOptions = 'View behaviour',\n StyleOverride = 'View style override',\n Animation = 'View animation',\n Schedule = 'Schedule options',\n\n /** rendered as hidden inputs */\n Hidden = 'Hidden options',\n}\n","import { useEffect, useState } from 'react';\n\nimport SwatchPicker from '../input/colour-input/SwatchPicker';\n\nimport style from './InlineColourPicker.module.scss';\n\ninterface InlineColourPickerProps {\n name: string;\n value: string;\n}\n\nconst ensureHex = (value: string) => {\n if (!value.startsWith('#')) {\n return `#${value}`;\n }\n return value;\n};\n\nexport default function InlineColourPicker({ name, value }: InlineColourPickerProps) {\n const [colour, setColour] = useState(() => ensureHex(value));\n\n useEffect(() => {\n setColour(ensureHex(value));\n }, [value]);\n\n return (\n <div className={style.inline}>\n <SwatchPicker color={colour} onChange={setColour} alwaysDisplayColor />\n <span>{colour}</span>\n <input type='hidden' name={name} value={colour} />\n </div>\n );\n}\n","import { ComponentProps, useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { isStringBoolean } from '../../../views/common/viewUtils';\nimport Checkbox from '../checkbox/Checkbox';\nimport Input from '../input/input/Input';\nimport Select, { SelectOption } from '../select/Select';\nimport Switch from '../switch/Switch';\n\nimport InlineColourPicker from './InlineColourPicker';\nimport { ParamField } from './viewParams.types';\n\nimport style from './ParamInput.module.scss';\n\ninterface ParamInputProps {\n paramField: ParamField;\n}\n\nexport default function ParamInput({ paramField }: ParamInputProps) {\n const [searchParams] = useSearchParams();\n const { id, type, defaultValue } = paramField;\n\n if (type === 'persist') {\n if (!paramField.values || !paramField.values.length) {\n return null;\n }\n return <input hidden name={id} readOnly value={paramField.values.join(',')} />;\n }\n\n if (type === 'option') {\n const optionFromParams = searchParams.get(id);\n const defaultOptionValue = optionFromParams || defaultValue;\n\n if (paramField.values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return <ControlledSelect id={id} initialValue={defaultOptionValue} options={paramField.values} />;\n }\n\n if (type === 'multi-option') {\n const optionFromParams = searchParams.getAll(id);\n\n return (\n <MultiOption\n paramField={paramField}\n options={optionFromParams.length ? optionFromParams : paramField.defaultValue ?? ['']}\n />\n );\n }\n\n if (type === 'boolean') {\n return <ControlledSwitch id={id} initialValue={isStringBoolean(searchParams.get(id)) ?? defaultValue} />;\n }\n\n if (type === 'number') {\n const { placeholder } = paramField;\n const defaultNumberValue = searchParams.get(id) ?? defaultValue;\n\n return (\n <Input\n height='large'\n type='number'\n step='any'\n name={id}\n defaultValue={defaultNumberValue}\n placeholder={placeholder}\n />\n );\n }\n\n if (type === 'colour') {\n return <InlineColourPicker name={id} value={searchParams.get(id) ?? defaultValue} />;\n }\n\n const defaultStringValue = searchParams.get(id) ?? defaultValue ?? '';\n const { placeholder } = paramField;\n\n return <ControlledInput id={id} initialValue={defaultStringValue} placeholder={placeholder} />;\n}\n\ninterface EditFormMultiOptionProps {\n paramField: ParamField & { type: 'multi-option' };\n options: string[];\n}\n\nfunction MultiOption({ paramField, options }: EditFormMultiOptionProps) {\n const { id, values } = paramField;\n const [paramState, setParamState] = useState<string[]>(options);\n\n // synchronise options\n useEffect(() => {\n setParamState(options);\n }, [options]);\n\n const toggleValue = (value: string, checked: boolean) => {\n if (checked) {\n setParamState((prev) => [...prev, value]);\n } else {\n setParamState((prev) => prev.filter((v) => v !== value));\n }\n };\n\n if (values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return (\n <>\n <input name={id} hidden readOnly value={paramState.join(',')} />\n <div className={style.inline}>\n {values.map((option) => {\n return (\n <label\n key={option.value}\n className={style.toggleSelect}\n style={{\n '--user-bg': option.colour,\n }}\n >\n <Checkbox\n checked={paramState.includes(option.value)}\n onCheckedChange={(checked) => toggleValue(option.value, checked as boolean)}\n />\n {option.label}\n </label>\n );\n })}\n </div>\n </>\n );\n}\n\ninterface ControlledSwitchProps {\n id: string;\n initialValue: boolean;\n}\nfunction ControlledSwitch({ id, initialValue }: ControlledSwitchProps) {\n const [checked, setChecked] = useState(initialValue);\n\n // synchronise checked state\n useEffect(() => {\n setChecked(initialValue);\n }, [initialValue]);\n\n return <Switch size='large' name={id} checked={checked} onCheckedChange={setChecked} />;\n}\n\ninterface ControlledSelectProps {\n id: string;\n initialValue?: string;\n options: SelectOption[];\n}\nfunction ControlledSelect({ id, initialValue, options }: ControlledSelectProps) {\n const [selected, setSelected] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setSelected(initialValue);\n }, [initialValue]);\n\n return (\n <Select\n size='large'\n name={id}\n options={options}\n value={selected}\n onValueChange={(value) => {\n if (value === null) return;\n setSelected(value);\n }}\n />\n );\n}\n\ninterface ControlledInputProps<T extends number | string> extends ComponentProps<typeof Input> {\n id: string;\n initialValue: T;\n}\nfunction ControlledInput<T extends number | string>({ id, initialValue, ...inputProps }: ControlledInputProps<T>) {\n const [value, setValue] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n return (\n <Input\n height='large'\n name={id}\n value={value}\n onChange={(event) => setValue(event.target.value as T)}\n {...inputProps}\n />\n );\n}\n","import { IoChevronDown } from 'react-icons/io5';\nimport { useLocalStorage } from '@mantine/hooks';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport { OptionTitle } from './constants';\nimport ParamInput from './ParamInput';\nimport { type ParamField } from './viewParams.types';\n\nimport style from './ViewParamsSection.module.scss';\n\ninterface ViewParamsSectionProps {\n title: string;\n collapsible?: boolean;\n options: ParamField[];\n}\n\nexport default function ViewParamsSection({ title, collapsible, options }: ViewParamsSectionProps) {\n const [collapsed, setCollapsed] = useLocalStorage({ key: `params-${title}`, defaultValue: false });\n\n const handleCollapse = () => {\n if (collapsible) {\n setCollapsed((prev) => !prev);\n }\n };\n\n return (\n <section className={style.section}>\n {title === OptionTitle.Hidden ? (\n <HiddenContents options={options} />\n ) : (\n <>\n <div className={cx([style.sectionHeader, collapsible && style.collapsible])} onClick={handleCollapse}>\n {title}\n {collapsible && <IoChevronDown className={cx([collapsed ? style.closed : style.open])} />}\n </div>\n <SectionContents options={options} collapsed={collapsed} />\n </>\n )}\n </section>\n );\n}\n\ninterface SectionContentsProps {\n options: ParamField[];\n collapsed: boolean;\n}\n\nfunction SectionContents({ options, collapsed }: SectionContentsProps) {\n return (\n <>\n {options.map((option) => {\n return (\n <label key={option.title} className={cx([style.label, collapsed && style.hidden])}>\n <span className={style.title}>{option.title}</span>\n <span className={style.description}>{option.description}</span>\n <ParamInput paramField={option} />\n </label>\n );\n })}\n </>\n );\n}\n\nfunction HiddenContents({ options }: { options: ParamField[] }) {\n return (\n <>\n {options.map((option, index) => {\n return <ParamInput key={option.title + index} paramField={option} />;\n })}\n </>\n );\n}\n","import { FormEvent, memo } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { useSearchParams } from 'react-router';\nimport { Dialog } from '@base-ui/react/dialog';\nimport { OntimeView } from 'ontime-types';\n\nimport { useIsSmallScreen } from '../../hooks/useIsSmallScreen';\nimport useViewSettings from '../../hooks-query/useViewSettings';\nimport Button from '../buttons/Button';\nimport IconButton from '../buttons/IconButton';\nimport Info from '../info/Info';\n\nimport { ViewOption } from './viewParams.types';\nimport { getURLSearchParamsFromObj } from './viewParams.utils';\nimport { useViewParamsEditorStore } from './viewParamsEditor.store';\nimport { ViewParamsPresets } from './ViewParamsPresets';\nimport ViewParamsSection from './ViewParamsSection';\n\nimport style from './ViewParamsEditor.module.scss';\n\ninterface EditFormDrawerProps {\n target: OntimeView;\n viewOptions: ViewOption[];\n}\n\nexport default memo(ViewParamsEditor);\nfunction ViewParamsEditor({ target, viewOptions }: EditFormDrawerProps) {\n const [_, setSearchParams] = useSearchParams();\n const { data: viewSettings } = useViewSettings();\n const { isOpen, close } = useViewParamsEditorStore();\n const isSmallScreen = useIsSmallScreen();\n\n const handleClose = () => {\n close();\n };\n\n const resetParams = () => {\n setSearchParams();\n };\n\n const onParamsFormSubmit = (formEvent: FormEvent<HTMLFormElement>) => {\n formEvent.preventDefault();\n\n const newParamsObject = Object.fromEntries(new FormData(formEvent.currentTarget));\n const newSearchParams = getURLSearchParamsFromObj(newParamsObject, viewOptions);\n setSearchParams(newSearchParams);\n\n if (isSmallScreen) {\n close();\n }\n };\n\n return (\n <Dialog.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n handleClose();\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Backdrop className={style.backdrop} />\n <Dialog.Popup className={style.drawer}>\n <div className={style.header}>\n <Dialog.Title>Customise</Dialog.Title>\n <IconButton variant='subtle-white' size='large' data-testid='close-view-params' onClick={handleClose}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {viewSettings.overrideStyles && (\n <Info className={style.info}>This view style is being modified by a custom CSS file.</Info>\n )}\n <ViewParamsPresets target={target} />\n <form id='edit-params-form' onSubmit={onParamsFormSubmit} className={style.sectionList}>\n {viewOptions.map((section) => (\n <ViewParamsSection\n key={section.title}\n title={section.title}\n collapsible={section.collapsible}\n options={section.options}\n />\n ))}\n </form>\n </div>\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={resetParams} type='reset'>\n Reset to default\n </Button>\n <Button\n variant='primary'\n size='large'\n form='edit-params-form'\n type='submit'\n data-testid='apply-view-params'\n >\n Apply\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n"],"names":["makeOptionsFromCustomFields","customFields","additionalOptions","filterImageType","options","key","value","Object","entries","type","push","label","makeCustomFieldSelectOptions","colour","makeProjectDataOptions","projectData","generatedOptions","custom","map","entry","index","title","sanitiseColour","startsWith","substring","collectFieldMetadata","paramFields","metadata","defaultValues","colorFields","Set","booleanFields","isPersistedField","persistedValues","forEach","section","option","add","id","values","String","defaultValue","getURLSearchParamsFromObj","paramsObj","newSearchParams","URLSearchParams","addedPairs","addUniqueParam","pair","has","append","length","Array","from","delete","split","v","processedValue","ViewParamsPresets","target","viewPresets","useViewUrlPresets","searchParams","setSearchParams","useSearchParams","handleRecall","preset","newSearch","search","set","alias","style","presetSection","active","get","jsxs","cx","jsx","Button","presetActions","OptionTitle","ClockOptions","TimerOptions","DataSources","ElementVisibility","BehaviourOptions","StyleOverride","Animation","Schedule","Hidden","ensureHex","InlineColourPicker","name","setColour","useState","useEffect","inline","SwatchPicker","ParamInput","paramField","join","defaultOptionValue","empty","ControlledSelect","optionFromParams","getAll","MultiOption","ControlledSwitch","isStringBoolean","placeholder","defaultNumberValue","Input","defaultStringValue","ControlledInput","paramState","setParamState","toggleValue","checked","prev","filter","Fragment","toggleSelect","Checkbox","includes","initialValue","setChecked","Switch","selected","setSelected","Select","inputProps","setValue","event","ViewParamsSection","collapsible","collapsed","setCollapsed","useLocalStorage","handleCollapse","HiddenContents","sectionHeader","IoChevronDown","closed","open","SectionContents","hidden","description","memo","ViewParamsEditor","viewOptions","_","data","viewSettings","useViewSettings","isOpen","close","useViewParamsEditorStore","isSmallScreen","useIsSmallScreen","handleClose","resetParams","onParamsFormSubmit","formEvent","preventDefault","newParamsObject","fromEntries","FormData","currentTarget","Dialog.Root","Dialog.Portal","Dialog.Backdrop","backdrop","Dialog.Popup","drawer","header","Dialog.Title","IconButton","IoClose","body","overrideStyles","Info","info","sectionList","footer"],"mappings":"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"}
1
+ {"version":3,"file":"ViewParamsEditor-CBnRitZ4.js","sources":["../../src/common/components/view-params-editor/viewParams.utils.ts","../../src/common/components/view-params-editor/ViewParamsPresets.tsx","../../src/common/components/view-params-editor/constants.ts","../../src/common/components/view-params-editor/InlineColourPicker.tsx","../../src/common/components/view-params-editor/ParamInput.tsx","../../src/common/components/view-params-editor/ViewParamsSection.tsx","../../src/common/components/view-params-editor/ViewParamsEditor.tsx"],"sourcesContent":["import type { CustomFields, ProjectData } from 'ontime-types';\n\nimport type { SelectOption } from '../select/Select';\n\nimport type { MultiselectOption, ViewOption } from './viewParams.types';\n\n/**\n * Creates a list of custom fields for a select\n * Filters out image type custom fields\n */\nexport function makeOptionsFromCustomFields(\n customFields: CustomFields,\n additionalOptions: SelectOption[] = [],\n filterImageType = true,\n): SelectOption[] {\n const options: SelectOption[] = [...additionalOptions];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: `custom-${key}`,\n label: `Custom: ${value.label}`,\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a multiselect component from custom fields\n * Filters out image type custom fields\n */\nexport function makeCustomFieldSelectOptions(customFields: CustomFields, filterImageType = true): MultiselectOption[] {\n const options: MultiselectOption[] = [];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: key,\n label: value.label,\n colour: value.colour,\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a select element that displays project custom data\n */\nexport function makeProjectDataOptions(\n projectData: ProjectData,\n additionalOptions: SelectOption[] = [],\n): SelectOption[] {\n const generatedOptions = projectData.custom.map((entry, index) => {\n return {\n value: `${index}-${entry.title}`,\n label: entry.title,\n };\n });\n\n return [...additionalOptions, ...generatedOptions];\n}\n\ntype ViewParamsObj = { [key: string]: string | FormDataEntryValue };\n\n/**\n * Utility remove the # character from a hex string\n */\nfunction sanitiseColour(colour: string) {\n if (colour.startsWith('#')) {\n return colour.substring(1);\n }\n return colour;\n}\n\ntype FieldMetadata = {\n defaultValues: Record<string, string>;\n colorFields: Set<string>;\n booleanFields: Set<string>;\n isPersistedField: Set<string>;\n persistedValues: Record<string, string[]>;\n};\n\n/**\n * Utility collects metadata about fields from view options\n * - where are the default values\n * - which fields are colours\n * - which fields are persisted\n */\nfunction collectFieldMetadata(paramFields: ViewOption[]): FieldMetadata {\n const metadata: FieldMetadata = {\n defaultValues: {},\n colorFields: new Set(),\n booleanFields: new Set(),\n isPersistedField: new Set(),\n persistedValues: {},\n };\n\n paramFields.forEach((section) => {\n section.options.forEach((option) => {\n if (option.type === 'persist') {\n metadata.isPersistedField.add(option.id);\n if (option.values) {\n metadata.persistedValues[option.id] = option.values;\n }\n } else {\n metadata.defaultValues[option.id] = String(option.defaultValue);\n }\n\n if (option.type === 'colour') {\n metadata.colorFields.add(option.id);\n } else if (option.type === 'boolean') {\n metadata.booleanFields.add(option.id);\n }\n });\n });\n\n return metadata;\n}\n\n/**\n * Makes a new URLSearchParams object from the given params object\n * @param paramsObj - The object containing parameters to be converted\n * @param paramFields - The view options that define the parameters\n * @returns A new URLSearchParams object with the parameters\n */\nexport function getURLSearchParamsFromObj(paramsObj: ViewParamsObj, paramFields: ViewOption[]) {\n const newSearchParams = new URLSearchParams();\n const addedPairs = new Set<string>();\n const metadata = collectFieldMetadata(paramFields);\n\n // Utility function to safely add params without duplicates\n const addUniqueParam = (id: string, value: string) => {\n const pair = `${id}:${value}`;\n if (!addedPairs.has(pair)) {\n addedPairs.add(pair);\n newSearchParams.append(id, value);\n }\n };\n\n // First add all persisted values\n Object.entries(metadata.persistedValues).forEach(([id, values]) => {\n values.forEach((value) => {\n if (value) {\n addUniqueParam(id, value);\n }\n });\n });\n\n // Then process user-provided values\n Object.entries(paramsObj).forEach(([id, value]) => {\n if (typeof value === 'string' && value.length) {\n // For persisted fields, clear existing values before adding new ones\n if (metadata.isPersistedField.has(id)) {\n // Clear tracking of previous values for this field\n Array.from(addedPairs).forEach((pair) => {\n if (pair.startsWith(`${id}:`)) {\n addedPairs.delete(pair);\n }\n });\n newSearchParams.delete(id);\n }\n\n // Process and add new values\n value.split(',').forEach((v) => {\n // some field types need extra processing\n const processedValue = (() => {\n if (metadata.colorFields.has(id)) {\n return sanitiseColour(v);\n }\n if (metadata.booleanFields.has(id)) {\n return v === 'on' ? 'true' : 'false';\n }\n return v;\n })();\n if (metadata.isPersistedField.has(id) || metadata.defaultValues[id] !== processedValue) {\n addUniqueParam(id, processedValue);\n }\n });\n }\n });\n\n return newSearchParams;\n}\n","import { useSearchParams } from 'react-router';\nimport { OntimeView, URLPreset } from 'ontime-types';\n\nimport { useViewUrlPresets } from '../../hooks-query/useUrlPresets';\nimport { cx } from '../../utils/styleUtils';\nimport Button from '../buttons/Button';\n\nimport style from './ViewParamsPresets.module.scss';\n\n/**\n * Shows a list of presets for the current view\n */\nexport function ViewParamsPresets({ target }: { target: OntimeView }) {\n const { viewPresets } = useViewUrlPresets(target);\n const [searchParams, setSearchParams] = useSearchParams();\n\n const handleRecall = (preset: URLPreset) => {\n const newSearch = new URLSearchParams(preset.search);\n newSearch.set('alias', preset.alias);\n setSearchParams(newSearch);\n };\n\n if (viewPresets.length === 0) {\n return null;\n }\n\n return (\n <div className={style.presetSection}>\n {viewPresets.map((preset) => {\n const active = searchParams.get('alias') === preset.alias;\n return (\n <div key={preset.alias} className={cx([style.preset, active && style.active])}>\n <div>{preset.alias}</div>\n <Button\n variant={active ? 'ghosted' : 'subtle-white'}\n onClick={() => handleRecall(preset)}\n disabled={active}\n className={style.presetActions}\n >\n {active ? 'Applied' : 'Apply'}\n </Button>\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * Gathers possible titles for view options\n */\nexport enum OptionTitle {\n ClockOptions = 'Clock Options',\n TimerOptions = 'Timer Options',\n DataSources = 'Data sources',\n ElementVisibility = 'Element visibility',\n BehaviourOptions = 'View behaviour',\n StyleOverride = 'View style override',\n Animation = 'View animation',\n Schedule = 'Schedule options',\n\n /** rendered as hidden inputs */\n Hidden = 'Hidden options',\n}\n","import { useEffect, useState } from 'react';\n\nimport SwatchPicker from '../input/colour-input/SwatchPicker';\n\nimport style from './InlineColourPicker.module.scss';\n\ninterface InlineColourPickerProps {\n name: string;\n value: string;\n}\n\nconst ensureHex = (value: string) => {\n if (!value.startsWith('#')) {\n return `#${value}`;\n }\n return value;\n};\n\nexport default function InlineColourPicker({ name, value }: InlineColourPickerProps) {\n const [colour, setColour] = useState(() => ensureHex(value));\n\n useEffect(() => {\n setColour(ensureHex(value));\n }, [value]);\n\n return (\n <div className={style.inline}>\n <SwatchPicker color={colour} onChange={setColour} alwaysDisplayColor />\n <span>{colour}</span>\n <input type='hidden' name={name} value={colour} />\n </div>\n );\n}\n","import { ComponentProps, useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { isStringBoolean } from '../../../views/common/viewUtils';\nimport Checkbox from '../checkbox/Checkbox';\nimport Input from '../input/input/Input';\nimport Select, { SelectOption } from '../select/Select';\nimport Switch from '../switch/Switch';\n\nimport InlineColourPicker from './InlineColourPicker';\nimport { ParamField } from './viewParams.types';\n\nimport style from './ParamInput.module.scss';\n\ninterface ParamInputProps {\n paramField: ParamField;\n}\n\nexport default function ParamInput({ paramField }: ParamInputProps) {\n const [searchParams] = useSearchParams();\n const { id, type, defaultValue } = paramField;\n\n if (type === 'persist') {\n if (!paramField.values || !paramField.values.length) {\n return null;\n }\n return <input hidden name={id} readOnly value={paramField.values.join(',')} />;\n }\n\n if (type === 'option') {\n const optionFromParams = searchParams.get(id);\n const defaultOptionValue = optionFromParams || defaultValue;\n\n if (paramField.values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return <ControlledSelect id={id} initialValue={defaultOptionValue} options={paramField.values} />;\n }\n\n if (type === 'multi-option') {\n const optionFromParams = searchParams.getAll(id);\n\n return (\n <MultiOption\n paramField={paramField}\n options={optionFromParams.length ? optionFromParams : paramField.defaultValue ?? ['']}\n />\n );\n }\n\n if (type === 'boolean') {\n return <ControlledSwitch id={id} initialValue={isStringBoolean(searchParams.get(id)) ?? defaultValue} />;\n }\n\n if (type === 'number') {\n const { placeholder } = paramField;\n const defaultNumberValue = searchParams.get(id) ?? defaultValue;\n\n return (\n <Input\n height='large'\n type='number'\n step='any'\n name={id}\n defaultValue={defaultNumberValue}\n placeholder={placeholder}\n />\n );\n }\n\n if (type === 'colour') {\n return <InlineColourPicker name={id} value={searchParams.get(id) ?? defaultValue} />;\n }\n\n const defaultStringValue = searchParams.get(id) ?? defaultValue ?? '';\n const { placeholder } = paramField;\n\n return <ControlledInput id={id} initialValue={defaultStringValue} placeholder={placeholder} />;\n}\n\ninterface EditFormMultiOptionProps {\n paramField: ParamField & { type: 'multi-option' };\n options: string[];\n}\n\nfunction MultiOption({ paramField, options }: EditFormMultiOptionProps) {\n const { id, values } = paramField;\n const [paramState, setParamState] = useState<string[]>(options);\n\n // synchronise options\n useEffect(() => {\n setParamState(options);\n }, [options]);\n\n const toggleValue = (value: string, checked: boolean) => {\n if (checked) {\n setParamState((prev) => [...prev, value]);\n } else {\n setParamState((prev) => prev.filter((v) => v !== value));\n }\n };\n\n if (values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return (\n <>\n <input name={id} hidden readOnly value={paramState.join(',')} />\n <div className={style.inline}>\n {values.map((option) => {\n return (\n <label\n key={option.value}\n className={style.toggleSelect}\n style={{\n '--user-bg': option.colour,\n }}\n >\n <Checkbox\n checked={paramState.includes(option.value)}\n onCheckedChange={(checked) => toggleValue(option.value, checked as boolean)}\n />\n {option.label}\n </label>\n );\n })}\n </div>\n </>\n );\n}\n\ninterface ControlledSwitchProps {\n id: string;\n initialValue: boolean;\n}\nfunction ControlledSwitch({ id, initialValue }: ControlledSwitchProps) {\n const [checked, setChecked] = useState(initialValue);\n\n // synchronise checked state\n useEffect(() => {\n setChecked(initialValue);\n }, [initialValue]);\n\n return <Switch size='large' name={id} checked={checked} onCheckedChange={setChecked} />;\n}\n\ninterface ControlledSelectProps {\n id: string;\n initialValue?: string;\n options: SelectOption[];\n}\nfunction ControlledSelect({ id, initialValue, options }: ControlledSelectProps) {\n const [selected, setSelected] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setSelected(initialValue);\n }, [initialValue]);\n\n return (\n <Select\n size='large'\n name={id}\n options={options}\n value={selected}\n onValueChange={(value) => {\n if (value === null) return;\n setSelected(value);\n }}\n />\n );\n}\n\ninterface ControlledInputProps<T extends number | string> extends ComponentProps<typeof Input> {\n id: string;\n initialValue: T;\n}\nfunction ControlledInput<T extends number | string>({ id, initialValue, ...inputProps }: ControlledInputProps<T>) {\n const [value, setValue] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n return (\n <Input\n height='large'\n name={id}\n value={value}\n onChange={(event) => setValue(event.target.value as T)}\n {...inputProps}\n />\n );\n}\n","import { IoChevronDown } from 'react-icons/io5';\nimport { useLocalStorage } from '@mantine/hooks';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport { OptionTitle } from './constants';\nimport ParamInput from './ParamInput';\nimport { type ParamField } from './viewParams.types';\n\nimport style from './ViewParamsSection.module.scss';\n\ninterface ViewParamsSectionProps {\n title: string;\n collapsible?: boolean;\n options: ParamField[];\n}\n\nexport default function ViewParamsSection({ title, collapsible, options }: ViewParamsSectionProps) {\n const [collapsed, setCollapsed] = useLocalStorage({ key: `params-${title}`, defaultValue: false });\n\n const handleCollapse = () => {\n if (collapsible) {\n setCollapsed((prev) => !prev);\n }\n };\n\n return (\n <section className={style.section}>\n {title === OptionTitle.Hidden ? (\n <HiddenContents options={options} />\n ) : (\n <>\n <div className={cx([style.sectionHeader, collapsible && style.collapsible])} onClick={handleCollapse}>\n {title}\n {collapsible && <IoChevronDown className={cx([collapsed ? style.closed : style.open])} />}\n </div>\n <SectionContents options={options} collapsed={collapsed} />\n </>\n )}\n </section>\n );\n}\n\ninterface SectionContentsProps {\n options: ParamField[];\n collapsed: boolean;\n}\n\nfunction SectionContents({ options, collapsed }: SectionContentsProps) {\n return (\n <>\n {options.map((option) => {\n return (\n <label key={option.title} className={cx([style.label, collapsed && style.hidden])}>\n <span className={style.title}>{option.title}</span>\n <span className={style.description}>{option.description}</span>\n <ParamInput paramField={option} />\n </label>\n );\n })}\n </>\n );\n}\n\nfunction HiddenContents({ options }: { options: ParamField[] }) {\n return (\n <>\n {options.map((option, index) => {\n return <ParamInput key={option.title + index} paramField={option} />;\n })}\n </>\n );\n}\n","import { FormEvent, memo } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { useSearchParams } from 'react-router';\nimport { Dialog } from '@base-ui/react/dialog';\nimport { OntimeView } from 'ontime-types';\n\nimport { useIsSmallScreen } from '../../hooks/useIsSmallScreen';\nimport useViewSettings from '../../hooks-query/useViewSettings';\nimport Button from '../buttons/Button';\nimport IconButton from '../buttons/IconButton';\nimport Info from '../info/Info';\n\nimport { ViewOption } from './viewParams.types';\nimport { getURLSearchParamsFromObj } from './viewParams.utils';\nimport { useViewParamsEditorStore } from './viewParamsEditor.store';\nimport { ViewParamsPresets } from './ViewParamsPresets';\nimport ViewParamsSection from './ViewParamsSection';\n\nimport style from './ViewParamsEditor.module.scss';\n\ninterface EditFormDrawerProps {\n target: OntimeView;\n viewOptions: ViewOption[];\n}\n\nexport default memo(ViewParamsEditor);\nfunction ViewParamsEditor({ target, viewOptions }: EditFormDrawerProps) {\n const [_, setSearchParams] = useSearchParams();\n const { data: viewSettings } = useViewSettings();\n const { isOpen, close } = useViewParamsEditorStore();\n const isSmallScreen = useIsSmallScreen();\n\n const handleClose = () => {\n close();\n };\n\n const resetParams = () => {\n setSearchParams();\n };\n\n const onParamsFormSubmit = (formEvent: FormEvent<HTMLFormElement>) => {\n formEvent.preventDefault();\n\n const newParamsObject = Object.fromEntries(new FormData(formEvent.currentTarget));\n const newSearchParams = getURLSearchParamsFromObj(newParamsObject, viewOptions);\n setSearchParams(newSearchParams);\n\n if (isSmallScreen) {\n close();\n }\n };\n\n return (\n <Dialog.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n handleClose();\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Backdrop className={style.backdrop} />\n <Dialog.Popup className={style.drawer}>\n <div className={style.header}>\n <Dialog.Title>Customise</Dialog.Title>\n <IconButton variant='subtle-white' size='large' data-testid='close-view-params' onClick={handleClose}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {viewSettings.overrideStyles && (\n <Info className={style.info}>This view style is being modified by a custom CSS file.</Info>\n )}\n <ViewParamsPresets target={target} />\n <form id='edit-params-form' onSubmit={onParamsFormSubmit} className={style.sectionList}>\n {viewOptions.map((section) => (\n <ViewParamsSection\n key={section.title}\n title={section.title}\n collapsible={section.collapsible}\n options={section.options}\n />\n ))}\n </form>\n </div>\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={resetParams} type='reset'>\n Reset to default\n </Button>\n <Button\n variant='primary'\n size='large'\n form='edit-params-form'\n type='submit'\n data-testid='apply-view-params'\n >\n Apply\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n"],"names":["makeOptionsFromCustomFields","customFields","additionalOptions","filterImageType","options","key","value","Object","entries","type","push","label","makeCustomFieldSelectOptions","colour","makeProjectDataOptions","projectData","generatedOptions","custom","map","entry","index","title","sanitiseColour","startsWith","substring","collectFieldMetadata","paramFields","metadata","defaultValues","colorFields","Set","booleanFields","isPersistedField","persistedValues","forEach","section","option","add","id","values","String","defaultValue","getURLSearchParamsFromObj","paramsObj","newSearchParams","URLSearchParams","addedPairs","addUniqueParam","pair","has","append","length","Array","from","delete","split","v","processedValue","ViewParamsPresets","target","viewPresets","useViewUrlPresets","searchParams","setSearchParams","useSearchParams","handleRecall","preset","newSearch","search","set","alias","style","presetSection","active","get","jsxs","cx","jsx","Button","presetActions","OptionTitle","ClockOptions","TimerOptions","DataSources","ElementVisibility","BehaviourOptions","StyleOverride","Animation","Schedule","Hidden","ensureHex","InlineColourPicker","name","setColour","useState","useEffect","inline","SwatchPicker","ParamInput","paramField","join","defaultOptionValue","empty","ControlledSelect","optionFromParams","getAll","MultiOption","ControlledSwitch","isStringBoolean","placeholder","defaultNumberValue","Input","defaultStringValue","ControlledInput","paramState","setParamState","toggleValue","checked","prev","filter","Fragment","toggleSelect","Checkbox","includes","initialValue","setChecked","Switch","selected","setSelected","Select","inputProps","setValue","event","ViewParamsSection","collapsible","collapsed","setCollapsed","useLocalStorage","handleCollapse","HiddenContents","sectionHeader","IoChevronDown","closed","open","SectionContents","hidden","description","memo","ViewParamsEditor","viewOptions","_","data","viewSettings","useViewSettings","isOpen","close","useViewParamsEditorStore","isSmallScreen","useIsSmallScreen","handleClose","resetParams","onParamsFormSubmit","formEvent","preventDefault","newParamsObject","fromEntries","FormData","currentTarget","Dialog.Root","Dialog.Portal","Dialog.Backdrop","backdrop","Dialog.Popup","drawer","header","Dialog.Title","IconButton","IoClose","body","overrideStyles","Info","info","sectionList","footer"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{O as ie,h as g,P as b}from"./vendor-q6fv0YT2.js";import{j as D,i as h,x as ae,y as oe,z as se,A as de,B as ue,C as ce,D as le,E as fe,F as ye,G as Ee,S as we,H as pe}from"./useRundown-Bn6ZPsz0.js";import{T as _}from"./validateEvent-Do8yE_DJ.js";import{az as o,ba as me,bC as v,s as ge,bg as ve,M as B,bD as R,I as be}from"./index-B81u4hxi.js";import{u as Ie}from"./editorSettings-D2f7e1a6.js";import{p as M}from"./parseUserTime-YeFR8t3F.js";import{s as he}from"./rundownUtils-CtVGQDQn.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},y=new n.Error().stack;y&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[y]="78e4c80f-d98b-41bc-8c9e-c3258dfb6498",n._sentryDebugIdIdentifier="sentry-dbid-78e4c80f-d98b-41bc-8c9e-c3258dfb6498")}catch{}})();function Re(n,y){const c=[];for(let s=0;s<n.length;s++){const E=y[n[s]];E&&(D(E)?(c.push(E.id),c.push(...E.entries),c.push(`end-${E.id}`)):c.push(E.id))}return c}function Fe(n,y,c,s){return n==="end-group"?c==="after":n==="group"?!(c!==void 0&&c==="after"&&!s):y===null}function De(n,y,c){const s=c[n],E=y.indexOf(n),f=y[E-1];if(!f)return"parent"in s&&s.parent!==null?{destinationId:s.parent,order:"before"}:{destinationId:null,order:"before"};if(D(s)){const d=c[f];return"parent"in d&&d.parent!==null?{destinationId:d.parent,order:"before"}:{destinationId:f,order:"before"}}const l=c[f],p=s.parent;return D(l)?p===null?{destinationId:f,order:"insert"}:{destinationId:f,order:"before"}:h(l)&&l.parent!==null&&p===null?{destinationId:f,order:"after"}:{destinationId:f,order:"before"}}function Qe(n,y,c){const s=c[n],E=y.indexOf(n),f=y[E+1];if("parent"in s&&s.parent!==null){const I=c[s.parent];if(D(I)&&I.entries[I.entries.length-1]===n)return{destinationId:s.parent,order:"after"}}if(!f)return{destinationId:null,order:"after"};if(D(s)){if(s.entries.includes(f)){const I=E+s.entries.length+1,Q=y[I];return Q?{destinationId:Q,order:"after"}:{destinationId:null,order:"after"}}return{destinationId:f,order:"after"}}const l=c[f],p=s.parent;return D(l)&&p===null?l.entries.length===0?{destinationId:f,order:"insert"}:{destinationId:l.entries[0],order:"before"}:(h(l)?l.parent:null)!==null&&p===null?{destinationId:f,order:"after"}:{destinationId:f,order:"after"}}function Se(n,y){const c=[];for(const s of y)n.includes(s)&&c.push(s);return c}const Te=()=>{const n=ie(),{linkPrevious:y,defaultTimeStrategy:c,defaultDuration:s,defaultWarnTime:E,defaultDangerTime:f,defaultTimerType:l,defaultEndAction:p}=Ie(),d=g.useCallback(()=>n.getQueryData(o),[n]),I=g.useCallback(r=>{const t=d();if(t!=null&&t.entries)return t.entries[r]},[d]),{mutateAsync:Q}=b({mutationFn:([r,t])=>ae(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>n.invalidateQueries({queryKey:o})}),j=g.useCallback(async(r,t)=>{const e=d(),i=e==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");const a={...r,id:me()};if(h(a)){if(t!=null&&t.lastEventId){const u=e.entries[t==null?void 0:t.lastEventId];h(u)&&(a.timeStart=u.timeEnd)}a.linkStart=(t==null?void 0:t.linkPrevious)??y,a.duration===void 0&&a.timeEnd===void 0&&(a.duration=M(s)),a.timeDanger===void 0&&(a.timeDanger=M(f)),a.timeWarning===void 0&&(a.timeWarning=M(E)),a.timerType===void 0&&(a.timerType=l),a.endAction===void 0&&(a.endAction=p),a.timeStrategy===void 0&&(a.timeStrategy=c)}t!=null&&t.after&&(a.after=t.after),t!=null&&t.before&&(a.before=t.before);try{await Q([i,a])}catch(u){v("Failed adding event",u)}},[d,y,s,f,E,l,p,c,Q]),{mutateAsync:F}=b({mutationFn:([r,t,e])=>oe(r,t,e),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>n.invalidateQueries({queryKey:o})}),H=g.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await F([i,r,t])}catch(i){v("Error cloning entry",i)}},[F,d]),{mutateAsync:q}=b({mutationFn:([r,t])=>se(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o),i=t.id;if(e&&i){const a={...e.entries};a[i]={...a[i],...t},n.setQueryData(o,{id:e.id,title:e.title,order:e.order,flatOrder:e.flatOrder,entries:a,revision:-1})}return{previousData:e,newEvent:t}},onError:(r,t,e)=>{e!=null&&e.previousData&&n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:async()=>{await n.invalidateQueries({queryKey:o})}}),z=g.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await q([e,r])}catch(e){v("Error updating event",e)}},[d,q]),V=g.useCallback(async(r,t,e,i)=>{var k;const a=(k=d())==null?void 0:k.id;if(!a)throw new Error("Rundown not initialised");if(!i&&e==="")return;const u={id:r};i?t==="timeEnd"?(u.timeStrategy=e===""?_.LockDuration:_.LockEnd,u.timeEnd=e===""?void 0:w()):t==="duration"?(u.timeStrategy=e===""?_.LockEnd:_.LockDuration,u.duration=e===""?void 0:w()):t==="timeStart"&&(u.linkStart=e==="",u.timeStart=e===""?void 0:w()):u[t]=w();try{await q([a,u])}catch(m){v("Error updating event",m)}function w(){let m=0;if(e==="p"||e==="prev"||e==="previous")m=S();else if(e.startsWith("+")||e.startsWith("p+")||e.startsWith("p +")){const A=e.substring(1);m=S()+M(A)}else m=M(e);return Math.min(m,ge-ve)}function S(){const m=n.getQueryData(o);if(!(m!=null&&m.order)||!(m!=null&&m.entries))return 0;const A=m.order.indexOf(r);if(A===0)return 0;let $=0;for(let K=A-1;K>=0;K--){const N=m.entries[m.order[K]];if(h(N)){$=N.timeEnd;break}}return $}},[d,q,n]),{mutateAsync:T}=b({mutationFn:([r,t])=>de(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o);if(e){const i=new Set(t.ids),a={...e.entries};i.forEach(u=>{if(Object.hasOwn(a,u)){const w=a[u];h(w)&&(a[u]={...w,...t})}}),n.setQueryData(o,{id:e.id,title:e.title,order:e.order,flatOrder:e.flatOrder,entries:a,revision:-1})}return{previousRundown:e}},onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousRundown)}}),J=g.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await T([i,{data:r,ids:t}])}catch(i){v("Error updating events",i)}},[T,d]),{mutateAsync:L}=b({mutationFn:([r,t])=>ue(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o);if(e){const{entries:i,order:a,flatOrder:u}=Me(t,e);n.setQueryData(o,{id:e.id,title:e.title,order:a,flatOrder:u,entries:i,revision:-1})}return{previousData:e}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),X=g.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await L([e,r])}catch(e){v("Error deleting event",e)}},[L,d]),{mutateAsync:P}=b({mutationFn:([r])=>ce(r),onMutate:async()=>{await n.cancelQueries({queryKey:o});const r=n.getQueryData(o);return n.setQueryData(o,{id:(r==null?void 0:r.id)??"default",title:(r==null?void 0:r.title)??"",order:[],flatOrder:[],entries:{},revision:-1}),{previousData:r}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),Y=g.useCallback(async()=>{var r;try{const t=(r=d())==null?void 0:r.id;if(!t)throw new Error("Rundown not initialised");await P([t])}catch(t){v("Error deleting events",t)}},[P,d]),{mutateAsync:G}=b({mutationFn:([r,t])=>le(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),Z=g.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await G([e,r])}catch(e){v("Error applying delay",e)}},[G,d]),{mutateAsync:U}=b({mutationFn:([r,t])=>fe(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>n.invalidateQueries({queryKey:o})}),x=g.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await U([e,r])}catch(e){v("Error dissolving group",e)}},[d,U]),{mutateAsync:C}=b({mutationFn:([r,t])=>ye(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>n.invalidateQueries({queryKey:o})}),ee=g.useCallback(async r=>{if(r.length!==0)try{const t=d(),e=t==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");if(r.length===1)await C([e,r]);else{const i=Se(r,t.flatOrder);await C([e,i])}}catch(t){v("Error grouping entries",t)}},[d,C]),{mutateAsync:O}=b({mutationFn:([r,t])=>Ee(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>{n.invalidateQueries({queryKey:o})}}),te=g.useCallback(async(r,t)=>{var e;try{const i=d(),a=i==null?void 0:i.id;if(!a)throw new Error("Rundown not initialised");const{destinationId:u,order:w}=t==="up"?De(r,i.flatOrder,i.entries):Qe(r,i.flatOrder,i.entries);return u?(await O([a,{entryId:r,destinationId:u,order:w}]),((e=i.entries[u])==null?void 0:e.type)===we.Group?u:void 0):void 0}catch(i){v("Error re-ordering event",i)}},[d,O]),re=g.useCallback(async(r,t,e)=>{var i;try{const a=(i=d())==null?void 0:i.id;if(!a)throw new Error("Rundown not initialised");await O([a,{entryId:r,destinationId:t,order:e}])}catch(a){throw v("Error re-ordering event",a),a}},[d,O]),{mutateAsync:W}=b({mutationFn:([r,t,e])=>pe(r,t,e),onMutate:async([r,t,e])=>{await n.cancelQueries({queryKey:o});const i=n.getQueryData(o);if(i){const a={...i.entries},u=i.entries[t],w=i.entries[e];if(!h(u)||!h(w))return;const[S,k]=he(u,w);a[t]=S,a[e]=k,n.setQueryData(o,{id:i.id,title:i.title,order:i.order,flatOrder:i.flatOrder,entries:a,revision:-1})}return{previousData:i}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),ne=g.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await W([i,r,t])}catch(i){v("Error re-ordering event",i)}},[d,W]);return{addEntry:j,applyDelay:Z,batchUpdateEvents:J,clone:H,deleteEntry:X,deleteAllEntries:Y,ungroup:x,getEntryById:I,groupEntries:ee,move:te,reorderEntry:re,swapEvents:ne,updateEntry:z,updateTimer:V}};function Me(n,y){const c={...y.entries};let s=[...y.order],E=[...y.flatOrder];for(let l=0;l<n.length;l++){const p=c[n[l]];f(p)}function f(l){if(D(l)||!l.parent)s=s.filter(p=>p!==l.id);else{const p=c[l.parent];p&&D(p)&&(p.entries=p.entries.filter(d=>d!==l.id))}delete c[l.id],E=E.filter(p=>p!==l.id)}return{entries:c,order:s,flatOrder:E}}function Le(n,y="compact"){if(n==null||n===0)return"";const c=n<0,s=Math.abs(n),E=y==="compact",f=E?"+":"delayed by ",l=E?"-":"ahead by ";return s<B?`${c?l:f}${R(s,"s")} sec`:s<be&&s%B===0?`${c?l:f}${R(s,"m")} min`:`${c?l:f}${R(s,"HH:mm:ss")}`}export{Re as a,Fe as c,Le as m,Te as u};
2
- //# sourceMappingURL=dateConfig-D7xim1t4.js.map
1
+ import{O as ie,h as g,P as b}from"./vendor-DmGkEtRj.js";import{j as D,i as h,x as ae,y as oe,z as se,A as de,B as ue,C as ce,D as le,E as fe,F as ye,G as Ee,S as we,H as pe}from"./useRundown-BGhL8DEI.js";import{T as _}from"./validateEvent-jVIMKhmx.js";import{az as o,ba as me,bC as v,s as ge,bg as ve,M as B,bD as R,I as be}from"./index-B1K7rED_.js";import{u as Ie}from"./editorSettings-CRJwIW7V.js";import{p as M}from"./parseUserTime-0pNWLcr0.js";import{s as he}from"./rundownUtils-D1oJpMdx.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},y=new n.Error().stack;y&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[y]="78e4c80f-d98b-41bc-8c9e-c3258dfb6498",n._sentryDebugIdIdentifier="sentry-dbid-78e4c80f-d98b-41bc-8c9e-c3258dfb6498")}catch{}})();function Re(n,y){const c=[];for(let s=0;s<n.length;s++){const E=y[n[s]];E&&(D(E)?(c.push(E.id),c.push(...E.entries),c.push(`end-${E.id}`)):c.push(E.id))}return c}function Fe(n,y,c,s){return n==="end-group"?c==="after":n==="group"?!(c!==void 0&&c==="after"&&!s):y===null}function De(n,y,c){const s=c[n],E=y.indexOf(n),f=y[E-1];if(!f)return"parent"in s&&s.parent!==null?{destinationId:s.parent,order:"before"}:{destinationId:null,order:"before"};if(D(s)){const d=c[f];return"parent"in d&&d.parent!==null?{destinationId:d.parent,order:"before"}:{destinationId:f,order:"before"}}const l=c[f],p=s.parent;return D(l)?p===null?{destinationId:f,order:"insert"}:{destinationId:f,order:"before"}:h(l)&&l.parent!==null&&p===null?{destinationId:f,order:"after"}:{destinationId:f,order:"before"}}function Qe(n,y,c){const s=c[n],E=y.indexOf(n),f=y[E+1];if("parent"in s&&s.parent!==null){const I=c[s.parent];if(D(I)&&I.entries[I.entries.length-1]===n)return{destinationId:s.parent,order:"after"}}if(!f)return{destinationId:null,order:"after"};if(D(s)){if(s.entries.includes(f)){const I=E+s.entries.length+1,Q=y[I];return Q?{destinationId:Q,order:"after"}:{destinationId:null,order:"after"}}return{destinationId:f,order:"after"}}const l=c[f],p=s.parent;return D(l)&&p===null?l.entries.length===0?{destinationId:f,order:"insert"}:{destinationId:l.entries[0],order:"before"}:(h(l)?l.parent:null)!==null&&p===null?{destinationId:f,order:"after"}:{destinationId:f,order:"after"}}function Se(n,y){const c=[];for(const s of y)n.includes(s)&&c.push(s);return c}const Te=()=>{const n=ie(),{linkPrevious:y,defaultTimeStrategy:c,defaultDuration:s,defaultWarnTime:E,defaultDangerTime:f,defaultTimerType:l,defaultEndAction:p}=Ie(),d=g.useCallback(()=>n.getQueryData(o),[n]),I=g.useCallback(r=>{const t=d();if(t!=null&&t.entries)return t.entries[r]},[d]),{mutateAsync:Q}=b({mutationFn:([r,t])=>ae(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>n.invalidateQueries({queryKey:o})}),j=g.useCallback(async(r,t)=>{const e=d(),i=e==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");const a={...r,id:me()};if(h(a)){if(t!=null&&t.lastEventId){const u=e.entries[t==null?void 0:t.lastEventId];h(u)&&(a.timeStart=u.timeEnd)}a.linkStart=(t==null?void 0:t.linkPrevious)??y,a.duration===void 0&&a.timeEnd===void 0&&(a.duration=M(s)),a.timeDanger===void 0&&(a.timeDanger=M(f)),a.timeWarning===void 0&&(a.timeWarning=M(E)),a.timerType===void 0&&(a.timerType=l),a.endAction===void 0&&(a.endAction=p),a.timeStrategy===void 0&&(a.timeStrategy=c)}t!=null&&t.after&&(a.after=t.after),t!=null&&t.before&&(a.before=t.before);try{await Q([i,a])}catch(u){v("Failed adding event",u)}},[d,y,s,f,E,l,p,c,Q]),{mutateAsync:F}=b({mutationFn:([r,t,e])=>oe(r,t,e),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>n.invalidateQueries({queryKey:o})}),H=g.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await F([i,r,t])}catch(i){v("Error cloning entry",i)}},[F,d]),{mutateAsync:q}=b({mutationFn:([r,t])=>se(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o),i=t.id;if(e&&i){const a={...e.entries};a[i]={...a[i],...t},n.setQueryData(o,{id:e.id,title:e.title,order:e.order,flatOrder:e.flatOrder,entries:a,revision:-1})}return{previousData:e,newEvent:t}},onError:(r,t,e)=>{e!=null&&e.previousData&&n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:async()=>{await n.invalidateQueries({queryKey:o})}}),z=g.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await q([e,r])}catch(e){v("Error updating event",e)}},[d,q]),V=g.useCallback(async(r,t,e,i)=>{var k;const a=(k=d())==null?void 0:k.id;if(!a)throw new Error("Rundown not initialised");if(!i&&e==="")return;const u={id:r};i?t==="timeEnd"?(u.timeStrategy=e===""?_.LockDuration:_.LockEnd,u.timeEnd=e===""?void 0:w()):t==="duration"?(u.timeStrategy=e===""?_.LockEnd:_.LockDuration,u.duration=e===""?void 0:w()):t==="timeStart"&&(u.linkStart=e==="",u.timeStart=e===""?void 0:w()):u[t]=w();try{await q([a,u])}catch(m){v("Error updating event",m)}function w(){let m=0;if(e==="p"||e==="prev"||e==="previous")m=S();else if(e.startsWith("+")||e.startsWith("p+")||e.startsWith("p +")){const A=e.substring(1);m=S()+M(A)}else m=M(e);return Math.min(m,ge-ve)}function S(){const m=n.getQueryData(o);if(!(m!=null&&m.order)||!(m!=null&&m.entries))return 0;const A=m.order.indexOf(r);if(A===0)return 0;let $=0;for(let K=A-1;K>=0;K--){const N=m.entries[m.order[K]];if(h(N)){$=N.timeEnd;break}}return $}},[d,q,n]),{mutateAsync:T}=b({mutationFn:([r,t])=>de(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o);if(e){const i=new Set(t.ids),a={...e.entries};i.forEach(u=>{if(Object.hasOwn(a,u)){const w=a[u];h(w)&&(a[u]={...w,...t})}}),n.setQueryData(o,{id:e.id,title:e.title,order:e.order,flatOrder:e.flatOrder,entries:a,revision:-1})}return{previousRundown:e}},onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousRundown)}}),J=g.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await T([i,{data:r,ids:t}])}catch(i){v("Error updating events",i)}},[T,d]),{mutateAsync:L}=b({mutationFn:([r,t])=>ue(r,t),onMutate:async([r,t])=>{await n.cancelQueries({queryKey:o});const e=n.getQueryData(o);if(e){const{entries:i,order:a,flatOrder:u}=Me(t,e);n.setQueryData(o,{id:e.id,title:e.title,order:a,flatOrder:u,entries:i,revision:-1})}return{previousData:e}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),X=g.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await L([e,r])}catch(e){v("Error deleting event",e)}},[L,d]),{mutateAsync:P}=b({mutationFn:([r])=>ce(r),onMutate:async()=>{await n.cancelQueries({queryKey:o});const r=n.getQueryData(o);return n.setQueryData(o,{id:(r==null?void 0:r.id)??"default",title:(r==null?void 0:r.title)??"",order:[],flatOrder:[],entries:{},revision:-1}),{previousData:r}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),Y=g.useCallback(async()=>{var r;try{const t=(r=d())==null?void 0:r.id;if(!t)throw new Error("Rundown not initialised");await P([t])}catch(t){v("Error deleting events",t)}},[P,d]),{mutateAsync:G}=b({mutationFn:([r,t])=>le(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),Z=g.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await G([e,r])}catch(e){v("Error applying delay",e)}},[G,d]),{mutateAsync:U}=b({mutationFn:([r,t])=>fe(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>n.invalidateQueries({queryKey:o})}),x=g.useCallback(async r=>{var t;try{const e=(t=d())==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");await U([e,r])}catch(e){v("Error dissolving group",e)}},[d,U]),{mutateAsync:C}=b({mutationFn:([r,t])=>ye(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSuccess:r=>{if(!r.data)return;const{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w}=r.data;n.setQueryData(o,{id:t,title:e,order:i,flatOrder:a,entries:u,revision:w})},onSettled:()=>n.invalidateQueries({queryKey:o})}),ee=g.useCallback(async r=>{if(r.length!==0)try{const t=d(),e=t==null?void 0:t.id;if(!e)throw new Error("Rundown not initialised");if(r.length===1)await C([e,r]);else{const i=Se(r,t.flatOrder);await C([e,i])}}catch(t){v("Error grouping entries",t)}},[d,C]),{mutateAsync:O}=b({mutationFn:([r,t])=>Ee(r,t),onMutate:()=>n.cancelQueries({queryKey:o}),onSettled:()=>{n.invalidateQueries({queryKey:o})}}),te=g.useCallback(async(r,t)=>{var e;try{const i=d(),a=i==null?void 0:i.id;if(!a)throw new Error("Rundown not initialised");const{destinationId:u,order:w}=t==="up"?De(r,i.flatOrder,i.entries):Qe(r,i.flatOrder,i.entries);return u?(await O([a,{entryId:r,destinationId:u,order:w}]),((e=i.entries[u])==null?void 0:e.type)===we.Group?u:void 0):void 0}catch(i){v("Error re-ordering event",i)}},[d,O]),re=g.useCallback(async(r,t,e)=>{var i;try{const a=(i=d())==null?void 0:i.id;if(!a)throw new Error("Rundown not initialised");await O([a,{entryId:r,destinationId:t,order:e}])}catch(a){throw v("Error re-ordering event",a),a}},[d,O]),{mutateAsync:W}=b({mutationFn:([r,t,e])=>pe(r,t,e),onMutate:async([r,t,e])=>{await n.cancelQueries({queryKey:o});const i=n.getQueryData(o);if(i){const a={...i.entries},u=i.entries[t],w=i.entries[e];if(!h(u)||!h(w))return;const[S,k]=he(u,w);a[t]=S,a[e]=k,n.setQueryData(o,{id:i.id,title:i.title,order:i.order,flatOrder:i.flatOrder,entries:a,revision:-1})}return{previousData:i}},onError:(r,t,e)=>{n.setQueryData(o,e==null?void 0:e.previousData)},onSettled:()=>{n.invalidateQueries({queryKey:o})}}),ne=g.useCallback(async(r,t)=>{var e;try{const i=(e=d())==null?void 0:e.id;if(!i)throw new Error("Rundown not initialised");await W([i,r,t])}catch(i){v("Error re-ordering event",i)}},[d,W]);return{addEntry:j,applyDelay:Z,batchUpdateEvents:J,clone:H,deleteEntry:X,deleteAllEntries:Y,ungroup:x,getEntryById:I,groupEntries:ee,move:te,reorderEntry:re,swapEvents:ne,updateEntry:z,updateTimer:V}};function Me(n,y){const c={...y.entries};let s=[...y.order],E=[...y.flatOrder];for(let l=0;l<n.length;l++){const p=c[n[l]];f(p)}function f(l){if(D(l)||!l.parent)s=s.filter(p=>p!==l.id);else{const p=c[l.parent];p&&D(p)&&(p.entries=p.entries.filter(d=>d!==l.id))}delete c[l.id],E=E.filter(p=>p!==l.id)}return{entries:c,order:s,flatOrder:E}}function Le(n,y="compact"){if(n==null||n===0)return"";const c=n<0,s=Math.abs(n),E=y==="compact",f=E?"+":"delayed by ",l=E?"-":"ahead by ";return s<B?`${c?l:f}${R(s,"s")} sec`:s<be&&s%B===0?`${c?l:f}${R(s,"m")} min`:`${c?l:f}${R(s,"HH:mm:ss")}`}export{Re as a,Fe as c,Le as m,Te as u};
2
+ //# sourceMappingURL=dateConfig-Crm-Cu2y.js.map