@getontime/cli 4.0.0-beta.5 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/client/assets/Backstage-ZSqb8OU6.js +2 -0
  2. package/client/assets/Backstage-ZSqb8OU6.js.br +0 -0
  3. package/client/assets/Backstage-ZSqb8OU6.js.gz +0 -0
  4. package/client/assets/Backstage-ZSqb8OU6.js.map +1 -0
  5. package/client/assets/Countdown-DVRZbeRP.js +2 -0
  6. package/client/assets/Countdown-DVRZbeRP.js.br +0 -0
  7. package/client/assets/Countdown-DVRZbeRP.js.gz +0 -0
  8. package/client/assets/{Countdown-BaaR4j9x.js.map → Countdown-DVRZbeRP.js.map} +1 -1
  9. package/client/assets/CustomTranslationModal-D_Cy0d_H.js +2 -0
  10. package/client/assets/CustomTranslationModal-D_Cy0d_H.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-D_Cy0d_H.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-CcNNjbmZ.js.map → CustomTranslationModal-D_Cy0d_H.js.map} +1 -1
  13. package/client/assets/{DelayIndicator-DXDACqpc.js → DelayIndicator-B_JKLKYW.js} +2 -2
  14. package/client/assets/DelayIndicator-B_JKLKYW.js.br +0 -0
  15. package/client/assets/DelayIndicator-B_JKLKYW.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-DXDACqpc.js.map → DelayIndicator-B_JKLKYW.js.map} +1 -1
  17. package/client/assets/{EditorFeatureWrapper-CX6wzTmM.js → EditorFeatureWrapper-DzBxDvRn.js} +2 -2
  18. package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-CX6wzTmM.js.map → EditorFeatureWrapper-DzBxDvRn.js.map} +1 -1
  21. package/client/assets/{EditorUtils-DxjFOwpn.js → EditorUtils-De0umjb-.js} +2 -2
  22. package/client/assets/EditorUtils-De0umjb-.js.br +0 -0
  23. package/client/assets/EditorUtils-De0umjb-.js.gz +0 -0
  24. package/client/assets/{EditorUtils-DxjFOwpn.js.map → EditorUtils-De0umjb-.js.map} +1 -1
  25. package/client/assets/{Empty-DiBXyIA8.js → Empty-BYF0tVRk.js} +2 -2
  26. package/client/assets/Empty-BYF0tVRk.js.br +2 -0
  27. package/client/assets/Empty-BYF0tVRk.js.gz +0 -0
  28. package/client/assets/{Empty-DiBXyIA8.js.map → Empty-BYF0tVRk.js.map} +1 -1
  29. package/client/assets/{EmptyPage-X6EO1Y5W.js → EmptyPage-DYH2bswA.js} +2 -2
  30. package/client/assets/EmptyPage-DYH2bswA.js.br +0 -0
  31. package/client/assets/EmptyPage-DYH2bswA.js.gz +0 -0
  32. package/client/assets/{EmptyPage-X6EO1Y5W.js.map → EmptyPage-DYH2bswA.js.map} +1 -1
  33. package/client/assets/{FollowButton-Cr-HA2-6.js → FollowButton-DyWsvyFF.js} +2 -2
  34. package/client/assets/FollowButton-DyWsvyFF.js.br +0 -0
  35. package/client/assets/FollowButton-DyWsvyFF.js.gz +0 -0
  36. package/client/assets/{FollowButton-Cr-HA2-6.js.map → FollowButton-DyWsvyFF.js.map} +1 -1
  37. package/client/assets/{MessageControlExport-VUkIayAJ.js → MessageControlExport-yLGU2dMq.js} +2 -2
  38. package/client/assets/MessageControlExport-yLGU2dMq.js.br +0 -0
  39. package/client/assets/MessageControlExport-yLGU2dMq.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-VUkIayAJ.js.map → MessageControlExport-yLGU2dMq.js.map} +1 -1
  41. package/client/assets/MilestoneEditor-GkzJ-h1C.js +2 -0
  42. package/client/assets/MilestoneEditor-GkzJ-h1C.js.br +0 -0
  43. package/client/assets/MilestoneEditor-GkzJ-h1C.js.gz +0 -0
  44. package/client/assets/{MilestoneEditor-Da8oxrHI.js.map → MilestoneEditor-GkzJ-h1C.js.map} +1 -1
  45. package/client/assets/Modal-BKL-5GzU.js +2 -0
  46. package/client/assets/Modal-BKL-5GzU.js.br +0 -0
  47. package/client/assets/Modal-BKL-5GzU.js.gz +0 -0
  48. package/client/assets/Modal-BKL-5GzU.js.map +1 -0
  49. package/client/assets/Modal-BgJx3SNK.css +1 -0
  50. package/client/assets/Modal-BgJx3SNK.css.br +0 -0
  51. package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
  52. package/client/assets/{MultiPartProgressBar-mGPuP1Wd.js → MultiPartProgressBar-BITERKS0.js} +2 -2
  53. package/client/assets/MultiPartProgressBar-BITERKS0.js.br +0 -0
  54. package/client/assets/MultiPartProgressBar-BITERKS0.js.gz +0 -0
  55. package/client/assets/{MultiPartProgressBar-mGPuP1Wd.js.map → MultiPartProgressBar-BITERKS0.js.map} +1 -1
  56. package/client/assets/OperatorExport-DMZ6eQfT.js +2 -0
  57. package/client/assets/OperatorExport-DMZ6eQfT.js.br +0 -0
  58. package/client/assets/OperatorExport-DMZ6eQfT.js.gz +0 -0
  59. package/client/assets/OperatorExport-DMZ6eQfT.js.map +1 -0
  60. package/client/assets/{OverviewWrapper-BMuW_wiO.js → OverviewWrapper-riM6vPno.js} +2 -2
  61. package/client/assets/OverviewWrapper-riM6vPno.js.br +0 -0
  62. package/client/assets/OverviewWrapper-riM6vPno.js.gz +0 -0
  63. package/client/assets/{OverviewWrapper-BMuW_wiO.js.map → OverviewWrapper-riM6vPno.js.map} +1 -1
  64. package/client/assets/{ProjectInfo-BYi1lzPk.js → ProjectInfo-DxtMq70a.js} +2 -2
  65. package/client/assets/ProjectInfo-DxtMq70a.js.br +0 -0
  66. package/client/assets/ProjectInfo-DxtMq70a.js.gz +0 -0
  67. package/client/assets/{ProjectInfo-BYi1lzPk.js.map → ProjectInfo-DxtMq70a.js.map} +1 -1
  68. package/client/assets/{ProtectRoute-DnUCrlh6.js → ProtectRoute-p1fmtLeu.js} +2 -2
  69. package/client/assets/ProtectRoute-p1fmtLeu.js.br +0 -0
  70. package/client/assets/ProtectRoute-p1fmtLeu.js.gz +0 -0
  71. package/client/assets/{ProtectRoute-DnUCrlh6.js.map → ProtectRoute-p1fmtLeu.js.map} +1 -1
  72. package/client/assets/ProtectedCuesheet-CvRnqT0z.js +2 -0
  73. package/client/assets/ProtectedCuesheet-CvRnqT0z.js.br +0 -0
  74. package/client/assets/ProtectedCuesheet-CvRnqT0z.js.gz +0 -0
  75. package/client/assets/ProtectedCuesheet-CvRnqT0z.js.map +1 -0
  76. package/client/assets/ProtectedEditor-BoiAT_IR.css +1 -0
  77. package/client/assets/ProtectedEditor-BoiAT_IR.css.br +0 -0
  78. package/client/assets/ProtectedEditor-BoiAT_IR.css.gz +0 -0
  79. package/client/assets/ProtectedEditor-D4UXj1xL.js +3 -0
  80. package/client/assets/ProtectedEditor-D4UXj1xL.js.br +0 -0
  81. package/client/assets/ProtectedEditor-D4UXj1xL.js.gz +0 -0
  82. package/client/assets/ProtectedEditor-D4UXj1xL.js.map +1 -0
  83. package/client/assets/RundownEntry-B1dSz1wu.js +2 -0
  84. package/client/assets/RundownEntry-B1dSz1wu.js.br +0 -0
  85. package/client/assets/RundownEntry-B1dSz1wu.js.gz +0 -0
  86. package/client/assets/{RundownEntry-Dl4Cb_pZ.js.map → RundownEntry-B1dSz1wu.js.map} +1 -1
  87. package/client/assets/RundownExport-WjLpncYT.js +3 -0
  88. package/client/assets/RundownExport-WjLpncYT.js.br +0 -0
  89. package/client/assets/RundownExport-WjLpncYT.js.gz +0 -0
  90. package/client/assets/{RundownExport-BPDLhvsM.js.map → RundownExport-WjLpncYT.js.map} +1 -1
  91. package/client/assets/{Select-CUjlJirY.js → Select-niU9Razm.js} +2 -2
  92. package/client/assets/Select-niU9Razm.js.br +0 -0
  93. package/client/assets/Select-niU9Razm.js.gz +0 -0
  94. package/client/assets/{Select-CUjlJirY.js.map → Select-niU9Razm.js.map} +1 -1
  95. package/client/assets/Studio-CWdJq4bx.js +2 -0
  96. package/client/assets/Studio-CWdJq4bx.js.br +0 -0
  97. package/client/assets/Studio-CWdJq4bx.js.gz +0 -0
  98. package/client/assets/{Studio-BLCIas53.js.map → Studio-CWdJq4bx.js.map} +1 -1
  99. package/client/assets/{StyleEditor-DTNiR-0P.js → StyleEditor-BIFjHsgD.js} +2 -2
  100. package/client/assets/StyleEditor-BIFjHsgD.js.br +0 -0
  101. package/client/assets/StyleEditor-BIFjHsgD.js.gz +0 -0
  102. package/client/assets/{StyleEditor-DTNiR-0P.js.map → StyleEditor-BIFjHsgD.js.map} +1 -1
  103. package/client/assets/SuperscriptTime-DCTyUARx.js +2 -0
  104. package/client/assets/SuperscriptTime-DCTyUARx.js.br +0 -0
  105. package/client/assets/SuperscriptTime-DCTyUARx.js.gz +0 -0
  106. package/client/assets/SuperscriptTime-DCTyUARx.js.map +1 -0
  107. package/client/assets/TimeElements-DBVGVx71.js +2 -0
  108. package/client/assets/TimeElements-DBVGVx71.js.br +0 -0
  109. package/client/assets/TimeElements-DBVGVx71.js.gz +0 -0
  110. package/client/assets/{TimeElements-rlwX9Mgy.js.map → TimeElements-DBVGVx71.js.map} +1 -1
  111. package/client/assets/{TimeInput-C0_Nl63x.js → TimeInput-wQ67FbW6.js} +2 -2
  112. package/client/assets/TimeInput-wQ67FbW6.js.br +0 -0
  113. package/client/assets/TimeInput-wQ67FbW6.js.gz +0 -0
  114. package/client/assets/{TimeInput-C0_Nl63x.js.map → TimeInput-wQ67FbW6.js.map} +1 -1
  115. package/client/assets/TimelinePage-DZefE2vQ.js +2 -0
  116. package/client/assets/TimelinePage-DZefE2vQ.js.br +0 -0
  117. package/client/assets/TimelinePage-DZefE2vQ.js.gz +0 -0
  118. package/client/assets/{TimelinePage-BC-pnISF.js.map → TimelinePage-DZefE2vQ.js.map} +1 -1
  119. package/client/assets/Timer-Bs450x86.js +2 -0
  120. package/client/assets/Timer-Bs450x86.js.br +0 -0
  121. package/client/assets/Timer-Bs450x86.js.gz +0 -0
  122. package/client/assets/Timer-Bs450x86.js.map +1 -0
  123. package/client/assets/{TimerControlExport-C_Jbwxog.js → TimerControlExport-C1C_vBX4.js} +2 -2
  124. package/client/assets/TimerControlExport-C1C_vBX4.js.br +0 -0
  125. package/client/assets/TimerControlExport-C1C_vBX4.js.gz +0 -0
  126. package/client/assets/{TimerControlExport-C_Jbwxog.js.map → TimerControlExport-C1C_vBX4.js.map} +1 -1
  127. package/client/assets/{TitleCard-C-Tw72nZ.js → TitleCard-B4N-kCM3.js} +2 -2
  128. package/client/assets/TitleCard-B4N-kCM3.js.br +0 -0
  129. package/client/assets/TitleCard-B4N-kCM3.js.gz +0 -0
  130. package/client/assets/{TitleCard-C-Tw72nZ.js.map → TitleCard-B4N-kCM3.js.map} +1 -1
  131. package/client/assets/{Tooltip-BZrLdTBU.js → Tooltip-DJ8Y4CO4.js} +2 -2
  132. package/client/assets/Tooltip-DJ8Y4CO4.js.br +0 -0
  133. package/client/assets/Tooltip-DJ8Y4CO4.js.gz +0 -0
  134. package/client/assets/{Tooltip-BZrLdTBU.js.map → Tooltip-DJ8Y4CO4.js.map} +1 -1
  135. package/client/assets/{ViewLogo-CdsW41HC.js → ViewLogo-Dd60EREE.js} +2 -2
  136. package/client/assets/ViewLogo-Dd60EREE.js.br +0 -0
  137. package/client/assets/ViewLogo-Dd60EREE.js.gz +0 -0
  138. package/client/assets/{ViewLogo-CdsW41HC.js.map → ViewLogo-Dd60EREE.js.map} +1 -1
  139. package/client/assets/{ViewParamsEditor-kNKEOAwm.css → ViewParamsEditor-1Ok39npF.css} +1 -1
  140. package/client/assets/ViewParamsEditor-1Ok39npF.css.br +0 -0
  141. package/client/assets/ViewParamsEditor-1Ok39npF.css.gz +0 -0
  142. package/client/assets/{ViewParamsEditor-YoYxps2g.js → ViewParamsEditor-BWEYbq_S.js} +2 -2
  143. package/client/assets/ViewParamsEditor-BWEYbq_S.js.br +0 -0
  144. package/client/assets/ViewParamsEditor-BWEYbq_S.js.gz +0 -0
  145. package/client/assets/{ViewParamsEditor-YoYxps2g.js.map → ViewParamsEditor-BWEYbq_S.js.map} +1 -1
  146. package/client/assets/{dateConfig-CqC6Ta_8.js → dateConfig-8rhb0Dbh.js} +2 -2
  147. package/client/assets/dateConfig-8rhb0Dbh.js.br +0 -0
  148. package/client/assets/dateConfig-8rhb0Dbh.js.gz +0 -0
  149. package/client/assets/{dateConfig-CqC6Ta_8.js.map → dateConfig-8rhb0Dbh.js.map} +1 -1
  150. package/client/assets/{editorSettings-CL1TjKzU.js → editorSettings-LMnfWux6.js} +2 -2
  151. package/client/assets/editorSettings-LMnfWux6.js.br +0 -0
  152. package/client/assets/editorSettings-LMnfWux6.js.gz +0 -0
  153. package/client/assets/{editorSettings-CL1TjKzU.js.map → editorSettings-LMnfWux6.js.map} +1 -1
  154. package/client/assets/{getProgress-Dh-Yy44B.js → getProgress-CyJTu6f5.js} +2 -2
  155. package/client/assets/getProgress-CyJTu6f5.js.br +0 -0
  156. package/client/assets/getProgress-CyJTu6f5.js.gz +0 -0
  157. package/client/assets/{getProgress-Dh-Yy44B.js.map → getProgress-CyJTu6f5.js.map} +1 -1
  158. package/client/assets/index-5QAOtSTh.js +3 -0
  159. package/client/assets/index-5QAOtSTh.js.br +0 -0
  160. package/client/assets/index-5QAOtSTh.js.gz +0 -0
  161. package/client/assets/index-5QAOtSTh.js.map +1 -0
  162. package/client/assets/{index-pvMSlFrO.css → index-De0uf0Ta.css} +1 -1
  163. package/client/assets/index-De0uf0Ta.css.br +0 -0
  164. package/client/assets/index-De0uf0Ta.css.gz +0 -0
  165. package/client/assets/{offset-BnfjZ6JI.js → offset-CLDSqOP5.js} +2 -2
  166. package/client/assets/offset-CLDSqOP5.js.br +0 -0
  167. package/client/assets/offset-CLDSqOP5.js.gz +0 -0
  168. package/client/assets/{offset-BnfjZ6JI.js.map → offset-CLDSqOP5.js.map} +1 -1
  169. package/client/assets/{parseUserTime-DNXIMX9s.js → parseUserTime-CCDHpp7D.js} +2 -2
  170. package/client/assets/parseUserTime-CCDHpp7D.js.br +0 -0
  171. package/client/assets/parseUserTime-CCDHpp7D.js.gz +0 -0
  172. package/client/assets/{parseUserTime-DNXIMX9s.js.map → parseUserTime-CCDHpp7D.js.map} +1 -1
  173. package/client/assets/{playbackstate-DzSEaiNW.js → playbackstate-6lBh6omZ.js} +2 -2
  174. package/client/assets/playbackstate-6lBh6omZ.js.br +0 -0
  175. package/client/assets/playbackstate-6lBh6omZ.js.gz +0 -0
  176. package/client/assets/{playbackstate-DzSEaiNW.js.map → playbackstate-6lBh6omZ.js.map} +1 -1
  177. package/client/assets/{presentation.utils-BfcniGcl.js → presentation.utils-BUIuV_2e.js} +2 -2
  178. package/client/assets/presentation.utils-BUIuV_2e.js.br +0 -0
  179. package/client/assets/presentation.utils-BUIuV_2e.js.gz +0 -0
  180. package/client/assets/{presentation.utils-BfcniGcl.js.map → presentation.utils-BUIuV_2e.js.map} +1 -1
  181. package/client/assets/{rundownUtils-CPBsEZ2m.js → rundownUtils-Cnd2prRX.js} +2 -2
  182. package/client/assets/rundownUtils-Cnd2prRX.js.br +0 -0
  183. package/client/assets/rundownUtils-Cnd2prRX.js.gz +0 -0
  184. package/client/assets/{rundownUtils-CPBsEZ2m.js.map → rundownUtils-Cnd2prRX.js.map} +1 -1
  185. package/client/assets/{useCustomFields-DY13Ir96.js → useCustomFields-BuxKsqGS.js} +2 -2
  186. package/client/assets/useCustomFields-BuxKsqGS.js.br +0 -0
  187. package/client/assets/useCustomFields-BuxKsqGS.js.gz +0 -0
  188. package/client/assets/{useCustomFields-DY13Ir96.js.map → useCustomFields-BuxKsqGS.js.map} +1 -1
  189. package/client/assets/{useFollowComponent-C42-1XCu.js → useFollowComponent-iGQv4zoS.js} +2 -2
  190. package/client/assets/useFollowComponent-iGQv4zoS.js.br +0 -0
  191. package/client/assets/useFollowComponent-iGQv4zoS.js.gz +0 -0
  192. package/client/assets/{useFollowComponent-C42-1XCu.js.map → useFollowComponent-iGQv4zoS.js.map} +1 -1
  193. package/client/assets/{useProjectData-BF2F6qPB.js → useProjectData-CetvEK9E.js} +2 -2
  194. package/client/assets/useProjectData-CetvEK9E.js.br +0 -0
  195. package/client/assets/useProjectData-CetvEK9E.js.gz +0 -0
  196. package/client/assets/{useProjectData-BF2F6qPB.js.map → useProjectData-CetvEK9E.js.map} +1 -1
  197. package/client/assets/useReport-PEFRsOhF.js +2 -0
  198. package/client/assets/useReport-PEFRsOhF.js.br +0 -0
  199. package/client/assets/useReport-PEFRsOhF.js.gz +0 -0
  200. package/client/assets/{useReport-DPqY9XXp.js.map → useReport-PEFRsOhF.js.map} +1 -1
  201. package/client/assets/{useRundown-uuXixjnX.js → useRundown-D8CYATNi.js} +2 -2
  202. package/client/assets/useRundown-D8CYATNi.js.br +0 -0
  203. package/client/assets/useRundown-D8CYATNi.js.gz +0 -0
  204. package/client/assets/{useRundown-uuXixjnX.js.map → useRundown-D8CYATNi.js.map} +1 -1
  205. package/client/assets/{useWindowTitle-BQ1kqXfk.js → useWindowTitle-b5fN0StF.js} +2 -2
  206. package/client/assets/useWindowTitle-b5fN0StF.js.br +0 -0
  207. package/client/assets/useWindowTitle-b5fN0StF.js.gz +0 -0
  208. package/client/assets/{useWindowTitle-BQ1kqXfk.js.map → useWindowTitle-b5fN0StF.js.map} +1 -1
  209. package/client/assets/{validateEvent-Cy-jEiwB.js → validateEvent-Bvgk1E-Y.js} +2 -2
  210. package/client/assets/validateEvent-Bvgk1E-Y.js.br +0 -0
  211. package/client/assets/validateEvent-Bvgk1E-Y.js.gz +0 -0
  212. package/client/assets/{validateEvent-Cy-jEiwB.js.map → validateEvent-Bvgk1E-Y.js.map} +1 -1
  213. package/client/assets/{vendor-Cnciq4o_.js → vendor-Cu5xgv5K.js} +3 -3
  214. package/client/assets/vendor-Cu5xgv5K.js.br +0 -0
  215. package/client/assets/vendor-Cu5xgv5K.js.gz +0 -0
  216. package/client/assets/{vendor-Cnciq4o_.js.map → vendor-Cu5xgv5K.js.map} +1 -1
  217. package/client/assets/{common.options-p5f_zJ2-.js → viewLoader.utils-BPhACxyG.js} +2 -2
  218. package/client/assets/viewLoader.utils-BPhACxyG.js.br +0 -0
  219. package/client/assets/viewLoader.utils-BPhACxyG.js.gz +0 -0
  220. package/client/assets/viewLoader.utils-BPhACxyG.js.map +1 -0
  221. package/client/index.html +3 -3
  222. package/package.json +1 -1
  223. package/server/index.cjs +103 -103
  224. package/client/assets/Backstage-B-_iTDRg.js +0 -2
  225. package/client/assets/Backstage-B-_iTDRg.js.br +0 -0
  226. package/client/assets/Backstage-B-_iTDRg.js.gz +0 -0
  227. package/client/assets/Backstage-B-_iTDRg.js.map +0 -1
  228. package/client/assets/Countdown-BaaR4j9x.js +0 -2
  229. package/client/assets/Countdown-BaaR4j9x.js.br +0 -0
  230. package/client/assets/Countdown-BaaR4j9x.js.gz +0 -0
  231. package/client/assets/CustomTranslationModal-CcNNjbmZ.js +0 -2
  232. package/client/assets/CustomTranslationModal-CcNNjbmZ.js.br +0 -0
  233. package/client/assets/CustomTranslationModal-CcNNjbmZ.js.gz +0 -0
  234. package/client/assets/DelayIndicator-DXDACqpc.js.br +0 -0
  235. package/client/assets/DelayIndicator-DXDACqpc.js.gz +0 -0
  236. package/client/assets/DropdownMenu-Bn0VHzKx.js +0 -2
  237. package/client/assets/DropdownMenu-Bn0VHzKx.js.br +0 -0
  238. package/client/assets/DropdownMenu-Bn0VHzKx.js.gz +0 -0
  239. package/client/assets/DropdownMenu-Bn0VHzKx.js.map +0 -1
  240. package/client/assets/DropdownMenu-ByBDeesm.css +0 -1
  241. package/client/assets/DropdownMenu-ByBDeesm.css.br +0 -0
  242. package/client/assets/DropdownMenu-ByBDeesm.css.gz +0 -0
  243. package/client/assets/EditorFeatureWrapper-CX6wzTmM.js.br +0 -0
  244. package/client/assets/EditorFeatureWrapper-CX6wzTmM.js.gz +0 -0
  245. package/client/assets/EditorUtils-DxjFOwpn.js.br +0 -0
  246. package/client/assets/EditorUtils-DxjFOwpn.js.gz +0 -0
  247. package/client/assets/Empty-DiBXyIA8.js.br +0 -2
  248. package/client/assets/Empty-DiBXyIA8.js.gz +0 -0
  249. package/client/assets/EmptyPage-X6EO1Y5W.js.br +0 -0
  250. package/client/assets/EmptyPage-X6EO1Y5W.js.gz +0 -0
  251. package/client/assets/FollowButton-Cr-HA2-6.js.br +0 -0
  252. package/client/assets/FollowButton-Cr-HA2-6.js.gz +0 -0
  253. package/client/assets/MessageControlExport-VUkIayAJ.js.br +0 -0
  254. package/client/assets/MessageControlExport-VUkIayAJ.js.gz +0 -0
  255. package/client/assets/MilestoneEditor-Da8oxrHI.js +0 -2
  256. package/client/assets/MilestoneEditor-Da8oxrHI.js.br +0 -0
  257. package/client/assets/MilestoneEditor-Da8oxrHI.js.gz +0 -0
  258. package/client/assets/MultiPartProgressBar-mGPuP1Wd.js.br +0 -0
  259. package/client/assets/MultiPartProgressBar-mGPuP1Wd.js.gz +0 -0
  260. package/client/assets/OperatorExport-BeuWuV6I.js +0 -2
  261. package/client/assets/OperatorExport-BeuWuV6I.js.br +0 -0
  262. package/client/assets/OperatorExport-BeuWuV6I.js.gz +0 -0
  263. package/client/assets/OperatorExport-BeuWuV6I.js.map +0 -1
  264. package/client/assets/OverviewWrapper-BMuW_wiO.js.br +0 -0
  265. package/client/assets/OverviewWrapper-BMuW_wiO.js.gz +0 -0
  266. package/client/assets/ProjectInfo-BYi1lzPk.js.br +0 -0
  267. package/client/assets/ProjectInfo-BYi1lzPk.js.gz +0 -0
  268. package/client/assets/ProtectRoute-DnUCrlh6.js.br +0 -0
  269. package/client/assets/ProtectRoute-DnUCrlh6.js.gz +0 -0
  270. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js +0 -2
  271. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.br +0 -0
  272. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.gz +0 -0
  273. package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.map +0 -1
  274. package/client/assets/ProtectedEditor-C4beOxz1.css +0 -1
  275. package/client/assets/ProtectedEditor-C4beOxz1.css.br +0 -0
  276. package/client/assets/ProtectedEditor-C4beOxz1.css.gz +0 -0
  277. package/client/assets/ProtectedEditor-KcsoZKKo.js +0 -3
  278. package/client/assets/ProtectedEditor-KcsoZKKo.js.br +0 -0
  279. package/client/assets/ProtectedEditor-KcsoZKKo.js.gz +0 -0
  280. package/client/assets/ProtectedEditor-KcsoZKKo.js.map +0 -1
  281. package/client/assets/RundownEntry-Dl4Cb_pZ.js +0 -2
  282. package/client/assets/RundownEntry-Dl4Cb_pZ.js.br +0 -0
  283. package/client/assets/RundownEntry-Dl4Cb_pZ.js.gz +0 -0
  284. package/client/assets/RundownExport-BPDLhvsM.js +0 -3
  285. package/client/assets/RundownExport-BPDLhvsM.js.br +0 -0
  286. package/client/assets/RundownExport-BPDLhvsM.js.gz +0 -0
  287. package/client/assets/Select-CUjlJirY.js.br +0 -0
  288. package/client/assets/Select-CUjlJirY.js.gz +0 -0
  289. package/client/assets/Studio-BLCIas53.js +0 -2
  290. package/client/assets/Studio-BLCIas53.js.br +0 -0
  291. package/client/assets/Studio-BLCIas53.js.gz +0 -0
  292. package/client/assets/StyleEditor-DTNiR-0P.js.br +0 -0
  293. package/client/assets/StyleEditor-DTNiR-0P.js.gz +0 -0
  294. package/client/assets/TimeElements-rlwX9Mgy.js +0 -2
  295. package/client/assets/TimeElements-rlwX9Mgy.js.br +0 -0
  296. package/client/assets/TimeElements-rlwX9Mgy.js.gz +0 -0
  297. package/client/assets/TimeInput-C0_Nl63x.js.br +0 -0
  298. package/client/assets/TimeInput-C0_Nl63x.js.gz +0 -0
  299. package/client/assets/TimelinePage-BC-pnISF.js +0 -2
  300. package/client/assets/TimelinePage-BC-pnISF.js.br +0 -0
  301. package/client/assets/TimelinePage-BC-pnISF.js.gz +0 -0
  302. package/client/assets/Timer-DgmA0De-.js +0 -2
  303. package/client/assets/Timer-DgmA0De-.js.br +0 -0
  304. package/client/assets/Timer-DgmA0De-.js.gz +0 -0
  305. package/client/assets/Timer-DgmA0De-.js.map +0 -1
  306. package/client/assets/TimerControlExport-C_Jbwxog.js.br +0 -0
  307. package/client/assets/TimerControlExport-C_Jbwxog.js.gz +0 -0
  308. package/client/assets/TitleCard-C-Tw72nZ.js.br +0 -0
  309. package/client/assets/TitleCard-C-Tw72nZ.js.gz +0 -0
  310. package/client/assets/Tooltip-BZrLdTBU.js.br +0 -0
  311. package/client/assets/Tooltip-BZrLdTBU.js.gz +0 -0
  312. package/client/assets/ViewLogo-CdsW41HC.js.br +0 -0
  313. package/client/assets/ViewLogo-CdsW41HC.js.gz +0 -0
  314. package/client/assets/ViewParamsEditor-YoYxps2g.js.br +0 -0
  315. package/client/assets/ViewParamsEditor-YoYxps2g.js.gz +0 -0
  316. package/client/assets/ViewParamsEditor-kNKEOAwm.css.br +0 -0
  317. package/client/assets/ViewParamsEditor-kNKEOAwm.css.gz +0 -0
  318. package/client/assets/common.options-p5f_zJ2-.js.br +0 -0
  319. package/client/assets/common.options-p5f_zJ2-.js.gz +0 -0
  320. package/client/assets/common.options-p5f_zJ2-.js.map +0 -1
  321. package/client/assets/dateConfig-CqC6Ta_8.js.br +0 -0
  322. package/client/assets/dateConfig-CqC6Ta_8.js.gz +0 -0
  323. package/client/assets/editorSettings-CL1TjKzU.js.br +0 -0
  324. package/client/assets/editorSettings-CL1TjKzU.js.gz +0 -0
  325. package/client/assets/getProgress-Dh-Yy44B.js.br +0 -0
  326. package/client/assets/getProgress-Dh-Yy44B.js.gz +0 -0
  327. package/client/assets/index-DdPXqLQ6.js +0 -3
  328. package/client/assets/index-DdPXqLQ6.js.br +0 -0
  329. package/client/assets/index-DdPXqLQ6.js.gz +0 -0
  330. package/client/assets/index-DdPXqLQ6.js.map +0 -1
  331. package/client/assets/index-pvMSlFrO.css.br +0 -0
  332. package/client/assets/index-pvMSlFrO.css.gz +0 -0
  333. package/client/assets/offset-BnfjZ6JI.js.br +0 -2
  334. package/client/assets/offset-BnfjZ6JI.js.gz +0 -0
  335. package/client/assets/parseUserTime-DNXIMX9s.js.br +0 -0
  336. package/client/assets/parseUserTime-DNXIMX9s.js.gz +0 -0
  337. package/client/assets/playbackstate-DzSEaiNW.js.br +0 -0
  338. package/client/assets/playbackstate-DzSEaiNW.js.gz +0 -0
  339. package/client/assets/presentation.utils-BfcniGcl.js.br +0 -0
  340. package/client/assets/presentation.utils-BfcniGcl.js.gz +0 -0
  341. package/client/assets/rundownUtils-CPBsEZ2m.js.br +0 -0
  342. package/client/assets/rundownUtils-CPBsEZ2m.js.gz +0 -0
  343. package/client/assets/useCustomFields-DY13Ir96.js.br +0 -0
  344. package/client/assets/useCustomFields-DY13Ir96.js.gz +0 -0
  345. package/client/assets/useFollowComponent-C42-1XCu.js.br +0 -0
  346. package/client/assets/useFollowComponent-C42-1XCu.js.gz +0 -0
  347. package/client/assets/useProjectData-BF2F6qPB.js.br +0 -0
  348. package/client/assets/useProjectData-BF2F6qPB.js.gz +0 -0
  349. package/client/assets/useReport-DPqY9XXp.js +0 -2
  350. package/client/assets/useReport-DPqY9XXp.js.br +0 -0
  351. package/client/assets/useReport-DPqY9XXp.js.gz +0 -0
  352. package/client/assets/useRundown-uuXixjnX.js.br +0 -0
  353. package/client/assets/useRundown-uuXixjnX.js.gz +0 -0
  354. package/client/assets/useWindowTitle-BQ1kqXfk.js.br +0 -0
  355. package/client/assets/useWindowTitle-BQ1kqXfk.js.gz +0 -0
  356. package/client/assets/validateEvent-Cy-jEiwB.js.br +0 -0
  357. package/client/assets/validateEvent-Cy-jEiwB.js.gz +0 -0
  358. package/client/assets/vendor-Cnciq4o_.js.br +0 -0
  359. package/client/assets/vendor-Cnciq4o_.js.gz +0 -0
  360. package/client/assets/viewLoader.utils-CYlNKkLE.js +0 -2
  361. package/client/assets/viewLoader.utils-CYlNKkLE.js.br +0 -0
  362. package/client/assets/viewLoader.utils-CYlNKkLE.js.gz +0 -0
  363. package/client/assets/viewLoader.utils-CYlNKkLE.js.map +0 -1
  364. /package/client/assets/{viewLoader-Bk5IU6zG.css → SuperscriptTime-Bk5IU6zG.css} +0 -0
  365. /package/client/assets/{viewLoader-Bk5IU6zG.css.br → SuperscriptTime-Bk5IU6zG.css.br} +0 -0
  366. /package/client/assets/{viewLoader-Bk5IU6zG.css.gz → SuperscriptTime-Bk5IU6zG.css.gz} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorExport-DMZ6eQfT.js","sources":["../../src/features/operator/edit-modal/EditModal.tsx","../../src/features/viewers/common/running-time/RunningTime.tsx","../../src/features/operator/operator-event/OperatorEvent.tsx","../../src/features/operator/operator-group/OperatorGroup.tsx","../../src/features/operator/status-bar/StatusBarProgress.tsx","../../src/features/operator/status-bar/StatusBarTimers.tsx","../../src/features/operator/status-bar/StatusBar.tsx","../../src/features/operator/operator.options.tsx","../../src/features/operator/operator.utils.ts","../../src/features/operator/useOperatorData.ts","../../src/features/operator/Operator.tsx","../../src/features/operator/OperatorExport.tsx"],"sourcesContent":["import { Fragment, useRef, useState } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog } from '@base-ui-components/react/dialog';\nimport { OntimeEvent } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport Textarea from '../../../common/components/input/textarea/Textarea';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { EditEvent } from '../operator.types';\n\nimport style from './EditModal.module.scss';\n\ninterface EditModalProps {\n event: EditEvent;\n onClose: () => void;\n}\n\nexport default function EditModal(props: EditModalProps) {\n const { event, onClose } = props;\n\n const { updateEntry } = useEntryActions();\n const [loading, setLoading] = useState(false);\n const inputRef = useRef<HTMLTextAreaElement[]>(new Array<HTMLTextAreaElement>());\n\n const handleSave = async () => {\n if (!inputRef.current) return;\n setLoading(true);\n\n const patchObject: Partial<OntimeEvent> = { id: event.id };\n\n inputRef.current.forEach((element) => {\n if (element.dataset.field && element.defaultValue != element.value) {\n if (patchObject.custom) {\n patchObject.custom[element.dataset.field] = element.value;\n } else {\n Object.assign(patchObject, { custom: { [element.dataset.field]: element.value } });\n }\n }\n });\n\n if (patchObject.custom) {\n await updateEntry(patchObject);\n }\n\n setLoading(false);\n onClose();\n };\n\n return (\n <Dialog.Root\n open\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n >\n <Dialog.Portal>\n <Dialog.Popup className={style.editModal}>\n <div className={style.title}>\n {`Editing fields in cue ${event.cue}`}\n <IconButton variant='subtle-white' onClick={onClose} disabled={loading}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {event.subscriptions.map((field) => {\n return (\n <Fragment key={field.id}>\n <label htmlFor={field.id} className={style.label} style={{ '--user-bg': field.colour }}>\n {field.label}\n </label>\n <Textarea\n name={field.id}\n ref={(element) => {\n if (element) inputRef.current.push(element);\n }}\n placeholder={`Add value for ${field.label} field`}\n defaultValue={field.value}\n data-field={field.id}\n disabled={loading}\n rows={5}\n />\n </Fragment>\n );\n })}\n </div>\n\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n <Button variant='primary' size='large' onClick={handleSave} disabled={loading}>\n Save\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","/**\n * encapsulate logic related to showing a running timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\nimport { removeLeadingZero, removeSeconds } from 'ontime-utils';\n\nimport { formattedTime } from '../../../overview/overview.utils';\n\ninterface RunningTimeProps {\n value: MaybeNumber;\n hideSeconds?: boolean;\n hideLeadingZero?: boolean;\n className?: string;\n}\n\nexport default function RunningTime(props: RunningTimeProps) {\n const { value, hideSeconds, hideLeadingZero, className } = props;\n let display = formattedTime(value, hideSeconds || hideLeadingZero ? 2 : 3);\n\n if (hideLeadingZero) {\n display = removeLeadingZero(display);\n }\n\n if (hideSeconds) {\n display = removeSeconds(display);\n }\n\n return <div className={className}>{display}</div>;\n}\n","import { memo, RefObject, SyntheticEvent } from 'react';\nimport { useLongPress } from '@mantine/hooks';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString } from 'ontime-utils';\n\nimport DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, useTimeUntilExpectedStart } from '../../../common/utils/time';\nimport RunningTime from '../../viewers/common/running-time/RunningTime';\nimport type { EditEvent, Subscribed } from '../operator.types';\n\nimport style from './OperatorEvent.module.scss';\n\ninterface OperatorEventProps {\n id: string;\n colour: string;\n cue: string;\n main: string;\n secondary: string;\n timeStart: number;\n duration: number;\n delay: number;\n dayOffset: number;\n isLinkedToLoaded: boolean;\n isSelected: boolean;\n isPast: boolean;\n selectedRef?: RefObject<HTMLDivElement | null>;\n showStart: boolean;\n subscribed: Subscribed;\n totalGap: number;\n onLongPress: (event: EditEvent) => void;\n}\n\nexport default memo(OperatorEvent);\nfunction OperatorEvent({\n id,\n colour,\n cue,\n main,\n secondary,\n timeStart,\n duration,\n delay,\n dayOffset,\n isLinkedToLoaded,\n isSelected,\n isPast,\n selectedRef,\n showStart,\n subscribed,\n totalGap,\n onLongPress,\n}: OperatorEventProps) {\n /**\n * gather behaviour for long press and context menu\n */\n const handleLongPress = (event?: SyntheticEvent) => {\n // we dont have an event out of useLongPress\n event?.preventDefault();\n if (subscribed) {\n onLongPress({ id, cue, subscriptions: subscribed });\n }\n };\n\n const mouseHandlers = useLongPress(handleLongPress);\n const cueColours = colour && getAccessibleColour(colour);\n\n const operatorClasses = cx([\n style.event,\n isSelected && style.running,\n isPast && style.past,\n ]);\n\n return (\n <div className={operatorClasses} data-testid={cue} ref={selectedRef} onContextMenu={handleLongPress} {...mouseHandlers}>\n <div className={style.binder} style={{ ...cueColours }}>\n <span className={style.cue}>{cue}</span>\n </div>\n\n <span className={style.mainField}>\n {showStart && <span className={style.plannedStart}>{millisToString(timeStart)}</span>}\n {main}\n </span>\n <span className={style.secondaryField}>{secondary}</span>\n <OperatorEventSchedule\n timeStart={timeStart}\n isPast={isPast}\n isSelected={isSelected}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n <span className={style.runningTime}>\n <DelayIndicator delayValue={delay} />\n <RunningTime className={cx([isSelected && style.muted])} value={duration} hideLeadingZero />\n </span>\n\n <div className={style.fields}>\n {subscribed\n .filter((field) => field.value)\n .map((field) => {\n const fieldClasses = cx([style.field, !field.colour ? style.noColour : null]);\n return (\n <div key={field.id}>\n <span className={fieldClasses} style={{ backgroundColor: field.colour }}>\n {field.label}\n </span>\n <span className={style.value} style={{ color: field.colour }}>\n {field.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface OperatorEventScheduleProps {\n timeStart: number;\n isPast: boolean;\n isSelected: boolean;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction OperatorEventSchedule({\n timeStart,\n isPast,\n isSelected,\n delay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n}: OperatorEventScheduleProps) {\n if (isPast) {\n return <span className={style.timeUntil}>DONE</span>;\n }\n\n if (isSelected) {\n return <span className={style.timeUntil}>LIVE</span>;\n }\n\n return (\n <TimeUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n );\n}\n\ninterface TimeUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction TimeUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: TimeUntilProps) {\n // we isolate this to avoid unnecessary re-renders\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n\n const isDue = timeUntil < MILLIS_PER_SECOND;\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return <span className={style.timeUntil} data-testid='time-until'>{timeUntilString}</span>;\n}\n","import { memo } from 'react';\n\nimport style from './OperatorGroup.module.scss';\n\ninterface OperatorGroup {\n title: string;\n}\n\nexport default memo(OperatorGroup);\nfunction OperatorGroup({ title }: OperatorGroup) {\n return <div className={style.group}>{title}</div>;\n}\n","import { ViewSettings } from 'ontime-types';\n\nimport MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport { useProgressData } from '../../../common/hooks/useSocket';\n\nimport styles from './StatusBar.module.scss';\n\ninterface StatusBarProgressProps {\n viewSettings: ViewSettings;\n}\n\nexport default function StatusBarProgress({ viewSettings }: StatusBarProgressProps) {\n const { current, duration, timeWarning, timeDanger } = useProgressData();\n\n return (\n <MultiPartProgressBar\n now={current}\n complete={duration}\n normalColor={viewSettings.normalColor}\n warning={timeWarning}\n warningColor={viewSettings.warningColor}\n danger={timeDanger}\n dangerColor={viewSettings.dangerColor}\n className={styles.progressOverride}\n ignoreCssOverride\n />\n );\n}\n","import { ClockOverview, TimerOverview } from '../../overview/composite/TimeElements';\n\nimport style from './StatusBar.module.scss';\n\nexport default function StatusBarTimers() {\n return (\n <div className={style.timers}>\n <TimerOverview className={style.runningTimer} />\n <ClockOverview className={style.timeNow} />\n </div>\n );\n}\n","import useViewSettings from '../../../common/hooks-query/useViewSettings';\n\nimport StatusBarProgress from './StatusBarProgress';\nimport StatusBarTimers from './StatusBarTimers';\n\nimport styles from './StatusBar.module.scss';\n\nexport default function StatusBar() {\n const { data } = useViewSettings();\n\n return (\n <div className={styles.statusBar}>\n <StatusBarTimers />\n {data && <StatusBarProgress viewSettings={data} />}\n </div>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, EntryId, OntimeEvent } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport {\n makeCustomFieldSelectOptions,\n makeOptionsFromCustomFields,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../viewers/common/viewUtils';\n\nexport const getOperatorOptions = (customFields: CustomFields, timeFormat: string): ViewOption[] => {\n const fieldOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const customFieldSelect = makeCustomFieldSelectOptions(customFields);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main data field',\n description: 'Field to be shown in the first line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary data field',\n description: 'Field to be shown in the second line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'subscribe',\n title: 'Highlight Fields',\n description: 'Choose custom fields to highlight',\n type: 'multi-option',\n values: customFieldSelect,\n },\n {\n id: 'shouldEdit',\n title: 'Edit custom field',\n description: 'Allows editing an highlighted custom field by long pressing',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hidePast',\n title: 'Hide Past Events',\n description: 'Whether to hide events that have passed',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'showStart',\n title: 'Show planned start',\n description: 'Whether to prepend the planned start to the items',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n ];\n};\n\ntype OperatorOptions = {\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n subscribe: string[];\n shouldEdit: boolean;\n hidePast: boolean;\n showStart: boolean;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): OperatorOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Helper to get array values from either source\n const getArrayValues = (key: string): EntryId[] => {\n if (defaultValues?.has(key)) {\n return defaultValues.getAll(key) as EntryId[];\n }\n return searchParams.getAll(key) as EntryId[];\n };\n\n // we manually make an object that matches the key above\n return {\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n subscribe: getArrayValues('subscribe'),\n shouldEdit: isStringBoolean(getValue('shouldEdit')),\n hidePast: isStringBoolean(getValue('hidePast')),\n showStart: isStringBoolean(getValue('showStart')),\n };\n}\n\n/**\n * Hook exposes the operator view options\n */\nexport function useOperatorOptions(): OperatorOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { CustomFields, MaybeString, OntimeEvent } from 'ontime-types';\r\n\r\nimport { getPropertyValue } from '../viewers/common/viewUtils';\r\n\r\nimport type { Subscribed } from './operator.types';\r\n\r\nexport function getEventData(\r\n event: OntimeEvent,\r\n main: MaybeString,\r\n secondary: MaybeString,\r\n subscriptions: string[],\r\n customFields: CustomFields,\r\n) {\r\n const mainField = main ? getPropertyValue(event, main) ?? '' : event.title;\r\n const secondaryField = getPropertyValue(event, secondary) ?? '';\r\n\r\n // remove subscriptions that are not in customFields\r\n const sanitisedSubscriptions = subscriptions.filter((field) => Object.hasOwn(customFields, field));\r\n const subscribedData = sanitisedSubscriptions.reduce<Subscribed>((acc, id) => {\r\n const field = customFields[id];\r\n if (field) {\r\n acc.push({\r\n id,\r\n label: field.label,\r\n colour: field.colour,\r\n value: event.custom[id],\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return { mainField, secondaryField, subscribedData };\r\n}\r\n","import { CustomFields, Rundown, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport { useRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { RundownMetadataObject } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../../views/utils/viewLoader.utils';\n\nexport interface OperatorData {\n rundown: Rundown;\n rundownMetadata: RundownMetadataObject;\n customFields: CustomFields;\n settings: Settings;\n}\n\nexport function useOperatorData(): ViewData<OperatorData> {\n const { data: rundown, rundownMetadata, status: rundownStatus } = useRundownWithMetadata();\n const { data: customFields, status: customFieldStatus } = useCustomFields();\n const { data: settings, status: settingsStatus } = useSettings();\n\n return {\n data: {\n rundown,\n rundownMetadata,\n customFields,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, customFieldStatus, settingsStatus]),\n };\n}\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isOntimeEvent, isOntimeGroup, OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useSelectedEventId } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport { getDefaultFormat } from '../../common/utils/time';\nimport Loader from '../../views/common/loader/Loader';\n\nimport EditModal from './edit-modal/EditModal';\nimport FollowButton from './follow-button/FollowButton';\nimport OperatorEvent from './operator-event/OperatorEvent';\nimport OperatorGroup from './operator-group/OperatorGroup';\nimport StatusBar from './status-bar/StatusBar';\nimport { getOperatorOptions, useOperatorOptions } from './operator.options';\nimport type { EditEvent } from './operator.types';\nimport { getEventData } from './operator.utils';\nimport { OperatorData, useOperatorData } from './useOperatorData';\n\nimport style from './Operator.module.scss';\n\nconst selectedOffset = 50;\n\nexport default function OperatorLoader() {\n const { data, status } = useOperatorData();\n\n useWindowTitle('Operator');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Operator {...data} />;\n}\n\nfunction Operator({ rundown, rundownMetadata, customFields, settings }: OperatorData) {\n const { selectedEventId } = useSelectedEventId();\n const { subscribe, mainSource, secondarySource, shouldEdit, hidePast, showStart } = useOperatorOptions();\n\n const [showEditPrompt, setShowEditPrompt] = useState(false);\n const [editEvent, setEditEvent] = useState<EditEvent | null>(null);\n\n const [lockAutoScroll, setLockAutoScroll] = useState(false);\n const selectedRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const scrollToComponent = useFollowComponent({\n followRef: selectedRef,\n scrollRef,\n doFollow: !lockAutoScroll,\n topOffset: selectedOffset,\n followTrigger: selectedEventId,\n });\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n\n // reset scroll if nothing is selected\n useEffect(() => {\n if (!selectedEventId) {\n if (!lockAutoScroll) {\n scrollRef.current?.scrollTo(0, 0);\n }\n }\n }, [selectedEventId, lockAutoScroll, scrollRef]);\n\n const handleOffset = () => {\n if (selectedEventId) {\n scrollToComponent();\n }\n setLockAutoScroll(false);\n };\n\n // prevent considering automated scrolls as user scrolls\n const handleUserScroll = () => {\n if (selectedRef?.current && scrollRef?.current) {\n const selectedRect = selectedRef.current.getBoundingClientRect();\n const scrollerRect = scrollRef.current.getBoundingClientRect();\n if (selectedRect && scrollerRect) {\n const distanceFromTop = selectedRect.top - scrollerRect.top;\n const hasScrolledOutOfThreshold = distanceFromTop < -8 || distanceFromTop > selectedOffset;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n timeoutId.current = setTimeout(() => {\n setShowEditPrompt(false);\n }, 700);\n\n setShowEditPrompt(true);\n\n throttledHandleScroll();\n };\n\n const handleEdit = useCallback((event: EditEvent) => {\n setEditEvent({ ...event });\n }, []);\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const operatorOptions = useMemo(() => getOperatorOptions(customFields, defaultFormat), [customFields, defaultFormat]);\n\n const canEdit = shouldEdit && subscribe.length;\n\n return (\n <div className={style.operatorContainer} data-testid='operator-view'>\n <ViewParamsEditor target={OntimeView.Operator} viewOptions={operatorOptions} />\n {editEvent && <EditModal event={editEvent} onClose={() => setEditEvent(null)} />}\n\n <StatusBar />\n\n {canEdit && (\n <div className={cx([style.editPrompt, showEditPrompt && style.show])}>Press and hold to edit user field</div>\n )}\n\n <div className={style.operatorEvents} onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {rundown.order.map((entryId) => {\n const entry = rundown.entries[entryId];\n if (isOntimeEvent(entry)) {\n const { isPast, isLinkedToLoaded, isLoaded, totalGap } = rundownMetadata[entryId];\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || entry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n entry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={entry.id}\n id={entry.id}\n colour={entry.colour}\n cue={entry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={entry.timeStart}\n duration={entry.duration}\n delay={entry.delay}\n dayOffset={entry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n }\n\n if (isOntimeGroup(entry)) {\n return (\n <Fragment key={entry.id}>\n <OperatorGroup key={entry.id} title={entry.title} />\n {entry.entries.map((nestedEntryId) => {\n const nestedEntry = rundown.entries[nestedEntryId];\n if (!isOntimeEvent(nestedEntry)) {\n return null;\n }\n\n const { isPast, isLoaded, isLinkedToLoaded, totalGap } = rundownMetadata[nestedEntryId];\n\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || nestedEntry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n nestedEntry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={nestedEntry.id}\n id={nestedEntry.id}\n colour={nestedEntry.colour}\n cue={nestedEntry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={nestedEntry.timeStart}\n duration={nestedEntry.duration}\n delay={nestedEntry.delay}\n dayOffset={nestedEntry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n })}\n </Fragment>\n );\n }\n return null;\n })}\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n","import ProtectRoute from '../../common/components/protect-route/ProtectRoute';\n\nimport Operator from './Operator';\n\nexport default function OperatorExport() {\n return (\n <ProtectRoute permission='operator'>\n <Operator />\n </ProtectRoute>\n );\n}\n"],"names":["EditModal","props","event","onClose","updateEntry","useEntryActions","loading","setLoading","useState","inputRef","useRef","handleSave","patchObject","element","jsx","Dialog.Root","isOpen","Dialog.Portal","jsxs","Dialog.Popup","style","IconButton","IoClose","field","Fragment","Textarea","Button","RunningTime","value","hideSeconds","hideLeadingZero","className","display","formattedTime","removeLeadingZero","removeSeconds","memo","OperatorEvent","id","colour","cue","main","secondary","timeStart","duration","delay","dayOffset","isLinkedToLoaded","isSelected","isPast","selectedRef","showStart","subscribed","totalGap","onLongPress","handleLongPress","mouseHandlers","useLongPress","cueColours","getAccessibleColour","operatorClasses","cx","millisToString","OperatorEventSchedule","DelayIndicator","fieldClasses","TimeUntil","timeUntil","useTimeUntilExpectedStart","timeUntilString","MILLIS_PER_SECOND","formatDuration","MILLIS_PER_MINUTE","OperatorGroup","title","StatusBarProgress","viewSettings","current","timeWarning","timeDanger","useProgressData","MultiPartProgressBar","styles","StatusBarTimers","TimerOverview","ClockOverview","StatusBar","data","useViewSettings","getOperatorOptions","customFields","timeFormat","fieldOptions","makeOptionsFromCustomFields","customFieldSelect","makeCustomFieldSelectOptions","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","getArrayValues","isStringBoolean","useOperatorOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","getEventData","subscriptions","mainField","getPropertyValue","secondaryField","subscribedData","acc","useOperatorData","rundown","rundownMetadata","rundownStatus","useRundownWithMetadata","customFieldStatus","useCustomFields","settings","settingsStatus","useSettings","aggregateQueryStatus","selectedOffset","OperatorLoader","status","useWindowTitle","Loader","EmptyPage","Operator","selectedEventId","useSelectedEventId","subscribe","mainSource","secondarySource","shouldEdit","hidePast","showEditPrompt","setShowEditPrompt","editEvent","setEditEvent","lockAutoScroll","setLockAutoScroll","scrollRef","scrollToComponent","useFollowComponent","timeoutId","useEffect","_a","handleOffset","throttledHandleScroll","throttle","selectedRect","scrollerRect","distanceFromTop","hasScrolledOutOfThreshold","handleScroll","handleEdit","useCallback","defaultFormat","getDefaultFormat","operatorOptions","canEdit","ViewParamsEditor","OntimeView","entryId","entry","isOntimeEvent","isLoaded","isOntimeGroup","nestedEntryId","nestedEntry","FollowButton","OperatorExport","ProtectRoute"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e,aY as ee,aZ as te,a_ as ae,f as se,a$ as ie,h as d,ad as re,ab as ne,av as le}from"./vendor-Cnciq4o_.js";import{i as X,ah as oe,ae as j,ar as g,b7 as P,b8 as ce,aq as de,O as x,a9 as ue,ac as he,Y as V,ad as S,af as fe,X as me,a7 as pe,B as ve,_ as be,an as xe,b9 as M,ba as H,am as je,ag as ge,al as _e,au as we,bb as Ce}from"./index-DdPXqLQ6.js";import{I as ke}from"./useWindowTitle-BQ1kqXfk.js";import{S as Y}from"./Select-CUjlJirY.js";import{S as _,u as ye}from"./useProjectData-BF2F6qPB.js";import{u as Se}from"./useCustomFields-DY13Ir96.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new s.Error().stack;r&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[r]="032dbb79-be26-44f0-8314-9096816e7e99",s._sentryDebugIdIdentifier="sentry-dbid-032dbb79-be26-44f0-8314-9096816e7e99")}catch{}})();const it=/^\d+$/,rt=/^https?:\/\//,nt=/^[a-z0-9]+$/i,Oe=/^[a-zA-Z0-9_-]*$/,Re="_blink_1cc8f_1",Ne="_fourtyfive_1cc8f_13",Ie="_radioGroup_1cc8f_17",$e="_item_1cc8f_23",De="_horizontal_1cc8f_28",Ue="_vertical_1cc8f_35",We="_radio_1cc8f_17",Ee="_indicator_1cc8f_73",I={blink:Re,fourtyfive:Ne,radioGroup:Ie,item:$e,horizontal:De,vertical:Ue,radio:We,indicator:Ee};function Z({items:s,className:r,orientation:n="vertical",onValueChange:o,...h}){return e.jsx(ee,{onValueChange:l=>o==null?void 0:o(l),className:X([I.radioGroup,I[n],r]),...h,children:s.map(l=>e.jsxs("label",{className:I.item,children:[e.jsx(te,{value:l.value.toString(),className:I.radio,children:e.jsx(ae,{className:I.indicator})}),l.label]},l.value.toString()))})}const K={hideTableSeconds:!1,hideIndexColumn:!1,showDelayedTimes:!1,hideDelays:!1},lt=se()(ie(s=>({...K,setOption:(r,n)=>s(o=>({...o,[r]:n})),toggleOption:r=>s(n=>({...n,[r]:!n[r]})),resetOptions:()=>s(K)}),{name:"cuesheet-options"})),W=[{value:"flag",label:"Flag"},{value:"cue",label:"Cue"},{value:"title",label:"Title"},{value:"timeStart",label:"Time start"},{value:"timeEnd",label:"Time end"},{value:"duration",label:"Duration"},{value:"note",label:"Note"}];function ze(s){return Object.entries(s).map(([r,n])=>({value:`custom-${r}`,label:n.label}))}const Fe="_twoCols_1wch9_17",Le="_grid_1wch9_23",G={twoCols:Fe,grid:Le};function Te({readRef:s,writeRef:r}){const{data:n}=Se(),o=d.useMemo(()=>ze(n),[n]),[h,l]=d.useState("full"),[u,$]=d.useState("full"),[w,C]=d.useState(()=>{const t={};return[...W,...o].forEach(i=>{t[i.value]=!0}),t}),[R,D]=d.useState(()=>{const t={};return[...W,...o].forEach(i=>{t[i.value]=!0}),t}),z=t=>{l(t),C(i=>{const f={...i};return Object.keys(f).forEach(m=>{f[m]=!0}),f})},F=t=>{t==="full"&&l("full"),$(t),C(i=>{const f={...i};return D(m=>{const k={...m};return[...W,...o].forEach(N=>{f[N.value]=!0,k[N.value]=!0}),k}),f})},c=(t,i,f)=>{i==="read"?C(m=>({...m,[t]:f})):D(m=>({...m,[t]:f}))},p=()=>h==="full"||u==="full"?"full":Object.entries(w).filter(([t,i])=>i).map(([t])=>t).join(","),L=()=>u==="full"?"full":Object.entries(R).filter(([t,i])=>i).map(([t])=>t).join(",");return e.jsxs(oe,{children:[e.jsx("input",{name:"read",hidden:!0,readOnly:!0,ref:s,value:p()||"-"}),e.jsx("input",{name:"write",hidden:!0,readOnly:!0,ref:r,value:L()||"-"}),e.jsxs("div",{children:[e.jsx(j,{title:"Access mode",description:"Which parts of the data will the link give access to"}),e.jsxs("div",{children:[e.jsx(Z,{value:u,onValueChange:F,orientation:"horizontal",items:[{value:"full",label:"Full write (edit all existing and future columns)"},{value:"custom",label:"Custom write"}]}),e.jsx(Z,{value:h,onValueChange:z,orientation:"horizontal",disabled:u==="full",items:[{value:"full",label:"Full read (view all existing and future columns)"},{value:"custom",label:"Custom read"}]})]})]}),e.jsxs("div",{className:G.twoCols,children:[e.jsxs("div",{className:G.grid,children:[e.jsx(g,{children:"Ontime columns"}),e.jsx(g,{children:"Read"}),e.jsx(g,{children:"Write"}),W.map(t=>e.jsxs(d.Fragment,{children:[e.jsx("div",{children:t.label}),e.jsx(_,{checked:!!w[t.value],onCheckedChange:i=>c(t.value,"read",i),disabled:h==="full"||u==="full","data-testid":`read-${t.value}`}),e.jsx(_,{checked:!!R[t.value],onCheckedChange:i=>c(t.value,"write",i),disabled:u==="full","data-testid":`write-${t.value}`})]},t.value))]}),o.length>0&&e.jsxs("div",{className:G.grid,children:[e.jsx(g,{children:"Custom fields"}),e.jsx(g,{children:"Read"}),e.jsx(g,{children:"Write"}),o.map(t=>e.jsxs(d.Fragment,{children:[t.label,e.jsx(_,{checked:!!w[t.value],onCheckedChange:i=>c(t.value,"read",i),disabled:h==="full"||u==="full","data-testid":`read-${t.value}`}),e.jsx(_,{checked:!!R[t.value],onCheckedChange:i=>c(t.value,"write",i),disabled:u==="full","data-testid":`write-${t.value}`})]},t.value))]})]})]})}const Pe="_qrCode_kmiy6_17",Ge="_column_kmiy6_23",Be="_copiableLink_kmiy6_32",qe="_shareInline_kmiy6_39",Ae="_end_kmiy6_45",O={qrCode:Pe,column:Ge,copiableLink:Be,shareInline:qe,end:Ae};function Ve({hostOptions:s,pathOptions:r,presets:n,isLockedToView:o}){var B,q;const[h,l]=d.useState("pending"),[u,$]=d.useState(P),w=d.useRef(null),C=d.useRef(null),R=d.useRef(`cuesheet-${ce()}`),{addPreset:D}=de(),{handleSubmit:z,setError:F,watch:c,setValue:p,reset:L,register:t,formState:{errors:i,isDirty:f}}=re({mode:"onChange",defaultValues:{baseUrl:P,path:o?r[0].value:x.Timer,authenticate:!1,lockConfig:!1,lockNav:!1}}),m=async(a,y)=>{if(y.read==="-")throw new Error("Cannot create a share with no read permissions");return(await D({target:x.Cuesheet,enabled:!0,alias:a,search:"",options:{read:y.read,write:y.write}})).find(U=>U.alias===a)},k=async a=>{var y,T,U;try{if(l("loading"),a.path===x.Cuesheet){const v=await m(a.alias,{read:((y=w.current)==null?void 0:y.value)??"full",write:((T=C.current)==null?void 0:T.value)??"full"});if(!v)throw new Error("Failed to create URL preset for Cuesheet");const b=await M({baseUrl:a.baseUrl,path:a.path,authenticate:a.authenticate,lockConfig:a.lockConfig,lockNav:a.lockNav,preset:v.alias});await H(b),$(b)}else{const v=a.path.startsWith("preset-")?a.path.replace("preset-",""):void 0,b=v?(U=n.find(J=>J.alias===v))==null?void 0:U.target:a.path;if(!b)throw new Error(`Could not resolve preset: ${b}`);const A=await M({baseUrl:je(a.baseUrl),path:b,authenticate:a.authenticate,lockConfig:a.lockConfig,lockNav:a.lockNav,preset:v});await H(A),$(A)}L(a,{keepValues:!0,keepDirty:!1}),l("success")}catch(v){const b=ge(v);F("root",{message:b}),l("error")}},N=f||h!=="success";return e.jsxs("form",{onSubmit:z(k),onKeyDown:a=>ue(a),children:[!o&&e.jsx(ke,{children:"You can generate a link to share with your team or to use in automation (such as companion)."}),e.jsxs("div",{className:O.shareInline,children:[e.jsxs("div",{className:O.column,children:[e.jsxs(he,{children:[V?e.jsx("input",{hidden:!0,readOnly:!0,name:"baseUrl",value:P}):e.jsxs(S,{children:[e.jsx(j,{title:"Host IP",description:`Which IP address will be used${V?" (not applicable in Ontime Cloud)":""}`}),e.jsx(Y,{options:s,value:c("baseUrl"),onValueChange:a=>p("baseUrl",a)})]}),o?e.jsx("input",{type:"hidden",value:c("path")}):e.jsxs(S,{children:[e.jsx(j,{title:"Ontime view",description:"Which view or preset will the link point to"}),e.jsx(Y,{options:r,value:c("path"),onValueChange:a=>p("path",a,{shouldDirty:!0})})]}),c("path")===x.Cuesheet&&e.jsxs(e.Fragment,{children:[e.jsxs(S,{children:[e.jsx(j,{title:"Preset alias",description:"The name of the preset we will create to hold this options",error:(B=i.alias)==null?void 0:B.message}),e.jsx(fe,{defaultValue:R.current,...t("alias",{required:"Alias cannot be empty and must be unique",pattern:{value:Oe,message:"Field can only contain URL safe characters (a-z, 0-9, _ and -)"}})})]}),e.jsx(Te,{readRef:w,writeRef:C})]}),e.jsxs(S,{children:[e.jsx(j,{title:"Lock navigation",description:"Whether to hide the navigation menu"}),e.jsx(_,{size:"large",name:"lockNav","data-testid":"lockNav",checked:c("lockNav"),onCheckedChange:a=>p("lockNav",a,{shouldDirty:!0}),disabled:c("lockConfig")})]}),c("path")!==x.Cuesheet&&e.jsxs(S,{children:[e.jsx(j,{title:"Lock configuration",description:"Whether to hide the configuration panel (also hides navigation)"}),e.jsx(_,{size:"large",name:"lockConfig","data-testid":"lockConfig",checked:c("lockConfig"),onCheckedChange:a=>{a&&p("lockNav",a,{shouldDirty:!0}),p("lockConfig",a,{shouldDirty:!0})}})]}),e.jsxs(S,{children:[e.jsx(j,{title:"Authenticate",description:"Whether the URL should be pre-authenticated"}),e.jsx(_,{size:"large",name:"authenticate","data-testid":"authenticate",checked:c("authenticate"),onCheckedChange:a=>p("authenticate",a,{shouldDirty:!0})})]})]}),e.jsx(me,{children:(q=i.root)==null?void 0:q.message}),e.jsx(pe,{align:"end",className:O.end,children:e.jsx(ve,{type:"submit",variant:N?"primary":"subtle",loading:h==="loading",children:N?"Create share link":"Link copied to clipboard!"})})]}),e.jsxs(be,{className:O.column,children:[e.jsx(g,{children:"Share this link"}),e.jsx(ne,{size:172,value:u,className:O.qrCode}),e.jsx("div",{className:O.copiableLink,"data-testid":"copy-link",children:u}),e.jsx(xe,{copyValue:u,children:"Copy link"})]})]})]})}function ot({lockedPath:s}){const{data:r}=_e(),{data:n}=we({skip:s===void 0}),o=d.useMemo(()=>r.networkInterfaces.map(l=>({value:l.address,label:`${l.name} - ${l.address}`})),[r.networkInterfaces]),h=d.useMemo(()=>s?[{value:s.value,label:s.label}]:[{value:x.Timer,label:"Timer"},{value:x.Cuesheet,label:"Cuesheet"},{value:x.Operator,label:"Operator"},{value:"<<companion>>",label:"Companion"},...n.map(l=>({value:`preset-${l.alias}`,label:`URL Preset: ${l.alias}`}))],[s,n]);return e.jsx(Ve,{hostOptions:o,pathOptions:h,presets:n,isLockedToView:!!s})}const Me="_title_g70eo_17",He="_description_g70eo_24",Q={title:Me,description:He};function ct(){const{data:s}=ye();return!s.title&&!s.description?null:e.jsxs("div",{children:[e.jsx("div",{className:Q.title,children:s.title}),e.jsx("div",{className:Q.description,children:s.description})]})}const Ye="_overview_zh5tn_17",Ze="_isOffline_zh5tn_24",Ke="_info_zh5tn_24",Qe="_nav_zh5tn_39",E={overview:Ye,isOffline:Ze,info:Ke,nav:Qe};function dt({navElements:s,children:r}){const{isOnline:n}=Ce();return e.jsx("div",{className:X([E.overview,!n&&E.isOffline]),children:e.jsxs(le,{children:[e.jsx("div",{className:E.nav,children:s}),e.jsx("div",{className:E.info,children:r})]})})}export{ot as G,dt as O,Z as R,ct as T,nt as a,it as i,rt as s,lt as u};
2
- //# sourceMappingURL=OverviewWrapper-BMuW_wiO.js.map
1
+ import{j as e,aY as ee,aZ as te,a_ as ae,f as se,a$ as ie,h as d,ad as re,ab as ne,av as le}from"./vendor-Cu5xgv5K.js";import{i as X,ah as oe,ae as j,ar as g,b7 as P,b8 as ce,aq as de,O as x,a9 as ue,ac as he,Y as V,ad as S,af as fe,X as me,a7 as pe,B as ve,_ as be,an as xe,b9 as M,ba as H,am as je,ag as ge,al as _e,au as we,bb as Ce}from"./index-5QAOtSTh.js";import{I as ke}from"./useWindowTitle-b5fN0StF.js";import{S as Y}from"./Select-niU9Razm.js";import{S as _,u as ye}from"./useProjectData-CetvEK9E.js";import{u as Se}from"./useCustomFields-BuxKsqGS.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new s.Error().stack;r&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[r]="032dbb79-be26-44f0-8314-9096816e7e99",s._sentryDebugIdIdentifier="sentry-dbid-032dbb79-be26-44f0-8314-9096816e7e99")}catch{}})();const it=/^\d+$/,rt=/^https?:\/\//,nt=/^[a-z0-9]+$/i,Oe=/^[a-zA-Z0-9_-]*$/,Re="_blink_1cc8f_1",Ne="_fourtyfive_1cc8f_13",Ie="_radioGroup_1cc8f_17",$e="_item_1cc8f_23",De="_horizontal_1cc8f_28",Ue="_vertical_1cc8f_35",We="_radio_1cc8f_17",Ee="_indicator_1cc8f_73",I={blink:Re,fourtyfive:Ne,radioGroup:Ie,item:$e,horizontal:De,vertical:Ue,radio:We,indicator:Ee};function Z({items:s,className:r,orientation:n="vertical",onValueChange:o,...h}){return e.jsx(ee,{onValueChange:l=>o==null?void 0:o(l),className:X([I.radioGroup,I[n],r]),...h,children:s.map(l=>e.jsxs("label",{className:I.item,children:[e.jsx(te,{value:l.value.toString(),className:I.radio,children:e.jsx(ae,{className:I.indicator})}),l.label]},l.value.toString()))})}const K={hideTableSeconds:!1,hideIndexColumn:!1,showDelayedTimes:!1,hideDelays:!1},lt=se()(ie(s=>({...K,setOption:(r,n)=>s(o=>({...o,[r]:n})),toggleOption:r=>s(n=>({...n,[r]:!n[r]})),resetOptions:()=>s(K)}),{name:"cuesheet-options"})),W=[{value:"flag",label:"Flag"},{value:"cue",label:"Cue"},{value:"title",label:"Title"},{value:"timeStart",label:"Time start"},{value:"timeEnd",label:"Time end"},{value:"duration",label:"Duration"},{value:"note",label:"Note"}];function ze(s){return Object.entries(s).map(([r,n])=>({value:`custom-${r}`,label:n.label}))}const Fe="_twoCols_1wch9_17",Le="_grid_1wch9_23",G={twoCols:Fe,grid:Le};function Te({readRef:s,writeRef:r}){const{data:n}=Se(),o=d.useMemo(()=>ze(n),[n]),[h,l]=d.useState("full"),[u,$]=d.useState("full"),[w,C]=d.useState(()=>{const t={};return[...W,...o].forEach(i=>{t[i.value]=!0}),t}),[R,D]=d.useState(()=>{const t={};return[...W,...o].forEach(i=>{t[i.value]=!0}),t}),z=t=>{l(t),C(i=>{const f={...i};return Object.keys(f).forEach(m=>{f[m]=!0}),f})},F=t=>{t==="full"&&l("full"),$(t),C(i=>{const f={...i};return D(m=>{const k={...m};return[...W,...o].forEach(N=>{f[N.value]=!0,k[N.value]=!0}),k}),f})},c=(t,i,f)=>{i==="read"?C(m=>({...m,[t]:f})):D(m=>({...m,[t]:f}))},p=()=>h==="full"||u==="full"?"full":Object.entries(w).filter(([t,i])=>i).map(([t])=>t).join(","),L=()=>u==="full"?"full":Object.entries(R).filter(([t,i])=>i).map(([t])=>t).join(",");return e.jsxs(oe,{children:[e.jsx("input",{name:"read",hidden:!0,readOnly:!0,ref:s,value:p()||"-"}),e.jsx("input",{name:"write",hidden:!0,readOnly:!0,ref:r,value:L()||"-"}),e.jsxs("div",{children:[e.jsx(j,{title:"Access mode",description:"Which parts of the data will the link give access to"}),e.jsxs("div",{children:[e.jsx(Z,{value:u,onValueChange:F,orientation:"horizontal",items:[{value:"full",label:"Full write (edit all existing and future columns)"},{value:"custom",label:"Custom write"}]}),e.jsx(Z,{value:h,onValueChange:z,orientation:"horizontal",disabled:u==="full",items:[{value:"full",label:"Full read (view all existing and future columns)"},{value:"custom",label:"Custom read"}]})]})]}),e.jsxs("div",{className:G.twoCols,children:[e.jsxs("div",{className:G.grid,children:[e.jsx(g,{children:"Ontime columns"}),e.jsx(g,{children:"Read"}),e.jsx(g,{children:"Write"}),W.map(t=>e.jsxs(d.Fragment,{children:[e.jsx("div",{children:t.label}),e.jsx(_,{checked:!!w[t.value],onCheckedChange:i=>c(t.value,"read",i),disabled:h==="full"||u==="full","data-testid":`read-${t.value}`}),e.jsx(_,{checked:!!R[t.value],onCheckedChange:i=>c(t.value,"write",i),disabled:u==="full","data-testid":`write-${t.value}`})]},t.value))]}),o.length>0&&e.jsxs("div",{className:G.grid,children:[e.jsx(g,{children:"Custom fields"}),e.jsx(g,{children:"Read"}),e.jsx(g,{children:"Write"}),o.map(t=>e.jsxs(d.Fragment,{children:[t.label,e.jsx(_,{checked:!!w[t.value],onCheckedChange:i=>c(t.value,"read",i),disabled:h==="full"||u==="full","data-testid":`read-${t.value}`}),e.jsx(_,{checked:!!R[t.value],onCheckedChange:i=>c(t.value,"write",i),disabled:u==="full","data-testid":`write-${t.value}`})]},t.value))]})]})]})}const Pe="_qrCode_kmiy6_17",Ge="_column_kmiy6_23",Be="_copiableLink_kmiy6_32",qe="_shareInline_kmiy6_39",Ae="_end_kmiy6_45",O={qrCode:Pe,column:Ge,copiableLink:Be,shareInline:qe,end:Ae};function Ve({hostOptions:s,pathOptions:r,presets:n,isLockedToView:o}){var B,q;const[h,l]=d.useState("pending"),[u,$]=d.useState(P),w=d.useRef(null),C=d.useRef(null),R=d.useRef(`cuesheet-${ce()}`),{addPreset:D}=de(),{handleSubmit:z,setError:F,watch:c,setValue:p,reset:L,register:t,formState:{errors:i,isDirty:f}}=re({mode:"onChange",defaultValues:{baseUrl:P,path:o?r[0].value:x.Timer,authenticate:!1,lockConfig:!1,lockNav:!1}}),m=async(a,y)=>{if(y.read==="-")throw new Error("Cannot create a share with no read permissions");return(await D({target:x.Cuesheet,enabled:!0,alias:a,search:"",options:{read:y.read,write:y.write}})).find(U=>U.alias===a)},k=async a=>{var y,T,U;try{if(l("loading"),a.path===x.Cuesheet){const v=await m(a.alias,{read:((y=w.current)==null?void 0:y.value)??"full",write:((T=C.current)==null?void 0:T.value)??"full"});if(!v)throw new Error("Failed to create URL preset for Cuesheet");const b=await M({baseUrl:a.baseUrl,path:a.path,authenticate:a.authenticate,lockConfig:a.lockConfig,lockNav:a.lockNav,preset:v.alias});await H(b),$(b)}else{const v=a.path.startsWith("preset-")?a.path.replace("preset-",""):void 0,b=v?(U=n.find(J=>J.alias===v))==null?void 0:U.target:a.path;if(!b)throw new Error(`Could not resolve preset: ${b}`);const A=await M({baseUrl:je(a.baseUrl),path:b,authenticate:a.authenticate,lockConfig:a.lockConfig,lockNav:a.lockNav,preset:v});await H(A),$(A)}L(a,{keepValues:!0,keepDirty:!1}),l("success")}catch(v){const b=ge(v);F("root",{message:b}),l("error")}},N=f||h!=="success";return e.jsxs("form",{onSubmit:z(k),onKeyDown:a=>ue(a),children:[!o&&e.jsx(ke,{children:"You can generate a link to share with your team or to use in automation (such as companion)."}),e.jsxs("div",{className:O.shareInline,children:[e.jsxs("div",{className:O.column,children:[e.jsxs(he,{children:[V?e.jsx("input",{hidden:!0,readOnly:!0,name:"baseUrl",value:P}):e.jsxs(S,{children:[e.jsx(j,{title:"Host IP",description:`Which IP address will be used${V?" (not applicable in Ontime Cloud)":""}`}),e.jsx(Y,{options:s,value:c("baseUrl"),onValueChange:a=>p("baseUrl",a)})]}),o?e.jsx("input",{type:"hidden",value:c("path")}):e.jsxs(S,{children:[e.jsx(j,{title:"Ontime view",description:"Which view or preset will the link point to"}),e.jsx(Y,{options:r,value:c("path"),onValueChange:a=>p("path",a,{shouldDirty:!0})})]}),c("path")===x.Cuesheet&&e.jsxs(e.Fragment,{children:[e.jsxs(S,{children:[e.jsx(j,{title:"Preset alias",description:"The name of the preset we will create to hold this options",error:(B=i.alias)==null?void 0:B.message}),e.jsx(fe,{defaultValue:R.current,...t("alias",{required:"Alias cannot be empty and must be unique",pattern:{value:Oe,message:"Field can only contain URL safe characters (a-z, 0-9, _ and -)"}})})]}),e.jsx(Te,{readRef:w,writeRef:C})]}),e.jsxs(S,{children:[e.jsx(j,{title:"Lock navigation",description:"Whether to hide the navigation menu"}),e.jsx(_,{size:"large",name:"lockNav","data-testid":"lockNav",checked:c("lockNav"),onCheckedChange:a=>p("lockNav",a,{shouldDirty:!0}),disabled:c("lockConfig")})]}),c("path")!==x.Cuesheet&&e.jsxs(S,{children:[e.jsx(j,{title:"Lock configuration",description:"Whether to hide the configuration panel (also hides navigation)"}),e.jsx(_,{size:"large",name:"lockConfig","data-testid":"lockConfig",checked:c("lockConfig"),onCheckedChange:a=>{a&&p("lockNav",a,{shouldDirty:!0}),p("lockConfig",a,{shouldDirty:!0})}})]}),e.jsxs(S,{children:[e.jsx(j,{title:"Authenticate",description:"Whether the URL should be pre-authenticated"}),e.jsx(_,{size:"large",name:"authenticate","data-testid":"authenticate",checked:c("authenticate"),onCheckedChange:a=>p("authenticate",a,{shouldDirty:!0})})]})]}),e.jsx(me,{children:(q=i.root)==null?void 0:q.message}),e.jsx(pe,{align:"end",className:O.end,children:e.jsx(ve,{type:"submit",variant:N?"primary":"subtle",loading:h==="loading",children:N?"Create share link":"Link copied to clipboard!"})})]}),e.jsxs(be,{className:O.column,children:[e.jsx(g,{children:"Share this link"}),e.jsx(ne,{size:172,value:u,className:O.qrCode}),e.jsx("div",{className:O.copiableLink,"data-testid":"copy-link",children:u}),e.jsx(xe,{copyValue:u,children:"Copy link"})]})]})]})}function ot({lockedPath:s}){const{data:r}=_e(),{data:n}=we({skip:s===void 0}),o=d.useMemo(()=>r.networkInterfaces.map(l=>({value:l.address,label:`${l.name} - ${l.address}`})),[r.networkInterfaces]),h=d.useMemo(()=>s?[{value:s.value,label:s.label}]:[{value:x.Timer,label:"Timer"},{value:x.Cuesheet,label:"Cuesheet"},{value:x.Operator,label:"Operator"},{value:"<<companion>>",label:"Companion"},...n.map(l=>({value:`preset-${l.alias}`,label:`URL Preset: ${l.alias}`}))],[s,n]);return e.jsx(Ve,{hostOptions:o,pathOptions:h,presets:n,isLockedToView:!!s})}const Me="_title_g70eo_17",He="_description_g70eo_24",Q={title:Me,description:He};function ct(){const{data:s}=ye();return!s.title&&!s.description?null:e.jsxs("div",{children:[e.jsx("div",{className:Q.title,children:s.title}),e.jsx("div",{className:Q.description,children:s.description})]})}const Ye="_overview_zh5tn_17",Ze="_isOffline_zh5tn_24",Ke="_info_zh5tn_24",Qe="_nav_zh5tn_39",E={overview:Ye,isOffline:Ze,info:Ke,nav:Qe};function dt({navElements:s,children:r}){const{isOnline:n}=Ce();return e.jsx("div",{className:X([E.overview,!n&&E.isOffline]),children:e.jsxs(le,{children:[e.jsx("div",{className:E.nav,children:s}),e.jsx("div",{className:E.info,children:r})]})})}export{ot as G,dt as O,Z as R,ct as T,nt as a,it as i,rt as s,lt as u};
2
+ //# sourceMappingURL=OverviewWrapper-riM6vPno.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OverviewWrapper-BMuW_wiO.js","sources":["../../src/common/utils/regex.ts","../../src/common/components/radio-group/RadioGroup.tsx","../../src/views/cuesheet/cuesheet.options.ts","../../src/features/sharing/composite/CuesheetLinkOptions.tsx","../../src/features/sharing/GenerateLinkForm.tsx","../../src/features/sharing/GenerateLinkFormExport.tsx","../../src/features/overview/composite/TitleOverview.tsx","../../src/features/overview/OverviewWrapper.tsx"],"sourcesContent":["/**\n * Simple regex patterns for common use cases\n * mostly used in form validation\n */\n\nexport const isOnlyNumbers = /^\\d+$/;\nexport const isIPAddress = /^((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}$/;\nexport const startsWithHttp = /^https?:\\/\\//;\nexport const startsWithSlash = /^\\//;\nexport const isAlphanumeric = /^[a-z0-9]+$/i;\nexport const isASCII = /^[ -~]+$/; //https://catonmat.net/my-favorite-regex\nexport const isASCIIorEmpty = /^$|^[ -~]+$/; //https://catonmat.net/my-favorite-regex\nexport const isNotEmpty = /\\S/;\nexport const isUrlSafe = /^[a-zA-Z0-9_-]*$/; // https://stackoverflow.com/questions/24419067/validate-a-string-to-be-url-safe-using-regex\n","import { Radio } from '@base-ui-components/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui-components/react/radio-group';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './RadioGroup.module.scss';\n\ninterface RadioGroupProps<T extends string | number | boolean> extends Omit<BaseRadioGroup.Props, 'onValueChange'> {\n items: {\n value: T;\n label: string;\n }[];\n onValueChange?: (value: T) => void;\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport default function RadioGroup<T extends string | number | boolean>({\n items,\n className,\n orientation = 'vertical',\n onValueChange,\n ...elementProps\n}: RadioGroupProps<T>) {\n return (\n <BaseRadioGroup\n onValueChange={(value) => onValueChange?.(value as T)}\n className={cx([style.radioGroup, style[orientation], className])}\n {...elementProps}\n >\n {items.map((item) => (\n <label className={style.item} key={item.value.toString()}>\n <Radio.Root value={item.value.toString()} className={style.radio}>\n <Radio.Indicator className={style.indicator} />\n </Radio.Root>\n {item.label}\n </label>\n ))}\n </BaseRadioGroup>\n );\n}\n","import { CustomFields } from 'ontime-types';\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\ntype OptionValues = {\n hideTableSeconds: boolean;\n hideIndexColumn: boolean;\n showDelayedTimes: boolean;\n hideDelays: boolean;\n};\n\nconst defaultOptions: OptionValues = {\n hideTableSeconds: false,\n hideIndexColumn: false,\n showDelayedTimes: false,\n hideDelays: false,\n};\n\nexport type CuesheetOptionKeys = keyof OptionValues;\n\nexport interface CuesheetOptions extends OptionValues {\n setOption: <K extends CuesheetOptionKeys>(key: K, value: OptionValues[K]) => void;\n toggleOption: (key: CuesheetOptionKeys) => void;\n resetOptions: () => void;\n}\n\nexport const usePersistedCuesheetOptions = create<CuesheetOptions>()(\n persist(\n (set) => {\n return {\n ...defaultOptions,\n setOption: (key, value) => set((state) => ({ ...state, [key]: value })),\n toggleOption: (key) => set((state) => ({ ...state, [key]: !state[key] })),\n resetOptions: () => set(defaultOptions),\n };\n },\n {\n name: 'cuesheet-options',\n },\n ),\n);\n\nexport const cuesheetDefaultColumns = [\n { value: 'flag', label: 'Flag' },\n { value: 'cue', label: 'Cue' },\n { value: 'title', label: 'Title' },\n { value: 'timeStart', label: 'Time start' },\n { value: 'timeEnd', label: 'Time end' },\n { value: 'duration', label: 'Duration' },\n { value: 'note', label: 'Note' },\n];\n\nexport function makeCuesheetCustomColumns(customFields: CustomFields) {\n return Object.entries(customFields).map(([key, field]) => {\n return {\n value: `custom-${key}`,\n label: field.label,\n };\n });\n}\n","import { Fragment, RefObject, useMemo, useState } from 'react';\n\nimport RadioGroup from '../../../common/components/radio-group/RadioGroup';\nimport Switch from '../../../common/components/switch/Switch';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\nimport { cuesheetDefaultColumns, makeCuesheetCustomColumns } from '../../../views/cuesheet/cuesheet.options';\nimport * as Panel from '../../app-settings/panel-utils/PanelUtils';\n\nimport style from './CuesheetLinkOptions.module.scss';\n\ntype AccessMode = 'full' | 'custom';\n\ninterface CuesheetLinkOptionsProps {\n readRef?: RefObject<HTMLInputElement | null>;\n writeRef?: RefObject<HTMLInputElement | null>;\n}\n\nexport default function CuesheetLinkOptions({ readRef, writeRef }: CuesheetLinkOptionsProps) {\n const { data } = useCustomFields();\n const customFieldColumns = useMemo(() => makeCuesheetCustomColumns(data), [data]);\n\n const [readPermissions, setReadPermissions] = useState<AccessMode>('full');\n const [writePermissions, setWritePermissions] = useState<AccessMode>('full');\n\n const [readSwitches, setReadSwitches] = useState<Record<string, boolean>>(() => {\n const initialState: Record<string, boolean> = {};\n [...cuesheetDefaultColumns, ...customFieldColumns].forEach((column) => {\n initialState[column.value] = true;\n });\n return initialState;\n });\n\n const [writeSwitches, setWriteSwitches] = useState<Record<string, boolean>>(() => {\n const initialState: Record<string, boolean> = {};\n [...cuesheetDefaultColumns, ...customFieldColumns].forEach((column) => {\n initialState[column.value] = true;\n });\n return initialState;\n });\n\n const handleReadModeChange = (value: AccessMode) => {\n setReadPermissions(value);\n\n setReadSwitches((prevReadSwitches) => {\n const updatedReadSwitches = { ...prevReadSwitches };\n Object.keys(updatedReadSwitches).forEach((key) => {\n updatedReadSwitches[key] = true;\n });\n return updatedReadSwitches;\n });\n };\n\n const handleWriteModeChange = (value: AccessMode) => {\n if (value === 'full') {\n setReadPermissions('full');\n }\n setWritePermissions(value);\n\n setReadSwitches((prevReadSwitches) => {\n const updatedReadSwitches = { ...prevReadSwitches };\n setWriteSwitches((prevWriteSwitches) => {\n const updatedWriteSwitches = { ...prevWriteSwitches };\n [...cuesheetDefaultColumns, ...customFieldColumns].forEach((column) => {\n updatedReadSwitches[column.value] = true;\n updatedWriteSwitches[column.value] = true;\n });\n return updatedWriteSwitches;\n });\n return updatedReadSwitches;\n });\n };\n\n const handleSwitchChange = (key: string, type: 'read' | 'write', value: boolean) => {\n if (type === 'read') {\n setReadSwitches((prevReadSwitches) => {\n const updatedReadSwitches = { ...prevReadSwitches, [key]: value };\n return updatedReadSwitches;\n });\n } else {\n setWriteSwitches((prevWriteSwitches) => {\n const updatedWriteSwitches = { ...prevWriteSwitches, [key]: value };\n return updatedWriteSwitches;\n });\n }\n };\n\n const getReadPermissions = () => {\n if (readPermissions === 'full' || writePermissions === 'full') {\n return 'full';\n }\n\n return Object.entries(readSwitches)\n .filter(([_, value]) => value)\n .map(([key]) => key)\n .join(',');\n };\n\n const getWritePermissions = () => {\n if (writePermissions === 'full') {\n return 'full';\n }\n\n return Object.entries(writeSwitches)\n .filter(([_, value]) => value)\n .map(([key]) => key)\n .join(',');\n };\n\n return (\n <Panel.Indent>\n <input name='read' hidden readOnly ref={readRef} value={getReadPermissions() || '-'} />\n <input name='write' hidden readOnly ref={writeRef} value={getWritePermissions() || '-'} />\n <div>\n <Panel.Field title='Access mode' description='Which parts of the data will the link give access to' />\n <div>\n <RadioGroup\n value={writePermissions}\n onValueChange={handleWriteModeChange}\n orientation='horizontal'\n items={[\n { value: 'full', label: 'Full write (edit all existing and future columns)' },\n { value: 'custom', label: 'Custom write' },\n ]}\n />\n <RadioGroup\n value={readPermissions}\n onValueChange={handleReadModeChange}\n orientation='horizontal'\n disabled={writePermissions === 'full'}\n items={[\n { value: 'full', label: 'Full read (view all existing and future columns)' },\n { value: 'custom', label: 'Custom read' },\n ]}\n />\n </div>\n </div>\n <div className={style.twoCols}>\n <div className={style.grid}>\n <Panel.Description>Ontime columns</Panel.Description>\n <Panel.Description>Read</Panel.Description>\n <Panel.Description>Write</Panel.Description>\n {cuesheetDefaultColumns.map((column) => (\n <Fragment key={column.value}>\n <div>{column.label}</div>\n <Switch\n checked={Boolean(readSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'read', value)}\n disabled={readPermissions === 'full' || writePermissions === 'full'}\n data-testid={`read-${column.value}`}\n />\n <Switch\n checked={Boolean(writeSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'write', value)}\n disabled={writePermissions === 'full'}\n data-testid={`write-${column.value}`}\n />\n </Fragment>\n ))}\n </div>\n {customFieldColumns.length > 0 && (\n <div className={style.grid}>\n <Panel.Description>Custom fields</Panel.Description>\n <Panel.Description>Read</Panel.Description>\n <Panel.Description>Write</Panel.Description>\n {customFieldColumns.map((column) => (\n <Fragment key={column.value}>\n {column.label}\n <Switch\n checked={Boolean(readSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'read', value)}\n disabled={readPermissions === 'full' || writePermissions === 'full'}\n data-testid={`read-${column.value}`}\n />\n <Switch\n checked={Boolean(writeSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'write', value)}\n disabled={writePermissions === 'full'}\n data-testid={`write-${column.value}`}\n />\n </Fragment>\n ))}\n </div>\n )}\n </div>\n </Panel.Indent>\n );\n}\n","import { useRef, useState } from 'react';\nimport { FieldErrors, useForm } from 'react-hook-form';\nimport QRCode from 'react-qr-code';\nimport { OntimeView, URLPreset } from 'ontime-types';\nimport { generateId } from 'ontime-utils';\n\nimport { generateUrl } from '../../common/api/session';\nimport { maybeAxiosError } from '../../common/api/utils';\nimport Button from '../../common/components/buttons/Button';\nimport CopyTag from '../../common/components/copy-tag/CopyTag';\nimport Info from '../../common/components/info/Info';\nimport Input from '../../common/components/input/input/Input';\nimport Select from '../../common/components/select/Select';\nimport Switch from '../../common/components/switch/Switch';\nimport { useUpdateUrlPreset } from '../../common/hooks-query/useUrlPresets';\nimport copyToClipboard from '../../common/utils/copyToClipboard';\nimport { preventEscape } from '../../common/utils/keyEvent';\nimport { linkToOtherHost } from '../../common/utils/linkUtils';\nimport { isUrlSafe } from '../../common/utils/regex';\nimport { isOntimeCloud, serverURL } from '../../externals';\nimport * as Panel from '../app-settings/panel-utils/PanelUtils';\n\nimport CuesheetLinkOptions from './composite/CuesheetLinkOptions';\n\nimport style from './GenerateLinkForm.module.scss';\n\ninterface GenerateLinkFormProps {\n hostOptions: { value: string; label: string }[];\n pathOptions: { value: OntimeView | string; label: string }[];\n presets: URLPreset[];\n isLockedToView?: boolean;\n}\n\ntype GenericLinkOptions = {\n baseUrl: string;\n path: OntimeView | string; // we use empty string for Companion view\n authenticate: boolean;\n lockConfig: boolean;\n lockNav: boolean;\n};\n\ntype CuesheetLinkOptions = GenericLinkOptions & {\n path: OntimeView.Cuesheet;\n\n alias: string;\n options: {\n read?: string;\n write?: string;\n };\n};\n\ntype GenerateLinkFormOptions = GenericLinkOptions | CuesheetLinkOptions;\n\ntype GenerateLinkState = 'pending' | 'loading' | 'success' | 'error';\n\nexport default function GenerateLinkForm({ hostOptions, pathOptions, presets, isLockedToView }: GenerateLinkFormProps) {\n const [formState, setFormState] = useState<GenerateLinkState>('pending');\n const [url, setUrl] = useState(serverURL);\n const cuesheetReadRef = useRef<HTMLInputElement>(null);\n const cuesheetWriteRef = useRef<HTMLInputElement>(null);\n const generatedAlias = useRef<string>(`cuesheet-${generateId()}`);\n\n const { addPreset } = useUpdateUrlPreset();\n\n const {\n handleSubmit,\n setError,\n watch,\n setValue,\n reset,\n register,\n formState: { errors, isDirty },\n } = useForm<GenerateLinkFormOptions>({\n mode: 'onChange',\n defaultValues: {\n baseUrl: serverURL,\n path: isLockedToView ? pathOptions[0].value : OntimeView.Timer,\n authenticate: false,\n lockConfig: false,\n lockNav: false,\n },\n });\n\n /**\n * If the user is generating a link to the cuesheet we gather extra options\n * The extra options are saved into a URL preset which we then request a share link for\n */\n const createPresetFromOptions = async (\n alias: string,\n options: Required<CuesheetLinkOptions['options']>,\n ): Promise<URLPreset | undefined> => {\n if (options.read === '-') {\n throw new Error('Cannot create a share with no read permissions');\n }\n const presets = await addPreset({\n target: OntimeView.Cuesheet,\n enabled: true,\n alias,\n search: '',\n options: {\n read: options.read,\n write: options.write,\n },\n });\n return presets.find((preset) => preset.alias === alias);\n };\n\n const onSubmit = async (options: GenerateLinkFormOptions) => {\n try {\n setFormState('loading');\n if (options.path === OntimeView.Cuesheet) {\n const urlPreset = await createPresetFromOptions((options as CuesheetLinkOptions).alias, {\n read: cuesheetReadRef.current?.value ?? 'full',\n write: cuesheetWriteRef.current?.value ?? 'full',\n });\n\n if (!urlPreset) {\n throw new Error('Failed to create URL preset for Cuesheet');\n }\n\n const url = await generateUrl({\n baseUrl: options.baseUrl,\n path: options.path,\n authenticate: options.authenticate,\n lockConfig: options.lockConfig,\n lockNav: options.lockNav,\n preset: urlPreset.alias,\n });\n await copyToClipboard(url);\n setUrl(url);\n } else {\n const presetPath = options.path.startsWith('preset-') ? options.path.replace('preset-', '') : undefined;\n const path = presetPath ? presets.find((preset) => preset.alias === presetPath)?.target : options.path;\n if (!path) {\n throw new Error(`Could not resolve preset: ${path}`);\n }\n\n const url = await generateUrl({\n baseUrl: linkToOtherHost(options.baseUrl),\n path,\n authenticate: options.authenticate,\n lockConfig: options.lockConfig,\n lockNav: options.lockNav,\n preset: presetPath,\n });\n\n await copyToClipboard(url);\n setUrl(url);\n }\n reset(options, {\n keepValues: true,\n keepDirty: false,\n });\n setFormState('success');\n } catch (error) {\n const message = maybeAxiosError(error);\n setError('root', { message });\n setFormState('error');\n }\n };\n\n const canSubmit = isDirty || formState !== 'success';\n\n return (\n <form onSubmit={handleSubmit(onSubmit)} onKeyDown={(event) => preventEscape(event)}>\n {!isLockedToView && (\n <Info>You can generate a link to share with your team or to use in automation (such as companion).</Info>\n )}\n <div className={style.shareInline}>\n <div className={style.column}>\n <Panel.ListGroup>\n {isOntimeCloud ? (\n <input hidden readOnly name='baseUrl' value={serverURL} />\n ) : (\n <Panel.ListItem>\n <Panel.Field\n title='Host IP'\n description={`Which IP address will be used${isOntimeCloud ? ' (not applicable in Ontime Cloud)' : ''}`}\n />\n <Select\n options={hostOptions}\n value={watch('baseUrl')}\n onValueChange={(value) => setValue('baseUrl', value)}\n />\n </Panel.ListItem>\n )}\n {isLockedToView ? (\n <input type='hidden' value={watch('path')} />\n ) : (\n <Panel.ListItem>\n <Panel.Field title='Ontime view' description='Which view or preset will the link point to' />\n <Select\n options={pathOptions}\n value={watch('path')}\n onValueChange={(value) => setValue('path', value, { shouldDirty: true })}\n />\n </Panel.ListItem>\n )}\n\n {watch('path') === OntimeView.Cuesheet && (\n <>\n <Panel.ListItem>\n <Panel.Field\n title='Preset alias'\n description='The name of the preset we will create to hold this options'\n error={(errors as FieldErrors<CuesheetLinkOptions>).alias?.message}\n />\n <Input\n defaultValue={generatedAlias.current}\n {...register('alias', {\n required: 'Alias cannot be empty and must be unique',\n pattern: {\n value: isUrlSafe,\n message: 'Field can only contain URL safe characters (a-z, 0-9, _ and -)',\n },\n })}\n />\n </Panel.ListItem>\n <CuesheetLinkOptions readRef={cuesheetReadRef} writeRef={cuesheetWriteRef} />\n </>\n )}\n\n <Panel.ListItem>\n <Panel.Field title='Lock navigation' description='Whether to hide the navigation menu' />\n <Switch\n size='large'\n name='lockNav'\n data-testid='lockNav'\n checked={watch('lockNav')}\n onCheckedChange={(checked) => setValue('lockNav', checked, { shouldDirty: true })}\n disabled={watch('lockConfig')}\n />\n </Panel.ListItem>\n {watch('path') !== OntimeView.Cuesheet && (\n <Panel.ListItem>\n <Panel.Field\n title='Lock configuration'\n description='Whether to hide the configuration panel (also hides navigation)'\n />\n <Switch\n size='large'\n name='lockConfig'\n data-testid='lockConfig'\n checked={watch('lockConfig')}\n onCheckedChange={(checked) => {\n if (checked) {\n setValue('lockNav', checked, { shouldDirty: true });\n }\n setValue('lockConfig', checked, { shouldDirty: true });\n }}\n />\n </Panel.ListItem>\n )}\n <Panel.ListItem>\n <Panel.Field title='Authenticate' description='Whether the URL should be pre-authenticated' />\n <Switch\n size='large'\n name='authenticate'\n data-testid='authenticate'\n checked={watch('authenticate')}\n onCheckedChange={(checked) => setValue('authenticate', checked, { shouldDirty: true })}\n />\n </Panel.ListItem>\n </Panel.ListGroup>\n <Panel.Error>{errors.root?.message}</Panel.Error>\n <Panel.InlineElements align='end' className={style.end}>\n <Button type='submit' variant={canSubmit ? 'primary' : 'subtle'} loading={formState === 'loading'}>\n {canSubmit ? 'Create share link' : 'Link copied to clipboard!'}\n </Button>\n </Panel.InlineElements>\n </div>\n <Panel.Section className={style.column}>\n <Panel.Description>Share this link</Panel.Description>\n <QRCode size={172} value={url} className={style.qrCode} />\n <div className={style.copiableLink} data-testid='copy-link'>\n {url}\n </div>\n <CopyTag copyValue={url}>Copy link</CopyTag>\n </Panel.Section>\n </div>\n </form>\n );\n}\n","import { useMemo } from 'react';\nimport { OntimeView } from 'ontime-types';\n\nimport useInfo from '../../common/hooks-query/useInfo';\nimport useUrlPresets from '../../common/hooks-query/useUrlPresets';\n\nimport GenerateLinkForm from './GenerateLinkForm';\n\ninterface GenerateLinkFormExportProps {\n lockedPath?: { value: OntimeView; label: string };\n}\n\nexport default function GenerateLinkFormExport({ lockedPath }: GenerateLinkFormExportProps) {\n const { data: infoData } = useInfo();\n const { data: urlPresetData } = useUrlPresets({ skip: lockedPath === undefined });\n\n const hostOptions = useMemo(() => {\n return infoData.networkInterfaces.map((nif) => ({\n value: nif.address,\n label: `${nif.name} - ${nif.address}`,\n }));\n }, [infoData.networkInterfaces]);\n\n const pathOptions = useMemo(() => {\n if (lockedPath) {\n return [{ value: lockedPath.value, label: lockedPath.label }];\n }\n return [\n { value: OntimeView.Timer, label: 'Timer' },\n { value: OntimeView.Cuesheet, label: 'Cuesheet' },\n { value: OntimeView.Operator, label: 'Operator' },\n { value: '<<companion>>', label: 'Companion' },\n ...urlPresetData.map((preset) => ({\n value: `preset-${preset.alias}`,\n label: `URL Preset: ${preset.alias}`,\n })),\n ];\n }, [lockedPath, urlPresetData]);\n\n return (\n <GenerateLinkForm\n hostOptions={hostOptions}\n pathOptions={pathOptions}\n presets={urlPresetData}\n isLockedToView={Boolean(lockedPath)}\n />\n );\n}\n","import useProjectData from '../../../common/hooks-query/useProjectData';\n\nimport style from './TitleOverview.module.scss';\n\nexport default function TitleOverview() {\n const { data } = useProjectData();\n\n if (!data.title && !data.description) {\n return null;\n }\n\n return (\n <div>\n <div className={style.title}>{data.title}</div>\n <div className={style.description}>{data.description}</div>\n </div>\n );\n}\n","import { PropsWithChildren, ReactNode } from 'react';\nimport { ErrorBoundary } from '@sentry/react';\n\nimport { useIsOnline } from '../../common/hooks/useSocket';\nimport { cx } from '../../common/utils/styleUtils';\n\nimport style from './Overview.module.scss';\n\ninterface OverviewWrapperProps {\n navElements: ReactNode;\n}\n\nexport function OverviewWrapper({ navElements, children }: PropsWithChildren<OverviewWrapperProps>) {\n const { isOnline } = useIsOnline();\n return (\n <div className={cx([style.overview, !isOnline && style.isOffline])}>\n <ErrorBoundary>\n <div className={style.nav}>{navElements}</div>\n <div className={style.info}>{children}</div>\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["isOnlyNumbers","startsWithHttp","isAlphanumeric","isUrlSafe","RadioGroup","items","className","orientation","onValueChange","elementProps","jsx","BaseRadioGroup","value","cx","style","item","Radio.Root","Radio.Indicator","defaultOptions","usePersistedCuesheetOptions","create","persist","set","key","state","cuesheetDefaultColumns","makeCuesheetCustomColumns","customFields","field","CuesheetLinkOptions","readRef","writeRef","data","useCustomFields","customFieldColumns","useMemo","readPermissions","setReadPermissions","useState","writePermissions","setWritePermissions","readSwitches","setReadSwitches","initialState","column","writeSwitches","setWriteSwitches","handleReadModeChange","prevReadSwitches","updatedReadSwitches","handleWriteModeChange","prevWriteSwitches","updatedWriteSwitches","handleSwitchChange","type","getReadPermissions","_","getWritePermissions","jsxs","Panel.Indent","Panel.Field","Panel.Description","Fragment","Switch","GenerateLinkForm","hostOptions","pathOptions","presets","isLockedToView","formState","setFormState","url","setUrl","serverURL","cuesheetReadRef","useRef","cuesheetWriteRef","generatedAlias","generateId","addPreset","useUpdateUrlPreset","handleSubmit","setError","watch","setValue","reset","register","errors","isDirty","useForm","OntimeView","createPresetFromOptions","alias","options","preset","onSubmit","urlPreset","_a","_b","generateUrl","copyToClipboard","presetPath","path","_c","linkToOtherHost","error","message","maybeAxiosError","canSubmit","event","preventEscape","Info","Panel.ListGroup","isOntimeCloud","Panel.ListItem","Select","Input","checked","Panel.Error","Panel.InlineElements","Button","Panel.Section","QRCode","CopyTag","GenerateLinkFormExport","lockedPath","infoData","useInfo","urlPresetData","useUrlPresets","nif","TitleOverview","useProjectData","OverviewWrapper","navElements","children","isOnline","useIsOnline","ErrorBoundary"],"mappings":"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"}
1
+ {"version":3,"file":"OverviewWrapper-riM6vPno.js","sources":["../../src/common/utils/regex.ts","../../src/common/components/radio-group/RadioGroup.tsx","../../src/views/cuesheet/cuesheet.options.ts","../../src/features/sharing/composite/CuesheetLinkOptions.tsx","../../src/features/sharing/GenerateLinkForm.tsx","../../src/features/sharing/GenerateLinkFormExport.tsx","../../src/features/overview/composite/TitleOverview.tsx","../../src/features/overview/OverviewWrapper.tsx"],"sourcesContent":["/**\n * Simple regex patterns for common use cases\n * mostly used in form validation\n */\n\nexport const isOnlyNumbers = /^\\d+$/;\nexport const isIPAddress = /^((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}$/;\nexport const startsWithHttp = /^https?:\\/\\//;\nexport const startsWithSlash = /^\\//;\nexport const isAlphanumeric = /^[a-z0-9]+$/i;\nexport const isASCII = /^[ -~]+$/; //https://catonmat.net/my-favorite-regex\nexport const isASCIIorEmpty = /^$|^[ -~]+$/; //https://catonmat.net/my-favorite-regex\nexport const isNotEmpty = /\\S/;\nexport const isUrlSafe = /^[a-zA-Z0-9_-]*$/; // https://stackoverflow.com/questions/24419067/validate-a-string-to-be-url-safe-using-regex\n","import { Radio } from '@base-ui-components/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui-components/react/radio-group';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './RadioGroup.module.scss';\n\ninterface RadioGroupProps<T extends string | number | boolean> extends Omit<BaseRadioGroup.Props, 'onValueChange'> {\n items: {\n value: T;\n label: string;\n }[];\n onValueChange?: (value: T) => void;\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport default function RadioGroup<T extends string | number | boolean>({\n items,\n className,\n orientation = 'vertical',\n onValueChange,\n ...elementProps\n}: RadioGroupProps<T>) {\n return (\n <BaseRadioGroup\n onValueChange={(value) => onValueChange?.(value as T)}\n className={cx([style.radioGroup, style[orientation], className])}\n {...elementProps}\n >\n {items.map((item) => (\n <label className={style.item} key={item.value.toString()}>\n <Radio.Root value={item.value.toString()} className={style.radio}>\n <Radio.Indicator className={style.indicator} />\n </Radio.Root>\n {item.label}\n </label>\n ))}\n </BaseRadioGroup>\n );\n}\n","import { CustomFields } from 'ontime-types';\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\ntype OptionValues = {\n hideTableSeconds: boolean;\n hideIndexColumn: boolean;\n showDelayedTimes: boolean;\n hideDelays: boolean;\n};\n\nconst defaultOptions: OptionValues = {\n hideTableSeconds: false,\n hideIndexColumn: false,\n showDelayedTimes: false,\n hideDelays: false,\n};\n\nexport type CuesheetOptionKeys = keyof OptionValues;\n\nexport interface CuesheetOptions extends OptionValues {\n setOption: <K extends CuesheetOptionKeys>(key: K, value: OptionValues[K]) => void;\n toggleOption: (key: CuesheetOptionKeys) => void;\n resetOptions: () => void;\n}\n\nexport const usePersistedCuesheetOptions = create<CuesheetOptions>()(\n persist(\n (set) => {\n return {\n ...defaultOptions,\n setOption: (key, value) => set((state) => ({ ...state, [key]: value })),\n toggleOption: (key) => set((state) => ({ ...state, [key]: !state[key] })),\n resetOptions: () => set(defaultOptions),\n };\n },\n {\n name: 'cuesheet-options',\n },\n ),\n);\n\nexport const cuesheetDefaultColumns = [\n { value: 'flag', label: 'Flag' },\n { value: 'cue', label: 'Cue' },\n { value: 'title', label: 'Title' },\n { value: 'timeStart', label: 'Time start' },\n { value: 'timeEnd', label: 'Time end' },\n { value: 'duration', label: 'Duration' },\n { value: 'note', label: 'Note' },\n];\n\nexport function makeCuesheetCustomColumns(customFields: CustomFields) {\n return Object.entries(customFields).map(([key, field]) => {\n return {\n value: `custom-${key}`,\n label: field.label,\n };\n });\n}\n","import { Fragment, RefObject, useMemo, useState } from 'react';\n\nimport RadioGroup from '../../../common/components/radio-group/RadioGroup';\nimport Switch from '../../../common/components/switch/Switch';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\nimport { cuesheetDefaultColumns, makeCuesheetCustomColumns } from '../../../views/cuesheet/cuesheet.options';\nimport * as Panel from '../../app-settings/panel-utils/PanelUtils';\n\nimport style from './CuesheetLinkOptions.module.scss';\n\ntype AccessMode = 'full' | 'custom';\n\ninterface CuesheetLinkOptionsProps {\n readRef?: RefObject<HTMLInputElement | null>;\n writeRef?: RefObject<HTMLInputElement | null>;\n}\n\nexport default function CuesheetLinkOptions({ readRef, writeRef }: CuesheetLinkOptionsProps) {\n const { data } = useCustomFields();\n const customFieldColumns = useMemo(() => makeCuesheetCustomColumns(data), [data]);\n\n const [readPermissions, setReadPermissions] = useState<AccessMode>('full');\n const [writePermissions, setWritePermissions] = useState<AccessMode>('full');\n\n const [readSwitches, setReadSwitches] = useState<Record<string, boolean>>(() => {\n const initialState: Record<string, boolean> = {};\n [...cuesheetDefaultColumns, ...customFieldColumns].forEach((column) => {\n initialState[column.value] = true;\n });\n return initialState;\n });\n\n const [writeSwitches, setWriteSwitches] = useState<Record<string, boolean>>(() => {\n const initialState: Record<string, boolean> = {};\n [...cuesheetDefaultColumns, ...customFieldColumns].forEach((column) => {\n initialState[column.value] = true;\n });\n return initialState;\n });\n\n const handleReadModeChange = (value: AccessMode) => {\n setReadPermissions(value);\n\n setReadSwitches((prevReadSwitches) => {\n const updatedReadSwitches = { ...prevReadSwitches };\n Object.keys(updatedReadSwitches).forEach((key) => {\n updatedReadSwitches[key] = true;\n });\n return updatedReadSwitches;\n });\n };\n\n const handleWriteModeChange = (value: AccessMode) => {\n if (value === 'full') {\n setReadPermissions('full');\n }\n setWritePermissions(value);\n\n setReadSwitches((prevReadSwitches) => {\n const updatedReadSwitches = { ...prevReadSwitches };\n setWriteSwitches((prevWriteSwitches) => {\n const updatedWriteSwitches = { ...prevWriteSwitches };\n [...cuesheetDefaultColumns, ...customFieldColumns].forEach((column) => {\n updatedReadSwitches[column.value] = true;\n updatedWriteSwitches[column.value] = true;\n });\n return updatedWriteSwitches;\n });\n return updatedReadSwitches;\n });\n };\n\n const handleSwitchChange = (key: string, type: 'read' | 'write', value: boolean) => {\n if (type === 'read') {\n setReadSwitches((prevReadSwitches) => {\n const updatedReadSwitches = { ...prevReadSwitches, [key]: value };\n return updatedReadSwitches;\n });\n } else {\n setWriteSwitches((prevWriteSwitches) => {\n const updatedWriteSwitches = { ...prevWriteSwitches, [key]: value };\n return updatedWriteSwitches;\n });\n }\n };\n\n const getReadPermissions = () => {\n if (readPermissions === 'full' || writePermissions === 'full') {\n return 'full';\n }\n\n return Object.entries(readSwitches)\n .filter(([_, value]) => value)\n .map(([key]) => key)\n .join(',');\n };\n\n const getWritePermissions = () => {\n if (writePermissions === 'full') {\n return 'full';\n }\n\n return Object.entries(writeSwitches)\n .filter(([_, value]) => value)\n .map(([key]) => key)\n .join(',');\n };\n\n return (\n <Panel.Indent>\n <input name='read' hidden readOnly ref={readRef} value={getReadPermissions() || '-'} />\n <input name='write' hidden readOnly ref={writeRef} value={getWritePermissions() || '-'} />\n <div>\n <Panel.Field title='Access mode' description='Which parts of the data will the link give access to' />\n <div>\n <RadioGroup\n value={writePermissions}\n onValueChange={handleWriteModeChange}\n orientation='horizontal'\n items={[\n { value: 'full', label: 'Full write (edit all existing and future columns)' },\n { value: 'custom', label: 'Custom write' },\n ]}\n />\n <RadioGroup\n value={readPermissions}\n onValueChange={handleReadModeChange}\n orientation='horizontal'\n disabled={writePermissions === 'full'}\n items={[\n { value: 'full', label: 'Full read (view all existing and future columns)' },\n { value: 'custom', label: 'Custom read' },\n ]}\n />\n </div>\n </div>\n <div className={style.twoCols}>\n <div className={style.grid}>\n <Panel.Description>Ontime columns</Panel.Description>\n <Panel.Description>Read</Panel.Description>\n <Panel.Description>Write</Panel.Description>\n {cuesheetDefaultColumns.map((column) => (\n <Fragment key={column.value}>\n <div>{column.label}</div>\n <Switch\n checked={Boolean(readSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'read', value)}\n disabled={readPermissions === 'full' || writePermissions === 'full'}\n data-testid={`read-${column.value}`}\n />\n <Switch\n checked={Boolean(writeSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'write', value)}\n disabled={writePermissions === 'full'}\n data-testid={`write-${column.value}`}\n />\n </Fragment>\n ))}\n </div>\n {customFieldColumns.length > 0 && (\n <div className={style.grid}>\n <Panel.Description>Custom fields</Panel.Description>\n <Panel.Description>Read</Panel.Description>\n <Panel.Description>Write</Panel.Description>\n {customFieldColumns.map((column) => (\n <Fragment key={column.value}>\n {column.label}\n <Switch\n checked={Boolean(readSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'read', value)}\n disabled={readPermissions === 'full' || writePermissions === 'full'}\n data-testid={`read-${column.value}`}\n />\n <Switch\n checked={Boolean(writeSwitches[column.value])}\n onCheckedChange={(value: boolean) => handleSwitchChange(column.value, 'write', value)}\n disabled={writePermissions === 'full'}\n data-testid={`write-${column.value}`}\n />\n </Fragment>\n ))}\n </div>\n )}\n </div>\n </Panel.Indent>\n );\n}\n","import { useRef, useState } from 'react';\nimport { FieldErrors, useForm } from 'react-hook-form';\nimport QRCode from 'react-qr-code';\nimport { OntimeView, URLPreset } from 'ontime-types';\nimport { generateId } from 'ontime-utils';\n\nimport { generateUrl } from '../../common/api/session';\nimport { maybeAxiosError } from '../../common/api/utils';\nimport Button from '../../common/components/buttons/Button';\nimport CopyTag from '../../common/components/copy-tag/CopyTag';\nimport Info from '../../common/components/info/Info';\nimport Input from '../../common/components/input/input/Input';\nimport Select from '../../common/components/select/Select';\nimport Switch from '../../common/components/switch/Switch';\nimport { useUpdateUrlPreset } from '../../common/hooks-query/useUrlPresets';\nimport copyToClipboard from '../../common/utils/copyToClipboard';\nimport { preventEscape } from '../../common/utils/keyEvent';\nimport { linkToOtherHost } from '../../common/utils/linkUtils';\nimport { isUrlSafe } from '../../common/utils/regex';\nimport { isOntimeCloud, serverURL } from '../../externals';\nimport * as Panel from '../app-settings/panel-utils/PanelUtils';\n\nimport CuesheetLinkOptions from './composite/CuesheetLinkOptions';\n\nimport style from './GenerateLinkForm.module.scss';\n\ninterface GenerateLinkFormProps {\n hostOptions: { value: string; label: string }[];\n pathOptions: { value: OntimeView | string; label: string }[];\n presets: URLPreset[];\n isLockedToView?: boolean;\n}\n\ntype GenericLinkOptions = {\n baseUrl: string;\n path: OntimeView | string; // we use empty string for Companion view\n authenticate: boolean;\n lockConfig: boolean;\n lockNav: boolean;\n};\n\ntype CuesheetLinkOptions = GenericLinkOptions & {\n path: OntimeView.Cuesheet;\n\n alias: string;\n options: {\n read?: string;\n write?: string;\n };\n};\n\ntype GenerateLinkFormOptions = GenericLinkOptions | CuesheetLinkOptions;\n\ntype GenerateLinkState = 'pending' | 'loading' | 'success' | 'error';\n\nexport default function GenerateLinkForm({ hostOptions, pathOptions, presets, isLockedToView }: GenerateLinkFormProps) {\n const [formState, setFormState] = useState<GenerateLinkState>('pending');\n const [url, setUrl] = useState(serverURL);\n const cuesheetReadRef = useRef<HTMLInputElement>(null);\n const cuesheetWriteRef = useRef<HTMLInputElement>(null);\n const generatedAlias = useRef<string>(`cuesheet-${generateId()}`);\n\n const { addPreset } = useUpdateUrlPreset();\n\n const {\n handleSubmit,\n setError,\n watch,\n setValue,\n reset,\n register,\n formState: { errors, isDirty },\n } = useForm<GenerateLinkFormOptions>({\n mode: 'onChange',\n defaultValues: {\n baseUrl: serverURL,\n path: isLockedToView ? pathOptions[0].value : OntimeView.Timer,\n authenticate: false,\n lockConfig: false,\n lockNav: false,\n },\n });\n\n /**\n * If the user is generating a link to the cuesheet we gather extra options\n * The extra options are saved into a URL preset which we then request a share link for\n */\n const createPresetFromOptions = async (\n alias: string,\n options: Required<CuesheetLinkOptions['options']>,\n ): Promise<URLPreset | undefined> => {\n if (options.read === '-') {\n throw new Error('Cannot create a share with no read permissions');\n }\n const presets = await addPreset({\n target: OntimeView.Cuesheet,\n enabled: true,\n alias,\n search: '',\n options: {\n read: options.read,\n write: options.write,\n },\n });\n return presets.find((preset) => preset.alias === alias);\n };\n\n const onSubmit = async (options: GenerateLinkFormOptions) => {\n try {\n setFormState('loading');\n if (options.path === OntimeView.Cuesheet) {\n const urlPreset = await createPresetFromOptions((options as CuesheetLinkOptions).alias, {\n read: cuesheetReadRef.current?.value ?? 'full',\n write: cuesheetWriteRef.current?.value ?? 'full',\n });\n\n if (!urlPreset) {\n throw new Error('Failed to create URL preset for Cuesheet');\n }\n\n const url = await generateUrl({\n baseUrl: options.baseUrl,\n path: options.path,\n authenticate: options.authenticate,\n lockConfig: options.lockConfig,\n lockNav: options.lockNav,\n preset: urlPreset.alias,\n });\n await copyToClipboard(url);\n setUrl(url);\n } else {\n const presetPath = options.path.startsWith('preset-') ? options.path.replace('preset-', '') : undefined;\n const path = presetPath ? presets.find((preset) => preset.alias === presetPath)?.target : options.path;\n if (!path) {\n throw new Error(`Could not resolve preset: ${path}`);\n }\n\n const url = await generateUrl({\n baseUrl: linkToOtherHost(options.baseUrl),\n path,\n authenticate: options.authenticate,\n lockConfig: options.lockConfig,\n lockNav: options.lockNav,\n preset: presetPath,\n });\n\n await copyToClipboard(url);\n setUrl(url);\n }\n reset(options, {\n keepValues: true,\n keepDirty: false,\n });\n setFormState('success');\n } catch (error) {\n const message = maybeAxiosError(error);\n setError('root', { message });\n setFormState('error');\n }\n };\n\n const canSubmit = isDirty || formState !== 'success';\n\n return (\n <form onSubmit={handleSubmit(onSubmit)} onKeyDown={(event) => preventEscape(event)}>\n {!isLockedToView && (\n <Info>You can generate a link to share with your team or to use in automation (such as companion).</Info>\n )}\n <div className={style.shareInline}>\n <div className={style.column}>\n <Panel.ListGroup>\n {isOntimeCloud ? (\n <input hidden readOnly name='baseUrl' value={serverURL} />\n ) : (\n <Panel.ListItem>\n <Panel.Field\n title='Host IP'\n description={`Which IP address will be used${isOntimeCloud ? ' (not applicable in Ontime Cloud)' : ''}`}\n />\n <Select\n options={hostOptions}\n value={watch('baseUrl')}\n onValueChange={(value) => setValue('baseUrl', value)}\n />\n </Panel.ListItem>\n )}\n {isLockedToView ? (\n <input type='hidden' value={watch('path')} />\n ) : (\n <Panel.ListItem>\n <Panel.Field title='Ontime view' description='Which view or preset will the link point to' />\n <Select\n options={pathOptions}\n value={watch('path')}\n onValueChange={(value) => setValue('path', value, { shouldDirty: true })}\n />\n </Panel.ListItem>\n )}\n\n {watch('path') === OntimeView.Cuesheet && (\n <>\n <Panel.ListItem>\n <Panel.Field\n title='Preset alias'\n description='The name of the preset we will create to hold this options'\n error={(errors as FieldErrors<CuesheetLinkOptions>).alias?.message}\n />\n <Input\n defaultValue={generatedAlias.current}\n {...register('alias', {\n required: 'Alias cannot be empty and must be unique',\n pattern: {\n value: isUrlSafe,\n message: 'Field can only contain URL safe characters (a-z, 0-9, _ and -)',\n },\n })}\n />\n </Panel.ListItem>\n <CuesheetLinkOptions readRef={cuesheetReadRef} writeRef={cuesheetWriteRef} />\n </>\n )}\n\n <Panel.ListItem>\n <Panel.Field title='Lock navigation' description='Whether to hide the navigation menu' />\n <Switch\n size='large'\n name='lockNav'\n data-testid='lockNav'\n checked={watch('lockNav')}\n onCheckedChange={(checked) => setValue('lockNav', checked, { shouldDirty: true })}\n disabled={watch('lockConfig')}\n />\n </Panel.ListItem>\n {watch('path') !== OntimeView.Cuesheet && (\n <Panel.ListItem>\n <Panel.Field\n title='Lock configuration'\n description='Whether to hide the configuration panel (also hides navigation)'\n />\n <Switch\n size='large'\n name='lockConfig'\n data-testid='lockConfig'\n checked={watch('lockConfig')}\n onCheckedChange={(checked) => {\n if (checked) {\n setValue('lockNav', checked, { shouldDirty: true });\n }\n setValue('lockConfig', checked, { shouldDirty: true });\n }}\n />\n </Panel.ListItem>\n )}\n <Panel.ListItem>\n <Panel.Field title='Authenticate' description='Whether the URL should be pre-authenticated' />\n <Switch\n size='large'\n name='authenticate'\n data-testid='authenticate'\n checked={watch('authenticate')}\n onCheckedChange={(checked) => setValue('authenticate', checked, { shouldDirty: true })}\n />\n </Panel.ListItem>\n </Panel.ListGroup>\n <Panel.Error>{errors.root?.message}</Panel.Error>\n <Panel.InlineElements align='end' className={style.end}>\n <Button type='submit' variant={canSubmit ? 'primary' : 'subtle'} loading={formState === 'loading'}>\n {canSubmit ? 'Create share link' : 'Link copied to clipboard!'}\n </Button>\n </Panel.InlineElements>\n </div>\n <Panel.Section className={style.column}>\n <Panel.Description>Share this link</Panel.Description>\n <QRCode size={172} value={url} className={style.qrCode} />\n <div className={style.copiableLink} data-testid='copy-link'>\n {url}\n </div>\n <CopyTag copyValue={url}>Copy link</CopyTag>\n </Panel.Section>\n </div>\n </form>\n );\n}\n","import { useMemo } from 'react';\nimport { OntimeView } from 'ontime-types';\n\nimport useInfo from '../../common/hooks-query/useInfo';\nimport useUrlPresets from '../../common/hooks-query/useUrlPresets';\n\nimport GenerateLinkForm from './GenerateLinkForm';\n\ninterface GenerateLinkFormExportProps {\n lockedPath?: { value: OntimeView; label: string };\n}\n\nexport default function GenerateLinkFormExport({ lockedPath }: GenerateLinkFormExportProps) {\n const { data: infoData } = useInfo();\n const { data: urlPresetData } = useUrlPresets({ skip: lockedPath === undefined });\n\n const hostOptions = useMemo(() => {\n return infoData.networkInterfaces.map((nif) => ({\n value: nif.address,\n label: `${nif.name} - ${nif.address}`,\n }));\n }, [infoData.networkInterfaces]);\n\n const pathOptions = useMemo(() => {\n if (lockedPath) {\n return [{ value: lockedPath.value, label: lockedPath.label }];\n }\n return [\n { value: OntimeView.Timer, label: 'Timer' },\n { value: OntimeView.Cuesheet, label: 'Cuesheet' },\n { value: OntimeView.Operator, label: 'Operator' },\n { value: '<<companion>>', label: 'Companion' },\n ...urlPresetData.map((preset) => ({\n value: `preset-${preset.alias}`,\n label: `URL Preset: ${preset.alias}`,\n })),\n ];\n }, [lockedPath, urlPresetData]);\n\n return (\n <GenerateLinkForm\n hostOptions={hostOptions}\n pathOptions={pathOptions}\n presets={urlPresetData}\n isLockedToView={Boolean(lockedPath)}\n />\n );\n}\n","import useProjectData from '../../../common/hooks-query/useProjectData';\n\nimport style from './TitleOverview.module.scss';\n\nexport default function TitleOverview() {\n const { data } = useProjectData();\n\n if (!data.title && !data.description) {\n return null;\n }\n\n return (\n <div>\n <div className={style.title}>{data.title}</div>\n <div className={style.description}>{data.description}</div>\n </div>\n );\n}\n","import { PropsWithChildren, ReactNode } from 'react';\nimport { ErrorBoundary } from '@sentry/react';\n\nimport { useIsOnline } from '../../common/hooks/useSocket';\nimport { cx } from '../../common/utils/styleUtils';\n\nimport style from './Overview.module.scss';\n\ninterface OverviewWrapperProps {\n navElements: ReactNode;\n}\n\nexport function OverviewWrapper({ navElements, children }: PropsWithChildren<OverviewWrapperProps>) {\n const { isOnline } = useIsOnline();\n return (\n <div className={cx([style.overview, !isOnline && style.isOffline])}>\n <ErrorBoundary>\n <div className={style.nav}>{navElements}</div>\n <div className={style.info}>{children}</div>\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["isOnlyNumbers","startsWithHttp","isAlphanumeric","isUrlSafe","RadioGroup","items","className","orientation","onValueChange","elementProps","jsx","BaseRadioGroup","value","cx","style","item","Radio.Root","Radio.Indicator","defaultOptions","usePersistedCuesheetOptions","create","persist","set","key","state","cuesheetDefaultColumns","makeCuesheetCustomColumns","customFields","field","CuesheetLinkOptions","readRef","writeRef","data","useCustomFields","customFieldColumns","useMemo","readPermissions","setReadPermissions","useState","writePermissions","setWritePermissions","readSwitches","setReadSwitches","initialState","column","writeSwitches","setWriteSwitches","handleReadModeChange","prevReadSwitches","updatedReadSwitches","handleWriteModeChange","prevWriteSwitches","updatedWriteSwitches","handleSwitchChange","type","getReadPermissions","_","getWritePermissions","jsxs","Panel.Indent","Panel.Field","Panel.Description","Fragment","Switch","GenerateLinkForm","hostOptions","pathOptions","presets","isLockedToView","formState","setFormState","url","setUrl","serverURL","cuesheetReadRef","useRef","cuesheetWriteRef","generatedAlias","generateId","addPreset","useUpdateUrlPreset","handleSubmit","setError","watch","setValue","reset","register","errors","isDirty","useForm","OntimeView","createPresetFromOptions","alias","options","preset","onSubmit","urlPreset","_a","_b","generateUrl","copyToClipboard","presetPath","path","_c","linkToOtherHost","error","message","maybeAxiosError","canSubmit","event","preventEscape","Info","Panel.ListGroup","isOntimeCloud","Panel.ListItem","Select","Input","checked","Panel.Error","Panel.InlineElements","Button","Panel.Section","QRCode","CopyTag","GenerateLinkFormExport","lockedPath","infoData","useInfo","urlPresetData","useUrlPresets","nif","TitleOverview","useProjectData","OverviewWrapper","navElements","children","isOnline","useIsOnline","ErrorBoundary"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e,ac as f}from"./vendor-Cnciq4o_.js";import{u as m,L as u,f as j,O as o}from"./index-DdPXqLQ6.js";import{E as l}from"./EmptyPage-X6EO1Y5W.js";import{V as x}from"./ViewLogo-CdsW41HC.js";import{V as a}from"./ViewParamsEditor-YoYxps2g.js";import{u as _}from"./useWindowTitle-BQ1kqXfk.js";import{u as h}from"./useProjectData-BF2F6qPB.js";import"./Empty-DiBXyIA8.js";import"./Select-CUjlJirY.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new s.Error().stack;r&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[r]="ce864784-26a5-4afd-b831-7fdb93549169",s._sentryDebugIdIdentifier="sentry-dbid-ce864784-26a5-4afd-b831-7fdb93549169")}catch{}})();function g(){const s=m(t=>t.mirror),{data:r,status:n}=h();return{data:{projectData:r,isMirrored:s},status:n}}function V(){const{data:s,status:r}=g();return _("Project info"),r==="pending"?e.jsx(u,{}):r==="error"?e.jsx(l,{text:"There was an error fetching data, please refresh the page."}):e.jsx(v,{...s})}function v({projectData:s,isMirrored:r}){const{getLocalizedString:n}=j();return!s||Object.values(s).every(i=>!i||i&&Array.isArray(i)&&i.length===0)?e.jsxs(e.Fragment,{children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),e.jsx(l,{text:n("common.no_data")}),";"]}):e.jsxs("div",{className:`project ${r?"mirror":""}`,"data-testid":"project-view",children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),s.logo&&e.jsx(x,{name:s.logo,className:"logo"}),e.jsxs("div",{className:"info",children:[s.title&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.title")}),e.jsx("div",{className:"info__value",children:s.title})]}),s.description&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.description")}),e.jsx("div",{className:"info__value",children:s.description})]}),s.info&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.info")}),e.jsx("div",{className:"info__value",children:s.info})]}),s.url&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.url")}),e.jsxs("a",{href:s.url,target:"_blank",rel:"noreferrer",className:"info__value link",children:[s.url," ",e.jsx(f,{style:{fontSize:"1em"}})]})]}),s.custom.map((i,d)=>{const c=!!i.url;return e.jsxs("div",{className:"info__custom",children:[c&&e.jsx("div",{className:"info__image-container",children:e.jsx("img",{className:"info__image",src:i.url,loading:"lazy"})}),e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:i.title}),e.jsx("div",{className:"info__value",children:i.value})]})]},`${i.title}-${d}`)})]})]})}export{V as default};
2
- //# sourceMappingURL=ProjectInfo-BYi1lzPk.js.map
1
+ import{j as e,ac as f}from"./vendor-Cu5xgv5K.js";import{u as m,L as u,f as j,O as o}from"./index-5QAOtSTh.js";import{E as l}from"./EmptyPage-DYH2bswA.js";import{V as x}from"./ViewLogo-Dd60EREE.js";import{V as a}from"./ViewParamsEditor-BWEYbq_S.js";import{u as _}from"./useWindowTitle-b5fN0StF.js";import{u as h}from"./useProjectData-CetvEK9E.js";import"./Empty-BYF0tVRk.js";import"./Select-niU9Razm.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new s.Error().stack;r&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[r]="ce864784-26a5-4afd-b831-7fdb93549169",s._sentryDebugIdIdentifier="sentry-dbid-ce864784-26a5-4afd-b831-7fdb93549169")}catch{}})();function g(){const s=m(t=>t.mirror),{data:r,status:n}=h();return{data:{projectData:r,isMirrored:s},status:n}}function V(){const{data:s,status:r}=g();return _("Project info"),r==="pending"?e.jsx(u,{}):r==="error"?e.jsx(l,{text:"There was an error fetching data, please refresh the page."}):e.jsx(v,{...s})}function v({projectData:s,isMirrored:r}){const{getLocalizedString:n}=j();return!s||Object.values(s).every(i=>!i||i&&Array.isArray(i)&&i.length===0)?e.jsxs(e.Fragment,{children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),e.jsx(l,{text:n("common.no_data")}),";"]}):e.jsxs("div",{className:`project ${r?"mirror":""}`,"data-testid":"project-view",children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),s.logo&&e.jsx(x,{name:s.logo,className:"logo"}),e.jsxs("div",{className:"info",children:[s.title&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.title")}),e.jsx("div",{className:"info__value",children:s.title})]}),s.description&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.description")}),e.jsx("div",{className:"info__value",children:s.description})]}),s.info&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.info")}),e.jsx("div",{className:"info__value",children:s.info})]}),s.url&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.url")}),e.jsxs("a",{href:s.url,target:"_blank",rel:"noreferrer",className:"info__value link",children:[s.url," ",e.jsx(f,{style:{fontSize:"1em"}})]})]}),s.custom.map((i,d)=>{const c=!!i.url;return e.jsxs("div",{className:"info__custom",children:[c&&e.jsx("div",{className:"info__image-container",children:e.jsx("img",{className:"info__image",src:i.url,loading:"lazy"})}),e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:i.title}),e.jsx("div",{className:"info__value",children:i.value})]})]},`${i.title}-${d}`)})]})]})}export{V as default};
2
+ //# sourceMappingURL=ProjectInfo-DxtMq70a.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectInfo-BYi1lzPk.js","sources":["../../src/views/project-info/useProjectInfoData.ts","../../src/views/project-info/ProjectInfo.tsx"],"sourcesContent":["import { ProjectData } from 'ontime-types';\n\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { ViewData } from '../utils/viewLoader.utils';\n\nexport interface ProjectInfoData {\n projectData: ProjectData;\n isMirrored: boolean;\n}\n\nexport function useProjectInfoData(): ViewData<ProjectInfoData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n\n return {\n data: {\n projectData,\n isMirrored,\n },\n status: projectDataStatus,\n };\n}\n","import { IoOpenOutline } from 'react-icons/io5';\nimport { OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\n\nimport { ProjectInfoData, useProjectInfoData } from './useProjectInfoData';\n\nimport './ProjectInfo.scss';\n\nexport default function ProjectInfoLoader() {\n const { data, status } = useProjectInfoData();\n\n useWindowTitle('Project info');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <ProjectInfo {...data} />;\n}\n\nfunction ProjectInfo({ projectData, isMirrored }: ProjectInfoData) {\n const { getLocalizedString } = useTranslation();\n\n /**\n * Check if there is data to show at all\n * We need a special check for the project fields which can be an empty array\n */\n const isEmpty =\n !projectData ||\n Object.values(projectData).every((value) => !value || (value && Array.isArray(value) && value.length === 0));\n if (isEmpty) {\n return (\n <>\n <ViewParamsEditor target={OntimeView.ProjectInfo} viewOptions={[]} />\n <EmptyPage text={getLocalizedString('common.no_data')} />;\n </>\n );\n }\n\n return (\n <div className={`project ${isMirrored ? 'mirror' : ''}`} data-testid='project-view'>\n <ViewParamsEditor target={OntimeView.ProjectInfo} viewOptions={[]} />\n {projectData.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='info'>\n {projectData.title && (\n <div>\n <div className='info__label'>{getLocalizedString('project.title')}</div>\n <div className='info__value'>{projectData.title}</div>\n </div>\n )}\n {projectData.description && (\n <div>\n <div className='info__label'>{getLocalizedString('project.description')}</div>\n <div className='info__value'>{projectData.description}</div>\n </div>\n )}\n {projectData.info && (\n <div>\n <div className='info__label'>{getLocalizedString('project.info')}</div>\n <div className='info__value'>{projectData.info}</div>\n </div>\n )}\n {projectData.url && (\n <div>\n <div className='info__label'>{getLocalizedString('project.url')}</div>\n <a href={projectData.url} target='_blank' rel='noreferrer' className='info__value link'>\n {projectData.url} <IoOpenOutline style={{ fontSize: '1em' }} />\n </a>\n </div>\n )}\n {projectData.custom.map((info, idx) => {\n const hasUrl = Boolean(info.url);\n return (\n <div key={`${info.title}-${idx}`} className='info__custom'>\n {hasUrl && (\n <div className='info__image-container'>\n <img className='info__image' src={info.url} loading='lazy' />\n </div>\n )}\n <div>\n <div className='info__label'>{info.title}</div>\n <div className='info__value'>{info.value}</div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":["useProjectInfoData","isMirrored","useViewOptionsStore","state","projectData","projectDataStatus","useProjectData","ProjectInfoLoader","data","status","useWindowTitle","Loader","jsx","EmptyPage","ProjectInfo","getLocalizedString","useTranslation","value","jsxs","Fragment","ViewParamsEditor","OntimeView","ViewLogo","IoOpenOutline","info","idx","hasUrl"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectInfo-DxtMq70a.js","sources":["../../src/views/project-info/useProjectInfoData.ts","../../src/views/project-info/ProjectInfo.tsx"],"sourcesContent":["import { ProjectData } from 'ontime-types';\n\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { ViewData } from '../utils/viewLoader.utils';\n\nexport interface ProjectInfoData {\n projectData: ProjectData;\n isMirrored: boolean;\n}\n\nexport function useProjectInfoData(): ViewData<ProjectInfoData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n\n return {\n data: {\n projectData,\n isMirrored,\n },\n status: projectDataStatus,\n };\n}\n","import { IoOpenOutline } from 'react-icons/io5';\nimport { OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\n\nimport { ProjectInfoData, useProjectInfoData } from './useProjectInfoData';\n\nimport './ProjectInfo.scss';\n\nexport default function ProjectInfoLoader() {\n const { data, status } = useProjectInfoData();\n\n useWindowTitle('Project info');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <ProjectInfo {...data} />;\n}\n\nfunction ProjectInfo({ projectData, isMirrored }: ProjectInfoData) {\n const { getLocalizedString } = useTranslation();\n\n /**\n * Check if there is data to show at all\n * We need a special check for the project fields which can be an empty array\n */\n const isEmpty =\n !projectData ||\n Object.values(projectData).every((value) => !value || (value && Array.isArray(value) && value.length === 0));\n if (isEmpty) {\n return (\n <>\n <ViewParamsEditor target={OntimeView.ProjectInfo} viewOptions={[]} />\n <EmptyPage text={getLocalizedString('common.no_data')} />;\n </>\n );\n }\n\n return (\n <div className={`project ${isMirrored ? 'mirror' : ''}`} data-testid='project-view'>\n <ViewParamsEditor target={OntimeView.ProjectInfo} viewOptions={[]} />\n {projectData.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='info'>\n {projectData.title && (\n <div>\n <div className='info__label'>{getLocalizedString('project.title')}</div>\n <div className='info__value'>{projectData.title}</div>\n </div>\n )}\n {projectData.description && (\n <div>\n <div className='info__label'>{getLocalizedString('project.description')}</div>\n <div className='info__value'>{projectData.description}</div>\n </div>\n )}\n {projectData.info && (\n <div>\n <div className='info__label'>{getLocalizedString('project.info')}</div>\n <div className='info__value'>{projectData.info}</div>\n </div>\n )}\n {projectData.url && (\n <div>\n <div className='info__label'>{getLocalizedString('project.url')}</div>\n <a href={projectData.url} target='_blank' rel='noreferrer' className='info__value link'>\n {projectData.url} <IoOpenOutline style={{ fontSize: '1em' }} />\n </a>\n </div>\n )}\n {projectData.custom.map((info, idx) => {\n const hasUrl = Boolean(info.url);\n return (\n <div key={`${info.title}-${idx}`} className='info__custom'>\n {hasUrl && (\n <div className='info__image-container'>\n <img className='info__image' src={info.url} loading='lazy' />\n </div>\n )}\n <div>\n <div className='info__label'>{info.title}</div>\n <div className='info__value'>{info.value}</div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":["useProjectInfoData","isMirrored","useViewOptionsStore","state","projectData","projectDataStatus","useProjectData","ProjectInfoLoader","data","status","useWindowTitle","Loader","jsx","EmptyPage","ProjectInfo","getLocalizedString","useTranslation","value","jsxs","Fragment","ViewParamsEditor","OntimeView","ViewLogo","IoOpenOutline","info","idx","hasUrl"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{h as l,j as t,A as f}from"./vendor-Cnciq4o_.js";import{i as h,af as p,ai as b,bN as g,S as x}from"./index-DdPXqLQ6.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="85a7d0ce-b73e-4216-b0cc-3068e25ab5bf",e._sentryDebugIdIdentifier="sentry-dbid-85a7d0ce-b73e-4216-b0cc-3068e25ab5bf")}catch{}})();const y="_container_o8th0_17",_="_pin_o8th0_27",m="_pinFailed_o8th0_51",d={container:y,pin:_,pinFailed:m};function v({permission:e,handleValidation:n}){const[s,o]=l.useState(""),[i,r]=l.useState(!1),u=()=>{n(s)||(r(!0),o(""))},c=a=>{o(a),i&&r(!1)};return t.jsxs("div",{className:d.container,children:[`Ontime ${e}`,t.jsxs("form",{onSubmit:a=>{a.preventDefault(),u()},className:h([d.pin,i&&d.pinFailed]),children:[t.jsx(p,{type:"password",maxLength:4,height:"large",value:s,onChange:a=>c(a.target.value)}),t.jsx(b,{type:"submit",variant:"primary","aria-label":"Enter",children:t.jsx(f,{})})]})]})}function w({permission:e,children:n}){const{editorAuth:s,operatorAuth:o,validate:i}=l.useContext(g),r=l.useCallback(c=>i(c,e),[e,i]);return x||(e==="editor"?s:e==="operator"?o:!1)?t.jsx(t.Fragment,{children:n}):t.jsx(v,{permission:e,handleValidation:r})}export{w as P};
2
- //# sourceMappingURL=ProtectRoute-DnUCrlh6.js.map
1
+ import{h as l,j as t,A as f}from"./vendor-Cu5xgv5K.js";import{i as h,af as p,ai as b,bN as g,S as x}from"./index-5QAOtSTh.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="85a7d0ce-b73e-4216-b0cc-3068e25ab5bf",e._sentryDebugIdIdentifier="sentry-dbid-85a7d0ce-b73e-4216-b0cc-3068e25ab5bf")}catch{}})();const y="_container_o8th0_17",_="_pin_o8th0_27",m="_pinFailed_o8th0_51",d={container:y,pin:_,pinFailed:m};function v({permission:e,handleValidation:n}){const[s,o]=l.useState(""),[i,r]=l.useState(!1),u=()=>{n(s)||(r(!0),o(""))},c=a=>{o(a),i&&r(!1)};return t.jsxs("div",{className:d.container,children:[`Ontime ${e}`,t.jsxs("form",{onSubmit:a=>{a.preventDefault(),u()},className:h([d.pin,i&&d.pinFailed]),children:[t.jsx(p,{type:"password",maxLength:4,height:"large",value:s,onChange:a=>c(a.target.value)}),t.jsx(b,{type:"submit",variant:"primary","aria-label":"Enter",children:t.jsx(f,{})})]})]})}function w({permission:e,children:n}){const{editorAuth:s,operatorAuth:o,validate:i}=l.useContext(g),r=l.useCallback(c=>i(c,e),[e,i]);return x||(e==="editor"?s:e==="operator"?o:!1)?t.jsx(t.Fragment,{children:n}):t.jsx(v,{permission:e,handleValidation:r})}export{w as P};
2
+ //# sourceMappingURL=ProtectRoute-p1fmtLeu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProtectRoute-DnUCrlh6.js","sources":["../../src/common/components/protect-route/PinPage.tsx","../../src/common/components/protect-route/ProtectRoute.tsx"],"sourcesContent":["import { PropsWithChildren, useState } from 'react';\nimport { IoCheckmark } from 'react-icons/io5';\n\nimport { cx } from '../../utils/styleUtils';\nimport IconButton from '../buttons/IconButton';\nimport Input from '../input/input/Input';\n\nimport style from './PinPage.module.scss';\n\ninterface PinPageProps {\n permission: 'editor' | 'operator';\n handleValidation: (pin: string) => boolean;\n}\n\nexport default function PinPage({ permission, handleValidation }: PropsWithChildren<PinPageProps>) {\n const [pin, setPin] = useState('');\n const [failed, setFailed] = useState(false);\n\n const validate = () => {\n const isValid = handleValidation(pin);\n if (!isValid) {\n setFailed(true);\n setPin('');\n }\n };\n\n const handleInputChange = (value: string) => {\n setPin(value);\n if (failed) setFailed(false);\n };\n\n return (\n <div className={style.container}>\n {`Ontime ${permission}`}\n <form\n onSubmit={(event) => {\n event.preventDefault();\n validate();\n }}\n className={cx([style.pin, failed && style.pinFailed])}\n >\n <Input\n type='password'\n maxLength={4}\n height='large'\n value={pin}\n onChange={(e) => handleInputChange(e.target.value)}\n />\n <IconButton type='submit' variant='primary' aria-label='Enter'>\n <IoCheckmark />\n </IconButton>\n </form>\n </div>\n );\n}\n","import { PropsWithChildren, useCallback, useContext } from 'react';\n\nimport { isLocalhost } from '../../../externals';\nimport { AppContext } from '../../context/AppContext';\n\nimport PinPage from './PinPage';\n\ninterface ProtectRouteProps {\n permission: 'editor' | 'operator';\n}\n\nexport default function ProtectRoute({ permission, children }: PropsWithChildren<ProtectRouteProps>) {\n const { editorAuth, operatorAuth, validate } = useContext(AppContext);\n\n const handleValidation = useCallback(\n (pin: string) => {\n return validate(pin, permission);\n },\n [permission, validate],\n );\n\n const hasRelevantAuth = () => {\n if (permission === 'editor') {\n return editorAuth;\n }\n if (permission === 'operator') {\n return operatorAuth;\n }\n return false;\n };\n\n if (isLocalhost || hasRelevantAuth()) {\n // eslint-disable-next-line react/jsx-no-useless-fragment -- trying to make typescript happy\n return <>{children}</>;\n }\n\n return <PinPage permission={permission} handleValidation={handleValidation} />;\n}\n"],"names":["PinPage","permission","handleValidation","pin","setPin","useState","failed","setFailed","validate","handleInputChange","value","jsxs","style","event","cx","jsx","Input","e","IconButton","IoCheckmark","ProtectRoute","children","editorAuth","operatorAuth","useContext","AppContext","useCallback","isLocalhost"],"mappings":"kkBAcA,SAAwBA,EAAQ,CAAE,WAAAC,EAAY,iBAAAC,GAAqD,CACjG,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,EAAE,EAC3B,CAACC,EAAQC,CAAS,EAAIF,EAAAA,SAAS,EAAK,EAEpCG,EAAW,IAAM,CACLN,EAAiBC,CAAG,IAElCI,EAAU,EAAI,EACdH,EAAO,EAAE,EAEb,EAEMK,EAAqBC,GAAkB,CAC3CN,EAAOM,CAAK,EACRJ,KAAkB,EAAK,CAC7B,EAEA,OACGK,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,UACnB,SAAA,CAAA,UAAUX,CAAU,GACrBU,EAAA,KAAC,OAAA,CACC,SAAWE,GAAU,CACnBA,EAAM,eAAe,EACZL,EAAA,CACX,EACA,UAAWM,EAAG,CAACF,EAAM,IAAKN,GAAUM,EAAM,SAAS,CAAC,EAEpD,SAAA,CAAAG,EAAA,IAACC,EAAA,CACC,KAAK,WACL,UAAW,EACX,OAAO,QACP,MAAOb,EACP,SAAWc,GAAMR,EAAkBQ,EAAE,OAAO,KAAK,CAAA,CACnD,EACAF,EAAAA,IAACG,EAAW,CAAA,KAAK,SAAS,QAAQ,UAAU,aAAW,QACrD,SAACH,EAAA,IAAAI,EAAA,CAAY,CAAA,CACf,CAAA,CAAA,CAAA,CAAA,CACF,EACF,CAEJ,CC3CA,SAAwBC,EAAa,CAAE,WAAAnB,EAAY,SAAAoB,GAAkD,CACnG,KAAM,CAAE,WAAAC,EAAY,aAAAC,EAAc,SAAAf,CAAS,EAAIgB,EAAAA,WAAWC,CAAU,EAE9DvB,EAAmBwB,EAAA,YACtBvB,GACQK,EAASL,EAAKF,CAAU,EAEjC,CAACA,EAAYO,CAAQ,CACvB,EAYI,OAAAmB,IATE1B,IAAe,SACVqB,EAELrB,IAAe,WACVsB,EAEF,sBAKG,SAAAF,EAAS,EAGdN,EAAA,IAACf,EAAQ,CAAA,WAAAC,EAAwB,iBAAAC,CAAoC,CAAA,CAC9E"}
1
+ {"version":3,"file":"ProtectRoute-p1fmtLeu.js","sources":["../../src/common/components/protect-route/PinPage.tsx","../../src/common/components/protect-route/ProtectRoute.tsx"],"sourcesContent":["import { PropsWithChildren, useState } from 'react';\nimport { IoCheckmark } from 'react-icons/io5';\n\nimport { cx } from '../../utils/styleUtils';\nimport IconButton from '../buttons/IconButton';\nimport Input from '../input/input/Input';\n\nimport style from './PinPage.module.scss';\n\ninterface PinPageProps {\n permission: 'editor' | 'operator';\n handleValidation: (pin: string) => boolean;\n}\n\nexport default function PinPage({ permission, handleValidation }: PropsWithChildren<PinPageProps>) {\n const [pin, setPin] = useState('');\n const [failed, setFailed] = useState(false);\n\n const validate = () => {\n const isValid = handleValidation(pin);\n if (!isValid) {\n setFailed(true);\n setPin('');\n }\n };\n\n const handleInputChange = (value: string) => {\n setPin(value);\n if (failed) setFailed(false);\n };\n\n return (\n <div className={style.container}>\n {`Ontime ${permission}`}\n <form\n onSubmit={(event) => {\n event.preventDefault();\n validate();\n }}\n className={cx([style.pin, failed && style.pinFailed])}\n >\n <Input\n type='password'\n maxLength={4}\n height='large'\n value={pin}\n onChange={(e) => handleInputChange(e.target.value)}\n />\n <IconButton type='submit' variant='primary' aria-label='Enter'>\n <IoCheckmark />\n </IconButton>\n </form>\n </div>\n );\n}\n","import { PropsWithChildren, useCallback, useContext } from 'react';\n\nimport { isLocalhost } from '../../../externals';\nimport { AppContext } from '../../context/AppContext';\n\nimport PinPage from './PinPage';\n\ninterface ProtectRouteProps {\n permission: 'editor' | 'operator';\n}\n\nexport default function ProtectRoute({ permission, children }: PropsWithChildren<ProtectRouteProps>) {\n const { editorAuth, operatorAuth, validate } = useContext(AppContext);\n\n const handleValidation = useCallback(\n (pin: string) => {\n return validate(pin, permission);\n },\n [permission, validate],\n );\n\n const hasRelevantAuth = () => {\n if (permission === 'editor') {\n return editorAuth;\n }\n if (permission === 'operator') {\n return operatorAuth;\n }\n return false;\n };\n\n if (isLocalhost || hasRelevantAuth()) {\n // eslint-disable-next-line react/jsx-no-useless-fragment -- trying to make typescript happy\n return <>{children}</>;\n }\n\n return <PinPage permission={permission} handleValidation={handleValidation} />;\n}\n"],"names":["PinPage","permission","handleValidation","pin","setPin","useState","failed","setFailed","validate","handleInputChange","value","jsxs","style","event","cx","jsx","Input","e","IconButton","IoCheckmark","ProtectRoute","children","editorAuth","operatorAuth","useContext","AppContext","useCallback","isLocalhost"],"mappings":"kkBAcA,SAAwBA,EAAQ,CAAE,WAAAC,EAAY,iBAAAC,GAAqD,CACjG,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,EAAE,EAC3B,CAACC,EAAQC,CAAS,EAAIF,EAAAA,SAAS,EAAK,EAEpCG,EAAW,IAAM,CACLN,EAAiBC,CAAG,IAElCI,EAAU,EAAI,EACdH,EAAO,EAAE,EAEb,EAEMK,EAAqBC,GAAkB,CAC3CN,EAAOM,CAAK,EACRJ,KAAkB,EAAK,CAC7B,EAEA,OACGK,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,UACnB,SAAA,CAAA,UAAUX,CAAU,GACrBU,EAAA,KAAC,OAAA,CACC,SAAWE,GAAU,CACnBA,EAAM,eAAe,EACZL,EAAA,CACX,EACA,UAAWM,EAAG,CAACF,EAAM,IAAKN,GAAUM,EAAM,SAAS,CAAC,EAEpD,SAAA,CAAAG,EAAA,IAACC,EAAA,CACC,KAAK,WACL,UAAW,EACX,OAAO,QACP,MAAOb,EACP,SAAWc,GAAMR,EAAkBQ,EAAE,OAAO,KAAK,CAAA,CACnD,EACAF,EAAAA,IAACG,EAAW,CAAA,KAAK,SAAS,QAAQ,UAAU,aAAW,QACrD,SAACH,EAAA,IAAAI,EAAA,CAAY,CAAA,CACf,CAAA,CAAA,CAAA,CAAA,CACF,EACF,CAEJ,CC3CA,SAAwBC,EAAa,CAAE,WAAAnB,EAAY,SAAAoB,GAAkD,CACnG,KAAM,CAAE,WAAAC,EAAY,aAAAC,EAAc,SAAAf,CAAS,EAAIgB,EAAAA,WAAWC,CAAU,EAE9DvB,EAAmBwB,EAAA,YACtBvB,GACQK,EAASL,EAAKF,CAAU,EAEjC,CAACA,EAAYO,CAAQ,CACvB,EAYI,OAAAmB,IATE1B,IAAe,SACVqB,EAELrB,IAAe,WACVsB,EAEF,sBAKG,SAAAF,EAAS,EAGdN,EAAA,IAACf,EAAQ,CAAA,WAAAC,EAAwB,iBAAAC,CAAoC,CAAA,CAC9E"}
@@ -0,0 +1,2 @@
1
+ import{y as et,h as m,j as e,f as ue,aw as _e,ax as tt,ay as ge,az as nt,aA as st,aB as ot,aC as it,aD as at,aE as rt,aF as lt,aG as K,aH as ct,aI as ut,aq as de,aJ as ke,aK as Ce,T as ye,x as dt,aL as mt,ah as ft,am as pt,C as Te,aM as B,aN as Ie,aO as ht,aP as xt,aQ as je,aR as we,aS as Me,m as gt,aT as Re,aU as Ct,aV as yt,aW as jt,aX as bt,I as vt}from"./vendor-Cu5xgv5K.js";import{P as St}from"./ProtectRoute-p1fmtLeu.js";import{c as Et,a_ as _t,a$ as me,af as De,y as F,B as N,i as ee,g as L,b0 as k,l as be,b1 as kt,aA as H,b2 as re,b3 as le,ai as te,w as Tt,al as It,au as wt,O as Mt,P as Ne,b4 as X,o as Rt,b5 as Dt,b6 as Nt,aZ as zt}from"./index-5QAOtSTh.js";import{C as $,u as Ot}from"./useWindowTitle-b5fN0StF.js";import{T as ze,O as Oe,S as Wt,M as Pt,C as $t}from"./TimeElements-DBVGVx71.js";import{O as We,T as Bt,u as z,G as Ft}from"./OverviewWrapper-riM6vPno.js";import{M as Pe,P as Lt}from"./Modal-BKL-5GzU.js";import{h as Ht,i as U,k as $e,j as Be,q as fe,S as A,u as At}from"./useRundown-D8CYATNi.js";import{s as ie,E as Kt,M as Ut,G as Gt,u as Fe,T as Le,A as Vt}from"./MilestoneEditor-GkzJ-h1C.js";import{M as qt}from"./MultiPartProgressBar-BITERKS0.js";import{E as He}from"./EmptyPage-DYH2bswA.js";import{u as Jt}from"./useCustomFields-BuxKsqGS.js";import{T as Ae}from"./validateEvent-Bvgk1E-Y.js";import{D as Y}from"./DelayIndicator-B_JKLKYW.js";import{p as Ke}from"./parseUserTime-CCDHpp7D.js";import{m as Zt,u as Ue}from"./dateConfig-8rhb0Dbh.js";import{S as Ge,L as D}from"./EditorUtils-De0umjb-.js";import{P as Ve}from"./useProjectData-CetvEK9E.js";import"./Tooltip-DJ8Y4CO4.js";import"./offset-CLDSqOP5.js";import"./playbackstate-6lBh6omZ.js";import"./Select-niU9Razm.js";import"./TimeInput-wQ67FbW6.js";import"./editorSettings-LMnfWux6.js";import"./getProgress-CyJTu6f5.js";import"./Empty-BYF0tVRk.js";import"./rundownUtils-Cnd2prRX.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new t.Error().stack;n&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[n]="c38bd860-390b-4af3-bfae-9a5f2555ed27",t._sentryDebugIdIdentifier="sentry-dbid-c38bd860-390b-4af3-bfae-9a5f2555ed27")}catch{}})();function Qt(){const{width:t}=et();return m.useMemo(()=>t<800,[t])}const Xt=m.memo(Yt);function Yt({children:t}){return Qt()?e.jsx(en,{children:t}):e.jsx(tn,{children:t})}function en({children:t}){return e.jsxs(We,{navElements:t,children:[e.jsx(ze,{}),e.jsx(Oe,{})]})}function tn({children:t}){return e.jsxs(We,{navElements:t,children:[e.jsx(Bt,{}),e.jsx(Wt,{}),e.jsx(ze,{}),e.jsx(Oe,{}),e.jsx(Pt,{}),e.jsx($t,{})]})}function nn({entryId:t}){const{data:n}=Ht(),[o,s]=m.useState(null);return m.useEffect(()=>{if(n.order.length===0){s(null);return}const i=n.entries[t];s(i||null)},[t,n.order,n.entries]),U(o)?e.jsx("div",{className:ie.entryEditor,"data-testid":"editor-container",children:e.jsx(Kt,{event:o})}):$e(o)?e.jsx("div",{className:ie.inModal,"data-testid":"editor-container",children:e.jsx(Ut,{milestone:o})}):Be(o)?e.jsx("div",{className:ie.inModal,"data-testid":"editor-container",children:e.jsx(Gt,{group:o})}):null}const ce=ue(t=>({selectedEntryId:null,setEditableEntry:n=>t({selectedEntryId:n}),clearSelection:()=>t({selectedEntryId:null})})),sn=m.memo(on);function on(){const t=ce(o=>o.selectedEntryId),n=ce(o=>o.clearSelection);return t===null?null:e.jsx(Pe,{isOpen:!0,onClose:n,title:"Edit entry",showCloseButton:!0,bodyElements:e.jsx(nn,{entryId:t})})}const an="_progressOverride_av4z0_17",rn={progressOverride:an};function ln(){const{data:t}=Et(),{current:n,duration:o,timeWarning:s,timeDanger:i}=_t();return e.jsx(qt,{now:n,complete:o,normalColor:t.normalColor,warning:s,warningColor:t.warningColor,danger:i,dangerColor:t.dangerColor,className:rn.progressOverride,ignoreCssOverride:!0})}function cn(t,n){let o;return(...s)=>{o&&clearTimeout(o),o=setTimeout(()=>{o=null,t(...s)},n)}}const qe=me("cuesheet-sizes"),un=me("cuesheet-hidden"),dn=me("cuesheet-order"),mn=cn(t=>{localStorage.setItem(qe,JSON.stringify(t))},500);function fn(){const[t,n]=m.useState(()=>{try{const s=localStorage.getItem(qe);return s?JSON.parse(s):{}}catch{return{}}});m.useEffect(()=>{mn(t)},[t]);const o=m.useCallback(s=>{n(s)},[]);return{columnSizing:t,setColumnSizing:o}}function Je(t){const[n,o]=_e({key:dn,defaultValue:t.map(i=>i.id)});m.useEffect(()=>{const i=t.map(a=>a.id);i.some(a=>!n.includes(a))&&o(i)},[n,t,o]);const s=m.useCallback(()=>{o(t.map(i=>i.id))},[t,o]);return{columnOrder:n,saveColumnOrder:o,resetColumnOrder:s}}function pn(){const[t,n]=_e({key:un,defaultValue:{}});return{columnVisibility:t,setColumnVisibility:n}}function hn({columns:t,children:n}){const{columnOrder:o,saveColumnOrder:s}=Je(t),i=tt(ge(it,{activationConstraint:{delay:100,tolerance:50}}),ge(ot,{activationConstraint:{delay:100,tolerance:50}})),a=c=>{const{delta:l,active:d,over:r}=c;if(l.y>200||(r==null?void 0:r.id)==null)return;const u=o.indexOf(d.id),p=o.indexOf(r.id);if(p===-1)return;const x=[...o],h=x.splice(u,1);x.splice(p,0,h[0]),s(x)};return e.jsx(nt,{sensors:i,collisionDetection:st,onDragEnd:a,children:n})}const Ze=m.forwardRef(({initialValue:t,allowSubmitSameValue:n,handleUpdate:o,handleCancelUpdate:s},i)=>{const a=m.useRef(null),c=m.useCallback(p=>o(p),[o]),{value:l,onChange:d,onBlur:r,onKeyDown:u}=Fe(t,c,a,{allowSubmitSameValue:n,allowKeyboardNavigation:!0,submitOnEnter:!0,submitOnCtrlEnter:!0,onCancelUpdate:s});return m.useImperativeHandle(i,()=>({focus(){var p;(p=a.current)==null||p.focus()},select(){var p;(p=a.current)==null||p.select()},focusParentElement(){var p,x;(x=(p=a.current)==null?void 0:p.parentElement)==null||x.focus()}}),[a]),e.jsx(De,{ref:a,variant:"ghosted",fluid:!0,value:l,onChange:d,onBlur:r,onKeyDown:u})});Ze.displayName="SingleLineCell";const pe=m.memo(Ze),xn=m.memo(gn);function gn({initialValue:t,lockedValue:n,delayed:o,onSubmit:s,children:i}){const[a,c]=m.useState(!1),[l,d]=m.useState(t),r=m.useRef(null),u=m.useRef(null);m.useEffect(()=>{a&&r.current&&(r.current.focus(),r.current.select())},[a]),m.useEffect(()=>{a||d(t)},[t,a]);const p=()=>c(!0),x=()=>{c(!1),setTimeout(()=>{var f;return(f=u.current)==null?void 0:f.focusParentElement()})},h=m.useCallback(f=>{var S,w,j;if(c(!1),f===""){s(f),(S=r.current)==null||S.focusParentElement();return}if(f.startsWith("p")||f.startsWith("+")){s(f),(w=r.current)==null||w.focusParentElement();return}const g=Ke(f);if(g<0||isNaN(g)){d(t),setTimeout(()=>{var _;return(_=u.current)==null?void 0:_.focusParentElement()});return}if(g===t&&n){(j=r.current)==null||j.focusParentElement();return}s(f),d(Number(f)),setTimeout(()=>{var _;return(_=u.current)==null?void 0:_.focusParentElement()})},[t,n,s]),E=F(l);return a?e.jsx(pe,{ref:r,initialValue:E,allowSubmitSameValue:!n,handleUpdate:h,handleCancelUpdate:x}):e.jsx(Le,{onClick:p,onFocus:p,muted:!n,offset:o?"over":void 0,ref:u,children:i})}const Cn="_imageInput_1dtk5_17",yn="_imageCell_1dtk5_24",jn="_overlay_1dtk5_28",bn="_image_1dtk5_17",J={imageInput:Cn,imageCell:yn,overlay:jn,image:bn},vn=m.memo(Sn);function Sn({initialValue:t,readOnly:n,updateValue:o}){const s=a=>{a!==t&&(a!==""&&!a.startsWith("http")||o(a))},i=()=>{t&&window.open(t,"_blank","noopener,noreferrer")};return t?e.jsxs("div",{className:J.imageCell,children:[!n&&e.jsxs("div",{className:J.overlay,children:[e.jsx(N,{onClick:i,children:"Preview"}),e.jsx(N,{variant:"subtle-destructive",onClick:()=>s(""),children:"Delete"})]}),!!t&&e.jsx("img",{loading:"lazy",src:t,className:J.image})]}):e.jsx(De,{variant:"ghosted",className:J.imageInput,fluid:!0,readOnly:n,disabled:n,placeholder:"Paste image URL",onBlur:a=>s(a.currentTarget.value),onKeyDown:a=>{a.key==="Enter"&&s(a.currentTarget.value)},defaultValue:t})}const En="_flag_qc1zd_17",_n={flag:En};function kn(){return e.jsx("div",{className:_n.flag,children:e.jsx(at,{})})}const Tn="_ghostedText_18xqt_17",In="_multiline_18xqt_24",ve={ghostedText:Tn,multiline:In};function he({children:t,multiline:n}){return e.jsx("div",{className:`${ve.ghostedText} ${n?ve.multiline:""}`,children:t})}const Qe=m.memo(wn);function wn({initialValue:t,handleUpdate:n}){const o=m.useRef(null),s=m.useCallback(d=>n(d),[n]),{value:i,onChange:a,onBlur:c,onKeyDown:l}=Fe(t,s,o,{submitOnCtrlEnter:!0,allowKeyboardNavigation:!0});return e.jsx(Vt,{inputref:o,variant:"ghosted",fluid:!0,rows:1,value:i,onChange:a,onBlur:c,onKeyDown:l,spellCheck:!1})}const Mn="_muted_1u021_17",Rn="_numeric_1u021_22",Se={muted:Mn,numeric:Rn};function P({numeric:t,children:n}){return e.jsx("span",{className:ee([Se.muted,t&&Se.numeric]),children:n})}const Xe=m.memo(Dn);function Dn({initialValue:t,lockedValue:n,delayed:o,onSubmit:s,children:i}){const[a,c]=m.useState(!1),[l,d]=m.useState(t),r=m.useRef(null),u=m.useRef(null);m.useEffect(()=>{a&&r.current&&(r.current.focus(),r.current.select())},[a]),m.useEffect(()=>{a||d(t)},[t,a]);const p=()=>c(!0),x=()=>{c(!1),setTimeout(()=>{var f;return(f=u.current)==null?void 0:f.focusParentElement()})},h=m.useCallback(f=>{var S,w,j;if(c(!1),f===""){s(f),(S=r.current)==null||S.focusParentElement();return}if(f.startsWith("p")||f.startsWith("+")){s(f),(w=r.current)==null||w.focusParentElement();return}const g=Ke(f);if(g<0||isNaN(g)){d(t),setTimeout(()=>{var _;return(_=u.current)==null?void 0:_.focusParentElement()});return}if(g===t&&n){(j=r.current)==null||j.focusParentElement();return}s(f),d(Number(f)),setTimeout(()=>{var _;return(_=u.current)==null?void 0:_.focusParentElement()})},[t,n,s]),E=L(l);return a?e.jsx(pe,{ref:r,initialValue:E,allowSubmitSameValue:!n,handleUpdate:h,handleCancelUpdate:x}):e.jsx(Le,{onClick:p,onFocus:p,muted:!n,offset:o?"over":void 0,ref:u,children:i})}function Nn({getValue:t,row:n,table:o,column:s}){var f;if(!o.options.meta)return null;const{showDelayedTimes:i,hideTableSeconds:a}=o.options.meta.options,c=a?{format12:"hh:mm a",format24:"HH:mm"}:void 0,l=n.original;if(!U(l))return e.jsx(P,{numeric:!0,children:L(t(),c)});const{handleUpdateTimer:d}=o.options.meta,r=g=>d(n.original.id,"timeStart",g),u=t(),p=!l.linkStart,x=i?u+l.delay:u,h=L(x,c);return((f=s.columnDef.meta)==null?void 0:f.canWrite)?e.jsxs(Xe,{initialValue:u,onSubmit:r,lockedValue:p,delayed:l.delay!==0,children:[h,e.jsx(Y,{delayValue:l.delay,tooltipPrefix:F(u)})]}):e.jsxs(P,{numeric:!0,children:[h,e.jsx(Y,{delayValue:l.delay,tooltipPrefix:F(u)})]})}function zn({getValue:t,row:n,table:o,column:s}){var f;if(!o.options.meta)return null;const{showDelayedTimes:i,hideTableSeconds:a}=o.options.meta.options,c=a?{format12:"hh:mm a",format24:"HH:mm"}:void 0,l=n.original;if(!U(l))return e.jsx(P,{numeric:!0,children:L(t(),c)});const{handleUpdateTimer:d}=o.options.meta,r=g=>d(n.original.id,"timeEnd",g),u=t(),p=l.timeStrategy===Ae.LockEnd,x=i?u+l.delay:u,h=L(x,c);return((f=s.columnDef.meta)==null?void 0:f.canWrite)?e.jsxs(Xe,{initialValue:u,onSubmit:r,lockedValue:p,delayed:l.delay!==0,children:[h,e.jsx(Y,{delayValue:l.delay,tooltipPrefix:F(u)})]}):e.jsxs(P,{numeric:!0,children:[h,e.jsx(Y,{delayValue:l.delay,tooltipPrefix:F(u)})]})}function On({getValue:t,row:n,table:o,column:s}){var x;if(!o.options.meta)return null;const{hideTableSeconds:i}=o.options.meta.options,a=n.original;if(!U(a))return e.jsx(P,{numeric:!0,children:be(t(),i)});const{handleUpdateTimer:c}=o.options.meta,l=h=>c(n.original.id,"duration",h),d=t(),r=a.timeStrategy===Ae.LockDuration,u=be(d,i);return((x=s.columnDef.meta)==null?void 0:x.canWrite)?e.jsx(xn,{initialValue:d,onSubmit:l,lockedValue:r,children:u}):e.jsx(P,{numeric:!0,children:u})}function Wn({row:t,column:n,table:o}){var c;const s=m.useCallback(l=>{var d;(d=o.options.meta)==null||d.handleUpdate(t.index,n.id,l,!1)},[n.id,t.index,o.options.meta]),i=t.original[n.id];return typeof i!="string"?null:((c=n.columnDef.meta)==null?void 0:c.canWrite)?e.jsx(Qe,{initialValue:i,handleUpdate:s}):e.jsx(he,{multiline:!0,children:i})}function Pn({row:t,column:n,table:o}){var l;const s=m.useCallback(d=>{var r;(r=o.options.meta)==null||r.handleUpdate(t.index,n.id,d,!0)},[n.id,t.index,o.options.meta]),i=t.original;if(fe(i))return null;const a=(l=n.columnDef.meta)==null?void 0:l.canWrite,c=i.custom[n.id];return e.jsx(vn,{initialValue:c,updateValue:s,readOnly:!a})}function Ee({row:t,column:n,table:o}){var c;const s=m.useCallback(l=>{var d;(d=o.options.meta)==null||d.handleUpdate(t.index,n.id,l,!1)},[n.id,t.index,o.options.meta]),i=t.original[n.id];return typeof i!="string"?null:((c=n.columnDef.meta)==null?void 0:c.canWrite)?e.jsx(pe,{initialValue:i,handleUpdate:s}):e.jsx(he,{children:i})}function $n({row:t}){const n=t.original;return!U(n)||!n.flag?null:e.jsx(kn,{})}function Bn({row:t,column:n,table:o}){var l;const s=m.useCallback(d=>{var r;(r=o.options.meta)==null||r.handleUpdate(t.index,n.id,d,!0)},[n.id,t.index,o.options.meta]),i=t.original;if(fe(i))return null;const a=i.custom[n.id]??"";return((l=n.columnDef.meta)==null?void 0:l.canWrite)?e.jsx(Qe,{initialValue:a,handleUpdate:s}):e.jsx(he,{multiline:!0,children:a})}function Fn(t,n,o){var x,h,E,f;const s=[],i=n===k.Edit,a=o?((x=o.options)==null?void 0:x.read)==="full":!0,c=o?((h=o.options)==null?void 0:h.write)==="full":!0,l=(E=o==null?void 0:o.options)!=null&&E.write?new Set(o.options.write.split(",")):new Set,d=(f=o==null?void 0:o.options)!=null&&f.read?new Set(o.options.read.split(",")):new Set,r=g=>a||d.has(g),u=g=>i&&(c||l.has(g));r("flag")&&s.push({accessorKey:"flag",id:"flag",header:"Flag",cell:$n,size:45,minSize:45,meta:{canWrite:u("flag")}}),r("cue")&&s.push({accessorKey:"cue",id:"cue",header:"Cue",cell:Ee,size:75,minSize:40,meta:{canWrite:u("cue")}}),r("timeStart")&&s.push({accessorKey:"timeStart",id:"timeStart",header:"Start",cell:Nn,size:75,minSize:75,meta:{canWrite:u("timeStart")}}),r("timeEnd")&&s.push({accessorKey:"timeEnd",id:"timeEnd",header:"End",cell:zn,size:75,minSize:75,meta:{canWrite:u("timeEnd")}}),r("duration")&&s.push({accessorKey:"duration",id:"duration",header:"Duration",cell:On,size:75,minSize:75,meta:{canWrite:u("duration")}}),r("title")&&s.push({accessorKey:"title",id:"title",header:"Title",cell:Ee,size:250,minSize:75,meta:{canWrite:u("title")}}),r("note")&&s.push({accessorKey:"note",id:"note",header:"Note",cell:Wn,size:250,minSize:75,meta:{canWrite:u("note")}});const p=Object.keys(t);for(let g=0;g<p.length;g++){const S=p[g],w=`custom-${S}`;r(w)&&s.push({accessorKey:S,id:S,header:t[S].label,cell:t[S].type==="text"?Bn:Pn,size:250,minSize:75,meta:{colour:t[S].colour,canWrite:u(w)}})}return s}const Ln="_emptyContainer_1dp7m_17",Hn="_emptyCell_1dp7m_21",An="_empty_1dp7m_17",Kn="_text_1dp7m_30",Z={emptyContainer:Ln,emptyCell:Hn,empty:An,text:Kn};function Un({text:t}){return e.jsx("tbody",{className:Z.emptyContainer,children:e.jsx("tr",{children:e.jsxs("td",{colSpan:99,className:Z.emptyCell,children:[e.jsx(kt,{className:Z.empty}),t&&e.jsx("span",{className:Z.text,children:t})]})})})}const Gn="_cuesheet_1f3ag_17",Vn="_resizer_1f3ag_37",qn="_actionColumn_1f3ag_53",Jn="_indexColumn_1f3ag_62",Zn="_tableHeader_1f3ag_73",O={cuesheet:Gn,resizer:Vn,actionColumn:qn,indexColumn:Jn,tableHeader:Zn};function Qn({columnId:t,colSpan:n,injectedStyles:o,children:s,draggable:i}){const{attributes:a,listeners:c,setNodeRef:l,transform:d,transition:r,isDragging:u}=rt({id:t}),p={...o,zIndex:u?2:"inherit",transform:lt.Translate.toString(d),transition:r};return e.jsxs("th",{ref:l,style:p,colSpan:n,tabIndex:-1,children:[e.jsx("div",{...a,...c,children:s}),i]})}function Xn({colSpan:t,injectedStyles:n,children:o,draggable:s}){return e.jsxs("th",{style:n,colSpan:t,tabIndex:-1,children:[e.jsx("div",{children:o}),s]})}function Ye({header:t}){return e.jsx("div",{onDoubleClick:()=>t.column.resetSize(),onMouseDown:t.getResizeHandler(),onTouchStart:t.getResizeHandler(),className:O.resizer})}function Yn({headerGroup:t,cuesheetMode:n}){const o=z(s=>s.hideIndexColumn);return e.jsxs("tr",{children:[n===k.Edit&&e.jsx("th",{className:O.actionColumn,tabIndex:-1}),!o&&e.jsx("th",{className:O.indexColumn,tabIndex:-1,children:"#"}),e.jsx(ct,{items:t.headers,strategy:ut,children:t.headers.map(s=>{var l,d;const i=(l=s.column.columnDef.meta)==null?void 0:l.colour,c={opacity:((d=s.column.columnDef.meta)==null?void 0:d.canWrite)?1:.6};if(i){const r=H(i);c.backgroundColor=r.backgroundColor,c.color=r.color}return e.jsx(Qn,{columnId:s.column.id,colSpan:s.colSpan,injectedStyles:{width:`calc(var(--header-${s==null?void 0:s.id}-size) * 1px)`,...c},draggable:e.jsx(Ye,{header:s}),children:s.isPlaceholder?null:K(s.column.columnDef.header,s.getContext())},s.column.columnDef.id)})},t.id)]},t.id)}function es({headerGroup:t,cuesheetMode:n}){const o=z(s=>s.hideIndexColumn);return e.jsxs("tr",{children:[n===k.Edit&&e.jsx("th",{className:O.actionColumn,tabIndex:-1}),!o&&e.jsx("th",{className:O.indexColumn,tabIndex:-1,children:"#"}),t.headers.map(s=>{var l,d;const i=(l=s.column.columnDef.meta)==null?void 0:l.colour,c={opacity:((d=s.column.columnDef.meta)==null?void 0:d.canWrite)?1:.6};if(i){const r=H(i);c.backgroundColor=r.backgroundColor,c.color=r.color}return e.jsx(Xn,{columnId:s.column.id,colSpan:s.colSpan,injectedStyles:{width:`calc(var(--header-${s==null?void 0:s.id}-size) * 1px)`,...c},draggable:e.jsx(Ye,{header:s}),children:s.isPlaceholder?null:K(s.column.columnDef.header,s.getContext())},s.column.columnDef.id)})]},t.id)}const ts="_delayRow_lk49a_106",ns={delayRow:ts};function ss({duration:t,injectedStyles:n,...o}){if(z(a=>a.hideDelays)||t===0)return null;const i=Zt(t,"expanded");return e.jsx("tr",{className:ns.delayRow,"data-testid":"cuesheet-delay",style:n,...o,children:e.jsx("td",{tabIndex:0,children:i})})}const os=m.memo(ss),ne=ue(t=>({isOpen:!1,entryId:null,entryType:null,entryIndex:null,parentId:null,position:{x:0,y:0},flag:null,openMenu:(n,o,s,i,a,c)=>t({isOpen:!0,position:n,entryId:o,entryType:s,entryIndex:i,parentId:a,flag:c}),closeMenu:()=>t({isOpen:!1})})),is="_actionColumn_1npa7_53",as="_indexColumn_1npa7_62",rs="_eventRow_1npa7_106",ls="_firstAfterGroup_1npa7_116",cs="_skip_1npa7_119",W={actionColumn:is,indexColumn:as,eventRow:rs,firstAfterGroup:ls,skip:cs};function us({rowId:t,id:n,eventIndex:o,colour:s,isFirstAfterGroup:i,isLoaded:a,isPast:c,groupColour:l,flag:d,skip:r,parent:u,rowIndex:p,table:x,injectedStyles:h,...E}){var G;const{cuesheetMode:f,hideIndexColumn:g}=((G=x.options.meta)==null?void 0:G.options)??{cuesheetMode:k.Edit,hideIndexColumn:!1},S=ne(I=>I.openMenu),{color:w,backgroundColor:j}=H(s),_=re(w),se=le({..._,alpha:_.alpha*.8}),oe=m.useMemo(()=>{if(a)return"#087A27";if(s){const I=re(H(s).backgroundColor);if(I!==null)return le({...I,alpha:I.alpha*.25})}},[s,a]);return e.jsxs("tr",{id:t,className:ee([W.eventRow,r&&W.skip,i&&W.firstAfterGroup,u&&W.hasParent]),style:{...h,opacity:`${c?"0.2":"1"}`,"--user-bg":l??"transparent"},"data-testid":"cuesheet-event",...E,children:[f===k.Edit&&e.jsx("td",{className:W.actionColumn,tabIndex:-1,role:"cell",children:e.jsx(te,{"aria-label":"Options",variant:"ghosted-white",size:"small",onClick:I=>{const V=I.currentTarget.getBoundingClientRect(),C=8+V.y+V.height/2;S({x:V.x,y:C},n,A.Event,p,u,d)},children:e.jsx(de,{})})}),!g&&e.jsx("td",{className:W.indexColumn,style:{backgroundColor:j,color:se},tabIndex:-1,role:"cell",children:o}),x.getRow(t).getVisibleCells().map(I=>e.jsx("td",{style:{width:`calc(var(--col-${I.column.id}-size) * 1px)`,backgroundColor:oe},tabIndex:-1,role:"cell",children:K(I.column.columnDef.cell,I.getContext())},I.id))]})}const ds="_actionColumn_1p2se_53",ms="_indexColumn_1p2se_62",fs="_groupRow_1p2se_106",ae={actionColumn:ds,indexColumn:ms,groupRow:fs};function ps({groupId:t,colour:n,rowId:o,rowIndex:s,table:i,injectedStyles:a,...c}){var u;const{cuesheetMode:l,hideIndexColumn:d}=((u=i.options.meta)==null?void 0:u.options)??{cuesheetMode:k.Edit,hideIndexColumn:!1},r=ne(p=>p.openMenu);return e.jsxs("tr",{className:ae.groupRow,style:{...a,"--user-bg":n},"data-testid":"cuesheet-group",...c,children:[l===k.Edit&&e.jsx("td",{className:ae.actionColumn,tabIndex:-1,role:"cell",children:e.jsx(te,{"aria-label":"Options",variant:"ghosted-white",size:"small",onClick:p=>{const x=p.currentTarget.getBoundingClientRect(),h=8+x.y+x.height/2;r({x:x.x,y:h},t,A.Group,s,null,null)},children:e.jsx(de,{})})}),!d&&e.jsx("td",{className:ae.indexColumn,tabIndex:-1,role:"cell"}),i.getRow(o).getVisibleCells().map(p=>e.jsx("td",{tabIndex:-1,style:{width:`calc(var(--col-${p.column.id}-size) * 1px)`},role:"cell",children:K(p.column.columnDef.cell,p.getContext())},p.id))]})}const hs="_actionColumn_lp3t6_53",xs="_indexColumn_lp3t6_62",gs="_milestoneRow_lp3t6_106",Q={actionColumn:hs,indexColumn:xs,milestoneRow:gs};function Cs({entryId:t,isPast:n,parentBgColour:o,parentId:s,colour:i,rowId:a,rowIndex:c,table:l,injectedStyles:d,...r}){var E;const{cuesheetMode:u,hideIndexColumn:p}=((E=l.options.meta)==null?void 0:E.options)??{cuesheetMode:k.Edit,hideIndexColumn:!1},x=ne(f=>f.openMenu);let h;if(i){const f=re(H(i).backgroundColor);f!==null&&(h=le({...f,alpha:f.alpha*.25}))}return e.jsxs("tr",{className:ee([Q.milestoneRow,!!o&&Q.hasParent]),style:{...d,opacity:`${n?"0.2":"1"}`,"--user-bg":o??"transparent"},"data-testid":"cuesheet-milestone",...r,children:[u===k.Edit&&e.jsx("td",{className:Q.actionColumn,tabIndex:-1,role:"cell",children:e.jsx(te,{"aria-label":"Options",variant:"ghosted-white",size:"small",onClick:f=>{const g=f.currentTarget.getBoundingClientRect(),S=8+g.y+g.height/2;x({x:g.x,y:S},t,A.Milestone,c,s,null)},children:e.jsx(de,{})})}),!p&&e.jsx("td",{className:Q.indexColumn,tabIndex:-1,role:"cell",children:Tt}),l.getRow(a).getVisibleCells().map(f=>{const g=f.column.id!=="duration"&&f.column.id!=="timeStart"&&f.column.id!=="timeEnd";return e.jsx("td",{style:{width:`calc(var(--col-${f.column.id}-size) * 1px)`,backgroundColor:h,opacity:g?1:.4},tabIndex:-1,children:g&&K(f.column.columnDef.cell,f.getContext())},f.id)})]})}const xe=ue(t=>({canChangeMode:!1,canCreateEntries:!1,canEditEntries:!1,canFlag:!1,canShare:!1,setPermissions(n){t({canChangeMode:n.canChangeMode,canFlag:n.canFlag,canCreateEntries:n.canCreateEntries,canEditEntries:n.canEditEntries,canShare:n.canShare})}})),ys=m.memo(js);function js(){const{isOpen:t,entryId:n,entryIndex:o,parentId:s,flag:i,position:a,closeMenu:c}=ne(),{addEntry:l,clone:d,deleteEntry:r,move:u,updateEntry:p}=Ue(),x=ce(E=>E.setEditableEntry),h=xe();return t?e.jsx(Lt,{isOpen:!0,onClose:c,items:[{type:"item",label:"Edit...",onClick:()=>x(n),icon:ke,disabled:!h.canEditEntries},{type:"divider"},{type:"item",label:i?"Remove flag":"Add flag",onClick:()=>p({id:n,flag:!i}),icon:Ce,disabled:i===null||!h.canFlag},{type:"divider"},{type:"item",label:"Add event above",onClick:()=>l({type:A.Event,parent:s},{before:n}),icon:ye,disabled:!h.canCreateEntries},{type:"item",label:"Add event below",onClick:()=>l({type:A.Event,parent:s},{after:n}),icon:ye,disabled:!h.canCreateEntries},{type:"item",label:"Clone event",onClick:()=>d(n),icon:Ce,disabled:!h.canCreateEntries},{type:"divider"},{type:"item",label:"Move up",onClick:()=>u(n,"up"),icon:dt,disabled:o<1||!h.canEditEntries},{type:"item",label:"Move down",onClick:()=>u(n,"down"),icon:mt,disabled:!h.canEditEntries},{type:"divider"},{type:"item",label:"Delete",onClick:()=>r([n]),icon:ft,disabled:!h.canEditEntries}],position:a}):null}function bs(t){return e.jsx(pt,{style:{transform:"rotate(-45deg)"},...t})}function vs(){const{data:t}=It(),{data:n}=wt(),[o,s]=Te(),i=o&&t&&n;return e.jsxs(e.Fragment,{children:[e.jsxs(B,{onClick:s.open,render:e.jsx(N,{}),children:[e.jsx(bs,{}),"Share..."]}),e.jsx(Pe,{isOpen:o,onClose:s.close,title:"Share cuesheet view",showBackdrop:!0,showCloseButton:!0,bodyElements:i?e.jsx(Ft,{lockedPath:{value:Mt.Cuesheet,label:"Cuesheet"}}):null})]})}const Ss="_tableSettings_18k3s_17",Es="_sectionTitle_18k3s_29",_s="_option_18k3s_40",ks="_column_18k3s_47",Ts="_inline_18k3s_54",Is="_apart_18k3s_60",ws="_group_18k3s_65",Ms="_radioButton_18k3s_76",v={tableSettings:Ss,sectionTitle:Es,option:_s,column:ks,inline:Ts,apart:Is,group:ws,radioButton:Ms};function Rs({columns:t,handleResetResizing:n,handleResetReordering:o,handleClearToggles:s}){const i=xe(r=>r.canShare),a=m.use(Ne),[c,l]=Ie({key:a?`${a.alias}${X.cuesheetMode}`:X.cuesheetMode,defaultValue:a?k.Run:k.Edit}),d=r=>{const u=r.at(0);u&&l(u)};return e.jsxs(ht,{className:v.tableSettings,children:[e.jsx(Ds,{}),e.jsx(Ns,{columns:t,handleResetResizing:n,handleResetReordering:o,handleClearToggles:s}),e.jsxs(xt,{value:[c],onValueChange:d,className:ee([v.group,v.apart]),children:[e.jsx(B,{render:e.jsx(je,{}),value:k.Run,className:v.radioButton,children:"Run"}),e.jsx(B,{render:e.jsx(je,{}),value:k.Edit,className:v.radioButton,children:"Edit"})]}),i&&e.jsxs(e.Fragment,{children:[e.jsx(Ge,{orientation:"vertical"}),e.jsx(vs,{})]})]})}function Ds(){const t=z();return e.jsxs(we,{children:[e.jsx(Me,{render:e.jsx(B,{render:e.jsxs(N,{variant:"ghosted-white",children:[e.jsx(gt,{})," Settings",e.jsx(Re,{})]})})}),e.jsxs(Ve,{align:"start",className:v.inline,children:[e.jsxs("div",{className:v.column,children:[e.jsx(D,{className:v.sectionTitle,children:"Element visibility"}),e.jsxs(D,{className:v.option,children:[e.jsx($,{defaultChecked:t.hideTableSeconds,onCheckedChange:n=>t.setOption("hideTableSeconds",n)}),"Hide seconds in table"]}),e.jsxs(D,{className:v.option,children:[e.jsx($,{defaultChecked:t.hideIndexColumn,onCheckedChange:n=>t.setOption("hideIndexColumn",n)}),"Hide index column"]})]}),e.jsxs("div",{className:v.column,children:[e.jsx(D,{className:v.sectionTitle,children:"Table Behaviour"}),e.jsxs(D,{className:v.option,children:[e.jsx($,{defaultChecked:t.showDelayedTimes,onCheckedChange:n=>t.setOption("showDelayedTimes",n)}),"Show delayed times"]}),e.jsxs(D,{className:v.option,children:[e.jsx($,{defaultChecked:t.hideDelays,onCheckedChange:n=>t.setOption("hideDelays",n)}),"Hide delay entries"]})]})]})]})}function Ns({columns:t,handleResetResizing:n,handleResetReordering:o,handleClearToggles:s}){return e.jsxs(we,{children:[e.jsx(Me,{render:e.jsx(B,{render:e.jsxs(N,{variant:"ghosted-white",children:[e.jsx(ke,{})," View",e.jsx(Re,{})]})})}),e.jsxs(Ve,{align:"start",className:v.inline,children:[e.jsxs("div",{className:v.column,children:[e.jsx(D,{className:v.sectionTitle,children:"Column visibility"}),t.map(i=>{const a=i.columnDef.header,c=i.getIsVisible();return e.jsxs(D,{className:v.option,children:[e.jsx($,{defaultChecked:c,onCheckedChange:i.toggleVisibility}),a]},`${i.id}-${c}`)})]}),e.jsx(Ge,{orientation:"vertical"}),e.jsxs("div",{className:v.column,children:[e.jsx(D,{className:v.sectionTitle,children:"Reset Options"}),e.jsx(N,{size:"small",fluid:!0,onClick:s,children:"Show All"}),e.jsx(N,{size:"small",fluid:!0,onClick:n,children:"Reset Resizing"}),e.jsx(N,{size:"small",fluid:!0,onClick:o,children:"Reset Reordering"})]})]})]})}function zs({columns:t,cuesheetMode:n}){const{data:o,status:s}=At(),{updateEntry:i,updateTimer:a}=Ue(),c=z(C=>C.showDelayedTimes),l=z(C=>C.hideTableSeconds),d=z(C=>C.hideIndexColumn),{selectedEventId:r}=Rt(),u=m.useRef(null),{listeners:p}=Ct(),x=m.useMemo(()=>({handleUpdate:(C,b,T,R=!1)=>{const M=o[C];if(!(!M||M[b]===T)){if(R){i({id:M.id,custom:{[b]:T}});return}i({id:M.id,[b]:T})}},handleUpdateTimer:(C,b,T)=>{a(C,b,T,!0)},options:{showDelayedTimes:c,hideTableSeconds:l,cuesheetMode:n,hideIndexColumn:d}}),[n,o,d,l,c,i,a]),{columnOrder:h,resetColumnOrder:E}=Je(t),{columnSizing:f,setColumnSizing:g}=fn(),{columnVisibility:S,setColumnVisibility:w}=pn(),j=yt({data:o,columns:t,columnResizeMode:"onChange",state:{columnOrder:h,columnVisibility:S,columnSizing:f},onColumnVisibilityChange:w,onColumnSizingChange:g,getCoreRowModel:bt(),meta:x}),_=m.useCallback(()=>{j.toggleAllColumnsVisible(!0)},[j]),se=m.useCallback(()=>{g({})},[g]);m.useEffect(()=>{if(n===k.Edit||u.current===null||!r)return;const C=o.findIndex(b=>b.id===r);u.current.scrollToIndex({index:C,behavior:"smooth"})},[n,o,r]);const oe=m.useMemo(()=>{const C=j.getFlatHeaders(),b={};for(let T=0;T<C.length;T++){const R=C[T];R&&(b[`--header-${R.id}-size`]=R.getSize(),b[`--col-${R.column.id}-size`]=R.column.getSize())}return b},[j.getState().columnSizingInfo,j.getState().columnSizing]),G=j.getAllLeafColumns(),{rows:I}=j.getRowModel();return!o||s==="pending"?e.jsx(He,{text:"Loading..."}):e.jsxs(e.Fragment,{children:[e.jsx(Rs,{columns:G,handleResetResizing:se,handleResetReordering:E,handleClearToggles:_}),e.jsx(jt,{ref:u,data:o,increaseViewportBy:{top:100,bottom:200},components:{EmptyPlaceholder:()=>e.jsx(Un,{text:"No data in rundown"}),Table:({style:C,...b})=>e.jsx("table",{className:O.cuesheet,id:"cuesheet",style:{...C,...oe},...p,...b}),TableRow:({item:C,style:b,...T})=>{const R=T["data-index"],M=I[R],q=M.original.id,y=M.original;return Be(y)?e.jsx(ps,{groupId:y.id,colour:y.colour,rowId:M.id,rowIndex:M.index,table:j,injectedStyles:b,...T},q):fe(y)?e.jsx(os,{duration:y.duration,injectedStyles:b,...T},q):$e(y)?e.jsx(Cs,{entryId:y.id,isPast:y.isPast,parentBgColour:y.groupColour,parentId:y.parent,colour:y.colour,rowId:M.id,rowIndex:R,table:j,injectedStyles:b,...T},q):e.jsx(us,{id:y.id,eventIndex:y.eventIndex,colour:y.colour,isFirstAfterGroup:y.isFirstAfterGroup,isLoaded:y.isLoaded,isPast:y.isPast,groupColour:y.groupColour,flag:y.flag,skip:y.skip,parent:y.parent,rowId:M.id,rowIndex:R,table:j,injectedStyles:b,...T},M.id)},TableHead:C=>e.jsx("thead",{className:O.tableHeader,...C})},fixedHeaderContent:()=>j.getHeaderGroups().map(C=>{const b=j.getState().columnSizingInfo.isResizingColumn?es:Yn;return e.jsx(b,{cuesheetMode:n,headerGroup:C},C.id)})}),e.jsx(ys,{})]})}const Os=m.memo(Ws);function Ws(){const{data:t,status:n}=Jt(),o=xe(l=>l.setPermissions),s=m.use(Ne);m.useEffect(()=>{var l,d,r;if(s){const u=((l=s.options)==null?void 0:l.write)==="full";o({canChangeMode:((d=s.options)==null?void 0:d.write)!=="-",canCreateEntries:u,canEditEntries:u,canFlag:u||!!((r=s.options)!=null&&r.write.includes("flag")),canShare:!1})}else o({canChangeMode:!0,canCreateEntries:!0,canEditEntries:!0,canFlag:!0,canShare:Dt==="rw"})},[s,o]);const[i]=Ie({key:s?`${s.alias}${X.cuesheetMode}`:X.cuesheetMode,defaultValue:s?k.Run:k.Edit}),a=m.useMemo(()=>Fn(t,i,s),[t,i,s]),c=!t||n==="pending";return e.jsx(hn,{columns:a,children:c?e.jsx(He,{text:"Loading..."}):e.jsx(zs,{columns:a,cuesheetMode:i})})}const Ps="_tableWrapper_h9gr1_17",$s={tableWrapper:Ps};function Bs(){const[t,n]=Te();Ot("Cuesheet");const o=Nt();return e.jsxs(e.Fragment,{children:[e.jsx(zt,{isOpen:t,onClose:n.close}),e.jsx(sn,{}),e.jsxs("div",{className:$s.tableWrapper,"data-testid":"cuesheet",children:[e.jsx(Xt,{children:!o&&e.jsx(te,{"aria-label":"Toggle navigation",variant:"subtle-white",size:"xlarge",onClick:n.open,children:e.jsx(vt,{})})}),e.jsx(ln,{}),e.jsx(Os,{})]})]})}function po(){return e.jsx(St,{permission:"operator",children:e.jsx(Bs,{})})}export{po as default};
2
+ //# sourceMappingURL=ProtectedCuesheet-CvRnqT0z.js.map