@clickview/curator 1.100.0-rc.1 → 1.100.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 (321) hide show
  1. package/dist/.vite/manifest.json +1779 -1779
  2. package/dist/Assets/js/dist/scripts/{CYhNyVj0.chunk.js → -6zuD8lo.chunk.js} +2 -2
  3. package/dist/Assets/js/dist/scripts/{CYhNyVj0.chunk.js.map → -6zuD8lo.chunk.js.map} +1 -1
  4. package/dist/Assets/js/dist/scripts/{D28bEsam.chunk.js → 0A42jU2r.chunk.js} +2 -2
  5. package/dist/Assets/js/dist/scripts/{D28bEsam.chunk.js.map → 0A42jU2r.chunk.js.map} +1 -1
  6. package/dist/Assets/js/dist/scripts/{oYHUjbwb2.chunk.js → 0ogjGD4J2.chunk.js} +2 -2
  7. package/dist/Assets/js/dist/scripts/{oYHUjbwb2.chunk.js.map → 0ogjGD4J2.chunk.js.map} +1 -1
  8. package/dist/Assets/js/dist/scripts/{PeuFojmJ2.chunk.js → 2aCj1HHJ2.chunk.js} +2 -2
  9. package/dist/Assets/js/dist/scripts/{PeuFojmJ2.chunk.js.map → 2aCj1HHJ2.chunk.js.map} +1 -1
  10. package/dist/Assets/js/dist/scripts/{q7pjZoNd.chunk.js → 2zbtFQka.chunk.js} +2 -2
  11. package/dist/Assets/js/dist/scripts/{q7pjZoNd.chunk.js.map → 2zbtFQka.chunk.js.map} +1 -1
  12. package/dist/Assets/js/dist/scripts/{0S5J0xX22.chunk.js → 3IQ_8AZP2.chunk.js} +2 -2
  13. package/dist/Assets/js/dist/scripts/{0S5J0xX22.chunk.js.map → 3IQ_8AZP2.chunk.js.map} +1 -1
  14. package/dist/Assets/js/dist/scripts/{DvP7S5Uq.chunk.js → 3eMwLZ5D.chunk.js} +2 -2
  15. package/dist/Assets/js/dist/scripts/{DvP7S5Uq.chunk.js.map → 3eMwLZ5D.chunk.js.map} +1 -1
  16. package/dist/Assets/js/dist/scripts/{y1L3G7XA2.chunk.js → 4Tx2JSvk2.chunk.js} +2 -2
  17. package/dist/Assets/js/dist/scripts/{y1L3G7XA2.chunk.js.map → 4Tx2JSvk2.chunk.js.map} +1 -1
  18. package/dist/Assets/js/dist/scripts/{BbR7yW4A2.chunk.js → 5uVJfyDx2.chunk.js} +2 -2
  19. package/dist/Assets/js/dist/scripts/{BbR7yW4A2.chunk.js.map → 5uVJfyDx2.chunk.js.map} +1 -1
  20. package/dist/Assets/js/dist/scripts/{B52yjTo5.chunk.js → 6l2s6d3Q.chunk.js} +2 -2
  21. package/dist/Assets/js/dist/scripts/{B52yjTo5.chunk.js.map → 6l2s6d3Q.chunk.js.map} +1 -1
  22. package/dist/Assets/js/dist/scripts/{DezIbRcB2.chunk.js → 8RAh0VA72.chunk.js} +2 -2
  23. package/dist/Assets/js/dist/scripts/{DezIbRcB2.chunk.js.map → 8RAh0VA72.chunk.js.map} +1 -1
  24. package/dist/Assets/js/dist/scripts/{CixcMUHF.chunk.js → 9nk_zFtT.chunk.js} +2 -2
  25. package/dist/Assets/js/dist/scripts/{CixcMUHF.chunk.js.map → 9nk_zFtT.chunk.js.map} +1 -1
  26. package/dist/Assets/js/dist/scripts/{Bk9vy70e2.chunk.js → Ae4rMqFm2.chunk.js} +2 -2
  27. package/dist/Assets/js/dist/scripts/{Bk9vy70e2.chunk.js.map → Ae4rMqFm2.chunk.js.map} +1 -1
  28. package/dist/Assets/js/dist/scripts/{Bzh_AwaG.chunk.js → B0mCquXn.chunk.js} +2 -2
  29. package/dist/Assets/js/dist/scripts/{Bzh_AwaG.chunk.js.map → B0mCquXn.chunk.js.map} +1 -1
  30. package/dist/Assets/js/dist/scripts/B1pBJzjh.chunk.js +1 -0
  31. package/dist/Assets/js/dist/scripts/{BswFY0mR2.chunk.js → B6IinlWw2.chunk.js} +2 -2
  32. package/dist/Assets/js/dist/scripts/{BswFY0mR2.chunk.js.map → B6IinlWw2.chunk.js.map} +1 -1
  33. package/dist/Assets/js/dist/scripts/{ClpIRgLR.chunk.js → B6NMAAhW.chunk.js} +2 -2
  34. package/dist/Assets/js/dist/scripts/{ClpIRgLR.chunk.js.map → B6NMAAhW.chunk.js.map} +1 -1
  35. package/dist/Assets/js/dist/scripts/{BCMXlwdC2.chunk.js → B8RZKQTs2.chunk.js} +2 -2
  36. package/dist/Assets/js/dist/scripts/{BCMXlwdC2.chunk.js.map → B8RZKQTs2.chunk.js.map} +1 -1
  37. package/dist/Assets/js/dist/scripts/{CymdouaN.chunk.js → B9R92bqj.chunk.js} +2 -2
  38. package/dist/Assets/js/dist/scripts/{CymdouaN.chunk.js.map → B9R92bqj.chunk.js.map} +1 -1
  39. package/dist/Assets/js/dist/scripts/{CtVYDK7g.chunk.js → BAFYJZ4c.chunk.js} +2 -2
  40. package/dist/Assets/js/dist/scripts/{CtVYDK7g.chunk.js.map → BAFYJZ4c.chunk.js.map} +1 -1
  41. package/dist/Assets/js/dist/scripts/{_wZpe632.chunk.js → BFPSIGJg.chunk.js} +2 -2
  42. package/dist/Assets/js/dist/scripts/{_wZpe632.chunk.js.map → BFPSIGJg.chunk.js.map} +1 -1
  43. package/dist/Assets/js/dist/scripts/{BNHULwJy2.chunk.js → BGiLDtc92.chunk.js} +2 -2
  44. package/dist/Assets/js/dist/scripts/{BNHULwJy2.chunk.js.map → BGiLDtc92.chunk.js.map} +1 -1
  45. package/dist/Assets/js/dist/scripts/{DA9R8atp2.chunk.js → BH6LIpwu2.chunk.js} +2 -2
  46. package/dist/Assets/js/dist/scripts/{DA9R8atp2.chunk.js.map → BH6LIpwu2.chunk.js.map} +1 -1
  47. package/dist/Assets/js/dist/scripts/{DbrVjVdn.chunk.js → BMj3pXcm.chunk.js} +2 -2
  48. package/dist/Assets/js/dist/scripts/{DbrVjVdn.chunk.js.map → BMj3pXcm.chunk.js.map} +1 -1
  49. package/dist/Assets/js/dist/scripts/{CDvLjxwS.chunk.js → BQTfNBFU.chunk.js} +2 -2
  50. package/dist/Assets/js/dist/scripts/{CDvLjxwS.chunk.js.map → BQTfNBFU.chunk.js.map} +1 -1
  51. package/dist/Assets/js/dist/scripts/{mStmtFRo.chunk.js → BT-jeT7C.chunk.js} +2 -2
  52. package/dist/Assets/js/dist/scripts/{mStmtFRo.chunk.js.map → BT-jeT7C.chunk.js.map} +1 -1
  53. package/dist/Assets/js/dist/scripts/{FlF2O19P2.chunk.js → BUD4osIg2.chunk.js} +2 -2
  54. package/dist/Assets/js/dist/scripts/{FlF2O19P2.chunk.js.map → BUD4osIg2.chunk.js.map} +1 -1
  55. package/dist/Assets/js/dist/scripts/{DWS9yr24.chunk.js → BVoG71Kc.chunk.js} +2 -2
  56. package/dist/Assets/js/dist/scripts/{DWS9yr24.chunk.js.map → BVoG71Kc.chunk.js.map} +1 -1
  57. package/dist/Assets/js/dist/scripts/{B9tf3oT62.chunk.js → BW5iVK1B2.chunk.js} +2 -2
  58. package/dist/Assets/js/dist/scripts/{B9tf3oT62.chunk.js.map → BW5iVK1B2.chunk.js.map} +1 -1
  59. package/dist/Assets/js/dist/scripts/{C2mEE4FT.chunk.js → BW9r-3iO.chunk.js} +2 -2
  60. package/dist/Assets/js/dist/scripts/{C2mEE4FT.chunk.js.map → BW9r-3iO.chunk.js.map} +1 -1
  61. package/dist/Assets/js/dist/scripts/{Dpgqkqbp.chunk.js → BX1tMzoa.chunk.js} +2 -2
  62. package/dist/Assets/js/dist/scripts/{Dpgqkqbp.chunk.js.map → BX1tMzoa.chunk.js.map} +1 -1
  63. package/dist/Assets/js/dist/scripts/{DVRzbAn6.chunk.js → BXaC-l33.chunk.js} +2 -2
  64. package/dist/Assets/js/dist/scripts/{DVRzbAn6.chunk.js.map → BXaC-l33.chunk.js.map} +1 -1
  65. package/dist/Assets/js/dist/scripts/{BaR7D4NT2.chunk.js → BY-c3M2b2.chunk.js} +2 -2
  66. package/dist/Assets/js/dist/scripts/{BaR7D4NT2.chunk.js.map → BY-c3M2b2.chunk.js.map} +1 -1
  67. package/dist/Assets/js/dist/scripts/{CJpVJtZk.chunk.js → BYMuPFbe.chunk.js} +2 -2
  68. package/dist/Assets/js/dist/scripts/{CJpVJtZk.chunk.js.map → BYMuPFbe.chunk.js.map} +1 -1
  69. package/dist/Assets/js/dist/scripts/{C5INFWaM2.chunk.js → BaOAOuSc2.chunk.js} +2 -2
  70. package/dist/Assets/js/dist/scripts/{C5INFWaM2.chunk.js.map → BaOAOuSc2.chunk.js.map} +1 -1
  71. package/dist/Assets/js/dist/scripts/{wAWlO6hc.chunk.js → Bb_f3Lku.chunk.js} +2 -2
  72. package/dist/Assets/js/dist/scripts/{wAWlO6hc.chunk.js.map → Bb_f3Lku.chunk.js.map} +1 -1
  73. package/dist/Assets/js/dist/scripts/{BLJO44vl.chunk.js → BdJYoUIO.chunk.js} +2 -2
  74. package/dist/Assets/js/dist/scripts/{BLJO44vl.chunk.js.map → BdJYoUIO.chunk.js.map} +1 -1
  75. package/dist/Assets/js/dist/scripts/{CW2k5Ut-2.chunk.js → Bf-6iyfX2.chunk.js} +2 -2
  76. package/dist/Assets/js/dist/scripts/{CW2k5Ut-2.chunk.js.map → Bf-6iyfX2.chunk.js.map} +1 -1
  77. package/dist/Assets/js/dist/scripts/{DxL0ZEcN2.chunk.js → BiPUuGEE2.chunk.js} +2 -2
  78. package/dist/Assets/js/dist/scripts/{DxL0ZEcN2.chunk.js.map → BiPUuGEE2.chunk.js.map} +1 -1
  79. package/dist/Assets/js/dist/scripts/{2XS-c0Xo.chunk.js → Bj4-NRWf.chunk.js} +2 -2
  80. package/dist/Assets/js/dist/scripts/{2XS-c0Xo.chunk.js.map → Bj4-NRWf.chunk.js.map} +1 -1
  81. package/dist/Assets/js/dist/scripts/{D13ViJt82.chunk.js → BkVcraos2.chunk.js} +2 -2
  82. package/dist/Assets/js/dist/scripts/{D13ViJt82.chunk.js.map → BkVcraos2.chunk.js.map} +1 -1
  83. package/dist/Assets/js/dist/scripts/{U1L4Dfoc.chunk.js → BkZ7WS_H.chunk.js} +2 -2
  84. package/dist/Assets/js/dist/scripts/{U1L4Dfoc.chunk.js.map → BkZ7WS_H.chunk.js.map} +1 -1
  85. package/dist/Assets/js/dist/scripts/{DoQiTqRX2.chunk.js → BoMt5mMW2.chunk.js} +2 -2
  86. package/dist/Assets/js/dist/scripts/{DoQiTqRX2.chunk.js.map → BoMt5mMW2.chunk.js.map} +1 -1
  87. package/dist/Assets/js/dist/scripts/{Da_9BBKD2.chunk.js → Bo_WsHZq2.chunk.js} +2 -2
  88. package/dist/Assets/js/dist/scripts/{Da_9BBKD2.chunk.js.map → Bo_WsHZq2.chunk.js.map} +1 -1
  89. package/dist/Assets/js/dist/scripts/{CnyrKBG0.chunk.js → BpV5ErII.chunk.js} +2 -2
  90. package/dist/Assets/js/dist/scripts/{CnyrKBG0.chunk.js.map → BpV5ErII.chunk.js.map} +1 -1
  91. package/dist/Assets/js/dist/scripts/{Dfhl7nI62.chunk.js → BrBPGjLi2.chunk.js} +2 -2
  92. package/dist/Assets/js/dist/scripts/{Dfhl7nI62.chunk.js.map → BrBPGjLi2.chunk.js.map} +1 -1
  93. package/dist/Assets/js/dist/scripts/{DcxGcCkR.chunk.js → BrHyZG_m.chunk.js} +2 -2
  94. package/dist/Assets/js/dist/scripts/{DcxGcCkR.chunk.js.map → BrHyZG_m.chunk.js.map} +1 -1
  95. package/dist/Assets/js/dist/scripts/{FXPxauLF.chunk.js → Bu4F3uuX.chunk.js} +2 -2
  96. package/dist/Assets/js/dist/scripts/{FXPxauLF.chunk.js.map → Bu4F3uuX.chunk.js.map} +1 -1
  97. package/dist/Assets/js/dist/scripts/{DZdJx-7j.chunk.js → BvW9SXzy.chunk.js} +2 -2
  98. package/dist/Assets/js/dist/scripts/{DZdJx-7j.chunk.js.map → BvW9SXzy.chunk.js.map} +1 -1
  99. package/dist/Assets/js/dist/scripts/{CAU0Lbgd.chunk.js → BwKHls91.chunk.js} +2 -2
  100. package/dist/Assets/js/dist/scripts/{CAU0Lbgd.chunk.js.map → BwKHls91.chunk.js.map} +1 -1
  101. package/dist/Assets/js/dist/scripts/{BiTzUyxj2.chunk.js → BxZNJjbX2.chunk.js} +2 -2
  102. package/dist/Assets/js/dist/scripts/{BiTzUyxj2.chunk.js.map → BxZNJjbX2.chunk.js.map} +1 -1
  103. package/dist/Assets/js/dist/scripts/{cymXuIcM.chunk.js → BygVW5WL.chunk.js} +2 -2
  104. package/dist/Assets/js/dist/scripts/{cymXuIcM.chunk.js.map → BygVW5WL.chunk.js.map} +1 -1
  105. package/dist/Assets/js/dist/scripts/{Dx07A6Ct.chunk.js → ByzsHBuo.chunk.js} +2 -2
  106. package/dist/Assets/js/dist/scripts/{Dx07A6Ct.chunk.js.map → ByzsHBuo.chunk.js.map} +1 -1
  107. package/dist/Assets/js/dist/scripts/C-M2om56.chunk.js +3 -0
  108. package/dist/Assets/js/dist/scripts/C-M2om56.chunk.js.map +1 -0
  109. package/dist/Assets/js/dist/scripts/{B6dlmRQL.chunk.js → C0UYMHUe.chunk.js} +2 -2
  110. package/dist/Assets/js/dist/scripts/{B6dlmRQL.chunk.js.map → C0UYMHUe.chunk.js.map} +1 -1
  111. package/dist/Assets/js/dist/scripts/{V0N7tCBl.chunk.js → C0_pEFCD.chunk.js} +2 -2
  112. package/dist/Assets/js/dist/scripts/{V0N7tCBl.chunk.js.map → C0_pEFCD.chunk.js.map} +1 -1
  113. package/dist/Assets/js/dist/scripts/{Cpr1J8Rk2.chunk.js → C2jRLu4_2.chunk.js} +2 -2
  114. package/dist/Assets/js/dist/scripts/{Cpr1J8Rk2.chunk.js.map → C2jRLu4_2.chunk.js.map} +1 -1
  115. package/dist/Assets/js/dist/scripts/{CY56FWb9.chunk.js → C2tBl3l9.chunk.js} +2 -2
  116. package/dist/Assets/js/dist/scripts/{CY56FWb9.chunk.js.map → C2tBl3l9.chunk.js.map} +1 -1
  117. package/dist/Assets/js/dist/scripts/{C3Lx9PwR.chunk.js → C4eazpDh.chunk.js} +2 -2
  118. package/dist/Assets/js/dist/scripts/{C3Lx9PwR.chunk.js.map → C4eazpDh.chunk.js.map} +1 -1
  119. package/dist/Assets/js/dist/scripts/{puobgAYi.chunk.js → CBq4vrjT.chunk.js} +2 -2
  120. package/dist/Assets/js/dist/scripts/{puobgAYi.chunk.js.map → CBq4vrjT.chunk.js.map} +1 -1
  121. package/dist/Assets/js/dist/scripts/{Bcx1C8ae.chunk.js → CBzqRw-k.chunk.js} +2 -2
  122. package/dist/Assets/js/dist/scripts/{Bcx1C8ae.chunk.js.map → CBzqRw-k.chunk.js.map} +1 -1
  123. package/dist/Assets/js/dist/scripts/{BD6DIPGL2.chunk.js → CDAdfAL02.chunk.js} +2 -2
  124. package/dist/Assets/js/dist/scripts/{BD6DIPGL2.chunk.js.map → CDAdfAL02.chunk.js.map} +1 -1
  125. package/dist/Assets/js/dist/scripts/{Ddp1uNfH.chunk.js → CE1Dxq8p.chunk.js} +2 -2
  126. package/dist/Assets/js/dist/scripts/{Ddp1uNfH.chunk.js.map → CE1Dxq8p.chunk.js.map} +1 -1
  127. package/dist/Assets/js/dist/scripts/{C99MPG7E.chunk.js → CG2julEA.chunk.js} +2 -2
  128. package/dist/Assets/js/dist/scripts/{C99MPG7E.chunk.js.map → CG2julEA.chunk.js.map} +1 -1
  129. package/dist/Assets/js/dist/scripts/{tyY3GHEC2.chunk.js → CGcN4g0d2.chunk.js} +2 -2
  130. package/dist/Assets/js/dist/scripts/{tyY3GHEC2.chunk.js.map → CGcN4g0d2.chunk.js.map} +1 -1
  131. package/dist/Assets/js/dist/scripts/{wODD7tmB2.chunk.js → CJmV_FfR2.chunk.js} +2 -2
  132. package/dist/Assets/js/dist/scripts/{wODD7tmB2.chunk.js.map → CJmV_FfR2.chunk.js.map} +1 -1
  133. package/dist/Assets/js/dist/scripts/{DavA1dZZ.chunk.js → CKvVGIRL.chunk.js} +2 -2
  134. package/dist/Assets/js/dist/scripts/{DavA1dZZ.chunk.js.map → CKvVGIRL.chunk.js.map} +1 -1
  135. package/dist/Assets/js/dist/scripts/{CrndJnZp.chunk.js → CL1DcbTZ.chunk.js} +2 -2
  136. package/dist/Assets/js/dist/scripts/{CrndJnZp.chunk.js.map → CL1DcbTZ.chunk.js.map} +1 -1
  137. package/dist/Assets/js/dist/scripts/{DLLL2lwS.chunk.js → CNLx6_fS.chunk.js} +2 -2
  138. package/dist/Assets/js/dist/scripts/{DLLL2lwS.chunk.js.map → CNLx6_fS.chunk.js.map} +1 -1
  139. package/dist/Assets/js/dist/scripts/{w2lackHw.chunk.js → CNUVs80P.chunk.js} +2 -2
  140. package/dist/Assets/js/dist/scripts/{w2lackHw.chunk.js.map → CNUVs80P.chunk.js.map} +1 -1
  141. package/dist/Assets/js/dist/scripts/{CCzvD0H4.chunk.js → CPa__SNX.chunk.js} +2 -2
  142. package/dist/Assets/js/dist/scripts/{CCzvD0H4.chunk.js.map → CPa__SNX.chunk.js.map} +1 -1
  143. package/dist/Assets/js/dist/scripts/{DeDh-wVP.chunk.js → CSA2Tnv9.chunk.js} +2 -2
  144. package/dist/Assets/js/dist/scripts/{DeDh-wVP.chunk.js.map → CSA2Tnv9.chunk.js.map} +1 -1
  145. package/dist/Assets/js/dist/scripts/{CjZJx6-O2.chunk.js → CT-xEpNT2.chunk.js} +2 -2
  146. package/dist/Assets/js/dist/scripts/{CjZJx6-O2.chunk.js.map → CT-xEpNT2.chunk.js.map} +1 -1
  147. package/dist/Assets/js/dist/scripts/{BRPP3VZ1.chunk.js → CT0vfLa0.chunk.js} +2 -2
  148. package/dist/Assets/js/dist/scripts/{BRPP3VZ1.chunk.js.map → CT0vfLa0.chunk.js.map} +1 -1
  149. package/dist/Assets/js/dist/scripts/{DGjNB2Bz.chunk.js → CUDnXypB.chunk.js} +2 -2
  150. package/dist/Assets/js/dist/scripts/{DGjNB2Bz.chunk.js.map → CUDnXypB.chunk.js.map} +1 -1
  151. package/dist/Assets/js/dist/scripts/{cXanUGwK.chunk.js → CeMQZB5J.chunk.js} +2 -2
  152. package/dist/Assets/js/dist/scripts/{cXanUGwK.chunk.js.map → CeMQZB5J.chunk.js.map} +1 -1
  153. package/dist/Assets/js/dist/scripts/Cf5cjLzK.chunk.js +2 -0
  154. package/dist/Assets/js/dist/scripts/{D2iK_uRt.chunk.js.map → Cf5cjLzK.chunk.js.map} +1 -1
  155. package/dist/Assets/js/dist/scripts/{CRNBuqmR.chunk.js → CfGaxIgd.chunk.js} +2 -2
  156. package/dist/Assets/js/dist/scripts/{CRNBuqmR.chunk.js.map → CfGaxIgd.chunk.js.map} +1 -1
  157. package/dist/Assets/js/dist/scripts/{BNr7ZL3F2.chunk.js → Cqfub35W2.chunk.js} +2 -2
  158. package/dist/Assets/js/dist/scripts/{BNr7ZL3F2.chunk.js.map → Cqfub35W2.chunk.js.map} +1 -1
  159. package/dist/Assets/js/dist/scripts/{DRmwJ1it2.chunk.js → Cv8UpP5_2.chunk.js} +2 -2
  160. package/dist/Assets/js/dist/scripts/{DRmwJ1it2.chunk.js.map → Cv8UpP5_2.chunk.js.map} +1 -1
  161. package/dist/Assets/js/dist/scripts/{DOfeXfSj.chunk.js → CvV6jx2d.chunk.js} +2 -2
  162. package/dist/Assets/js/dist/scripts/{DOfeXfSj.chunk.js.map → CvV6jx2d.chunk.js.map} +1 -1
  163. package/dist/Assets/js/dist/scripts/{DnGnhqys.chunk.js → CxENQntH.chunk.js} +2 -2
  164. package/dist/Assets/js/dist/scripts/{DnGnhqys.chunk.js.map → CxENQntH.chunk.js.map} +1 -1
  165. package/dist/Assets/js/dist/scripts/{NMDkdR-8.chunk.js → CxIfJCSc.chunk.js} +2 -2
  166. package/dist/Assets/js/dist/scripts/{NMDkdR-8.chunk.js.map → CxIfJCSc.chunk.js.map} +1 -1
  167. package/dist/Assets/js/dist/scripts/{B9H-d-YC.chunk.js → CxggKQxV.chunk.js} +2 -2
  168. package/dist/Assets/js/dist/scripts/{B9H-d-YC.chunk.js.map → CxggKQxV.chunk.js.map} +1 -1
  169. package/dist/Assets/js/dist/scripts/{B3I44IzQ.chunk.js → CyNNZ1So.chunk.js} +2 -2
  170. package/dist/Assets/js/dist/scripts/{B3I44IzQ.chunk.js.map → CyNNZ1So.chunk.js.map} +1 -1
  171. package/dist/Assets/js/dist/scripts/{B2V1N14S.chunk.js → Cz-WSyAE.chunk.js} +2 -2
  172. package/dist/Assets/js/dist/scripts/{B2V1N14S.chunk.js.map → Cz-WSyAE.chunk.js.map} +1 -1
  173. package/dist/Assets/js/dist/scripts/{S9cTzcQc2.chunk.js → D2aQFJWt2.chunk.js} +2 -2
  174. package/dist/Assets/js/dist/scripts/{S9cTzcQc2.chunk.js.map → D2aQFJWt2.chunk.js.map} +1 -1
  175. package/dist/Assets/js/dist/scripts/{CEsXUxxo2.chunk.js → D2h9W4GA2.chunk.js} +2 -2
  176. package/dist/Assets/js/dist/scripts/{CEsXUxxo2.chunk.js.map → D2h9W4GA2.chunk.js.map} +1 -1
  177. package/dist/Assets/js/dist/scripts/{DqCsVhOS.chunk.js → D3NAhMJm.chunk.js} +2 -2
  178. package/dist/Assets/js/dist/scripts/{DqCsVhOS.chunk.js.map → D3NAhMJm.chunk.js.map} +1 -1
  179. package/dist/Assets/js/dist/scripts/{DpM1KgHy.chunk.js → D3aWaqBW.chunk.js} +2 -2
  180. package/dist/Assets/js/dist/scripts/{DpM1KgHy.chunk.js.map → D3aWaqBW.chunk.js.map} +1 -1
  181. package/dist/Assets/js/dist/scripts/{CxtxOtyF2.chunk.js → D4xcR0492.chunk.js} +2 -2
  182. package/dist/Assets/js/dist/scripts/{CxtxOtyF2.chunk.js.map → D4xcR0492.chunk.js.map} +1 -1
  183. package/dist/Assets/js/dist/scripts/{BEeh_Vbr.chunk.js → D5ek2PiI.chunk.js} +2 -2
  184. package/dist/Assets/js/dist/scripts/{BEeh_Vbr.chunk.js.map → D5ek2PiI.chunk.js.map} +1 -1
  185. package/dist/Assets/js/dist/scripts/{DjqQYm43.chunk.js → D61ei_h6.chunk.js} +2 -2
  186. package/dist/Assets/js/dist/scripts/{DjqQYm43.chunk.js.map → D61ei_h6.chunk.js.map} +1 -1
  187. package/dist/Assets/js/dist/scripts/{lgpeNdac.chunk.js → D6wyTufc.chunk.js} +2 -2
  188. package/dist/Assets/js/dist/scripts/{lgpeNdac.chunk.js.map → D6wyTufc.chunk.js.map} +1 -1
  189. package/dist/Assets/js/dist/scripts/{B8li8ced.chunk.js → D7I90XOo.chunk.js} +2 -2
  190. package/dist/Assets/js/dist/scripts/{B8li8ced.chunk.js.map → D7I90XOo.chunk.js.map} +1 -1
  191. package/dist/Assets/js/dist/scripts/{DBAwgllB.chunk.js → DArfNv9S.chunk.js} +2 -2
  192. package/dist/Assets/js/dist/scripts/{DBAwgllB.chunk.js.map → DArfNv9S.chunk.js.map} +1 -1
  193. package/dist/Assets/js/dist/scripts/{B6uYrrzJ2.chunk.js → DB-51xws2.chunk.js} +2 -2
  194. package/dist/Assets/js/dist/scripts/{B6uYrrzJ2.chunk.js.map → DB-51xws2.chunk.js.map} +1 -1
  195. package/dist/Assets/js/dist/scripts/{C-flCrUr.chunk.js → DENdEA1F.chunk.js} +2 -2
  196. package/dist/Assets/js/dist/scripts/{C-flCrUr.chunk.js.map → DENdEA1F.chunk.js.map} +1 -1
  197. package/dist/Assets/js/dist/scripts/{BuF_pg9-2.chunk.js → DFYiLmms2.chunk.js} +2 -2
  198. package/dist/Assets/js/dist/scripts/{BuF_pg9-2.chunk.js.map → DFYiLmms2.chunk.js.map} +1 -1
  199. package/dist/Assets/js/dist/scripts/{BE6LUVEo2.chunk.js → DHa-x1js2.chunk.js} +2 -2
  200. package/dist/Assets/js/dist/scripts/{BE6LUVEo2.chunk.js.map → DHa-x1js2.chunk.js.map} +1 -1
  201. package/dist/Assets/js/dist/scripts/{DDHep0UM.chunk.js → DHeA2NJS.chunk.js} +2 -2
  202. package/dist/Assets/js/dist/scripts/{DDHep0UM.chunk.js.map → DHeA2NJS.chunk.js.map} +1 -1
  203. package/dist/Assets/js/dist/scripts/{D5OaPA-v.chunk.js → DIDxfMO_.chunk.js} +2 -2
  204. package/dist/Assets/js/dist/scripts/{D5OaPA-v.chunk.js.map → DIDxfMO_.chunk.js.map} +1 -1
  205. package/dist/Assets/js/dist/scripts/{CV7UIOmh2.chunk.js → DMq1wDNm2.chunk.js} +2 -2
  206. package/dist/Assets/js/dist/scripts/{CV7UIOmh2.chunk.js.map → DMq1wDNm2.chunk.js.map} +1 -1
  207. package/dist/Assets/js/dist/scripts/{ByMU9ltp2.chunk.js → DNWM9yfh2.chunk.js} +2 -2
  208. package/dist/Assets/js/dist/scripts/{ByMU9ltp2.chunk.js.map → DNWM9yfh2.chunk.js.map} +1 -1
  209. package/dist/Assets/js/dist/scripts/{DFwtjofq2.chunk.js → DSj7VCEo2.chunk.js} +2 -2
  210. package/dist/Assets/js/dist/scripts/{DFwtjofq2.chunk.js.map → DSj7VCEo2.chunk.js.map} +1 -1
  211. package/dist/Assets/js/dist/scripts/{BSYuzR8N2.chunk.js → DSvehN9D2.chunk.js} +2 -2
  212. package/dist/Assets/js/dist/scripts/{BSYuzR8N2.chunk.js.map → DSvehN9D2.chunk.js.map} +1 -1
  213. package/dist/Assets/js/dist/scripts/{FS74_jrx.chunk.js → DTvCgZ4c.chunk.js} +2 -2
  214. package/dist/Assets/js/dist/scripts/{FS74_jrx.chunk.js.map → DTvCgZ4c.chunk.js.map} +1 -1
  215. package/dist/Assets/js/dist/scripts/{C7Gmh7eY.chunk.js → DWHKdmdQ.chunk.js} +2 -2
  216. package/dist/Assets/js/dist/scripts/{C7Gmh7eY.chunk.js.map → DWHKdmdQ.chunk.js.map} +1 -1
  217. package/dist/Assets/js/dist/scripts/{DXcaOjI_.chunk.js → DYFGF9Pe.chunk.js} +2 -2
  218. package/dist/Assets/js/dist/scripts/{DXcaOjI_.chunk.js.map → DYFGF9Pe.chunk.js.map} +1 -1
  219. package/dist/Assets/js/dist/scripts/{CIw53qNO2.chunk.js → DYOxTenc2.chunk.js} +2 -2
  220. package/dist/Assets/js/dist/scripts/{CIw53qNO2.chunk.js.map → DYOxTenc2.chunk.js.map} +1 -1
  221. package/dist/Assets/js/dist/scripts/{CignflP_2.chunk.js → DZthp5T62.chunk.js} +2 -2
  222. package/dist/Assets/js/dist/scripts/{CignflP_2.chunk.js.map → DZthp5T62.chunk.js.map} +1 -1
  223. package/dist/Assets/js/dist/scripts/{BlqDwJRY.chunk.js → Djgwr16q.chunk.js} +2 -2
  224. package/dist/Assets/js/dist/scripts/{BlqDwJRY.chunk.js.map → Djgwr16q.chunk.js.map} +1 -1
  225. package/dist/Assets/js/dist/scripts/{BwToh2X9.chunk.js → DjnvbVQs.chunk.js} +2 -2
  226. package/dist/Assets/js/dist/scripts/{BwToh2X9.chunk.js.map → DjnvbVQs.chunk.js.map} +1 -1
  227. package/dist/Assets/js/dist/scripts/{UelJUmgx2.chunk.js → DmrhyI9D2.chunk.js} +2 -2
  228. package/dist/Assets/js/dist/scripts/{UelJUmgx2.chunk.js.map → DmrhyI9D2.chunk.js.map} +1 -1
  229. package/dist/Assets/js/dist/scripts/{0KUhq7W7.chunk.js → DnZGILQc.chunk.js} +2 -2
  230. package/dist/Assets/js/dist/scripts/{0KUhq7W7.chunk.js.map → DnZGILQc.chunk.js.map} +1 -1
  231. package/dist/Assets/js/dist/scripts/{BSPrErub.chunk.js → DqnZw1cj.chunk.js} +2 -2
  232. package/dist/Assets/js/dist/scripts/{BSPrErub.chunk.js.map → DqnZw1cj.chunk.js.map} +1 -1
  233. package/dist/Assets/js/dist/scripts/{Bkx2vKcX2.chunk.js → DrAKpy8L2.chunk.js} +2 -2
  234. package/dist/Assets/js/dist/scripts/{Bkx2vKcX2.chunk.js.map → DrAKpy8L2.chunk.js.map} +1 -1
  235. package/dist/Assets/js/dist/scripts/{DX9DFxX2.chunk.js → DsM1bfoR.chunk.js} +2 -2
  236. package/dist/Assets/js/dist/scripts/{DX9DFxX2.chunk.js.map → DsM1bfoR.chunk.js.map} +1 -1
  237. package/dist/Assets/js/dist/scripts/{Dh3G-ann.chunk.js → Dt2TCPUI.chunk.js} +2 -2
  238. package/dist/Assets/js/dist/scripts/{Dh3G-ann.chunk.js.map → Dt2TCPUI.chunk.js.map} +1 -1
  239. package/dist/Assets/js/dist/scripts/{DA6Ynhan.chunk.js → DtylOK55.chunk.js} +2 -2
  240. package/dist/Assets/js/dist/scripts/{DA6Ynhan.chunk.js.map → DtylOK55.chunk.js.map} +1 -1
  241. package/dist/Assets/js/dist/scripts/{CJBiVila2.chunk.js → DuTcsFNo2.chunk.js} +2 -2
  242. package/dist/Assets/js/dist/scripts/{CJBiVila2.chunk.js.map → DuTcsFNo2.chunk.js.map} +1 -1
  243. package/dist/Assets/js/dist/scripts/{BBFS0f7w.chunk.js → Dw0mo6Cf.chunk.js} +2 -2
  244. package/dist/Assets/js/dist/scripts/{BBFS0f7w.chunk.js.map → Dw0mo6Cf.chunk.js.map} +1 -1
  245. package/dist/Assets/js/dist/scripts/{Cg5KHpRA.chunk.js → DwISzabN.chunk.js} +2 -2
  246. package/dist/Assets/js/dist/scripts/{Cg5KHpRA.chunk.js.map → DwISzabN.chunk.js.map} +1 -1
  247. package/dist/Assets/js/dist/scripts/{DMxtE2iS.chunk.js → DxW67uUT.chunk.js} +2 -2
  248. package/dist/Assets/js/dist/scripts/{DMxtE2iS.chunk.js.map → DxW67uUT.chunk.js.map} +1 -1
  249. package/dist/Assets/js/dist/scripts/{BOGS-BOS.chunk.js → Eg4zYYCO.chunk.js} +2 -2
  250. package/dist/Assets/js/dist/scripts/{BOGS-BOS.chunk.js.map → Eg4zYYCO.chunk.js.map} +1 -1
  251. package/dist/Assets/js/dist/scripts/{CSuC7le7.chunk.js → GT6nO4Jv.chunk.js} +2 -2
  252. package/dist/Assets/js/dist/scripts/{CSuC7le7.chunk.js.map → GT6nO4Jv.chunk.js.map} +1 -1
  253. package/dist/Assets/js/dist/scripts/{BhKv6dKl2.chunk.js → GpDEun8c2.chunk.js} +2 -2
  254. package/dist/Assets/js/dist/scripts/{BhKv6dKl2.chunk.js.map → GpDEun8c2.chunk.js.map} +1 -1
  255. package/dist/Assets/js/dist/scripts/{DKJC5qg0.chunk.js → OKjYL31I.chunk.js} +2 -2
  256. package/dist/Assets/js/dist/scripts/{DKJC5qg0.chunk.js.map → OKjYL31I.chunk.js.map} +1 -1
  257. package/dist/Assets/js/dist/scripts/{D8rrJ-jY2.chunk.js → OrCUhFjq2.chunk.js} +2 -2
  258. package/dist/Assets/js/dist/scripts/{D8rrJ-jY2.chunk.js.map → OrCUhFjq2.chunk.js.map} +1 -1
  259. package/dist/Assets/js/dist/scripts/{D3exV_Ay2.chunk.js → SVXAAhk02.chunk.js} +2 -2
  260. package/dist/Assets/js/dist/scripts/{D3exV_Ay2.chunk.js.map → SVXAAhk02.chunk.js.map} +1 -1
  261. package/dist/Assets/js/dist/scripts/{CcZKy7SH.chunk.js → SmmnJrec.chunk.js} +2 -2
  262. package/dist/Assets/js/dist/scripts/{CcZKy7SH.chunk.js.map → SmmnJrec.chunk.js.map} +1 -1
  263. package/dist/Assets/js/dist/scripts/{Dy4nscVE2.chunk.js → T3BageSw2.chunk.js} +2 -2
  264. package/dist/Assets/js/dist/scripts/{Dy4nscVE2.chunk.js.map → T3BageSw2.chunk.js.map} +1 -1
  265. package/dist/Assets/js/dist/scripts/{B8PM5Ji3.chunk.js → T6xxjp_W.chunk.js} +2 -2
  266. package/dist/Assets/js/dist/scripts/{B8PM5Ji3.chunk.js.map → T6xxjp_W.chunk.js.map} +1 -1
  267. package/dist/Assets/js/dist/scripts/{Cp6Af16p.chunk.js → Uc2eW092.chunk.js} +2 -2
  268. package/dist/Assets/js/dist/scripts/{Cp6Af16p.chunk.js.map → Uc2eW092.chunk.js.map} +1 -1
  269. package/dist/Assets/js/dist/scripts/{DmKyGgLu.chunk.js → XHoEdG1q.chunk.js} +2 -2
  270. package/dist/Assets/js/dist/scripts/{DmKyGgLu.chunk.js.map → XHoEdG1q.chunk.js.map} +1 -1
  271. package/dist/Assets/js/dist/scripts/{BdVoyBI02.chunk.js → Y14NYZ692.chunk.js} +2 -2
  272. package/dist/Assets/js/dist/scripts/{BdVoyBI02.chunk.js.map → Y14NYZ692.chunk.js.map} +1 -1
  273. package/dist/Assets/js/dist/scripts/{DrszevCi.chunk.js → Y_IcNhI9.chunk.js} +2 -2
  274. package/dist/Assets/js/dist/scripts/{DrszevCi.chunk.js.map → Y_IcNhI9.chunk.js.map} +1 -1
  275. package/dist/Assets/js/dist/scripts/{CMGpVYHd.chunk.js → Yr5eNz05.chunk.js} +2 -2
  276. package/dist/Assets/js/dist/scripts/{CMGpVYHd.chunk.js.map → Yr5eNz05.chunk.js.map} +1 -1
  277. package/dist/Assets/js/dist/scripts/{QnwProbJ2.chunk.js → Yrc9o6bG2.chunk.js} +2 -2
  278. package/dist/Assets/js/dist/scripts/{QnwProbJ2.chunk.js.map → Yrc9o6bG2.chunk.js.map} +1 -1
  279. package/dist/Assets/js/dist/scripts/{app-Dl-tzfIp.js → app-RphP4Ht0.js} +4 -4
  280. package/dist/Assets/js/dist/scripts/{app-Dl-tzfIp.js.map → app-RphP4Ht0.js.map} +1 -1
  281. package/dist/Assets/js/dist/scripts/{B96Bwi2D.chunk.js → cUgHqo-u.chunk.js} +2 -2
  282. package/dist/Assets/js/dist/scripts/{B96Bwi2D.chunk.js.map → cUgHqo-u.chunk.js.map} +1 -1
  283. package/dist/Assets/js/dist/scripts/{oGkpmMft2.chunk.js → dmUfJoJz2.chunk.js} +2 -2
  284. package/dist/Assets/js/dist/scripts/{oGkpmMft2.chunk.js.map → dmUfJoJz2.chunk.js.map} +1 -1
  285. package/dist/Assets/js/dist/scripts/{DjlPflaG.chunk.js → fapHSEex.chunk.js} +2 -2
  286. package/dist/Assets/js/dist/scripts/{DjlPflaG.chunk.js.map → fapHSEex.chunk.js.map} +1 -1
  287. package/dist/Assets/js/dist/scripts/{CaEXONXp2.chunk.js → jf0e_ii92.chunk.js} +2 -2
  288. package/dist/Assets/js/dist/scripts/{CaEXONXp2.chunk.js.map → jf0e_ii92.chunk.js.map} +1 -1
  289. package/dist/Assets/js/dist/scripts/{Co7TevGA.chunk.js → kp4jXqVv.chunk.js} +2 -2
  290. package/dist/Assets/js/dist/scripts/{Co7TevGA.chunk.js.map → kp4jXqVv.chunk.js.map} +1 -1
  291. package/dist/Assets/js/dist/scripts/lAvSm0ti.chunk.js +2 -0
  292. package/dist/Assets/js/dist/scripts/lAvSm0ti.chunk.js.map +1 -0
  293. package/dist/Assets/js/dist/scripts/{Dmf5vYc42.chunk.js → n7lzp_Mc2.chunk.js} +2 -2
  294. package/dist/Assets/js/dist/scripts/{Dmf5vYc42.chunk.js.map → n7lzp_Mc2.chunk.js.map} +1 -1
  295. package/dist/Assets/js/dist/scripts/{CG9yCT4r2.chunk.js → nvtWO4PW2.chunk.js} +2 -2
  296. package/dist/Assets/js/dist/scripts/{CG9yCT4r2.chunk.js.map → nvtWO4PW2.chunk.js.map} +1 -1
  297. package/dist/Assets/js/dist/scripts/{CACu0hGi2.chunk.js → oYKM19q12.chunk.js} +2 -2
  298. package/dist/Assets/js/dist/scripts/{CACu0hGi2.chunk.js.map → oYKM19q12.chunk.js.map} +1 -1
  299. package/dist/Assets/js/dist/scripts/{B5v11U7g.chunk.js → ohTu1tHz.chunk.js} +2 -2
  300. package/dist/Assets/js/dist/scripts/{B5v11U7g.chunk.js.map → ohTu1tHz.chunk.js.map} +1 -1
  301. package/dist/Assets/js/dist/scripts/{BrT-onLe2.chunk.js → uCRnfBEw2.chunk.js} +2 -2
  302. package/dist/Assets/js/dist/scripts/{BrT-onLe2.chunk.js.map → uCRnfBEw2.chunk.js.map} +1 -1
  303. package/dist/Assets/js/dist/scripts/{3XkTogZ22.chunk.js → udVWVmrH2.chunk.js} +2 -2
  304. package/dist/Assets/js/dist/scripts/{3XkTogZ22.chunk.js.map → udVWVmrH2.chunk.js.map} +1 -1
  305. package/dist/Assets/js/dist/scripts/{DW-yUqjB2.chunk.js → v0VARBBE2.chunk.js} +2 -2
  306. package/dist/Assets/js/dist/scripts/{DW-yUqjB2.chunk.js.map → v0VARBBE2.chunk.js.map} +1 -1
  307. package/dist/Assets/js/dist/scripts/{B4lIRWK22.chunk.js → vf9_5VGa2.chunk.js} +2 -2
  308. package/dist/Assets/js/dist/scripts/{B4lIRWK22.chunk.js.map → vf9_5VGa2.chunk.js.map} +1 -1
  309. package/dist/Assets/js/dist/scripts/{pOwOak4Z2.chunk.js → wTEWtWoE2.chunk.js} +2 -2
  310. package/dist/Assets/js/dist/scripts/{pOwOak4Z2.chunk.js.map → wTEWtWoE2.chunk.js.map} +1 -1
  311. package/dist/Assets/js/dist/scripts/{DPYIBfGB.chunk.js → xj8_Pfx7.chunk.js} +2 -2
  312. package/dist/Assets/js/dist/scripts/{DPYIBfGB.chunk.js.map → xj8_Pfx7.chunk.js.map} +1 -1
  313. package/dist/bundles.json +1 -1
  314. package/dist/en.json +1 -1
  315. package/package.json +1 -1
  316. package/dist/Assets/js/dist/scripts/D2iK_uRt.chunk.js +0 -2
  317. package/dist/Assets/js/dist/scripts/DBUreHJA.chunk.js +0 -3
  318. package/dist/Assets/js/dist/scripts/DBUreHJA.chunk.js.map +0 -1
  319. package/dist/Assets/js/dist/scripts/Dh5DbdtP.chunk.js +0 -2
  320. package/dist/Assets/js/dist/scripts/Dh5DbdtP.chunk.js.map +0 -1
  321. package/dist/Assets/js/dist/scripts/DrBVabtm.chunk.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"lgpeNdac.chunk.js","names":[],"sources":["../../../../../src/apps/marketing/interfaces/SubscriptionGroup.ts","../../../../../src/apps/marketing/constants/ClickViewOffices.ts","../../../../../src/apps/marketing/interfaces/ContactImport.ts","../../../../../src/apps/marketing/utils/WildWestValidationRules.ts","../../../../../src/apps/marketing/utils/CoreValidationRules.ts","../../../../../src/apps/marketing/utils/ContactUploadHelper.tsx","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadCustomEventForm.tsx","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadDetailsForm.tsx","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadDetailsSchema.ts","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/components/UploadCsv.tsx","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/ContactUploadView.tsx"],"sourcesContent":["export enum SubscriptionGroup {\n All = 'all',\n ClickView = 'cv',\n Streamable = 'sl',\n None = 'none'\n}\n","export enum ClickViewOffice {\n AU = 'ClickView Australia',\n NZ = 'ClickView New Zealand',\n UK = 'ClickView United Kingdom',\n US = 'ClickView United States'\n}\n","export enum ContactImport {\n GovSpend = 'bulk_import_govspend',\n AzGovBiz = 'bulk_import_azgovbiz',\n Agile = 'bulk_import_agile'\n}\n","import { ValidationRules } from 'apps/marketing/interfaces/ValidationRules';\n\nexport const WildWestValidationRules: ValidationRules[] = [\n {\n name: 'first_name',\n required: true,\n pattern: /^.{1,}$/\n },\n {\n name: 'last_name',\n required: true,\n pattern: /^.{1,}$/\n },\n {\n name: 'job_title',\n required: true,\n pattern: /^.{1,}$/\n },\n {\n name: 'email',\n required: true,\n unique: true,\n caseInsensitive: true,\n pattern: /^[A-Za-z0-9.'_%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]+$/\n },\n {\n name: 'account_name',\n required: true,\n pattern: /^.{1,}$/\n },\n {\n name: 'country_code',\n required: true,\n pattern: /^[A-Z]{2,3}$/\n },\n {\n name: 'clickview_office',\n required: true,\n pattern: /^ClickView (Australia|United States|New Zealand|United Kingdom)$/\n },\n {\n name: 'organisation_sub_type',\n required: false,\n pattern: /^.{1,}$/\n },\n {\n name: 'province',\n required: true,\n pattern: /^[A-Z]{2,3}$/\n },\n {\n name: 'phone',\n required: false,\n pattern: /^.{1,}$/\n }\n];\n","import { ValidationRules } from 'apps/marketing/interfaces/ValidationRules';\nimport { WildWestValidationRules } from 'apps/marketing/utils/WildWestValidationRules';\n\nexport const CoreValidationRules: ValidationRules[] = [\n ...WildWestValidationRules,\n {\n name: 'topic',\n required: false,\n unique: false,\n pattern: /^.{1,}$/\n },\n {\n name: 'sync_to_crm',\n required: false,\n unique: false,\n pattern: /^(TRUE|FALSE)$/\n },\n {\n name: 'lead_source',\n required: false,\n unique: false,\n pattern: /^.{1,}$/\n }\n];\n","import { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BatchJobSummary, MarketingProfile, MarketingProfileEvent } from 'libs/shared/interfaces';\n\nimport { ClickViewOffice } from 'apps/marketing/constants/ClickViewOffices';\nimport { BrazeEvents } from 'apps/marketing/interfaces/BrazeEvents';\nimport { BrazeWorkspace } from 'apps/marketing/interfaces/BrazeWorkspace';\nimport { ContactImport } from 'apps/marketing/interfaces/ContactImport';\nimport { ContactUploadDetails } from 'apps/marketing/interfaces/ContactUploadDetails';\nimport { SubscriptionGroup } from 'apps/marketing/interfaces/SubscriptionGroup';\nimport { ValidationRules } from 'apps/marketing/interfaces/ValidationRules';\nimport { ContactUploadTemplate } from 'apps/marketing/utils/ContactUploadTemplates';\nimport { CoreValidationRules } from 'apps/marketing/utils/CoreValidationRules';\nimport { WildWestValidationRules } from 'apps/marketing/utils/WildWestValidationRules';\n\nexport const ContactUploadHelper = {\n getWorkspaces() {\n return [\n { name: 'Wild West', value: BrazeWorkspace.WildWest },\n { name: 'Core', value: BrazeWorkspace.Core }\n ];\n },\n\n getBrazeTemplates(canManageAll: boolean) {\n return canManageAll ?\n [{ name: 'Wild West', link: ContactUploadTemplate.WildWest }, { name: 'Core', link: ContactUploadTemplate.Core }] :\n [{ name: 'Wild West', link: ContactUploadTemplate.WildWest }];\n },\n\n getSourcesByWorkspace(workspace: BrazeWorkspace) {\n if (workspace === BrazeWorkspace.WildWest)\n return [\n { name: ContactImport.GovSpend, validation: WildWestValidationRules },\n { name: ContactImport.AzGovBiz, validation: WildWestValidationRules },\n { name: ContactImport.Agile, validation: WildWestValidationRules }\n ];\n },\n\n getCsvValidation(data: string[][]) {\n const FIRST_DATA_ROW = 1;\n\n if (!data.length)\n return { isValid: false, error: 'No data found in the CSV.' };\n\n if (data.length === 1)\n return { isValid: false, error: 'CSV only contains headers and no data rows.' };\n\n if (data[FIRST_DATA_ROW]?.every(cell => !cell))\n return { isValid: false, error: 'First data row is empty.' };\n\n if (data.length > 10000)\n return { isValid: false, error: 'Cannot upload a spreadsheet larger than 10,000 rows.' };\n\n return { isValid: true, error: '' };\n },\n\n getJobSummaryClass(status: string) {\n switch (status) {\n case 'error':\n return 'danger';\n case 'warning':\n return 'warning';\n case 'success':\n return 'success';\n default:\n return 'info';\n }\n },\n\n getJobSummary(result: BatchJobSummary) {\n if (result.totalErrored > 0 && result.totalErrored < result.totalProcessed)\n return {\n status: 'error',\n message: `${result.totalErrored} out of ${result.totalProcessed} users failed to be uploaded`\n };\n\n if (result.totalErrored > 0 && result.totalErrored === result.totalProcessed)\n return {\n status: 'error',\n message: 'All users failed to be uploaded'\n };\n\n if (result.totalErrored === 0 && result.totalProcessed === 0)\n return {\n status: 'warning',\n message: 'No users were uploaded, they may already exist in Braze'\n };\n\n return {\n status: 'success',\n message: `${result.totalSucceeded} users have been uploaded to Braze`\n };\n },\n\n getSourcesValidation(sourceName: string, workspace: BrazeWorkspace): ValidationRules[] {\n return ContactUploadHelper.getSourcesByWorkspace(workspace).find(source => source.name === sourceName).validation;\n },\n\n isEmptyRow(row: string[]): boolean {\n return row.every(cell => cell.trim() === '');\n },\n\n getValidOfficeRegionValue(region: string) {\n switch (region) {\n case 'us':\n return [ ClickViewOffice.US, ClickViewOffice.AU, ClickViewOffice.NZ ];\n case 'eu':\n return [ClickViewOffice.UK];\n }\n },\n \n buildSubscriptionEvent(subscriptionGroup: SubscriptionGroup): MarketingProfileEvent {\n if (subscriptionGroup === SubscriptionGroup.None)\n return;\n\n const event: MarketingProfileEvent = {\n name: BrazeEvents.AddToSubscriptionGroups,\n time: new Date().toISOString(),\n properties: { source: 'curator_contact_upload' }\n };\n\n if (subscriptionGroup === SubscriptionGroup.ClickView)\n event.properties = { ...event.properties, products: ['clickview']};\n\n if (subscriptionGroup === SubscriptionGroup.Streamable)\n event.properties = { ...event.properties, products: ['streamable']};\n\n if (subscriptionGroup === SubscriptionGroup.All)\n event.properties = { ...event.properties, products: [ 'streamable', 'clickview' ]};\n\n return event;\n },\n \n buildMarketingProfileEvent(eventName: string, eventPayload: string): MarketingProfileEvent {\n if (!eventName)\n return;\n\n const event: MarketingProfileEvent = {\n name: eventName,\n time: new Date().toISOString(),\n properties: {}\n };\n\n if (eventPayload) {\n try {\n event.properties = JSON.parse(eventPayload);\n } catch {}\n }\n\n return event;\n },\n \n generateProfiles(csvData: string[][], details: ContactUploadDetails): MarketingProfile[] {\n const headers = csvData[0];\n const profiles: MarketingProfile[] = csvData.slice(1).map(row => {\n const wildWestProfile: MarketingProfile = {\n firstName: row[headers.indexOf('first_name')] || '',\n lastName: row[headers.indexOf('last_name')] || '',\n jobTitle: row[headers.indexOf('job_title')] || '',\n email: row[headers.indexOf('email')] || '',\n accountName: row[headers.indexOf('account_name')] || '',\n countryCode: row[headers.indexOf('country_code')] || '',\n organisationSubType: row[headers.indexOf('organisation_sub_type')] || '',\n province: row[headers.indexOf('province')] || '',\n phone: row[headers.indexOf('phone')] || '',\n clickViewOffice: row[headers.indexOf('clickview_office')] || ''\n };\n\n if (details.workspace === 'core') {\n return {\n ...wildWestProfile,\n topic: row[headers.indexOf('topic')] || '',\n syncToCrm: row[headers.indexOf('sync_to_crm')] || '',\n leadSource: row[headers.indexOf('lead_source')] || ''\n };\n }\n\n return wildWestProfile;\n });\n \n return profiles;\n },\n\n getContainerWidth(breakpoints: Breakpoints) {\n if (breakpoints.xl || breakpoints.xxl)\n return 'w-50';\n \n if (breakpoints.lg)\n return 'w-75';\n \n return 'w-100';\n },\n\n validateCSV(csvData: string[][], details: ContactUploadDetails, canUploadToCore: boolean) {\n const validationRules = canUploadToCore ?\n (details.workspace === BrazeWorkspace.WildWest ? WildWestValidationRules : CoreValidationRules) :\n ContactUploadHelper.getSourcesValidation(details.source, details.workspace);\n\n // Remove last row if it's empty.\n // A trailing comma in the last line of the CSV will result in a row of empty cells when parsed by PapaParse: https://github.com/mholt/PapaParse/issues/604\n if (csvData.length > 1 && ContactUploadHelper.isEmptyRow(csvData[csvData.length - 1])) {\n csvData.pop();\n }\n \n const headers = csvData[0];\n const rows = csvData.slice(1);\n \n const errors: string[] = [];\n const uniqueValues: Record<string, Set<string>> = {};\n \n validationRules.forEach(rule => {\n if (rule.unique) {\n uniqueValues[rule.name] = new Set();\n }\n });\n \n rows.forEach((row, rowIndex) => {\n validationRules.forEach(rule => {\n const colIndex = headers.indexOf(rule.name);\n const value = row[colIndex] || '';\n\n // We'll skip all validation checks if the `required` field is not set and there is no value\n if (!rule.required && !value)\n return;\n\n // Check 'clickview_office' column only contains values aligned with the Braze region they selected\n // e.g selecing EU region means cell values must be 'ClickView United Kingdom'\n const validValue = ContactUploadHelper.getValidOfficeRegionValue(details.region);\n\n if (headers[colIndex] === 'clickview_office' && !validValue.includes(value as ClickViewOffice)) {\n errors.push(`Row ${rowIndex + 1}: Invalid clickviewOffice value '${value}, must be the same region you have selected i.e ${validValue}`);\n }\n\n if (colIndex === -1) {\n // Only report this once rather than on every row iteration\n if (errors.includes(`Missing required column: ${rule.name}`)) return;\n errors.push(`Missing required column: ${rule.name}`);\n return;\n }\n \n if (rule.required && value.trim() === '') {\n errors.push(`Row ${rowIndex + 1}: ${rule.name} is required.`);\n }\n \n if (rule.pattern && !rule.pattern.test(value)) {\n errors.push(`Row ${rowIndex + 1}: ${rule.name} does not match the required format.`);\n }\n \n if (rule.unique) {\n const normalizedValue = rule.caseInsensitive ? value.toLowerCase() : value;\n if (uniqueValues[rule.name].has(normalizedValue)) {\n errors.push(`Row ${rowIndex + 1}: Duplicate value found for ${rule.name}.`);\n }\n uniqueValues[rule.name].add(normalizedValue);\n }\n });\n });\n return errors;\n }\n};\n","import React from 'react';\n\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nimport { ContactUploadDetails } from 'apps/marketing/interfaces/ContactUploadDetails';\nimport { ContactUploadHelper } from 'apps/marketing/utils/ContactUploadHelper';\n\ninterface ContactUploadCustomEventFormProps {\n formData: ContactUploadDetails;\n handleChange: React.ChangeEventHandler<HTMLInputElement>;\n handleBlur: React.FocusEventHandler<HTMLInputElement>;\n enabled: boolean;\n toggle: () => void;\n canManageAll: boolean;\n}\n\nexport function ContactUploadCustomEventForm(\n { formData, handleChange, handleBlur, enabled, toggle, canManageAll }: ContactUploadCustomEventFormProps\n): JSX.Element {\n if (!canManageAll)\n return <></>;\n\n const showEventPayloadPreview = formData.eventName && formData.eventValue;\n\n return (\n <div className='border border-2 border-gray-300 rounded'>\n <div className='bg-gray-200 p-3 rounded-top-1 border-bottom border-2 border-gray-300'>\n <div className='d-flex w-100 flex-row justify-content-between'>\n <p className='mb-0'>Custom Event</p>\n <ToggleSwitch\n on={enabled}\n onClick={toggle}\n tooltipText='Trigger a custom event for each user uploaded to Braze'\n />\n </div>\n </div>\n <div className='p-3'>\n <div className='mb-3'>\n <FormField\n name='eventName'\n label='Event Name'\n as='input'\n infoText='Name of the event that will be triggered for each user'\n disabled={!enabled}\n value={formData.eventName}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n <div className='mb-3'>\n <FormField\n name='eventValue'\n label='Event Payload'\n as='textarea'\n infoText='The JSON payload accompanying the event'\n infoTooltip='This should be formatted as valid JSON'\n disabled={!enabled}\n value={formData.eventValue}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n {showEventPayloadPreview &&\n <div className='mb-3'>\n <span className='d-flex text-sm mb-2'>Event preview</span>\n <pre className='bg-gray-200 p-2 rounded text-sm font-mono whitespace-pre-wrap'>\n {JSON.stringify(ContactUploadHelper.buildMarketingProfileEvent(\n formData.eventName,\n formData.eventValue\n ), null, 2)}\n </pre>\n </div>\n }\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\n\nimport { BrazeWorkspace } from 'apps/marketing/interfaces/BrazeWorkspace';\nimport { ContactUploadDetails } from 'apps/marketing/interfaces/ContactUploadDetails';\nimport { SubscriptionGroup } from 'apps/marketing/interfaces/SubscriptionGroup';\nimport { ContactUploadHelper } from 'apps/marketing/utils/ContactUploadHelper';\nimport { MarketingHelper } from 'apps/marketing/utils/MarketingHelper';\n\ninterface ContactUploadDetailsFormProps {\n formData: ContactUploadDetails;\n handleChange: React.ChangeEventHandler<HTMLInputElement>;\n handleBlur: React.FocusEventHandler<HTMLInputElement>;\n canManageAll: boolean;\n}\n\nexport function ContactUploadDetailsForm(\n { formData, handleChange, handleBlur, canManageAll }: ContactUploadDetailsFormProps\n): JSX.Element {\n const showSubscriptionGroups = canManageAll && formData.workspace !== BrazeWorkspace.WildWest;\n return (\n <div className='border border-2 border-gray-300 rounded'>\n <div className='bg-gray-200 p-3 rounded-top-1 border-bottom border-2 border-gray-300'>\n <p className='mb-0'>Upload Details</p>\n </div>\n <div className='p-3'>\n <div>\n {canManageAll ?\n <FormField\n name='source'\n label='Source'\n as='input'\n placeholder='bulk_import_...'\n value={formData.source}\n onChange={handleChange}\n onBlur={handleBlur}\n /> :\n <FormField\n name='source'\n label='Source'\n as='select'\n value={formData.source}\n onChange={handleChange}\n onBlur={handleBlur}\n >\n <option value='' disabled>Select Source</option>\n {ContactUploadHelper.getSourcesByWorkspace(formData.workspace).map(source => (\n <option key={source.name} value={source.name}>{source.name}</option>\n ))}\n </FormField>\n }\n </div>\n\n <div className='mb-3'>\n <FormField\n name='region'\n label='Region'\n infoText={!canManageAll && 'If you need to add users to EU, please contact the Product team'}\n as='select'\n value={formData.region}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={!canManageAll}\n >\n {canManageAll ? (\n <>\n <option value='' disabled>Select Region</option>\n {MarketingHelper.getAllRegions().map(region => (\n <option key={region.value} value={region.value}>\n {region.label}\n </option>\n ))}\n </>\n ) : (\n <option value='us'>US</option>\n )}\n </FormField>\n </div>\n\n <div className='mb-3'>\n <FormField\n name='workspace'\n label='Workspace'\n infoText={!canManageAll && 'If you need to add users to Core, please contact the Product team'}\n as='select'\n value={formData.workspace}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={!canManageAll}\n >\n {canManageAll ? (\n <>\n <option value='' disabled>Select Workspace</option>\n {ContactUploadHelper.getWorkspaces().map(workspace => (\n <option key={workspace.value} value={workspace.value}>\n {workspace.name}\n </option>\n ))}\n </>\n ) : (\n <option value='wildwest'>Wild West</option>\n )}\n </FormField>\n </div>\n {showSubscriptionGroups ? (\n <div className='mb-3'>\n <FormField\n name='subscriptionGroup'\n label='Subscription Groups'\n as='select'\n value={formData.subscriptionGroup}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={null}\n >\n <option value='' disabled>Select Subscription Groups</option>\n {Object.entries(SubscriptionGroup).map(([ sgName, sgValue ]) => (\n <option key={sgValue} value={sgValue}>\n {sgName}\n </option>\n ))}\n </FormField>\n </div>\n ) : <></>}\n </div>\n </div>\n );\n}\n","import * as Yup from 'yup';\n\nconst BULK_IMPORT_REGEX = /^bulk_import_[a-z0-9]+(_[a-z0-9]+)*$/;\nconst SNAKE_CASE_REGEX = /^[a-z0-9]+(_[a-z0-9]+)*$/;\n\nexport function ContactUploadDetailsSchema(isCustomEventEnabled: boolean) {\n return Yup.object().shape({\n source: Yup.string()\n .matches(\n BULK_IMPORT_REGEX,\n 'Must start with bulk_import_, followed by lowercase letters or numbers, with optional segments separated by a single underscore (_), and no uppercase letters or special characters.'\n )\n .required('Source is required'),\n region: Yup.string().required('Region is required'),\n workspace: Yup.string().required('Workspace is required'),\n eventName: Yup.string().when([], {\n is: () => isCustomEventEnabled,\n then: Yup.string().matches(SNAKE_CASE_REGEX, 'Event name must be lower snake case').required('Event name is required'),\n otherwise: Yup.string().notRequired()\n }),\n eventValue: Yup.string().when([], {\n is: () => isCustomEventEnabled,\n then: Yup.string().required('Event value is required'),\n otherwise: Yup.string().notRequired()\n })\n });\n}\n","import React from 'react';\n\nimport { BulkUploadFileSelect } from 'libs/shared/apps/user-manager/components/bulk-upload/bulk-upload-file-select/BulkUploadFileSelect';\n\nimport { ContactUploadHelper } from 'apps/marketing/utils/ContactUploadHelper';\n\ninterface UploadCsvProps {\n canManageAll: boolean;\n handleCsvParsing: (data: string[][]) => Promise<void>;\n numRows: number;\n}\n\nexport function UploadCsv({ canManageAll, handleCsvParsing, numRows }: UploadCsvProps) {\n const templates = ContactUploadHelper.getBrazeTemplates(canManageAll);\n return (\n <div>\n <p>\n Upload contacts to Braze\n {canManageAll ?\n '. Please use one of the following templates' :\n ' Wild West. Please use the following template'}\n </p>\n\n <ul>\n {templates.map((template, index) => (\n <li key={index}>\n <a className='btn btn-link p-0 text-info px-3' download href={template.link}>\n {template.name}\n </a>\n </li>\n ))}\n </ul>\n\n <div className='w-50'>\n <BulkUploadFileSelect onSelectSpreadsheet={handleCsvParsing} />\n </div>\n \n {numRows > 0 && (\n <p className='mt-2'>Total contacts to upload: <b>{numRows - 1}</b></p>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { Button } from 'react-bootstrap';\nimport { useDispatch } from 'react-redux';\nimport { Form } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { WizardPolling } from 'libs/shared/components/wizard/status/polling/WizardPolling';\nimport { BatchDataType } from 'libs/shared/enums/BatchDataType';\nimport { BatchJobName } from 'libs/shared/enums/BatchJobName';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJob, BatchJobProgress, BatchJobSummary, CuratorUser, MarketingProfileEvent } from 'libs/shared/interfaces';\n\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\nimport { useCuratorPermissions } from 'shared/hooks/UseCuratorPermissions';\n\nimport { BrazeWorkspace } from 'apps/marketing/interfaces/BrazeWorkspace';\nimport { ContactUploadDetails } from 'apps/marketing/interfaces/ContactUploadDetails';\nimport { SubscriptionGroup } from 'apps/marketing/interfaces/SubscriptionGroup';\nimport { MarketingLayoutView } from 'apps/marketing/layout/MarketingLayout';\nimport { ContactUploadHelper } from 'apps/marketing/utils/ContactUploadHelper';\nimport { MarketingHelper } from 'apps/marketing/utils/MarketingHelper';\nimport { ContactUploadCustomEventForm } from 'apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadCustomEventForm';\nimport { ContactUploadDetailsForm } from 'apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadDetailsForm';\nimport { ContactUploadDetailsSchema } from 'apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadDetailsSchema';\nimport { UploadCsv } from 'apps/marketing/views/contact-upload/contact-upload-wizard/components/UploadCsv';\n\nexport function ContactUploadView(): JSX.Element {\n const [ isCustomEventEnabled, setIsCustomEventEnabled ] = useState(true);\n const [ showDetailsSection, setShowDetailsSection ] = useState(false);\n const [ csvData, setCsvData ] = useState<string[][]>([]);\n const [ validationErrors, setValidationErrors ] = useState<string[]>([]);\n const [ jobId, setJobId ] = useState<string>('');\n const [ showSpinner, setShowSpinner ] = useState(false);\n const [ jobSummary, setJobSummary ] = useState({ status: '', message: '' });\n const [ status, setStatus ] = useState<'initial' | 'validating' | 'validated' | 'uploading' | 'completed'>('initial');\n\n const dispatch = useDispatch();\n const { hasPermissions } = useCuratorPermissions();\n\n const canManageUpload = hasPermissions(CuratorPermissionName.MarketingContactUploadAll);\n const canManageCatalog = hasPermissions(CuratorPermissionName.MarketingCatalogManagement);\n const canManageAll = canManageUpload && canManageCatalog;\n\n const containerWidth = ContactUploadHelper.getContainerWidth(useBreakpoints());\n const alerts = useAlerts();\n\n function pollJob(onSuccess: (progress: BatchJobProgress) => void, onError: (xhr: Xhr) => void): void {\n Flight.fetch(dispatch, JobRequests.getJobProgress(jobId, onSuccess, onError));\n }\n\n async function checkJobSummary() {\n const result: BatchJobSummary = await Flight.fetchAsync(dispatch, JobRequests.getJobSummary(jobId));\n setJobSummary(ContactUploadHelper.getJobSummary(result));\n setStatus('completed');\n }\n\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n\n useSetPageMetadata({ title: 'Contact Upload' });\n\n if (!currentUser.hasCompleted) return <></>;\n\n const handleCsvParsing = async (data: string[][]) => {\n // reset state on new csv upload\n setValidationErrors([]);\n setJobId('');\n setStatus('initial');\n\n if (!canManageAll) {\n setIsCustomEventEnabled(false);\n }\n\n const { isValid, error } = ContactUploadHelper.getCsvValidation(data);\n\n if (!isValid) {\n alerts.error(error);\n return;\n }\n\n // Remove empty rows\n const cleanData = data.filter(row => row.some(Boolean));\n\n setCsvData(cleanData);\n setShowDetailsSection(true);\n };\n\n const validateCsv = (contactUploadDetails: ContactUploadDetails) => {\n setStatus('validating');\n const errors = ContactUploadHelper.validateCSV(csvData, contactUploadDetails, canManageAll);\n setValidationErrors(errors);\n setStatus(errors.length > 0 ? 'initial' : 'validated');\n };\n\n async function handleUpload(details: ContactUploadDetails): Promise<void> {\n setShowSpinner(true);\n setStatus('uploading');\n\n const events: MarketingProfileEvent[] = [];\n\n const subscriptionGroupEvent = ContactUploadHelper.buildSubscriptionEvent(details.subscriptionGroup);\n\n if (subscriptionGroupEvent)\n events.push(subscriptionGroupEvent);\n\n const customEvent = ContactUploadHelper.buildMarketingProfileEvent(details.eventName, details.eventValue);\n\n if (customEvent)\n events.push(customEvent);\n \n const data = {\n name: BatchJobName.MarketingProfile,\n type: BatchJobType.MarketingProfile,\n metadata: {\n source: details.source,\n instanceRegion: MarketingHelper.getInstanceRegionByCode(details.region),\n workspace: details.workspace,\n profiles: ContactUploadHelper.generateProfiles(csvData, details),\n events\n },\n customerId: currentUser.data.id,\n dataType: BatchDataType.MarketingProfile\n };\n \n Flight.fetchAsync(dispatch, JobRequests.createJob(data))\n .then((job: BatchJob) => {\n setJobId(job.id);\n setStatus('uploading');\n })\n .catch(() => {\n alerts.error('Failed to upload the contacts. Please try again.');\n setStatus('initial');\n });\n }\n\n const UploadStatus = (): JSX.Element => {\n switch (status) {\n case 'validating':\n return null;\n case 'validated':\n return (\n <div className='alert alert-success'>\n Validation succeeded. Click Upload to continue.\n </div>\n );\n case 'uploading':\n return jobId ? (\n <div className='border-top pt-4'>\n <div className='alert alert-info'>\n Contacts will continue to be uploaded in the background, so you can safely close this page.\n Once processing is complete, you will be notified via email.\n </div>\n <WizardPolling\n jobId={jobId}\n pollJob={pollJob}\n actionName='Importing Users'\n actionVerb='Create'\n onStatusCompleted={() => {\n setShowSpinner(false);\n checkJobSummary();\n }}\n />\n </div>\n ) : null;\n case 'completed':\n return (\n <div className={`alert alert-${ContactUploadHelper.getJobSummaryClass(jobSummary.status)}`}>\n {jobSummary.message}\n </div>\n );\n default:\n if (validationErrors.length > 0) {\n return (\n <div className='border-top pt-4'>\n <div className='alert alert-danger'>\n <p><b>{validationErrors.length} Validation Error{validationErrors.length !== 1 && 's'}</b></p>\n <ul>\n {validationErrors.map(error => (\n <li key={error} className='text-danger'>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n );\n }\n return null;\n }\n };\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const leftNavItems = MarketingHelper.getLeftNavItems(canManageAll, currentAppLink.action);\n \n return (\n <MarketingLayoutView leftNavItems={leftNavItems}>\n <div className={containerWidth}>\n <FormWrapper\n validationSchema={ContactUploadDetailsSchema(isCustomEventEnabled)}\n // The initial values set are used by non-devs but can be overwritten by dev selections\n initialValues={{\n source: '',\n region: 'us',\n workspace: BrazeWorkspace.WildWest,\n subscriptionGroup: SubscriptionGroup.None,\n eventName: '',\n eventValue: ''\n }}\n onSubmit={validateCsv}\n >\n {({ values, handleChange, handleBlur, handleSubmit }) => (\n <div className='p-4 d-flex flex-column gap-4'>\n\n {/* Upload CSV */}\n <h2 className='mb-0'>Contact Upload</h2>\n <UploadCsv\n canManageAll={canManageAll}\n handleCsvParsing={handleCsvParsing}\n numRows={csvData.length}\n />\n \n {/* Input details */}\n {showDetailsSection && (\n <Form className='d-flex flex-column gap-4'>\n <ContactUploadDetailsForm\n formData={values}\n handleChange={handleChange}\n handleBlur={handleBlur}\n canManageAll={canManageAll}\n />\n <ContactUploadCustomEventForm\n formData={values}\n handleChange={handleChange}\n handleBlur={handleBlur}\n enabled={isCustomEventEnabled}\n toggle={() => setIsCustomEventEnabled(!isCustomEventEnabled)}\n canManageAll={canManageAll}\n />\n </Form>\n )}\n\n {/* Validate and Submit buttons */}\n {showDetailsSection &&\n <div className='d-flex align-self-end gap-2'>\n <Button\n variant='outline-dark'\n onClick={() => handleSubmit()}\n disabled={status === 'validated' || status === 'completed' || status === 'uploading'}\n >\n Validate\n </Button>\n <div className='d-flex gap-2 align-items-center'>\n <SpinnerButton\n variant='dark'\n onClick={() => handleUpload(values)}\n showSpinner={showSpinner}\n disabled={status === 'initial' || validationErrors.length > 0 || status === 'completed'}\n >\n Upload\n </SpinnerButton>\n </div>\n </div>\n }\n\n {/* Status display */}\n <UploadStatus />\n </div>\n )}\n </FormWrapper>\n </div>\n </MarketingLayoutView>\n );\n}\n"],"mappings":"8iCAAY,EAAL,SAAA,EAAA,OACL,GAAA,IAAA,MACA,EAAA,UAAA,KACA,EAAA,WAAA,KACA,EAAA,KAAA,QACF,EAAA,CAAA,CAAA,ECLY,EAAL,SAAA,EAAA,OACL,GAAA,GAAA,sBACA,EAAA,GAAA,wBACA,EAAA,GAAA,2BACA,EAAA,GAAA,2BACF,EAAA,CAAA,CAAA,ECLY,EAAL,SAAA,EAAA,OACL,GAAA,SAAA,uBACA,EAAA,SAAA,uBACA,EAAA,MAAA,qBACF,EAAA,CAAA,CAAA,ECFa,EAA6C,CACxD,CACE,KAAM,aACN,SAAU,GACV,QAAS,SACX,EACA,CACE,KAAM,YACN,SAAU,GACV,QAAS,SACX,EACA,CACE,KAAM,YACN,SAAU,GACV,QAAS,SACX,EACA,CACE,KAAM,QACN,SAAU,GACV,OAAQ,GACR,gBAAiB,GACjB,QAAS,gDACX,EACA,CACE,KAAM,eACN,SAAU,GACV,QAAS,SACX,EACA,CACE,KAAM,eACN,SAAU,GACV,QAAS,cACX,EACA,CACE,KAAM,mBACN,SAAU,GACV,QAAS,kEACX,EACA,CACE,KAAM,wBACN,SAAU,GACV,QAAS,SACX,EACA,CACE,KAAM,WACN,SAAU,GACV,QAAS,cACX,EACA,CACE,KAAM,QACN,SAAU,GACV,QAAS,SACX,CACF,ECpDa,EAAyC,CACpD,GAAG,EACH,CACE,KAAM,QACN,SAAU,GACV,OAAQ,GACR,QAAS,SACX,EACA,CACE,KAAM,cACN,SAAU,GACV,OAAQ,GACR,QAAS,gBACX,EACA,CACE,KAAM,cACN,SAAU,GACV,OAAQ,GACR,QAAS,SACX,CACF,ECTa,EAAsB,CACjC,eAAgB,CACd,MAAO,CACL,CAAE,KAAM,YAAa,MAAO,EAAe,QAAS,EACpD,CAAE,KAAM,OAAQ,MAAO,EAAe,IAAK,CAC7C,CACF,EAEA,kBAAkB,EAAuB,CACvC,OAAO,EACL,CAAC,CAAE,KAAM,YAAa,KAAM,EAAsB,QAAS,EAAG,CAAE,KAAM,OAAQ,KAAM,EAAsB,IAAK,CAAC,EAChH,CAAC,CAAE,KAAM,YAAa,KAAM,EAAsB,QAAS,CAAC,CAChE,EAEA,sBAAsB,EAA2B,CAC/C,GAAI,IAAc,EAAe,SAC/B,MAAO,CACL,CAAE,KAAM,EAAc,SAAU,WAAY,CAAwB,EACpE,CAAE,KAAM,EAAc,SAAU,WAAY,CAAwB,EACpE,CAAE,KAAM,EAAc,MAAO,WAAY,CAAwB,CACnE,CACJ,EAEA,iBAAiB,EAAkB,CAejC,OAZK,EAAK,OAGN,EAAK,SAAW,EACX,CAAE,QAAS,GAAO,MAAO,6CAA8C,EAE5E,EAAK,EAAe,EAAE,MAAM,GAAQ,CAAC,CAAI,EACpC,CAAE,QAAS,GAAO,MAAO,0BAA2B,EAEzD,EAAK,OAAS,IACT,CAAE,QAAS,GAAO,MAAO,sDAAuD,EAElF,CAAE,QAAS,GAAM,MAAO,EAAG,EAXzB,CAAE,QAAS,GAAO,MAAO,2BAA4B,CAYhE,EAEA,mBAAmB,EAAgB,CACjC,OAAQ,EAAR,CACE,IAAK,QACH,MAAO,SACT,IAAK,UACH,MAAO,UACT,IAAK,UACH,MAAO,UACT,QACE,MAAO,MACX,CACF,EAEA,cAAc,EAAyB,CAmBrC,OAlBI,EAAO,aAAe,GAAK,EAAO,aAAe,EAAO,eACnD,CACL,OAAQ,QACR,QAAS,GAAG,EAAO,aAAa,UAAU,EAAO,eAAe,6BAClE,EAEE,EAAO,aAAe,GAAK,EAAO,eAAiB,EAAO,eACrD,CACL,OAAQ,QACR,QAAS,iCACX,EAEE,EAAO,eAAiB,GAAK,EAAO,iBAAmB,EAClD,CACL,OAAQ,UACR,QAAS,yDACX,EAEK,CACL,OAAQ,UACR,QAAS,GAAG,EAAO,eAAe,mCACpC,CACF,EAEA,qBAAqB,EAAoB,EAA8C,CACrF,OAAO,EAAoB,sBAAsB,CAAS,CAAC,CAAC,KAAK,GAAU,EAAO,OAAS,CAAU,CAAC,CAAC,UACzG,EAEA,WAAW,EAAwB,CACjC,OAAO,EAAI,MAAM,GAAQ,EAAK,KAAK,IAAM,EAAE,CAC7C,EAEA,0BAA0B,EAAgB,CACxC,OAAQ,EAAR,CACE,IAAK,KACH,MAAO,CAAE,EAAgB,GAAI,EAAgB,GAAI,EAAgB,EAAG,EACtE,IAAK,KACH,MAAO,CAAC,EAAgB,EAAE,CAC9B,CACF,EAEA,uBAAuB,EAA6D,CAClF,GAAI,IAAsB,EAAkB,KAC1C,OAEF,IAAM,EAA+B,CACnC,KAAM,EAAY,wBAClB,KAAM,IAAI,KAAK,CAAA,CAAE,YAAY,EAC7B,WAAY,CAAE,OAAQ,wBAAyB,CACjD,EAWA,OATI,IAAsB,EAAkB,YAC1C,EAAM,WAAa,CAAE,GAAG,EAAM,WAAY,SAAU,CAAC,WAAW,CAAC,GAE/D,IAAsB,EAAkB,aAC1C,EAAM,WAAa,CAAE,GAAG,EAAM,WAAY,SAAU,CAAC,YAAY,CAAC,GAEhE,IAAsB,EAAkB,MAC1C,EAAM,WAAa,CAAE,GAAG,EAAM,WAAY,SAAU,CAAE,aAAc,WAAY,CAAC,GAE5E,CACT,EAEA,2BAA2B,EAAmB,EAA6C,CACzF,GAAI,CAAC,EACH,OAEF,IAAM,EAA+B,CACnC,KAAM,EACN,KAAM,IAAI,KAAK,CAAA,CAAE,YAAY,EAC7B,WAAY,CAAC,CACf,EAEA,GAAI,EACF,GAAI,CACF,EAAM,WAAa,KAAK,MAAM,CAAY,CAC5C,MAAQ,CAAC,CAGX,OAAO,CACT,EAEA,iBAAiB,EAAqB,EAAmD,CACvF,IAAM,EAAU,EAAQ,GA2BxB,OA1BqC,EAAQ,MAAM,CAAC,CAAC,CAAC,IAAI,GAAO,CAC/D,IAAM,EAAoC,CACxC,UAAW,EAAI,EAAQ,QAAQ,YAAY,IAAM,GACjD,SAAU,EAAI,EAAQ,QAAQ,WAAW,IAAM,GAC/C,SAAU,EAAI,EAAQ,QAAQ,WAAW,IAAM,GAC/C,MAAO,EAAI,EAAQ,QAAQ,OAAO,IAAM,GACxC,YAAa,EAAI,EAAQ,QAAQ,cAAc,IAAM,GACrD,YAAa,EAAI,EAAQ,QAAQ,cAAc,IAAM,GACrD,oBAAqB,EAAI,EAAQ,QAAQ,uBAAuB,IAAM,GACtE,SAAU,EAAI,EAAQ,QAAQ,UAAU,IAAM,GAC9C,MAAO,EAAI,EAAQ,QAAQ,OAAO,IAAM,GACxC,gBAAiB,EAAI,EAAQ,QAAQ,kBAAkB,IAAM,EAC/D,EAWA,OATI,EAAQ,YAAc,OACjB,CACL,GAAG,EACH,MAAO,EAAI,EAAQ,QAAQ,OAAO,IAAM,GACxC,UAAW,EAAI,EAAQ,QAAQ,aAAa,IAAM,GAClD,WAAY,EAAI,EAAQ,QAAQ,aAAa,IAAM,EACrD,EAGK,CACT,CAEO,CACT,EAEA,kBAAkB,EAA0B,CAO1C,OANI,EAAY,IAAM,EAAY,IACzB,OAEL,EAAY,GACP,OAEF,OACT,EAEA,YAAY,EAAqB,EAA+B,EAA0B,CACxF,IAAM,EAAkB,EACrB,EAAQ,YAAc,EAAe,SAAW,EAA0B,EAC3E,EAAoB,qBAAqB,EAAQ,OAAQ,EAAQ,SAAS,EAIxE,EAAQ,OAAS,GAAK,EAAoB,WAAW,EAAQ,EAAQ,OAAS,EAAE,GAClF,EAAQ,IAAI,EAGd,IAAM,EAAU,EAAQ,GAClB,EAAO,EAAQ,MAAM,CAAC,EAEtB,EAAmB,CAAC,EACpB,EAA4C,CAAC,EAiDnD,OA/CA,EAAgB,QAAQ,GAAQ,CAC1B,EAAK,SACP,EAAa,EAAK,MAAQ,IAAI,IAElC,CAAC,EAED,EAAK,SAAS,EAAK,IAAa,CAC9B,EAAgB,QAAQ,GAAQ,CAC9B,IAAM,EAAW,EAAQ,QAAQ,EAAK,IAAI,EACpC,EAAQ,EAAI,IAAa,GAG/B,GAAI,CAAC,EAAK,UAAY,CAAC,EACrB,OAIF,IAAM,EAAa,EAAoB,0BAA0B,EAAQ,MAAM,EAM/E,GAJI,EAAQ,KAAc,oBAAsB,CAAC,EAAW,SAAS,CAAwB,GAC3F,EAAO,KAAK,OAAO,EAAW,EAAE,mCAAmC,EAAM,kDAAkD,GAAY,EAGrI,IAAa,GAAI,CAEnB,GAAI,EAAO,SAAS,4BAA4B,EAAK,MAAM,EAAG,OAC9D,EAAO,KAAK,4BAA4B,EAAK,MAAM,EACnD,MACF,CAUA,GARI,EAAK,UAAY,EAAM,KAAK,IAAM,IACpC,EAAO,KAAK,OAAO,EAAW,EAAE,IAAI,EAAK,KAAK,cAAc,EAG1D,EAAK,SAAW,CAAC,EAAK,QAAQ,KAAK,CAAK,GAC1C,EAAO,KAAK,OAAO,EAAW,EAAE,IAAI,EAAK,KAAK,qCAAqC,EAGjF,EAAK,OAAQ,CACf,IAAM,EAAkB,EAAK,gBAAkB,EAAM,YAAY,EAAI,EACjE,EAAa,EAAK,KAAK,CAAC,IAAI,CAAe,GAC7C,EAAO,KAAK,OAAO,EAAW,EAAE,8BAA8B,EAAK,KAAK,EAAE,EAE5E,EAAa,EAAK,KAAK,CAAC,IAAI,CAAe,CAC7C,CACF,CAAC,CACH,CAAC,EACM,CACT,CACF,QCjPA,SAAgB,EACd,CAAE,WAAU,eAAc,aAAY,UAAS,SAAQ,gBAC1C,CACb,GAAI,CAAC,EACH,OAAO,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,EAEb,IAAM,EAA0B,EAAS,WAAa,EAAS,WAE/D,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,mDAAf,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iFACb,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,yDAAf,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,gBAAO,cAAe,CAAA,GACnC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAI,EACJ,QAAS,EACT,YAAY,wDACb,CAAA,CACE,GACF,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAK,YACL,MAAM,aACN,GAAG,QACH,SAAS,yDACT,SAAU,CAAC,EACX,MAAO,EAAS,UAChB,SAAU,EACV,OAAQ,CACT,CAAA,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAK,aACL,MAAM,gBACN,GAAG,WACH,SAAS,0CACT,YAAY,yCACZ,SAAU,CAAC,EACX,MAAO,EAAS,WAChB,SAAU,EACV,OAAQ,CACT,CAAA,CACE,CAAA,EACJ,IACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,+BAAsB,eAAmB,CAAA,GACzD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,yEACZ,KAAK,UAAU,EAAoB,2BAClC,EAAS,UACT,EAAS,UACX,EAAG,KAAM,CAAC,CACP,CAAA,CACF,GAEJ,GACF,GAET,CC5DA,SAAgB,EACd,CAAE,WAAU,eAAc,aAAY,gBACzB,CACb,IAAM,EAAyB,GAAgB,EAAS,YAAc,EAAe,SACrF,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,mDAAf,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iFACb,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,gBAAO,gBAAiB,CAAA,CAClC,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,SACG,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAK,SACL,MAAM,SACN,GAAG,QACH,YAAY,kBACZ,MAAO,EAAS,OAChB,SAAU,EACV,OAAQ,CACT,CAAA,GACD,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,KAAK,SACL,MAAM,SACN,GAAG,SACH,MAAO,EAAS,OAChB,SAAU,EACV,OAAQ,WANV,EAQE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,YAAS,eAAqB,CAAA,EAC9C,EAAoB,sBAAsB,EAAS,SAAS,CAAC,CAAC,IAAI,IACjE,EAAA,EAAA,IAAA,CAAC,SAAD,CAA0B,MAAO,EAAO,cAAO,EAAO,IAAa,EAAtD,EAAO,IAA+C,CACpE,CACQ,GAEV,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAK,SACL,MAAM,SACN,SAAU,CAAC,GAAgB,kEAC3B,GAAG,SACH,MAAO,EAAS,OAChB,SAAU,EACV,OAAQ,EACR,SAAU,CAAC,WAEV,GACC,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,YAAS,eAAqB,CAAA,EAC9C,EAAgB,cAAc,CAAC,CAAC,IAAI,IACnC,EAAA,EAAA,IAAA,CAAC,SAAD,CAA2B,MAAO,EAAO,eACtC,EAAO,KACF,EAFK,EAAO,KAEZ,CACT,CACD,CAAA,CAAA,GAEF,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,cAAK,IAAU,CAAA,CAEtB,CAAA,CACR,CAAA,GAEL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAK,YACL,MAAM,YACN,SAAU,CAAC,GAAgB,oEAC3B,GAAG,SACH,MAAO,EAAS,UAChB,SAAU,EACV,OAAQ,EACR,SAAU,CAAC,WAEV,GACC,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,YAAS,kBAAwB,CAAA,EACjD,EAAoB,cAAc,CAAC,CAAC,IAAI,IACvC,EAAA,EAAA,IAAA,CAAC,SAAD,CAA8B,MAAO,EAAU,eAC5C,EAAU,IACL,EAFK,EAAU,KAEf,CACT,CACD,CAAA,CAAA,GAEF,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,oBAAW,WAAiB,CAAA,CAEnC,CAAA,CACR,CAAA,EACJ,GACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,KAAK,oBACL,MAAM,sBACN,GAAG,SACH,MAAO,EAAS,kBAChB,SAAU,EACV,OAAQ,EACR,SAAU,cAPZ,EASE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,YAAS,4BAAkC,CAAA,EAC3D,OAAO,QAAQ,CAAiB,CAAC,CAAC,KAAK,CAAE,EAAQ,MAChD,EAAA,EAAA,IAAA,CAAC,SAAD,CAAsB,MAAO,WAC1B,CACK,EAFK,CAEL,CACT,CACQ,GACR,CAAA,GACH,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CACL,GACF,GAET,cC9HM,EAAoB,uCACpB,EAAmB,2BAEzB,SAAgB,EAA2B,EAA+B,CACxE,OAAA,EAAW,OAAO,CAAC,CAAC,MAAM,CACxB,OAAA,EAAY,OAAO,CAAC,CACjB,QACC,EACA,sLACF,CAAC,CACA,SAAS,oBAAoB,EAChC,OAAA,EAAY,OAAO,CAAC,CAAC,SAAS,oBAAoB,EAClD,UAAA,EAAe,OAAO,CAAC,CAAC,SAAS,uBAAuB,EACxD,UAAA,EAAe,OAAO,CAAC,CAAC,KAAK,CAAC,EAAG,CAC/B,OAAU,EACV,KAAA,EAAU,OAAO,CAAC,CAAC,QAAQ,EAAkB,qCAAqC,CAAC,CAAC,SAAS,wBAAwB,EACrH,UAAA,EAAe,OAAO,CAAC,CAAC,YAAY,CACtC,CAAC,EACD,WAAA,EAAgB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAG,CAChC,OAAU,EACV,KAAA,EAAU,OAAO,CAAC,CAAC,SAAS,yBAAyB,EACrD,UAAA,EAAe,OAAO,CAAC,CAAC,YAAY,CACtC,CAAC,CACH,CAAC,CACH,CCdA,SAAgB,EAAU,CAAE,eAAc,mBAAkB,WAA2B,CACrF,IAAM,EAAY,EAAoB,kBAAkB,CAAY,EACpE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,CAAG,2BAEA,EACC,8CACA,+CACD,CAAA,CAAA,GAEH,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACG,EAAU,KAAK,EAAU,KACxB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,kCAAkC,SAAA,GAAS,KAAM,EAAS,cACpE,EAAS,IACT,CAAA,CACD,EAJK,CAIL,CACL,CACC,CAAA,GAEJ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAsB,oBAAqB,CAAmB,CAAA,CAC3D,CAAA,EAEJ,EAAU,IACT,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAU,gBAAb,CAAoB,8BAA0B,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAU,CAAK,CAAA,CAAI,GAEpE,CAAA,CAAA,CAET,CCNA,SAAgB,GAAiC,CAC/C,GAAM,CAAE,EAAsB,IAAA,EAAA,EAAA,SAAA,CAAqC,EAAI,EACjE,CAAE,EAAoB,IAAA,EAAA,EAAA,SAAA,CAAmC,EAAK,EAC9D,CAAE,EAAS,IAAA,EAAA,EAAA,SAAA,CAAoC,CAAC,CAAC,EACjD,CAAE,EAAkB,IAAA,EAAA,EAAA,SAAA,CAA2C,CAAC,CAAC,EACjE,CAAE,EAAO,IAAA,EAAA,EAAA,SAAA,CAA8B,EAAE,EACzC,CAAE,EAAa,IAAA,EAAA,EAAA,SAAA,CAA4B,EAAK,EAChD,CAAE,EAAY,IAAA,EAAA,EAAA,SAAA,CAA2B,CAAE,OAAQ,GAAI,QAAS,EAAG,CAAC,EACpE,CAAE,EAAQ,IAAA,EAAA,EAAA,SAAA,CAA2F,SAAS,EAE9G,EAAW,EAAY,EACvB,CAAE,kBAAmB,EAAsB,EAE3C,EAAkB,EAAe,EAAsB,yBAAyB,EAChF,EAAmB,EAAe,EAAsB,0BAA0B,EAClF,EAAe,GAAmB,EAElC,EAAiB,EAAoB,kBAAkB,EAAe,CAAC,EACvE,EAAS,EAAU,EAEzB,SAAS,GAAQ,EAAiD,EAAmC,CACnG,EAAa,EAAU,EAAY,eAAe,EAAO,EAAW,CAAO,CAAC,CAC9E,CAEA,eAAe,IAAkB,CAC/B,IAAM,EAA0B,MAAM,EAAkB,EAAU,EAAY,cAAc,CAAK,CAAC,EAClG,EAAc,EAAoB,cAAc,CAAM,CAAC,EACvD,EAAU,WAAW,CACvB,CAEA,IAAM,EAAc,GAAkC,EAAa,YAAY,CAAC,EAIhF,GAFA,EAAmB,CAAE,MAAO,gBAAiB,CAAC,EAE1C,CAAC,EAAY,aAAc,OAAO,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,EAE1C,IAAM,GAAmB,KAAO,IAAqB,CAEnD,EAAoB,CAAC,CAAC,EACtB,EAAS,EAAE,EACX,EAAU,SAAS,EAEd,GACH,EAAwB,EAAK,EAG/B,GAAM,CAAE,UAAS,SAAU,EAAoB,iBAAiB,CAAI,EAEpE,GAAI,CAAC,EAAS,CACZ,EAAO,MAAM,CAAK,EAClB,MACF,CAGA,IAAM,EAAY,EAAK,OAAO,GAAO,EAAI,KAAK,OAAO,CAAC,EAEtD,EAAW,CAAS,EACpB,EAAsB,EAAI,CAC5B,EAEM,GAAe,GAA+C,CAClE,EAAU,YAAY,EACtB,IAAM,EAAS,EAAoB,YAAY,EAAS,EAAsB,CAAY,EAC1F,EAAoB,CAAM,EAC1B,EAAU,EAAO,OAAS,EAAI,UAAY,WAAW,CACvD,EAEA,eAAe,GAAa,EAA8C,CACxE,EAAe,EAAI,EACnB,EAAU,WAAW,EAErB,IAAM,EAAkC,CAAC,EAEnC,EAAyB,EAAoB,uBAAuB,EAAQ,iBAAiB,EAE/F,GACF,EAAO,KAAK,CAAsB,EAEpC,IAAM,EAAc,EAAoB,2BAA2B,EAAQ,UAAW,EAAQ,UAAU,EAEpG,GACF,EAAO,KAAK,CAAW,EAEzB,IAAM,EAAO,CACX,KAAM,EAAa,iBACnB,KAAM,EAAa,iBACnB,SAAU,CACR,OAAQ,EAAQ,OAChB,eAAgB,EAAgB,wBAAwB,EAAQ,MAAM,EACtE,UAAW,EAAQ,UACnB,SAAU,EAAoB,iBAAiB,EAAS,CAAO,EAC/D,QACF,EACA,WAAY,EAAY,KAAK,GAC7B,SAAU,EAAc,gBAC1B,EAEA,EAAkB,EAAU,EAAY,UAAU,CAAI,CAAC,CAAC,CACrD,KAAM,GAAkB,CACvB,EAAS,EAAI,EAAE,EACf,EAAU,WAAW,CACvB,CAAC,CAAC,CACD,UAAY,CACX,EAAO,MAAM,kDAAkD,EAC/D,EAAU,SAAS,CACrB,CAAC,CACL,CAEA,IAAM,OAAkC,CACtC,OAAQ,EAAR,CACE,IAAK,aACH,OAAO,KACT,IAAK,YACH,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,+BAAsB,iDAEhC,CAAA,EAET,IAAK,YACH,OAAO,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,2BAAf,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,4BAAmB,0JAG7B,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CACS,QACE,WACT,WAAW,kBACX,WAAW,SACX,sBAAyB,CACvB,EAAe,EAAK,EACpB,GAAgB,CAClB,CACD,CAAA,CACE,IACH,KACN,IAAK,YACH,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,eAAe,EAAoB,mBAAmB,EAAW,MAAM,aACpF,EAAW,OACT,CAAA,EAET,QAeE,OAdI,EAAiB,OAAS,GAE1B,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,4BACb,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,8BAAf,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,UAAG,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,CAAI,EAAiB,OAAO,oBAAkB,EAAiB,SAAW,GAAK,GAAO,CAAA,CAAA,CAAI,CAAA,GAC7F,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACG,EAAiB,IAAI,IACpB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAgB,UAAU,uBAAe,CAAU,EAA1C,CAA0C,CACpD,CACC,CAAA,CACD,GACF,CAAA,EAGF,IACX,CACF,EAEM,GAAA,EAAoC,kBAAkB,EAG5D,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAmC,aAHhB,EAAgB,gBAAgB,EAAc,GAAe,MAG7C,YACjC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,YACd,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,iBAAkB,EAA2B,CAAoB,EAEjE,cAAe,CACb,OAAQ,GACR,OAAQ,KACR,UAAW,EAAe,SAC1B,kBAAmB,EAAkB,KACrC,UAAW,GACX,WAAY,EACd,EACA,SAAU,aAER,CAAE,SAAQ,eAAc,aAAY,mBACpC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,wCAAf,EAGE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,gBAAO,gBAAkB,CAAA,GACvC,EAAA,EAAA,IAAA,CAAC,EAAD,CACgB,eACI,oBAClB,QAAS,EAAQ,MAClB,CAAA,EAGA,IACC,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,UAAU,oCAAhB,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAU,EACI,eACF,aACE,cACf,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAU,EACI,eACF,aACZ,QAAS,EACT,WAAc,EAAwB,CAAC,CAAoB,EAC7C,cACf,CAAA,CACG,IAIP,IACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uCAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,eACR,YAAe,EAAa,EAC5B,SAAU,IAAW,aAAe,IAAW,aAAe,IAAW,qBAC1E,UAEO,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,4CACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAQ,OACR,YAAe,GAAa,CAAM,EACrB,cACb,SAAU,IAAW,WAAa,EAAiB,OAAS,GAAK,IAAW,qBAC7E,QAEc,CAAA,CACZ,CAAA,CACF,KAIP,EAAA,EAAA,IAAA,CAAC,GAAD,CAAe,CAAA,CACZ,GAEI,CAAA,CACV,CAAA,CACc,CAAA,CAEzB"}
1
+ {"version":3,"file":"D6wyTufc.chunk.js","names":[],"sources":["../../../../../src/apps/marketing/interfaces/SubscriptionGroup.ts","../../../../../src/apps/marketing/constants/ClickViewOffices.ts","../../../../../src/apps/marketing/interfaces/ContactImport.ts","../../../../../src/apps/marketing/utils/WildWestValidationRules.ts","../../../../../src/apps/marketing/utils/CoreValidationRules.ts","../../../../../src/apps/marketing/utils/ContactUploadHelper.tsx","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadCustomEventForm.tsx","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadDetailsForm.tsx","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadDetailsSchema.ts","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/components/UploadCsv.tsx","../../../../../src/apps/marketing/views/contact-upload/contact-upload-wizard/ContactUploadView.tsx"],"sourcesContent":["export enum SubscriptionGroup {\n All = 'all',\n ClickView = 'cv',\n Streamable = 'sl',\n None = 'none'\n}\n","export enum ClickViewOffice {\n AU = 'ClickView Australia',\n NZ = 'ClickView New Zealand',\n UK = 'ClickView United Kingdom',\n US = 'ClickView United States'\n}\n","export enum ContactImport {\n GovSpend = 'bulk_import_govspend',\n AzGovBiz = 'bulk_import_azgovbiz',\n Agile = 'bulk_import_agile'\n}\n","import { ValidationRules } from 'apps/marketing/interfaces/ValidationRules';\n\nexport const WildWestValidationRules: ValidationRules[] = [\n {\n name: 'first_name',\n required: true,\n pattern: /^.{1,}$/\n },\n {\n name: 'last_name',\n required: true,\n pattern: /^.{1,}$/\n },\n {\n name: 'job_title',\n required: true,\n pattern: /^.{1,}$/\n },\n {\n name: 'email',\n required: true,\n unique: true,\n caseInsensitive: true,\n pattern: /^[A-Za-z0-9.'_%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]+$/\n },\n {\n name: 'account_name',\n required: true,\n pattern: /^.{1,}$/\n },\n {\n name: 'country_code',\n required: true,\n pattern: /^[A-Z]{2,3}$/\n },\n {\n name: 'clickview_office',\n required: true,\n pattern: /^ClickView (Australia|United States|New Zealand|United Kingdom)$/\n },\n {\n name: 'organisation_sub_type',\n required: false,\n pattern: /^.{1,}$/\n },\n {\n name: 'province',\n required: true,\n pattern: /^[A-Z]{2,3}$/\n },\n {\n name: 'phone',\n required: false,\n pattern: /^.{1,}$/\n }\n];\n","import { ValidationRules } from 'apps/marketing/interfaces/ValidationRules';\nimport { WildWestValidationRules } from 'apps/marketing/utils/WildWestValidationRules';\n\nexport const CoreValidationRules: ValidationRules[] = [\n ...WildWestValidationRules,\n {\n name: 'topic',\n required: false,\n unique: false,\n pattern: /^.{1,}$/\n },\n {\n name: 'sync_to_crm',\n required: false,\n unique: false,\n pattern: /^(TRUE|FALSE)$/\n },\n {\n name: 'lead_source',\n required: false,\n unique: false,\n pattern: /^.{1,}$/\n }\n];\n","import { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BatchJobSummary, MarketingProfile, MarketingProfileEvent } from 'libs/shared/interfaces';\n\nimport { ClickViewOffice } from 'apps/marketing/constants/ClickViewOffices';\nimport { BrazeEvents } from 'apps/marketing/interfaces/BrazeEvents';\nimport { BrazeWorkspace } from 'apps/marketing/interfaces/BrazeWorkspace';\nimport { ContactImport } from 'apps/marketing/interfaces/ContactImport';\nimport { ContactUploadDetails } from 'apps/marketing/interfaces/ContactUploadDetails';\nimport { SubscriptionGroup } from 'apps/marketing/interfaces/SubscriptionGroup';\nimport { ValidationRules } from 'apps/marketing/interfaces/ValidationRules';\nimport { ContactUploadTemplate } from 'apps/marketing/utils/ContactUploadTemplates';\nimport { CoreValidationRules } from 'apps/marketing/utils/CoreValidationRules';\nimport { WildWestValidationRules } from 'apps/marketing/utils/WildWestValidationRules';\n\nexport const ContactUploadHelper = {\n getWorkspaces() {\n return [\n { name: 'Wild West', value: BrazeWorkspace.WildWest },\n { name: 'Core', value: BrazeWorkspace.Core }\n ];\n },\n\n getBrazeTemplates(canManageAll: boolean) {\n return canManageAll ?\n [{ name: 'Wild West', link: ContactUploadTemplate.WildWest }, { name: 'Core', link: ContactUploadTemplate.Core }] :\n [{ name: 'Wild West', link: ContactUploadTemplate.WildWest }];\n },\n\n getSourcesByWorkspace(workspace: BrazeWorkspace) {\n if (workspace === BrazeWorkspace.WildWest)\n return [\n { name: ContactImport.GovSpend, validation: WildWestValidationRules },\n { name: ContactImport.AzGovBiz, validation: WildWestValidationRules },\n { name: ContactImport.Agile, validation: WildWestValidationRules }\n ];\n },\n\n getCsvValidation(data: string[][]) {\n const FIRST_DATA_ROW = 1;\n\n if (!data.length)\n return { isValid: false, error: 'No data found in the CSV.' };\n\n if (data.length === 1)\n return { isValid: false, error: 'CSV only contains headers and no data rows.' };\n\n if (data[FIRST_DATA_ROW]?.every(cell => !cell))\n return { isValid: false, error: 'First data row is empty.' };\n\n if (data.length > 10000)\n return { isValid: false, error: 'Cannot upload a spreadsheet larger than 10,000 rows.' };\n\n return { isValid: true, error: '' };\n },\n\n getJobSummaryClass(status: string) {\n switch (status) {\n case 'error':\n return 'danger';\n case 'warning':\n return 'warning';\n case 'success':\n return 'success';\n default:\n return 'info';\n }\n },\n\n getJobSummary(result: BatchJobSummary) {\n if (result.totalErrored > 0 && result.totalErrored < result.totalProcessed)\n return {\n status: 'error',\n message: `${result.totalErrored} out of ${result.totalProcessed} users failed to be uploaded`\n };\n\n if (result.totalErrored > 0 && result.totalErrored === result.totalProcessed)\n return {\n status: 'error',\n message: 'All users failed to be uploaded'\n };\n\n if (result.totalErrored === 0 && result.totalProcessed === 0)\n return {\n status: 'warning',\n message: 'No users were uploaded, they may already exist in Braze'\n };\n\n return {\n status: 'success',\n message: `${result.totalSucceeded} users have been uploaded to Braze`\n };\n },\n\n getSourcesValidation(sourceName: string, workspace: BrazeWorkspace): ValidationRules[] {\n return ContactUploadHelper.getSourcesByWorkspace(workspace).find(source => source.name === sourceName).validation;\n },\n\n isEmptyRow(row: string[]): boolean {\n return row.every(cell => cell.trim() === '');\n },\n\n getValidOfficeRegionValue(region: string) {\n switch (region) {\n case 'us':\n return [ ClickViewOffice.US, ClickViewOffice.AU, ClickViewOffice.NZ ];\n case 'eu':\n return [ClickViewOffice.UK];\n }\n },\n \n buildSubscriptionEvent(subscriptionGroup: SubscriptionGroup): MarketingProfileEvent {\n if (subscriptionGroup === SubscriptionGroup.None)\n return;\n\n const event: MarketingProfileEvent = {\n name: BrazeEvents.AddToSubscriptionGroups,\n time: new Date().toISOString(),\n properties: { source: 'curator_contact_upload' }\n };\n\n if (subscriptionGroup === SubscriptionGroup.ClickView)\n event.properties = { ...event.properties, products: ['clickview']};\n\n if (subscriptionGroup === SubscriptionGroup.Streamable)\n event.properties = { ...event.properties, products: ['streamable']};\n\n if (subscriptionGroup === SubscriptionGroup.All)\n event.properties = { ...event.properties, products: [ 'streamable', 'clickview' ]};\n\n return event;\n },\n \n buildMarketingProfileEvent(eventName: string, eventPayload: string): MarketingProfileEvent {\n if (!eventName)\n return;\n\n const event: MarketingProfileEvent = {\n name: eventName,\n time: new Date().toISOString(),\n properties: {}\n };\n\n if (eventPayload) {\n try {\n event.properties = JSON.parse(eventPayload);\n } catch {}\n }\n\n return event;\n },\n \n generateProfiles(csvData: string[][], details: ContactUploadDetails): MarketingProfile[] {\n const headers = csvData[0];\n const profiles: MarketingProfile[] = csvData.slice(1).map(row => {\n const wildWestProfile: MarketingProfile = {\n firstName: row[headers.indexOf('first_name')] || '',\n lastName: row[headers.indexOf('last_name')] || '',\n jobTitle: row[headers.indexOf('job_title')] || '',\n email: row[headers.indexOf('email')] || '',\n accountName: row[headers.indexOf('account_name')] || '',\n countryCode: row[headers.indexOf('country_code')] || '',\n organisationSubType: row[headers.indexOf('organisation_sub_type')] || '',\n province: row[headers.indexOf('province')] || '',\n phone: row[headers.indexOf('phone')] || '',\n clickViewOffice: row[headers.indexOf('clickview_office')] || ''\n };\n\n if (details.workspace === 'core') {\n return {\n ...wildWestProfile,\n topic: row[headers.indexOf('topic')] || '',\n syncToCrm: row[headers.indexOf('sync_to_crm')] || '',\n leadSource: row[headers.indexOf('lead_source')] || ''\n };\n }\n\n return wildWestProfile;\n });\n \n return profiles;\n },\n\n getContainerWidth(breakpoints: Breakpoints) {\n if (breakpoints.xl || breakpoints.xxl)\n return 'w-50';\n \n if (breakpoints.lg)\n return 'w-75';\n \n return 'w-100';\n },\n\n validateCSV(csvData: string[][], details: ContactUploadDetails, canUploadToCore: boolean) {\n const validationRules = canUploadToCore ?\n (details.workspace === BrazeWorkspace.WildWest ? WildWestValidationRules : CoreValidationRules) :\n ContactUploadHelper.getSourcesValidation(details.source, details.workspace);\n\n // Remove last row if it's empty.\n // A trailing comma in the last line of the CSV will result in a row of empty cells when parsed by PapaParse: https://github.com/mholt/PapaParse/issues/604\n if (csvData.length > 1 && ContactUploadHelper.isEmptyRow(csvData[csvData.length - 1])) {\n csvData.pop();\n }\n \n const headers = csvData[0];\n const rows = csvData.slice(1);\n \n const errors: string[] = [];\n const uniqueValues: Record<string, Set<string>> = {};\n \n validationRules.forEach(rule => {\n if (rule.unique) {\n uniqueValues[rule.name] = new Set();\n }\n });\n \n rows.forEach((row, rowIndex) => {\n validationRules.forEach(rule => {\n const colIndex = headers.indexOf(rule.name);\n const value = row[colIndex] || '';\n\n // We'll skip all validation checks if the `required` field is not set and there is no value\n if (!rule.required && !value)\n return;\n\n // Check 'clickview_office' column only contains values aligned with the Braze region they selected\n // e.g selecing EU region means cell values must be 'ClickView United Kingdom'\n const validValue = ContactUploadHelper.getValidOfficeRegionValue(details.region);\n\n if (headers[colIndex] === 'clickview_office' && !validValue.includes(value as ClickViewOffice)) {\n errors.push(`Row ${rowIndex + 1}: Invalid clickviewOffice value '${value}, must be the same region you have selected i.e ${validValue}`);\n }\n\n if (colIndex === -1) {\n // Only report this once rather than on every row iteration\n if (errors.includes(`Missing required column: ${rule.name}`)) return;\n errors.push(`Missing required column: ${rule.name}`);\n return;\n }\n \n if (rule.required && value.trim() === '') {\n errors.push(`Row ${rowIndex + 1}: ${rule.name} is required.`);\n }\n \n if (rule.pattern && !rule.pattern.test(value)) {\n errors.push(`Row ${rowIndex + 1}: ${rule.name} does not match the required format.`);\n }\n \n if (rule.unique) {\n const normalizedValue = rule.caseInsensitive ? value.toLowerCase() : value;\n if (uniqueValues[rule.name].has(normalizedValue)) {\n errors.push(`Row ${rowIndex + 1}: Duplicate value found for ${rule.name}.`);\n }\n uniqueValues[rule.name].add(normalizedValue);\n }\n });\n });\n return errors;\n }\n};\n","import React from 'react';\n\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nimport { ContactUploadDetails } from 'apps/marketing/interfaces/ContactUploadDetails';\nimport { ContactUploadHelper } from 'apps/marketing/utils/ContactUploadHelper';\n\ninterface ContactUploadCustomEventFormProps {\n formData: ContactUploadDetails;\n handleChange: React.ChangeEventHandler<HTMLInputElement>;\n handleBlur: React.FocusEventHandler<HTMLInputElement>;\n enabled: boolean;\n toggle: () => void;\n canManageAll: boolean;\n}\n\nexport function ContactUploadCustomEventForm(\n { formData, handleChange, handleBlur, enabled, toggle, canManageAll }: ContactUploadCustomEventFormProps\n): JSX.Element {\n if (!canManageAll)\n return <></>;\n\n const showEventPayloadPreview = formData.eventName && formData.eventValue;\n\n return (\n <div className='border border-2 border-gray-300 rounded'>\n <div className='bg-gray-200 p-3 rounded-top-1 border-bottom border-2 border-gray-300'>\n <div className='d-flex w-100 flex-row justify-content-between'>\n <p className='mb-0'>Custom Event</p>\n <ToggleSwitch\n on={enabled}\n onClick={toggle}\n tooltipText='Trigger a custom event for each user uploaded to Braze'\n />\n </div>\n </div>\n <div className='p-3'>\n <div className='mb-3'>\n <FormField\n name='eventName'\n label='Event Name'\n as='input'\n infoText='Name of the event that will be triggered for each user'\n disabled={!enabled}\n value={formData.eventName}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n <div className='mb-3'>\n <FormField\n name='eventValue'\n label='Event Payload'\n as='textarea'\n infoText='The JSON payload accompanying the event'\n infoTooltip='This should be formatted as valid JSON'\n disabled={!enabled}\n value={formData.eventValue}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </div>\n {showEventPayloadPreview &&\n <div className='mb-3'>\n <span className='d-flex text-sm mb-2'>Event preview</span>\n <pre className='bg-gray-200 p-2 rounded text-sm font-mono whitespace-pre-wrap'>\n {JSON.stringify(ContactUploadHelper.buildMarketingProfileEvent(\n formData.eventName,\n formData.eventValue\n ), null, 2)}\n </pre>\n </div>\n }\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\n\nimport { BrazeWorkspace } from 'apps/marketing/interfaces/BrazeWorkspace';\nimport { ContactUploadDetails } from 'apps/marketing/interfaces/ContactUploadDetails';\nimport { SubscriptionGroup } from 'apps/marketing/interfaces/SubscriptionGroup';\nimport { ContactUploadHelper } from 'apps/marketing/utils/ContactUploadHelper';\nimport { MarketingHelper } from 'apps/marketing/utils/MarketingHelper';\n\ninterface ContactUploadDetailsFormProps {\n formData: ContactUploadDetails;\n handleChange: React.ChangeEventHandler<HTMLInputElement>;\n handleBlur: React.FocusEventHandler<HTMLInputElement>;\n canManageAll: boolean;\n}\n\nexport function ContactUploadDetailsForm(\n { formData, handleChange, handleBlur, canManageAll }: ContactUploadDetailsFormProps\n): JSX.Element {\n const showSubscriptionGroups = canManageAll && formData.workspace !== BrazeWorkspace.WildWest;\n return (\n <div className='border border-2 border-gray-300 rounded'>\n <div className='bg-gray-200 p-3 rounded-top-1 border-bottom border-2 border-gray-300'>\n <p className='mb-0'>Upload Details</p>\n </div>\n <div className='p-3'>\n <div>\n {canManageAll ?\n <FormField\n name='source'\n label='Source'\n as='input'\n placeholder='bulk_import_...'\n value={formData.source}\n onChange={handleChange}\n onBlur={handleBlur}\n /> :\n <FormField\n name='source'\n label='Source'\n as='select'\n value={formData.source}\n onChange={handleChange}\n onBlur={handleBlur}\n >\n <option value='' disabled>Select Source</option>\n {ContactUploadHelper.getSourcesByWorkspace(formData.workspace).map(source => (\n <option key={source.name} value={source.name}>{source.name}</option>\n ))}\n </FormField>\n }\n </div>\n\n <div className='mb-3'>\n <FormField\n name='region'\n label='Region'\n infoText={!canManageAll && 'If you need to add users to EU, please contact the Product team'}\n as='select'\n value={formData.region}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={!canManageAll}\n >\n {canManageAll ? (\n <>\n <option value='' disabled>Select Region</option>\n {MarketingHelper.getAllRegions().map(region => (\n <option key={region.value} value={region.value}>\n {region.label}\n </option>\n ))}\n </>\n ) : (\n <option value='us'>US</option>\n )}\n </FormField>\n </div>\n\n <div className='mb-3'>\n <FormField\n name='workspace'\n label='Workspace'\n infoText={!canManageAll && 'If you need to add users to Core, please contact the Product team'}\n as='select'\n value={formData.workspace}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={!canManageAll}\n >\n {canManageAll ? (\n <>\n <option value='' disabled>Select Workspace</option>\n {ContactUploadHelper.getWorkspaces().map(workspace => (\n <option key={workspace.value} value={workspace.value}>\n {workspace.name}\n </option>\n ))}\n </>\n ) : (\n <option value='wildwest'>Wild West</option>\n )}\n </FormField>\n </div>\n {showSubscriptionGroups ? (\n <div className='mb-3'>\n <FormField\n name='subscriptionGroup'\n label='Subscription Groups'\n as='select'\n value={formData.subscriptionGroup}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={null}\n >\n <option value='' disabled>Select Subscription Groups</option>\n {Object.entries(SubscriptionGroup).map(([ sgName, sgValue ]) => (\n <option key={sgValue} value={sgValue}>\n {sgName}\n </option>\n ))}\n </FormField>\n </div>\n ) : <></>}\n </div>\n </div>\n );\n}\n","import * as Yup from 'yup';\n\nconst BULK_IMPORT_REGEX = /^bulk_import_[a-z0-9]+(_[a-z0-9]+)*$/;\nconst SNAKE_CASE_REGEX = /^[a-z0-9]+(_[a-z0-9]+)*$/;\n\nexport function ContactUploadDetailsSchema(isCustomEventEnabled: boolean) {\n return Yup.object().shape({\n source: Yup.string()\n .matches(\n BULK_IMPORT_REGEX,\n 'Must start with bulk_import_, followed by lowercase letters or numbers, with optional segments separated by a single underscore (_), and no uppercase letters or special characters.'\n )\n .required('Source is required'),\n region: Yup.string().required('Region is required'),\n workspace: Yup.string().required('Workspace is required'),\n eventName: Yup.string().when([], {\n is: () => isCustomEventEnabled,\n then: Yup.string().matches(SNAKE_CASE_REGEX, 'Event name must be lower snake case').required('Event name is required'),\n otherwise: Yup.string().notRequired()\n }),\n eventValue: Yup.string().when([], {\n is: () => isCustomEventEnabled,\n then: Yup.string().required('Event value is required'),\n otherwise: Yup.string().notRequired()\n })\n });\n}\n","import React from 'react';\n\nimport { BulkUploadFileSelect } from 'libs/shared/apps/user-manager/components/bulk-upload/bulk-upload-file-select/BulkUploadFileSelect';\n\nimport { ContactUploadHelper } from 'apps/marketing/utils/ContactUploadHelper';\n\ninterface UploadCsvProps {\n canManageAll: boolean;\n handleCsvParsing: (data: string[][]) => Promise<void>;\n numRows: number;\n}\n\nexport function UploadCsv({ canManageAll, handleCsvParsing, numRows }: UploadCsvProps) {\n const templates = ContactUploadHelper.getBrazeTemplates(canManageAll);\n return (\n <div>\n <p>\n Upload contacts to Braze\n {canManageAll ?\n '. Please use one of the following templates' :\n ' Wild West. Please use the following template'}\n </p>\n\n <ul>\n {templates.map((template, index) => (\n <li key={index}>\n <a className='btn btn-link p-0 text-info px-3' download href={template.link}>\n {template.name}\n </a>\n </li>\n ))}\n </ul>\n\n <div className='w-50'>\n <BulkUploadFileSelect onSelectSpreadsheet={handleCsvParsing} />\n </div>\n \n {numRows > 0 && (\n <p className='mt-2'>Total contacts to upload: <b>{numRows - 1}</b></p>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { Button } from 'react-bootstrap';\nimport { useDispatch } from 'react-redux';\nimport { Form } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { WizardPolling } from 'libs/shared/components/wizard/status/polling/WizardPolling';\nimport { BatchDataType } from 'libs/shared/enums/BatchDataType';\nimport { BatchJobName } from 'libs/shared/enums/BatchJobName';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJob, BatchJobProgress, BatchJobSummary, CuratorUser, MarketingProfileEvent } from 'libs/shared/interfaces';\n\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\nimport { useCuratorPermissions } from 'shared/hooks/UseCuratorPermissions';\n\nimport { BrazeWorkspace } from 'apps/marketing/interfaces/BrazeWorkspace';\nimport { ContactUploadDetails } from 'apps/marketing/interfaces/ContactUploadDetails';\nimport { SubscriptionGroup } from 'apps/marketing/interfaces/SubscriptionGroup';\nimport { MarketingLayoutView } from 'apps/marketing/layout/MarketingLayout';\nimport { ContactUploadHelper } from 'apps/marketing/utils/ContactUploadHelper';\nimport { MarketingHelper } from 'apps/marketing/utils/MarketingHelper';\nimport { ContactUploadCustomEventForm } from 'apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadCustomEventForm';\nimport { ContactUploadDetailsForm } from 'apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadDetailsForm';\nimport { ContactUploadDetailsSchema } from 'apps/marketing/views/contact-upload/contact-upload-wizard/components/contact-upload-details/ContactUploadDetailsSchema';\nimport { UploadCsv } from 'apps/marketing/views/contact-upload/contact-upload-wizard/components/UploadCsv';\n\nexport function ContactUploadView(): JSX.Element {\n const [ isCustomEventEnabled, setIsCustomEventEnabled ] = useState(true);\n const [ showDetailsSection, setShowDetailsSection ] = useState(false);\n const [ csvData, setCsvData ] = useState<string[][]>([]);\n const [ validationErrors, setValidationErrors ] = useState<string[]>([]);\n const [ jobId, setJobId ] = useState<string>('');\n const [ showSpinner, setShowSpinner ] = useState(false);\n const [ jobSummary, setJobSummary ] = useState({ status: '', message: '' });\n const [ status, setStatus ] = useState<'initial' | 'validating' | 'validated' | 'uploading' | 'completed'>('initial');\n\n const dispatch = useDispatch();\n const { hasPermissions } = useCuratorPermissions();\n\n const canManageUpload = hasPermissions(CuratorPermissionName.MarketingContactUploadAll);\n const canManageCatalog = hasPermissions(CuratorPermissionName.MarketingCatalogManagement);\n const canManageAll = canManageUpload && canManageCatalog;\n\n const containerWidth = ContactUploadHelper.getContainerWidth(useBreakpoints());\n const alerts = useAlerts();\n\n function pollJob(onSuccess: (progress: BatchJobProgress) => void, onError: (xhr: Xhr) => void): void {\n Flight.fetch(dispatch, JobRequests.getJobProgress(jobId, onSuccess, onError));\n }\n\n async function checkJobSummary() {\n const result: BatchJobSummary = await Flight.fetchAsync(dispatch, JobRequests.getJobSummary(jobId));\n setJobSummary(ContactUploadHelper.getJobSummary(result));\n setStatus('completed');\n }\n\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n\n useSetPageMetadata({ title: 'Contact Upload' });\n\n if (!currentUser.hasCompleted) return <></>;\n\n const handleCsvParsing = async (data: string[][]) => {\n // reset state on new csv upload\n setValidationErrors([]);\n setJobId('');\n setStatus('initial');\n\n if (!canManageAll) {\n setIsCustomEventEnabled(false);\n }\n\n const { isValid, error } = ContactUploadHelper.getCsvValidation(data);\n\n if (!isValid) {\n alerts.error(error);\n return;\n }\n\n // Remove empty rows\n const cleanData = data.filter(row => row.some(Boolean));\n\n setCsvData(cleanData);\n setShowDetailsSection(true);\n };\n\n const validateCsv = (contactUploadDetails: ContactUploadDetails) => {\n setStatus('validating');\n const errors = ContactUploadHelper.validateCSV(csvData, contactUploadDetails, canManageAll);\n setValidationErrors(errors);\n setStatus(errors.length > 0 ? 'initial' : 'validated');\n };\n\n async function handleUpload(details: ContactUploadDetails): Promise<void> {\n setShowSpinner(true);\n setStatus('uploading');\n\n const events: MarketingProfileEvent[] = [];\n\n const subscriptionGroupEvent = ContactUploadHelper.buildSubscriptionEvent(details.subscriptionGroup);\n\n if (subscriptionGroupEvent)\n events.push(subscriptionGroupEvent);\n\n const customEvent = ContactUploadHelper.buildMarketingProfileEvent(details.eventName, details.eventValue);\n\n if (customEvent)\n events.push(customEvent);\n \n const data = {\n name: BatchJobName.MarketingProfile,\n type: BatchJobType.MarketingProfile,\n metadata: {\n source: details.source,\n instanceRegion: MarketingHelper.getInstanceRegionByCode(details.region),\n workspace: details.workspace,\n profiles: ContactUploadHelper.generateProfiles(csvData, details),\n events\n },\n customerId: currentUser.data.id,\n dataType: BatchDataType.MarketingProfile\n };\n \n Flight.fetchAsync(dispatch, JobRequests.createJob(data))\n .then((job: BatchJob) => {\n setJobId(job.id);\n setStatus('uploading');\n })\n .catch(() => {\n alerts.error('Failed to upload the contacts. Please try again.');\n setStatus('initial');\n });\n }\n\n const UploadStatus = (): JSX.Element => {\n switch (status) {\n case 'validating':\n return null;\n case 'validated':\n return (\n <div className='alert alert-success'>\n Validation succeeded. Click Upload to continue.\n </div>\n );\n case 'uploading':\n return jobId ? (\n <div className='border-top pt-4'>\n <div className='alert alert-info'>\n Contacts will continue to be uploaded in the background, so you can safely close this page.\n Once processing is complete, you will be notified via email.\n </div>\n <WizardPolling\n jobId={jobId}\n pollJob={pollJob}\n actionName='Importing Users'\n actionVerb='Create'\n onStatusCompleted={() => {\n setShowSpinner(false);\n checkJobSummary();\n }}\n />\n </div>\n ) : null;\n case 'completed':\n return (\n <div className={`alert alert-${ContactUploadHelper.getJobSummaryClass(jobSummary.status)}`}>\n {jobSummary.message}\n </div>\n );\n default:\n if (validationErrors.length > 0) {\n return (\n <div className='border-top pt-4'>\n <div className='alert alert-danger'>\n <p><b>{validationErrors.length} Validation Error{validationErrors.length !== 1 && 's'}</b></p>\n <ul>\n {validationErrors.map(error => (\n <li key={error} className='text-danger'>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n );\n }\n return null;\n }\n };\n\n const currentAppLink = Core.AppLinkHelper.getCurrentAppLink();\n const leftNavItems = MarketingHelper.getLeftNavItems(canManageAll, currentAppLink.action);\n \n return (\n <MarketingLayoutView leftNavItems={leftNavItems}>\n <div className={containerWidth}>\n <FormWrapper\n validationSchema={ContactUploadDetailsSchema(isCustomEventEnabled)}\n // The initial values set are used by non-devs but can be overwritten by dev selections\n initialValues={{\n source: '',\n region: 'us',\n workspace: BrazeWorkspace.WildWest,\n subscriptionGroup: SubscriptionGroup.None,\n eventName: '',\n eventValue: ''\n }}\n onSubmit={validateCsv}\n >\n {({ values, handleChange, handleBlur, handleSubmit }) => (\n <div className='p-4 d-flex flex-column gap-4'>\n\n {/* Upload CSV */}\n <h2 className='mb-0'>Contact Upload</h2>\n <UploadCsv\n canManageAll={canManageAll}\n handleCsvParsing={handleCsvParsing}\n numRows={csvData.length}\n />\n \n {/* Input details */}\n {showDetailsSection && (\n <Form className='d-flex flex-column gap-4'>\n <ContactUploadDetailsForm\n formData={values}\n handleChange={handleChange}\n handleBlur={handleBlur}\n canManageAll={canManageAll}\n />\n <ContactUploadCustomEventForm\n formData={values}\n handleChange={handleChange}\n handleBlur={handleBlur}\n enabled={isCustomEventEnabled}\n toggle={() => setIsCustomEventEnabled(!isCustomEventEnabled)}\n canManageAll={canManageAll}\n />\n </Form>\n )}\n\n {/* Validate and Submit buttons */}\n {showDetailsSection &&\n <div className='d-flex align-self-end gap-2'>\n <Button\n variant='outline-dark'\n onClick={() => handleSubmit()}\n disabled={status === 'validated' || status === 'completed' || status === 'uploading'}\n >\n Validate\n </Button>\n <div className='d-flex gap-2 align-items-center'>\n <SpinnerButton\n variant='dark'\n onClick={() => handleUpload(values)}\n showSpinner={showSpinner}\n disabled={status === 'initial' || validationErrors.length > 0 || status === 'completed'}\n >\n Upload\n </SpinnerButton>\n </div>\n </div>\n }\n\n {/* Status display */}\n <UploadStatus />\n </div>\n )}\n </FormWrapper>\n </div>\n </MarketingLayoutView>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{C as e,a as t,i as n,ln as r,sn as i}from"./rp704-Pm.chunk.js";import{n as a}from"./Crs6pJ2h.chunk.js";import{t as o}from"./Di_u2uix.chunk.js";import{t as s}from"./BvMTtGLi.chunk.js";import"./CfCYHRuo.chunk.js";import{t as c}from"./EkUBWhps2.chunk.js";import{b as l}from"./BhKv6dKl2.chunk.js";import{s as u,u as d}from"./Dgk5cBBe.chunk.js";import"./Oh4_zGIH.chunk.js";import{t as f}from"./CVHQXNzi.chunk.js";import{n as p,t as m}from"./DmEz0Sg_2.chunk.js";import{t as h}from"./RUvwm6_V.chunk.js";import{t as g}from"./BLN1DcS_2.chunk.js";import{t as _}from"./6P6a6X0V2.chunk.js";import{t as v}from"./CT1aHkYG2.chunk.js";import{t as y}from"./CSqAh4jh.chunk.js";var b=i({FindInteractivesView:()=>T,RECENT_INTERACTIVES_KEY:()=>C,RECENT_INTERACTIVES_LIMIT:()=>25}),x=r(t()),S=n(),C=`recently:searched:interactives`;function w(e){return{application:s.INTERACTIVES,action:o.Interactives.PREVIEW_INTERACTIVE,args:[e.id]}}function T(){let[t,n]=x.useState(``),r=_.getRecentItem(C,c,!1),i=u(y.interactivesById(r)),b=d();async function T(n){n.preventDefault();let r=Number(t);if(Number.isNaN(r)){E();return}try{let t=await b(v.getObject(r.toString()));if(t.typeId===f.Interactive){e.trigger({application:s.INTERACTIVES,action:o.Interactives.EDIT_INTERACTIVE,args:[t.id]});return}if(t.typeId===f.Video){e.trigger({application:s.VIDEOS,action:o.Videos.EDIT_VIDEO_INTERACTIVES,args:[t.id]});return}if(t.typeId===f.Clip){e.trigger({application:s.CLIPS,action:o.Clips.EDIT_CLIP_INTERACTIVES,args:[t.id]});return}E()}catch{E()}}function E(){g.render((0,S.jsxs)(`p`,{children:[`No interactive or video with ID `,(0,S.jsx)(`strong`,{children:t}),` could be found.`]}),{title:`Not found`,submitButtonProps:{text:`Close`,variant:`dark`}})}return(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`form`,{onSubmit:T,children:[(0,S.jsxs)(`div`,{className:`d-flex align-items-center mb-1`,children:[(0,S.jsx)(`label`,{htmlFor:`search`,className:`mb-0 me-1`,children:`Search for interactive or video by ID`}),(0,S.jsx)(a,{svg:h,title:`Enter either an interactive ID, or a video ID to view it's interactives`,tooltipSpanHack:!0})]}),(0,S.jsxs)(`div`,{className:`input-group mb-3`,children:[(0,S.jsx)(`input`,{id:`search`,type:`number`,className:`form-control border-dark`,value:t,onChange:e=>n(e.target.value),placeholder:`Enter an ID...`}),(0,S.jsx)(`button`,{className:`btn btn-outline-dark`,type:`submit`,children:`Search`})]})]}),!!i.data?.length&&(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`p`,{className:`fw-semibold`,children:`Recently viewed interactives:`}),(0,S.jsx)(l,{collection:{data:i.data,pagination:null},columns:[{header:`ID`,accessor:`id`,appLink:w},{header:`Name`,accessor:`name`,appLink:w},{header:`Description`,accessor:`description`,appLink:w},{header:`Status`,accessor:e=>(0,S.jsx)(m,{data:e.status,type:p.Status})},{header:`Creator`,accessor:e=>e.owner?.email??`Unknown`}]})]})]})}export{C as n,b as t};
2
- //# sourceMappingURL=B8li8ced.chunk.js.map
1
+ import{C as e,a as t,i as n,ln as r,sn as i}from"./rp704-Pm.chunk.js";import{n as a}from"./Crs6pJ2h.chunk.js";import{t as o}from"./Di_u2uix.chunk.js";import{t as s}from"./BvMTtGLi.chunk.js";import"./CfCYHRuo.chunk.js";import{t as c}from"./EkUBWhps2.chunk.js";import{b as l}from"./GpDEun8c2.chunk.js";import{s as u,u as d}from"./Dgk5cBBe.chunk.js";import"./Oh4_zGIH.chunk.js";import{t as f}from"./CVHQXNzi.chunk.js";import{n as p,t as m}from"./DmEz0Sg_2.chunk.js";import{t as h}from"./RUvwm6_V.chunk.js";import{t as g}from"./BLN1DcS_2.chunk.js";import{t as _}from"./6P6a6X0V2.chunk.js";import{t as v}from"./CT1aHkYG2.chunk.js";import{t as y}from"./CSqAh4jh.chunk.js";var b=i({FindInteractivesView:()=>T,RECENT_INTERACTIVES_KEY:()=>C,RECENT_INTERACTIVES_LIMIT:()=>25}),x=r(t()),S=n(),C=`recently:searched:interactives`;function w(e){return{application:s.INTERACTIVES,action:o.Interactives.PREVIEW_INTERACTIVE,args:[e.id]}}function T(){let[t,n]=x.useState(``),r=_.getRecentItem(C,c,!1),i=u(y.interactivesById(r)),b=d();async function T(n){n.preventDefault();let r=Number(t);if(Number.isNaN(r)){E();return}try{let t=await b(v.getObject(r.toString()));if(t.typeId===f.Interactive){e.trigger({application:s.INTERACTIVES,action:o.Interactives.EDIT_INTERACTIVE,args:[t.id]});return}if(t.typeId===f.Video){e.trigger({application:s.VIDEOS,action:o.Videos.EDIT_VIDEO_INTERACTIVES,args:[t.id]});return}if(t.typeId===f.Clip){e.trigger({application:s.CLIPS,action:o.Clips.EDIT_CLIP_INTERACTIVES,args:[t.id]});return}E()}catch{E()}}function E(){g.render((0,S.jsxs)(`p`,{children:[`No interactive or video with ID `,(0,S.jsx)(`strong`,{children:t}),` could be found.`]}),{title:`Not found`,submitButtonProps:{text:`Close`,variant:`dark`}})}return(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`form`,{onSubmit:T,children:[(0,S.jsxs)(`div`,{className:`d-flex align-items-center mb-1`,children:[(0,S.jsx)(`label`,{htmlFor:`search`,className:`mb-0 me-1`,children:`Search for interactive or video by ID`}),(0,S.jsx)(a,{svg:h,title:`Enter either an interactive ID, or a video ID to view it's interactives`,tooltipSpanHack:!0})]}),(0,S.jsxs)(`div`,{className:`input-group mb-3`,children:[(0,S.jsx)(`input`,{id:`search`,type:`number`,className:`form-control border-dark`,value:t,onChange:e=>n(e.target.value),placeholder:`Enter an ID...`}),(0,S.jsx)(`button`,{className:`btn btn-outline-dark`,type:`submit`,children:`Search`})]})]}),!!i.data?.length&&(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`p`,{className:`fw-semibold`,children:`Recently viewed interactives:`}),(0,S.jsx)(l,{collection:{data:i.data,pagination:null},columns:[{header:`ID`,accessor:`id`,appLink:w},{header:`Name`,accessor:`name`,appLink:w},{header:`Description`,accessor:`description`,appLink:w},{header:`Status`,accessor:e=>(0,S.jsx)(m,{data:e.status,type:p.Status})},{header:`Creator`,accessor:e=>e.owner?.email??`Unknown`}]})]})]})}export{C as n,b as t};
2
+ //# sourceMappingURL=D7I90XOo.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"B8li8ced.chunk.js","names":[],"sources":["../../../../../src/apps/interactives/views/find-interactives/FindInteractivesView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Flight } from 'libs/common/react/index';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { InfoSvg } from 'libs/shared/images/svg/status/InfoSvg';\nimport { BaseObject, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { DialogHelper } from 'libs/shared/utils/DialogHelper';\nimport { RecentItemHelper } from 'libs/shared/utils/RecentItemHelper';\n\nimport { ObjectCollection } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { MasterObjectRequests } from 'shared/flight-requests/MasterObjectRequests';\n\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\n\nexport const RECENT_INTERACTIVES_KEY = 'recently:searched:interactives';\nexport const RECENT_INTERACTIVES_LIMIT = 25;\n\nfunction getAppLink(interactive: InteractiveMetadata) {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_INTERACTIVE,\n args: [interactive.id]\n };\n}\n\nexport function FindInteractivesView(): JSX.Element {\n const [ searchBar, setSearchBar ] = React.useState('');\n\n const recentInteractiveIds = RecentItemHelper.getRecentItem(RECENT_INTERACTIVES_KEY, LocalStorageHelper, false);\n\n const recentInteractives = Flight.useBasicFetch<InteractiveMetadata[]>(\n InteractiveRequests.interactivesById(recentInteractiveIds)\n );\n\n const fetchAsync = Flight.useGetFetchAsync();\n \n async function onSearch(e: React.FormEvent): Promise<void> {\n e.preventDefault();\n\n const id = Number(searchBar);\n\n if (Number.isNaN(id)) {\n onNotFound();\n return;\n }\n\n try {\n const response = await fetchAsync<BaseObject>(MasterObjectRequests.getObject(id.toString()));\n\n if (response.typeId === MasterType.Interactive) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE,\n args: [response.id]\n });\n\n return;\n }\n\n if (response.typeId === MasterType.Video) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.EDIT_VIDEO_INTERACTIVES,\n args: [response.id]\n });\n\n return;\n }\n\n if (response.typeId === MasterType.Clip) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: Actions.Clips.EDIT_CLIP_INTERACTIVES,\n args: [response.id]\n });\n\n return;\n }\n\n onNotFound();\n } catch {\n onNotFound();\n }\n }\n\n function onNotFound(): void {\n DialogHelper.render(<p>No interactive or video with ID <strong>{searchBar}</strong> could be found.</p>, {\n title: 'Not found',\n submitButtonProps: {\n text: 'Close',\n variant: 'dark'\n }\n });\n }\n\n return (\n <div>\n <form onSubmit={onSearch}>\n <div className='d-flex align-items-center mb-1'>\n <label htmlFor='search' className='mb-0 me-1'>Search for interactive or video by ID</label>\n\n <SvgContainer\n svg={InfoSvg}\n title={`Enter either an interactive ID, or a video ID to view it's interactives`}\n tooltipSpanHack\n />\n </div>\n\n <div className='input-group mb-3'>\n <input\n id='search'\n type='number'\n className='form-control border-dark'\n value={searchBar}\n onChange={e => setSearchBar(e.target.value)}\n placeholder='Enter an ID...'\n />\n <button className='btn btn-outline-dark' type='submit'>\n Search\n </button>\n </div>\n </form>\n\n {!!recentInteractives.data?.length && (\n <div>\n <p className='fw-semibold'>Recently viewed interactives:</p>\n\n <ObjectCollection\n collection={{ data: recentInteractives.data, pagination: null }}\n columns={[\n {\n header: 'ID',\n accessor: 'id',\n appLink: getAppLink\n },\n {\n header: 'Name',\n accessor: 'name',\n appLink: getAppLink\n },\n {\n header: 'Description',\n accessor: 'description',\n appLink: getAppLink\n },\n {\n header: 'Status',\n accessor: interactive => <Badge data={interactive.status} type={BadgeType.Status} />\n },\n {\n header: 'Creator',\n accessor: interactive => interactive.owner?.email ?? 'Unknown'\n }\n ]}\n />\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"D7I90XOo.chunk.js","names":[],"sources":["../../../../../src/apps/interactives/views/find-interactives/FindInteractivesView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Flight } from 'libs/common/react/index';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { InfoSvg } from 'libs/shared/images/svg/status/InfoSvg';\nimport { BaseObject, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { DialogHelper } from 'libs/shared/utils/DialogHelper';\nimport { RecentItemHelper } from 'libs/shared/utils/RecentItemHelper';\n\nimport { ObjectCollection } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { MasterObjectRequests } from 'shared/flight-requests/MasterObjectRequests';\n\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\n\nexport const RECENT_INTERACTIVES_KEY = 'recently:searched:interactives';\nexport const RECENT_INTERACTIVES_LIMIT = 25;\n\nfunction getAppLink(interactive: InteractiveMetadata) {\n return {\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.PREVIEW_INTERACTIVE,\n args: [interactive.id]\n };\n}\n\nexport function FindInteractivesView(): JSX.Element {\n const [ searchBar, setSearchBar ] = React.useState('');\n\n const recentInteractiveIds = RecentItemHelper.getRecentItem(RECENT_INTERACTIVES_KEY, LocalStorageHelper, false);\n\n const recentInteractives = Flight.useBasicFetch<InteractiveMetadata[]>(\n InteractiveRequests.interactivesById(recentInteractiveIds)\n );\n\n const fetchAsync = Flight.useGetFetchAsync();\n \n async function onSearch(e: React.FormEvent): Promise<void> {\n e.preventDefault();\n\n const id = Number(searchBar);\n\n if (Number.isNaN(id)) {\n onNotFound();\n return;\n }\n\n try {\n const response = await fetchAsync<BaseObject>(MasterObjectRequests.getObject(id.toString()));\n\n if (response.typeId === MasterType.Interactive) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE,\n args: [response.id]\n });\n\n return;\n }\n\n if (response.typeId === MasterType.Video) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.EDIT_VIDEO_INTERACTIVES,\n args: [response.id]\n });\n\n return;\n }\n\n if (response.typeId === MasterType.Clip) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: Actions.Clips.EDIT_CLIP_INTERACTIVES,\n args: [response.id]\n });\n\n return;\n }\n\n onNotFound();\n } catch {\n onNotFound();\n }\n }\n\n function onNotFound(): void {\n DialogHelper.render(<p>No interactive or video with ID <strong>{searchBar}</strong> could be found.</p>, {\n title: 'Not found',\n submitButtonProps: {\n text: 'Close',\n variant: 'dark'\n }\n });\n }\n\n return (\n <div>\n <form onSubmit={onSearch}>\n <div className='d-flex align-items-center mb-1'>\n <label htmlFor='search' className='mb-0 me-1'>Search for interactive or video by ID</label>\n\n <SvgContainer\n svg={InfoSvg}\n title={`Enter either an interactive ID, or a video ID to view it's interactives`}\n tooltipSpanHack\n />\n </div>\n\n <div className='input-group mb-3'>\n <input\n id='search'\n type='number'\n className='form-control border-dark'\n value={searchBar}\n onChange={e => setSearchBar(e.target.value)}\n placeholder='Enter an ID...'\n />\n <button className='btn btn-outline-dark' type='submit'>\n Search\n </button>\n </div>\n </form>\n\n {!!recentInteractives.data?.length && (\n <div>\n <p className='fw-semibold'>Recently viewed interactives:</p>\n\n <ObjectCollection\n collection={{ data: recentInteractives.data, pagination: null }}\n columns={[\n {\n header: 'ID',\n accessor: 'id',\n appLink: getAppLink\n },\n {\n header: 'Name',\n accessor: 'name',\n appLink: getAppLink\n },\n {\n header: 'Description',\n accessor: 'description',\n appLink: getAppLink\n },\n {\n header: 'Status',\n accessor: interactive => <Badge data={interactive.status} type={BadgeType.Status} />\n },\n {\n header: 'Creator',\n accessor: interactive => interactive.owner?.email ?? 'Unknown'\n }\n ]}\n />\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,ln as n}from"./rp704-Pm.chunk.js";import{t as r}from"./Di_u2uix.chunk.js";import{t as i}from"./BvMTtGLi.chunk.js";import"./CfCYHRuo.chunk.js";import{t as a}from"./CLCeObem2.chunk.js";import"./BhKv6dKl2.chunk.js";import{t as o}from"./BkdBq-7h.chunk.js";import{u as s}from"./Dgk5cBBe.chunk.js";import{t as c}from"./DpqbC5uX.chunk.js";import{n as l}from"./puobgAYi.chunk.js";import{t as u}from"./Dh5DbdtP.chunk.js";import{i as d}from"./DA0I3jYA.chunk.js";import{n as f}from"./dKyhMawf.chunk.js";import{t as p}from"./D0JviwKV2.chunk.js";import{n as m,r as h}from"./C4Ey4nzb2.chunk.js";import{n as g,r as _}from"./GWw4zEXk2.chunk.js";import{t as v}from"./DLH_r3Sm.chunk.js";import{t as y}from"./DXH18G3-.chunk.js";import{t as b}from"./CxUyw6yf.chunk.js";import{t as x}from"./C8hLOeBc2.chunk.js";import{n as S}from"./DPmhibHP2.chunk.js";import{t as C}from"./Cqdcbyjp.chunk.js";import{t as w}from"./BYiE7xZS2.chunk.js";import{t as T}from"./9Cw3Dk4A.chunk.js";var E=function(e){return e[e.Audience=0]=`Audience`,e[e.Topic=1]=`Topic`,e[e.Curriculum=2]=`Curriculum`,e}({}),D=n(e()),O=n(a()),k=t(),A=(e=0)=>{let t=Math.max(e,700);return O.object().shape({name:O.string().required(`Livestream name is required`),contentPartner:O.string().required(`Content partner required`),startDate:O.string().required(`Start date required`).test({name:`startDate`,message:`Start date cannot be in the past`,test:e=>!o.isBefore(e,new Date,`day`)}),timezone:O.string().required(`Timezone required`),startTime:O.string().required(`Time required`),duration:O.string().required(`Duration required`),description:O.string().required(`Description required`).max(t,`Description must be less than ${t} characters`),livestreamUrlId:O.string().matches(/^[0-9\s]+$/,`Invalid ID format`),registrationUrl:O.string().url(`Invalid URL format`),recordingMasterId:O.string(),pastRecordingMasterId:O.string(),audiences:O.array(O.string()).min(1,`Audience is required`),classifications:O.array(O.string()).min(1,`Topic is required`)})};function j(e){let t=f(),n=t.values.audiences.map(t=>e.audiences.find(e=>e.masterId.toString()===t.toString()))||[],[a,o]=D.useState(e.company);function s(e){t.setFieldValue(`contentPartner`,e.id),o(e)}function b(){t.setTouched({...t.touched,contentPartner:!0})}function w(e){a&&e!==a?.name&&(o(null),t.setFieldValue(`contentPartner`,``))}function E(e){t.setFieldValue(`audiences`,c.addOrRemoveImmutable(t.values.audiences,e.masterId.toString())),requestAnimationFrame(()=>t.setFieldTouched(`audiences`))}function O(e,t){let r=t.find(t=>t.name===e);return g(r?``:e,t,`name`,0).filter(e=>!(n.find(t=>t.masterId===e.masterId)||e.masterId===r?.masterId))}function A(e){t.setFieldValue(`classifications`,c.addOrRemoveImmutable(t.values.classifications,e.id.toString())),requestAnimationFrame(()=>t.setFieldTouched(`classifications`))}let j=`${h.getCustomFormControlClassName(t.errors,t.touched,`classifications`)} h-auto py-2`;return(0,k.jsxs)(d,{children:[(0,k.jsx)(m,{label:`Livestream name`,name:`name`,placeholder:`Enter a livestream name`,value:t.values.name,showRequiredStar:!0}),(0,k.jsxs)(`div`,{className:`form-group`,children:[(0,k.jsxs)(`label`,{className:`form-label`,children:[`Content partner`,(0,k.jsx)(`span`,{className:`text-red`,children:`*`})]}),(0,k.jsx)(T,{initialQuery:e.company?.name,presentationId:e.presentation.id,onSelect:s,onBlur:b,onQueryChange:w}),t.touched.contentPartner&&t.errors.contentPartner&&(0,k.jsx)(v,{name:`company`,children:t.errors.contentPartner})]}),(0,k.jsxs)(`div`,{className:`form-group`,children:[(0,k.jsxs)(`label`,{className:`form-label`,children:[`Grades`,(0,k.jsx)(`span`,{className:`text-red`,children:`*`})]}),(0,k.jsx)(C,{id:`audiences`,placeholder:`Select grade(s)`,local:e.audiences,valueKey:`masterId`,selections:n,onSuggestionSelected:E,removeSelection:e=>E(e),errorStateImageUrl:x.TYPEAHEAD_ERROR,emptyStateImageUrl:x.EmptyStates.TYPEAHEAD_RESULTS,activationLength:0,suggestionLimit:!1,getInputTokenComponent:e=>(0,k.jsx)(S,{selection:{name:e.name,masterId:e.masterId},colourVariant:`teal`,onClickRemove:e=>E(e),hideExpander:!0},e.masterId),getSuggestionComponent:e=>_(`name`,e),onSuggestionDependencies:[e.audiences,t.values.audiences,O],getLocalSuggestions:O,renderSuggestionsOnInputFocus:!0,focusInputOnSuggestionClick:!1,renderAsForm:!1,hideIcon:!0,onBlur:()=>t.setFieldTouched(`audiences`),className:`p-2 ${t.touched.audiences&&t.errors.audiences?`is-invalid`:``}`}),t.touched.audiences&&t.errors.audiences&&(0,k.jsx)(v,{name:`audiences`,children:t.errors.audiences})]}),(0,k.jsx)(m,{name:`classifications`,label:`Topics`,children:()=>(0,k.jsx)(`div`,{className:j,children:(0,k.jsx)(y,{label:`Mapped Topic(s)`,tree:e.classificationTree,selectedIds:t.values.classifications,onSelect:A,getSelectedItemAppLink:t=>({application:i.CV_LIVE,action:r.CvLive.EDIT_CLASSIFICATION,args:[e.presentation?.id,t]}),multiSelect:!0,openSelectionsInNewTab:!0,collapse:!0,showRequiredStar:!0})})}),(0,k.jsxs)(`div`,{className:`row g-2`,children:[(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{type:`date`,label:`Start date`,name:`startDate`,value:t.values.startDate,showRequiredStar:!0})}),(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{as:`select`,label:`Timezone`,name:`timezone`,value:t.values.timezone,showRequiredStar:!0,disabled:!0,children:Object.keys(l).map(e=>(0,k.jsx)(`option`,{value:e,children:e},e))})})]}),(0,k.jsxs)(`div`,{className:`row g-2`,children:[(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{type:`time`,label:`Time`,name:`startTime`,value:t.values.startTime,showRequiredStar:!0})}),(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{type:`number`,label:`Duration (minutes)`,name:`duration`,min:0,value:t.values.duration,showRequiredStar:!0})})]}),(0,k.jsx)(m,{as:`textarea`,label:`Description`,name:`description`,placeholder:`Enter a description`,rows:3,showRequiredStar:!0}),(0,k.jsxs)(`div`,{className:`form-group`,children:[(0,k.jsx)(`label`,{className:`form-label`,children:`Zoom join link`}),(0,k.jsxs)(`div`,{className:`input-group`,children:[(0,k.jsx)(`span`,{className:`input-group-text`,id:`livestreamInputGroupText`,children:u.getZoomBaseUrl()}),(0,k.jsx)(`input`,{type:`text`,className:`form-control`,id:`livestreamUrlId`,value:t.values.livestreamUrlId,onChange:e=>t.setFieldValue(`livestreamUrlId`,e.target.value.replace(/\s/g,``)),placeholder:`Zoom Webinar ID`,"aria-describedby":`livestreamInputGroupText`})]})]}),(0,k.jsx)(m,{label:`Zoom registration link`,placeholder:`Paste the registration URL`,name:`registrationUrl`}),!!e.isEdit&&u.isPastLivestream(e.initialEndDateTime)&&(0,k.jsxs)(`div`,{className:`row g-2`,children:[(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{label:`Recording ID`,placeholder:`Enter ID of a recording`,name:`recordingMasterId`})}),(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{label:`Past recording ID`,placeholder:`Enter ID of a past recording`,name:`pastRecordingMasterId`})})]}),(0,k.jsxs)(p,{children:[(0,k.jsx)(p.Cancel,{onClick:e.closePopup,text:`Cancel`}),(0,k.jsx)(p.Submit,{text:e.isEdit?`Edit`:`Add`,variant:`dark`})]})]})}function M(){let e=s();async function t(t,n,r){let i=c.uniq(c.flatten(r.map(e=>e.backboneAudienceIds)));await e(w.updateLivestreamBackboneMember(t.id,E.Audience,i)),await e(w.updateLivestreamMember(t.id,E.Audience,n))}async function n(t,n,r){let i=b.flatten(r),a=n.reduce((e,t)=>({...e,[t]:!0}),{}),o=i.filter(e=>a[e.id]),s=c.uniq(c.flatten(o.map(e=>e.backboneClassificationIds)));await e(w.updateLivestreamBackboneMember(t.id,E.Topic,s)),await e(w.updateLivestreamMember(t.id,E.Topic,n))}return{updateAudiences:t,updateClassifications:n}}export{j as n,A as r,M as t};
2
- //# sourceMappingURL=DBAwgllB.chunk.js.map
1
+ import{a as e,i as t,ln as n}from"./rp704-Pm.chunk.js";import{t as r}from"./Di_u2uix.chunk.js";import{t as i}from"./BvMTtGLi.chunk.js";import"./CfCYHRuo.chunk.js";import{t as a}from"./CLCeObem2.chunk.js";import"./GpDEun8c2.chunk.js";import{t as o}from"./BkdBq-7h.chunk.js";import{u as s}from"./Dgk5cBBe.chunk.js";import{t as c}from"./DpqbC5uX.chunk.js";import{n as l}from"./CBq4vrjT.chunk.js";import{t as u}from"./lAvSm0ti.chunk.js";import{i as d}from"./DA0I3jYA.chunk.js";import{n as f}from"./dKyhMawf.chunk.js";import{t as p}from"./D0JviwKV2.chunk.js";import{n as m,r as h}from"./C4Ey4nzb2.chunk.js";import{n as g,r as _}from"./GWw4zEXk2.chunk.js";import{t as v}from"./DLH_r3Sm.chunk.js";import{t as y}from"./DXH18G3-.chunk.js";import{t as b}from"./CxUyw6yf.chunk.js";import{t as x}from"./C8hLOeBc2.chunk.js";import{n as S}from"./DPmhibHP2.chunk.js";import{t as C}from"./Cqdcbyjp.chunk.js";import{t as w}from"./BYiE7xZS2.chunk.js";import{t as T}from"./9Cw3Dk4A.chunk.js";var E=function(e){return e[e.Audience=0]=`Audience`,e[e.Topic=1]=`Topic`,e[e.Curriculum=2]=`Curriculum`,e}({}),D=n(e()),O=n(a()),k=t(),A=(e=0)=>{let t=Math.max(e,700);return O.object().shape({name:O.string().required(`Livestream name is required`),contentPartner:O.string().required(`Content partner required`),startDate:O.string().required(`Start date required`).test({name:`startDate`,message:`Start date cannot be in the past`,test:e=>!o.isBefore(e,new Date,`day`)}),timezone:O.string().required(`Timezone required`),startTime:O.string().required(`Time required`),duration:O.string().required(`Duration required`),description:O.string().required(`Description required`).max(t,`Description must be less than ${t} characters`),livestreamUrlId:O.string().matches(/^[0-9\s]+$/,`Invalid ID format`),registrationUrl:O.string().url(`Invalid URL format`),recordingMasterId:O.string(),pastRecordingMasterId:O.string(),audiences:O.array(O.string()).min(1,`Audience is required`),classifications:O.array(O.string()).min(1,`Topic is required`)})};function j(e){let t=f(),n=t.values.audiences.map(t=>e.audiences.find(e=>e.masterId.toString()===t.toString()))||[],[a,o]=D.useState(e.company);function s(e){t.setFieldValue(`contentPartner`,e.id),o(e)}function b(){t.setTouched({...t.touched,contentPartner:!0})}function w(e){a&&e!==a?.name&&(o(null),t.setFieldValue(`contentPartner`,``))}function E(e){t.setFieldValue(`audiences`,c.addOrRemoveImmutable(t.values.audiences,e.masterId.toString())),requestAnimationFrame(()=>t.setFieldTouched(`audiences`))}function O(e,t){let r=t.find(t=>t.name===e);return g(r?``:e,t,`name`,0).filter(e=>!(n.find(t=>t.masterId===e.masterId)||e.masterId===r?.masterId))}function A(e){t.setFieldValue(`classifications`,c.addOrRemoveImmutable(t.values.classifications,e.id.toString())),requestAnimationFrame(()=>t.setFieldTouched(`classifications`))}let j=`${h.getCustomFormControlClassName(t.errors,t.touched,`classifications`)} h-auto py-2`;return(0,k.jsxs)(d,{children:[(0,k.jsx)(m,{label:`Livestream name`,name:`name`,placeholder:`Enter a livestream name`,value:t.values.name,showRequiredStar:!0}),(0,k.jsxs)(`div`,{className:`form-group`,children:[(0,k.jsxs)(`label`,{className:`form-label`,children:[`Content partner`,(0,k.jsx)(`span`,{className:`text-red`,children:`*`})]}),(0,k.jsx)(T,{initialQuery:e.company?.name,presentationId:e.presentation.id,onSelect:s,onBlur:b,onQueryChange:w}),t.touched.contentPartner&&t.errors.contentPartner&&(0,k.jsx)(v,{name:`company`,children:t.errors.contentPartner})]}),(0,k.jsxs)(`div`,{className:`form-group`,children:[(0,k.jsxs)(`label`,{className:`form-label`,children:[`Grades`,(0,k.jsx)(`span`,{className:`text-red`,children:`*`})]}),(0,k.jsx)(C,{id:`audiences`,placeholder:`Select grade(s)`,local:e.audiences,valueKey:`masterId`,selections:n,onSuggestionSelected:E,removeSelection:e=>E(e),errorStateImageUrl:x.TYPEAHEAD_ERROR,emptyStateImageUrl:x.EmptyStates.TYPEAHEAD_RESULTS,activationLength:0,suggestionLimit:!1,getInputTokenComponent:e=>(0,k.jsx)(S,{selection:{name:e.name,masterId:e.masterId},colourVariant:`teal`,onClickRemove:e=>E(e),hideExpander:!0},e.masterId),getSuggestionComponent:e=>_(`name`,e),onSuggestionDependencies:[e.audiences,t.values.audiences,O],getLocalSuggestions:O,renderSuggestionsOnInputFocus:!0,focusInputOnSuggestionClick:!1,renderAsForm:!1,hideIcon:!0,onBlur:()=>t.setFieldTouched(`audiences`),className:`p-2 ${t.touched.audiences&&t.errors.audiences?`is-invalid`:``}`}),t.touched.audiences&&t.errors.audiences&&(0,k.jsx)(v,{name:`audiences`,children:t.errors.audiences})]}),(0,k.jsx)(m,{name:`classifications`,label:`Topics`,children:()=>(0,k.jsx)(`div`,{className:j,children:(0,k.jsx)(y,{label:`Mapped Topic(s)`,tree:e.classificationTree,selectedIds:t.values.classifications,onSelect:A,getSelectedItemAppLink:t=>({application:i.CV_LIVE,action:r.CvLive.EDIT_CLASSIFICATION,args:[e.presentation?.id,t]}),multiSelect:!0,openSelectionsInNewTab:!0,collapse:!0,showRequiredStar:!0})})}),(0,k.jsxs)(`div`,{className:`row g-2`,children:[(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{type:`date`,label:`Start date`,name:`startDate`,value:t.values.startDate,showRequiredStar:!0})}),(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{as:`select`,label:`Timezone`,name:`timezone`,value:t.values.timezone,showRequiredStar:!0,disabled:!0,children:Object.keys(l).map(e=>(0,k.jsx)(`option`,{value:e,children:e},e))})})]}),(0,k.jsxs)(`div`,{className:`row g-2`,children:[(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{type:`time`,label:`Time`,name:`startTime`,value:t.values.startTime,showRequiredStar:!0})}),(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{type:`number`,label:`Duration (minutes)`,name:`duration`,min:0,value:t.values.duration,showRequiredStar:!0})})]}),(0,k.jsx)(m,{as:`textarea`,label:`Description`,name:`description`,placeholder:`Enter a description`,rows:3,showRequiredStar:!0}),(0,k.jsxs)(`div`,{className:`form-group`,children:[(0,k.jsx)(`label`,{className:`form-label`,children:`Zoom join link`}),(0,k.jsxs)(`div`,{className:`input-group`,children:[(0,k.jsx)(`span`,{className:`input-group-text`,id:`livestreamInputGroupText`,children:u.getZoomBaseUrl()}),(0,k.jsx)(`input`,{type:`text`,className:`form-control`,id:`livestreamUrlId`,value:t.values.livestreamUrlId,onChange:e=>t.setFieldValue(`livestreamUrlId`,e.target.value.replace(/\s/g,``)),placeholder:`Zoom Webinar ID`,"aria-describedby":`livestreamInputGroupText`})]})]}),(0,k.jsx)(m,{label:`Zoom registration link`,placeholder:`Paste the registration URL`,name:`registrationUrl`}),!!e.isEdit&&u.isPastLivestream(e.initialEndDateTime)&&(0,k.jsxs)(`div`,{className:`row g-2`,children:[(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{label:`Recording ID`,placeholder:`Enter ID of a recording`,name:`recordingMasterId`})}),(0,k.jsx)(`div`,{className:`col-6`,children:(0,k.jsx)(m,{label:`Past recording ID`,placeholder:`Enter ID of a past recording`,name:`pastRecordingMasterId`})})]}),(0,k.jsxs)(p,{children:[(0,k.jsx)(p.Cancel,{onClick:e.closePopup,text:`Cancel`}),(0,k.jsx)(p.Submit,{text:e.isEdit?`Edit`:`Add`,variant:`dark`})]})]})}function M(){let e=s();async function t(t,n,r){let i=c.uniq(c.flatten(r.map(e=>e.backboneAudienceIds)));await e(w.updateLivestreamBackboneMember(t.id,E.Audience,i)),await e(w.updateLivestreamMember(t.id,E.Audience,n))}async function n(t,n,r){let i=b.flatten(r),a=n.reduce((e,t)=>({...e,[t]:!0}),{}),o=i.filter(e=>a[e.id]),s=c.uniq(c.flatten(o.map(e=>e.backboneClassificationIds)));await e(w.updateLivestreamBackboneMember(t.id,E.Topic,s)),await e(w.updateLivestreamMember(t.id,E.Topic,n))}return{updateAudiences:t,updateClassifications:n}}export{j as n,A as r,M as t};
2
+ //# sourceMappingURL=DArfNv9S.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DBAwgllB.chunk.js","names":[],"sources":["../../../../../../../libs/shared/src/interfaces/models/Livestream.ts","../../../../../src/apps/cv-live/components/livestream-form/LivestreamForm.tsx","../../../../../src/apps/cv-live/hooks/useUpdateLivestream.ts"],"sourcesContent":["\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { CurationStatusString } from 'libs/shared/enums/CurationStatus';\nimport { Audience } from 'libs/shared/interfaces/models/Audience';\nimport { Classification } from 'libs/shared/interfaces/models/Classification';\nimport { Company } from 'libs/shared/interfaces/models/Company';\nimport { Video } from 'libs/shared/interfaces/models/Video';\n\nexport enum LivestreamMemberType {\n Audience,\n Topic,\n Curriculum\n}\n\nexport interface Livestream {\n id: string;\n name: string;\n status: CurationStatusString;\n company: Company;\n companyMasterId: string;\n audiences: Audience[];\n description: string;\n pastRecordingMasterId: string;\n recordingMasterId: string;\n livestreamUrl: string;\n registrationUrl: string;\n startDateTime: string;\n endDateTime: string;\n timezone: Timezone;\n presentationId: string;\n classifications: Classification[];\n recording: Video;\n}\n","import React from 'react';\nimport { Form } from 'formik';\nimport * as Yup from 'yup';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { InputToken } from 'libs/shared/apps/share/components/tokenized-typeahead/InputSelection';\nimport { TokenizedTypeahead } from 'libs/shared/apps/share/components/tokenized-typeahead/TokenizedTypeahead';\nimport { Timezone, TIMEZONES_US } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { getSuggestionComponent } from 'libs/shared/components/search-bar/SearchUtils';\nimport * as SearchUtils from 'libs/shared/components/search-bar/SearchUtils';\nimport { Company, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\n\nimport { TreeSelect } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { ClassificationTree } from 'shared/interfaces';\n\nimport { CompanySearch } from 'apps/cv-live/components/company-search/CompanySearch';\nimport { LivestreamHelper } from 'apps/cv-live/utils/LivestreamHelper';\n\nexport const getLivestreamValidationSchema = (currentDescriptionLength: number = 0) => {\n // Descriptions should not exceed 500 characters, unless they already exceeded\n // 500 characters before this validation was introduced.\n const maxDescriptionLength = Math.max(currentDescriptionLength, 700);\n \n return Yup.object().shape<LivestreamFormValues>({\n name: Yup.string().required('Livestream name is required'),\n contentPartner: Yup.string().required('Content partner required'),\n startDate: Yup.string()\n .required('Start date required')\n .test({\n name: 'startDate',\n message: 'Start date cannot be in the past',\n test: (value: string) => {\n return !DateHelper.isBefore(value, new Date(), 'day');\n }\n }),\n timezone: Yup.string().required('Timezone required'),\n startTime: Yup.string().required('Time required'),\n duration: Yup.string().required('Duration required'),\n description: Yup.string()\n .required('Description required')\n .max(maxDescriptionLength, `Description must be less than ${maxDescriptionLength} characters`),\n livestreamUrlId: Yup.string().matches(/^[0-9\\s]+$/, 'Invalid ID format'),\n registrationUrl: Yup.string().url('Invalid URL format'),\n recordingMasterId: Yup.string(),\n pastRecordingMasterId: Yup.string(),\n audiences: Yup.array(Yup.string()).min(1, 'Audience is required'),\n classifications: Yup.array(Yup.string()).min(1, 'Topic is required')\n });\n};\n\nexport interface LivestreamFormValues {\n name: string;\n startDate: string;\n contentPartner: string;\n duration: string;\n timezone: string;\n description: string;\n recordingMasterId: string;\n pastRecordingMasterId: string;\n livestreamUrlId: string;\n registrationUrl: string;\n startTime: string;\n audiences: string[];\n classifications?: string[];\n}\n\ninterface LivestreamFormProps {\n isEdit?: boolean;\n company?: Company;\n audiences?: PresentationAudience[];\n presentation: Presentation;\n classificationTree?: ClassificationTree;\n initialEndDateTime?: string;\n closePopup: () => void;\n}\n\nexport function LivestreamForm(props: LivestreamFormProps) {\n const formikProps = useFormikContextWrapper<LivestreamFormValues>();\n \n const selections =\n formikProps.values.audiences.map(\n selected => props.audiences.find(a => a.masterId.toString() === selected.toString())\n ) || [];\n \n const [ company, setCompany ] = React.useState<Company>(props.company);\n\n function onSelect(suggestion: Company) {\n formikProps.setFieldValue('contentPartner', suggestion.id);\n setCompany(suggestion);\n }\n\n function onBlur() {\n formikProps.setTouched({ ...formikProps.touched, contentPartner: true });\n }\n\n function onQueryChange(query: string) {\n if (company && query !== company?.name) {\n setCompany(null);\n formikProps.setFieldValue('contentPartner', '');\n }\n }\n\n function handleSelectAudience(audience: PresentationAudience) {\n formikProps.setFieldValue('audiences', ArrayHelper.addOrRemoveImmutable(formikProps.values.audiences, audience.masterId.toString()));\n\n requestAnimationFrame(() => formikProps.setFieldTouched('audiences'));\n }\n\n function getLocalSuggestions(query: string, data: PresentationAudience[]) {\n const selectedSuggestion = data.find(suggestion => suggestion.name === query);\n\n const localSuggestions = SearchUtils.getLocalSuggestions<PresentationAudience>(\n selectedSuggestion ? '' : query,\n data,\n 'name',\n 0\n );\n \n return localSuggestions.filter(suggestion => {\n if (selections.find(selection => selection.masterId === suggestion.masterId))\n return false;\n\n if (suggestion.masterId === selectedSuggestion?.masterId)\n return false;\n\n return true;\n });\n }\n\n function handleSelectClassification(item: ClassificationTree) {\n formikProps.setFieldValue('classifications', ArrayHelper.addOrRemoveImmutable(formikProps.values.classifications, item.id.toString()));\n\n requestAnimationFrame(() => formikProps.setFieldTouched('classifications'));\n }\n\n const treeSelectClassName =\n `${FormHelper.getCustomFormControlClassName(formikProps.errors, formikProps.touched, 'classifications')} h-auto py-2`;\n\n return (\n <Form>\n <FormField label='Livestream name' name='name' placeholder='Enter a livestream name' value={formikProps.values.name} showRequiredStar/>\n\n <div className='form-group'>\n <label className='form-label'>Content partner<span className='text-red'>*</span></label>\n <CompanySearch\n initialQuery={props.company?.name}\n presentationId={props.presentation.id}\n onSelect={onSelect}\n onBlur={onBlur}\n onQueryChange={onQueryChange}\n />\n {formikProps.touched.contentPartner && formikProps.errors.contentPartner &&\n <FormFeedback name='company'>{formikProps.errors.contentPartner}</FormFeedback>\n }\n </div>\n\n <div className='form-group'>\n <label className='form-label'>Grades<span className='text-red'>*</span></label>\n <TokenizedTypeahead<PresentationAudience>\n id='audiences'\n placeholder='Select grade(s)'\n local={props.audiences}\n valueKey='masterId'\n selections={selections}\n onSuggestionSelected={handleSelectAudience}\n removeSelection={selection => handleSelectAudience(selection)}\n errorStateImageUrl={ImageUrls.TYPEAHEAD_ERROR}\n emptyStateImageUrl={ImageUrls.EmptyStates.TYPEAHEAD_RESULTS}\n activationLength={0} // The remote list acts as a dropdown that allows you to select multiple options. No query is required\n suggestionLimit={false}\n getInputTokenComponent={(selection: PresentationAudience) => {\n return (\n <InputToken<PresentationAudience>\n key={selection.masterId}\n selection={{ name: selection.name, masterId: selection.masterId }}\n colourVariant='teal'\n onClickRemove={(selection: PresentationAudience) => handleSelectAudience(selection)}\n hideExpander\n />\n );\n }}\n getSuggestionComponent={suggestion => getSuggestionComponent('name', suggestion)}\n onSuggestionDependencies={[ props.audiences, formikProps.values.audiences, getLocalSuggestions ]}\n getLocalSuggestions={getLocalSuggestions}\n renderSuggestionsOnInputFocus\n focusInputOnSuggestionClick={false}\n renderAsForm={false}\n hideIcon\n onBlur={() => formikProps.setFieldTouched('audiences')}\n className={`p-2 ${formikProps.touched.audiences && formikProps.errors.audiences ? 'is-invalid' : ''}`}\n />\n {formikProps.touched.audiences && formikProps.errors.audiences &&\n <FormFeedback name='audiences'>{formikProps.errors.audiences}</FormFeedback>\n }\n </div>\n\n <FormField name='classifications' label='Topics'>\n {() => (\n <div className={treeSelectClassName}>\n <TreeSelect<ClassificationTree>\n label='Mapped Topic(s)'\n tree={props.classificationTree}\n selectedIds={formikProps.values.classifications}\n onSelect={handleSelectClassification}\n getSelectedItemAppLink={(classificationId: string) => ({\n application: AppChannels.CV_LIVE,\n action: Actions.CvLive.EDIT_CLASSIFICATION,\n args: [ props.presentation?.id, classificationId ]\n })}\n multiSelect\n openSelectionsInNewTab\n collapse\n showRequiredStar\n />\n </div>\n )}\n </FormField>\n\n <div className='row g-2'>\n <div className='col-6'>\n <FormField type='date' label='Start date' name='startDate' value={formikProps.values.startDate} showRequiredStar />\n </div>\n <div className='col-6'>\n <FormField\n as='select'\n label='Timezone'\n name='timezone'\n value={formikProps.values.timezone}\n showRequiredStar\n disabled\n >\n {Object.keys(TIMEZONES_US).map((key: Timezone) =>\n <option key={key} value={key}>{key}</option>)}\n </FormField>\n </div>\n </div>\n\n <div className='row g-2'>\n <div className='col-6'>\n <FormField type='time' label='Time' name='startTime' value={formikProps.values.startTime} showRequiredStar />\n </div>\n <div className='col-6'>\n <FormField type='number' label='Duration (minutes)' name='duration' min={0} value={formikProps.values.duration} showRequiredStar />\n </div>\n </div>\n\n <FormField\n as='textarea'\n label='Description'\n name='description'\n placeholder='Enter a description'\n rows={3}\n showRequiredStar\n />\n\n <div className='form-group'>\n <label className='form-label'>Zoom join link</label>\n <div className='input-group'>\n <span className='input-group-text' id='livestreamInputGroupText'>\n {LivestreamHelper.getZoomBaseUrl()}\n </span>\n <input\n type='text'\n className='form-control'\n id='livestreamUrlId'\n value={formikProps.values.livestreamUrlId}\n onChange={e => formikProps.setFieldValue('livestreamUrlId', e.target.value.replace(/\\s/g, ''))}\n placeholder='Zoom Webinar ID'\n aria-describedby='livestreamInputGroupText'\n />\n </div>\n </div>\n <FormField label='Zoom registration link' placeholder='Paste the registration URL' name='registrationUrl' />\n\n {!!props.isEdit && LivestreamHelper.isPastLivestream(props.initialEndDateTime) && (\n <div className='row g-2'>\n <div className='col-6'>\n <FormField label='Recording ID' placeholder='Enter ID of a recording' name='recordingMasterId' />\n </div>\n <div className='col-6'>\n <FormField label='Past recording ID' placeholder='Enter ID of a past recording' name='pastRecordingMasterId' />\n </div>\n </div>\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} text='Cancel'></PopupButtons.Cancel>\n <PopupButtons.Submit text={props.isEdit ? 'Edit' : 'Add'} variant='dark' />\n </PopupButtons>\n </Form>\n );\n}\n","import { useGetFetchAsync } from 'libs/common/react/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { Classification, Livestream, LivestreamMemberType, PresentationAudience } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { ClassificationTree } from 'shared/interfaces';\n\nimport { LivestreamRequests } from 'apps/cv-live/flight-requests/CvLiveLivestreamRequests';\n\nexport function useUpdateLivestream() {\n const fetchAsync = useGetFetchAsync();\n \n async function updateAudiences(\n livestream: Livestream,\n audienceIds: string[],\n audiences: PresentationAudience[]\n ) {\n const backboneIds = ArrayHelper.uniq(ArrayHelper.flatten(audiences.map(a => a.backboneAudienceIds)));\n\n await fetchAsync(\n LivestreamRequests.updateLivestreamBackboneMember(\n livestream.id,\n LivestreamMemberType.Audience,\n backboneIds\n )\n );\n\n await fetchAsync(\n LivestreamRequests.updateLivestreamMember(\n livestream.id,\n LivestreamMemberType.Audience,\n audienceIds\n )\n );\n }\n\n async function updateClassifications(\n livestream: Livestream,\n classificationIds: string[],\n classificationTree: ClassificationTree\n ) {\n const allClassifications = TreeHelper.flatten<Classification>(classificationTree);\n\n const idHash = classificationIds.reduce<HashObject>((acc, id) => ({ ...acc, [id]: true }), {});\n\n const classifications = allClassifications.filter(c => idHash[c.id]);\n\n const backboneIds = ArrayHelper.uniq(ArrayHelper.flatten(classifications.map(c => c.backboneClassificationIds)));\n\n await fetchAsync(\n LivestreamRequests.updateLivestreamBackboneMember(\n livestream.id,\n LivestreamMemberType.Topic,\n backboneIds\n )\n );\n\n await fetchAsync(\n LivestreamRequests.updateLivestreamMember(\n livestream.id,\n LivestreamMemberType.Topic,\n classificationIds\n )\n );\n }\n\n return {\n updateAudiences,\n updateClassifications\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DArfNv9S.chunk.js","names":[],"sources":["../../../../../../../libs/shared/src/interfaces/models/Livestream.ts","../../../../../src/apps/cv-live/components/livestream-form/LivestreamForm.tsx","../../../../../src/apps/cv-live/hooks/useUpdateLivestream.ts"],"sourcesContent":["\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { CurationStatusString } from 'libs/shared/enums/CurationStatus';\nimport { Audience } from 'libs/shared/interfaces/models/Audience';\nimport { Classification } from 'libs/shared/interfaces/models/Classification';\nimport { Company } from 'libs/shared/interfaces/models/Company';\nimport { Video } from 'libs/shared/interfaces/models/Video';\n\nexport enum LivestreamMemberType {\n Audience,\n Topic,\n Curriculum\n}\n\nexport interface Livestream {\n id: string;\n name: string;\n status: CurationStatusString;\n company: Company;\n companyMasterId: string;\n audiences: Audience[];\n description: string;\n pastRecordingMasterId: string;\n recordingMasterId: string;\n livestreamUrl: string;\n registrationUrl: string;\n startDateTime: string;\n endDateTime: string;\n timezone: Timezone;\n presentationId: string;\n classifications: Classification[];\n recording: Video;\n}\n","import React from 'react';\nimport { Form } from 'formik';\nimport * as Yup from 'yup';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { InputToken } from 'libs/shared/apps/share/components/tokenized-typeahead/InputSelection';\nimport { TokenizedTypeahead } from 'libs/shared/apps/share/components/tokenized-typeahead/TokenizedTypeahead';\nimport { Timezone, TIMEZONES_US } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { getSuggestionComponent } from 'libs/shared/components/search-bar/SearchUtils';\nimport * as SearchUtils from 'libs/shared/components/search-bar/SearchUtils';\nimport { Company, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\n\nimport { TreeSelect } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { ClassificationTree } from 'shared/interfaces';\n\nimport { CompanySearch } from 'apps/cv-live/components/company-search/CompanySearch';\nimport { LivestreamHelper } from 'apps/cv-live/utils/LivestreamHelper';\n\nexport const getLivestreamValidationSchema = (currentDescriptionLength: number = 0) => {\n // Descriptions should not exceed 500 characters, unless they already exceeded\n // 500 characters before this validation was introduced.\n const maxDescriptionLength = Math.max(currentDescriptionLength, 700);\n \n return Yup.object().shape<LivestreamFormValues>({\n name: Yup.string().required('Livestream name is required'),\n contentPartner: Yup.string().required('Content partner required'),\n startDate: Yup.string()\n .required('Start date required')\n .test({\n name: 'startDate',\n message: 'Start date cannot be in the past',\n test: (value: string) => {\n return !DateHelper.isBefore(value, new Date(), 'day');\n }\n }),\n timezone: Yup.string().required('Timezone required'),\n startTime: Yup.string().required('Time required'),\n duration: Yup.string().required('Duration required'),\n description: Yup.string()\n .required('Description required')\n .max(maxDescriptionLength, `Description must be less than ${maxDescriptionLength} characters`),\n livestreamUrlId: Yup.string().matches(/^[0-9\\s]+$/, 'Invalid ID format'),\n registrationUrl: Yup.string().url('Invalid URL format'),\n recordingMasterId: Yup.string(),\n pastRecordingMasterId: Yup.string(),\n audiences: Yup.array(Yup.string()).min(1, 'Audience is required'),\n classifications: Yup.array(Yup.string()).min(1, 'Topic is required')\n });\n};\n\nexport interface LivestreamFormValues {\n name: string;\n startDate: string;\n contentPartner: string;\n duration: string;\n timezone: string;\n description: string;\n recordingMasterId: string;\n pastRecordingMasterId: string;\n livestreamUrlId: string;\n registrationUrl: string;\n startTime: string;\n audiences: string[];\n classifications?: string[];\n}\n\ninterface LivestreamFormProps {\n isEdit?: boolean;\n company?: Company;\n audiences?: PresentationAudience[];\n presentation: Presentation;\n classificationTree?: ClassificationTree;\n initialEndDateTime?: string;\n closePopup: () => void;\n}\n\nexport function LivestreamForm(props: LivestreamFormProps) {\n const formikProps = useFormikContextWrapper<LivestreamFormValues>();\n \n const selections =\n formikProps.values.audiences.map(\n selected => props.audiences.find(a => a.masterId.toString() === selected.toString())\n ) || [];\n \n const [ company, setCompany ] = React.useState<Company>(props.company);\n\n function onSelect(suggestion: Company) {\n formikProps.setFieldValue('contentPartner', suggestion.id);\n setCompany(suggestion);\n }\n\n function onBlur() {\n formikProps.setTouched({ ...formikProps.touched, contentPartner: true });\n }\n\n function onQueryChange(query: string) {\n if (company && query !== company?.name) {\n setCompany(null);\n formikProps.setFieldValue('contentPartner', '');\n }\n }\n\n function handleSelectAudience(audience: PresentationAudience) {\n formikProps.setFieldValue('audiences', ArrayHelper.addOrRemoveImmutable(formikProps.values.audiences, audience.masterId.toString()));\n\n requestAnimationFrame(() => formikProps.setFieldTouched('audiences'));\n }\n\n function getLocalSuggestions(query: string, data: PresentationAudience[]) {\n const selectedSuggestion = data.find(suggestion => suggestion.name === query);\n\n const localSuggestions = SearchUtils.getLocalSuggestions<PresentationAudience>(\n selectedSuggestion ? '' : query,\n data,\n 'name',\n 0\n );\n \n return localSuggestions.filter(suggestion => {\n if (selections.find(selection => selection.masterId === suggestion.masterId))\n return false;\n\n if (suggestion.masterId === selectedSuggestion?.masterId)\n return false;\n\n return true;\n });\n }\n\n function handleSelectClassification(item: ClassificationTree) {\n formikProps.setFieldValue('classifications', ArrayHelper.addOrRemoveImmutable(formikProps.values.classifications, item.id.toString()));\n\n requestAnimationFrame(() => formikProps.setFieldTouched('classifications'));\n }\n\n const treeSelectClassName =\n `${FormHelper.getCustomFormControlClassName(formikProps.errors, formikProps.touched, 'classifications')} h-auto py-2`;\n\n return (\n <Form>\n <FormField label='Livestream name' name='name' placeholder='Enter a livestream name' value={formikProps.values.name} showRequiredStar/>\n\n <div className='form-group'>\n <label className='form-label'>Content partner<span className='text-red'>*</span></label>\n <CompanySearch\n initialQuery={props.company?.name}\n presentationId={props.presentation.id}\n onSelect={onSelect}\n onBlur={onBlur}\n onQueryChange={onQueryChange}\n />\n {formikProps.touched.contentPartner && formikProps.errors.contentPartner &&\n <FormFeedback name='company'>{formikProps.errors.contentPartner}</FormFeedback>\n }\n </div>\n\n <div className='form-group'>\n <label className='form-label'>Grades<span className='text-red'>*</span></label>\n <TokenizedTypeahead<PresentationAudience>\n id='audiences'\n placeholder='Select grade(s)'\n local={props.audiences}\n valueKey='masterId'\n selections={selections}\n onSuggestionSelected={handleSelectAudience}\n removeSelection={selection => handleSelectAudience(selection)}\n errorStateImageUrl={ImageUrls.TYPEAHEAD_ERROR}\n emptyStateImageUrl={ImageUrls.EmptyStates.TYPEAHEAD_RESULTS}\n activationLength={0} // The remote list acts as a dropdown that allows you to select multiple options. No query is required\n suggestionLimit={false}\n getInputTokenComponent={(selection: PresentationAudience) => {\n return (\n <InputToken<PresentationAudience>\n key={selection.masterId}\n selection={{ name: selection.name, masterId: selection.masterId }}\n colourVariant='teal'\n onClickRemove={(selection: PresentationAudience) => handleSelectAudience(selection)}\n hideExpander\n />\n );\n }}\n getSuggestionComponent={suggestion => getSuggestionComponent('name', suggestion)}\n onSuggestionDependencies={[ props.audiences, formikProps.values.audiences, getLocalSuggestions ]}\n getLocalSuggestions={getLocalSuggestions}\n renderSuggestionsOnInputFocus\n focusInputOnSuggestionClick={false}\n renderAsForm={false}\n hideIcon\n onBlur={() => formikProps.setFieldTouched('audiences')}\n className={`p-2 ${formikProps.touched.audiences && formikProps.errors.audiences ? 'is-invalid' : ''}`}\n />\n {formikProps.touched.audiences && formikProps.errors.audiences &&\n <FormFeedback name='audiences'>{formikProps.errors.audiences}</FormFeedback>\n }\n </div>\n\n <FormField name='classifications' label='Topics'>\n {() => (\n <div className={treeSelectClassName}>\n <TreeSelect<ClassificationTree>\n label='Mapped Topic(s)'\n tree={props.classificationTree}\n selectedIds={formikProps.values.classifications}\n onSelect={handleSelectClassification}\n getSelectedItemAppLink={(classificationId: string) => ({\n application: AppChannels.CV_LIVE,\n action: Actions.CvLive.EDIT_CLASSIFICATION,\n args: [ props.presentation?.id, classificationId ]\n })}\n multiSelect\n openSelectionsInNewTab\n collapse\n showRequiredStar\n />\n </div>\n )}\n </FormField>\n\n <div className='row g-2'>\n <div className='col-6'>\n <FormField type='date' label='Start date' name='startDate' value={formikProps.values.startDate} showRequiredStar />\n </div>\n <div className='col-6'>\n <FormField\n as='select'\n label='Timezone'\n name='timezone'\n value={formikProps.values.timezone}\n showRequiredStar\n disabled\n >\n {Object.keys(TIMEZONES_US).map((key: Timezone) =>\n <option key={key} value={key}>{key}</option>)}\n </FormField>\n </div>\n </div>\n\n <div className='row g-2'>\n <div className='col-6'>\n <FormField type='time' label='Time' name='startTime' value={formikProps.values.startTime} showRequiredStar />\n </div>\n <div className='col-6'>\n <FormField type='number' label='Duration (minutes)' name='duration' min={0} value={formikProps.values.duration} showRequiredStar />\n </div>\n </div>\n\n <FormField\n as='textarea'\n label='Description'\n name='description'\n placeholder='Enter a description'\n rows={3}\n showRequiredStar\n />\n\n <div className='form-group'>\n <label className='form-label'>Zoom join link</label>\n <div className='input-group'>\n <span className='input-group-text' id='livestreamInputGroupText'>\n {LivestreamHelper.getZoomBaseUrl()}\n </span>\n <input\n type='text'\n className='form-control'\n id='livestreamUrlId'\n value={formikProps.values.livestreamUrlId}\n onChange={e => formikProps.setFieldValue('livestreamUrlId', e.target.value.replace(/\\s/g, ''))}\n placeholder='Zoom Webinar ID'\n aria-describedby='livestreamInputGroupText'\n />\n </div>\n </div>\n <FormField label='Zoom registration link' placeholder='Paste the registration URL' name='registrationUrl' />\n\n {!!props.isEdit && LivestreamHelper.isPastLivestream(props.initialEndDateTime) && (\n <div className='row g-2'>\n <div className='col-6'>\n <FormField label='Recording ID' placeholder='Enter ID of a recording' name='recordingMasterId' />\n </div>\n <div className='col-6'>\n <FormField label='Past recording ID' placeholder='Enter ID of a past recording' name='pastRecordingMasterId' />\n </div>\n </div>\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} text='Cancel'></PopupButtons.Cancel>\n <PopupButtons.Submit text={props.isEdit ? 'Edit' : 'Add'} variant='dark' />\n </PopupButtons>\n </Form>\n );\n}\n","import { useGetFetchAsync } from 'libs/common/react/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { Classification, Livestream, LivestreamMemberType, PresentationAudience } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { ClassificationTree } from 'shared/interfaces';\n\nimport { LivestreamRequests } from 'apps/cv-live/flight-requests/CvLiveLivestreamRequests';\n\nexport function useUpdateLivestream() {\n const fetchAsync = useGetFetchAsync();\n \n async function updateAudiences(\n livestream: Livestream,\n audienceIds: string[],\n audiences: PresentationAudience[]\n ) {\n const backboneIds = ArrayHelper.uniq(ArrayHelper.flatten(audiences.map(a => a.backboneAudienceIds)));\n\n await fetchAsync(\n LivestreamRequests.updateLivestreamBackboneMember(\n livestream.id,\n LivestreamMemberType.Audience,\n backboneIds\n )\n );\n\n await fetchAsync(\n LivestreamRequests.updateLivestreamMember(\n livestream.id,\n LivestreamMemberType.Audience,\n audienceIds\n )\n );\n }\n\n async function updateClassifications(\n livestream: Livestream,\n classificationIds: string[],\n classificationTree: ClassificationTree\n ) {\n const allClassifications = TreeHelper.flatten<Classification>(classificationTree);\n\n const idHash = classificationIds.reduce<HashObject>((acc, id) => ({ ...acc, [id]: true }), {});\n\n const classifications = allClassifications.filter(c => idHash[c.id]);\n\n const backboneIds = ArrayHelper.uniq(ArrayHelper.flatten(classifications.map(c => c.backboneClassificationIds)));\n\n await fetchAsync(\n LivestreamRequests.updateLivestreamBackboneMember(\n livestream.id,\n LivestreamMemberType.Topic,\n backboneIds\n )\n );\n\n await fetchAsync(\n LivestreamRequests.updateLivestreamMember(\n livestream.id,\n LivestreamMemberType.Topic,\n classificationIds\n )\n );\n }\n\n return {\n updateAudiences,\n updateClassifications\n };\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,ln as n}from"./rp704-Pm.chunk.js";import{t as r}from"./CfCYHRuo.chunk.js";import{t as i}from"./CVi5Xm5t.chunk.js";import{r as a}from"./DBUreHJA.chunk.js";import{t as o}from"./DrMTnrkG2.chunk.js";import{t as s}from"./CbiGs3Tn.chunk.js";import{t as c}from"./CHTOLKFB.chunk.js";import{t as l}from"./BbpfuEhR.chunk.js";import{t as u}from"./C9oP1DNX2.chunk.js";var d=n(e(),1),f=t();function p(e){return(0,f.jsx)(`div`,{className:`py-5 text-center`,children:e.emptyStateText??`No data available.`})}var m={filterButton:`_filterButton_14zrq_1`,hideCaret:`_hideCaret_14zrq_4`,baseWidth:`_baseWidth_14zrq_7`};function h(e){let t=e.type===`dropdown`,[n,r]=d.useState(!1);function i(e){r(e)}let a=`${m.filterButton} mx-1 btn`,s=t?``:m.hideCaret;return(0,f.jsxs)(o,{onToggle:i,show:n,children:[(0,f.jsx)(o.Toggle,{id:e.name,className:`${a} ${s} ${e.extraClasses??``}`,variant:t?`outline-dark`:`dark`,disabled:e.disabled,children:e.name}),(0,f.jsx)(o.Menu,{children:(0,f.jsx)(`div`,{className:`${e.columnGroups?``:`py-1 `} ${e.columnGroups?.length?`d-flex flex-row`:``} px-3`,children:!e.columnGroups||!e.columnGroups.length?(0,f.jsx)(`div`,{className:`px-2 ${m.baseWidth}`,children:e.columns.map((t,n)=>(0,f.jsx)(c,{label:t.name,name:t.name,id:t.id,onChange:()=>e.onToggleVisibility(t,!t.visible),checked:t.visible,className:`my-2`},n))}):e.columnGroups.map((t,n)=>(0,f.jsxs)(`div`,{className:`px-2 ${m.baseWidth}`,children:[(0,f.jsx)(`h5`,{className:`my-2`,children:t}),e.columns.filter(e=>e.type===t).map((t,n)=>(0,f.jsx)(c,{label:t.name,name:t.name,id:t.id,onChange:()=>e.onToggleVisibility(t,!t.visible),checked:t.visible,className:`my-2`},n))]},n))})})]})}function g(e){let[t,n]=d.useState(e.columns),o=d.useMemo(()=>a({columns:e.columns,columnData:e.columnData}),[e.columnData.extraData]),c=(e,t)=>{n(n=>n.map(n=>n.id===e.id?{...n,visible:t}:n))},m=t.filter(e=>!e.visible).map(e=>e.id),g=t.filter(e=>e.name!==i.Actions);return!e.members?.length&&!e.onlyHideTableOnEmpty?(0,f.jsx)(p,{emptyStateText:e.emptyStateText}):(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(`div`,{className:s(`pt-2 pb-3 d-flex`,e.classNames?.filterContainer),children:[(0,f.jsxs)(`div`,{className:`d-inline-flex`,children:[(0,f.jsx)(h,{name:`Edit Columns`,type:`dropdown`,columnGroups:e.columnGroups,columns:g,onToggleVisibility:c}),(0,f.jsxs)(`span`,{className:`px-2 text-secondary align-self-center`,children:[e.members.length,` items`]})]}),e.children]}),(0,f.jsx)(l,{columns:o,data:e.members,theme:r,globalFilter:e.searchQuery,hiddenColumns:m,autoResetSortBy:!1,autoResetHiddenColumns:!1,emptyState:(0,f.jsx)(p,{emptyStateText:e.emptyStateText}),enableSort:!0}),(e.hasMoreMembers||e.isFetching)&&(0,f.jsx)(u,{isFetching:e.isFetching,fetchNext:e.fetchNext,nextCursor:e.nextCursor})]})}export{g as t};
2
- //# sourceMappingURL=B6uYrrzJ2.chunk.js.map
1
+ import{a as e,i as t,ln as n}from"./rp704-Pm.chunk.js";import{t as r}from"./CfCYHRuo.chunk.js";import{t as i}from"./CVi5Xm5t.chunk.js";import{r as a}from"./C-M2om56.chunk.js";import{t as o}from"./DrMTnrkG2.chunk.js";import{t as s}from"./CbiGs3Tn.chunk.js";import{t as c}from"./CHTOLKFB.chunk.js";import{t as l}from"./BbpfuEhR.chunk.js";import{t as u}from"./C9oP1DNX2.chunk.js";var d=n(e(),1),f=t();function p(e){return(0,f.jsx)(`div`,{className:`py-5 text-center`,children:e.emptyStateText??`No data available.`})}var m={filterButton:`_filterButton_14zrq_1`,hideCaret:`_hideCaret_14zrq_4`,baseWidth:`_baseWidth_14zrq_7`};function h(e){let t=e.type===`dropdown`,[n,r]=d.useState(!1);function i(e){r(e)}let a=`${m.filterButton} mx-1 btn`,s=t?``:m.hideCaret;return(0,f.jsxs)(o,{onToggle:i,show:n,children:[(0,f.jsx)(o.Toggle,{id:e.name,className:`${a} ${s} ${e.extraClasses??``}`,variant:t?`outline-dark`:`dark`,disabled:e.disabled,children:e.name}),(0,f.jsx)(o.Menu,{children:(0,f.jsx)(`div`,{className:`${e.columnGroups?``:`py-1 `} ${e.columnGroups?.length?`d-flex flex-row`:``} px-3`,children:!e.columnGroups||!e.columnGroups.length?(0,f.jsx)(`div`,{className:`px-2 ${m.baseWidth}`,children:e.columns.map((t,n)=>(0,f.jsx)(c,{label:t.name,name:t.name,id:t.id,onChange:()=>e.onToggleVisibility(t,!t.visible),checked:t.visible,className:`my-2`},n))}):e.columnGroups.map((t,n)=>(0,f.jsxs)(`div`,{className:`px-2 ${m.baseWidth}`,children:[(0,f.jsx)(`h5`,{className:`my-2`,children:t}),e.columns.filter(e=>e.type===t).map((t,n)=>(0,f.jsx)(c,{label:t.name,name:t.name,id:t.id,onChange:()=>e.onToggleVisibility(t,!t.visible),checked:t.visible,className:`my-2`},n))]},n))})})]})}function g(e){let[t,n]=d.useState(e.columns),o=d.useMemo(()=>a({columns:e.columns,columnData:e.columnData}),[e.columnData.extraData]),c=(e,t)=>{n(n=>n.map(n=>n.id===e.id?{...n,visible:t}:n))},m=t.filter(e=>!e.visible).map(e=>e.id),g=t.filter(e=>e.name!==i.Actions);return!e.members?.length&&!e.onlyHideTableOnEmpty?(0,f.jsx)(p,{emptyStateText:e.emptyStateText}):(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(`div`,{className:s(`pt-2 pb-3 d-flex`,e.classNames?.filterContainer),children:[(0,f.jsxs)(`div`,{className:`d-inline-flex`,children:[(0,f.jsx)(h,{name:`Edit Columns`,type:`dropdown`,columnGroups:e.columnGroups,columns:g,onToggleVisibility:c}),(0,f.jsxs)(`span`,{className:`px-2 text-secondary align-self-center`,children:[e.members.length,` items`]})]}),e.children]}),(0,f.jsx)(l,{columns:o,data:e.members,theme:r,globalFilter:e.searchQuery,hiddenColumns:m,autoResetSortBy:!1,autoResetHiddenColumns:!1,emptyState:(0,f.jsx)(p,{emptyStateText:e.emptyStateText}),enableSort:!0}),(e.hasMoreMembers||e.isFetching)&&(0,f.jsx)(u,{isFetching:e.isFetching,fetchNext:e.fetchNext,nextCursor:e.nextCursor})]})}export{g as t};
2
+ //# sourceMappingURL=DB-51xws2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"B6uYrrzJ2.chunk.js","names":[],"sources":["../../../../../src/shared/components/member-matrix/empty-state/MemberMatrixEmptyState.tsx","../../../../../src/shared/components/member-matrix/filter/member-matrix-filter.module.scss","../../../../../src/shared/components/member-matrix/filter/MemberMatrixFilter.tsx","../../../../../src/shared/components/member-matrix/MemberMatrix.tsx"],"sourcesContent":["import React from 'react';\n\ninterface MemberMatrixEmptyStateProps {\n emptyStateText?: string;\n}\n\nexport function MemberMatrixEmptyState(props: MemberMatrixEmptyStateProps): JSX.Element {\n return (\n <div className='py-5 text-center'>\n {props.emptyStateText ?? 'No data available.'}\n </div>\n );\n}\n",":local {\n .filterButton {\n font-weight: $cv-btn-font-weight;\n }\n\n .hideCaret::after {\n display: none;\n }\n\n .baseWidth {\n min-width: 10rem;\n }\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\nimport { MatrixColumn } from 'shared/interfaces';\n\nimport styles from './member-matrix-filter.module.scss';\n\ninterface MemberMatrixFilterProps {\n name: string;\n type: string;\n columns: MatrixColumn[];\n onToggleVisibility: (column: MatrixColumn, nextVisibleState: boolean) => void;\n columnGroups?: string[];\n disabled?: boolean;\n extraClasses?: string;\n}\n\nexport function MemberMatrixFilter(props: MemberMatrixFilterProps): JSX.Element {\n const isDropdownFilter = props.type === 'dropdown';\n\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n }\n\n const baseClass = `${styles.filterButton} mx-1 btn`;\n const caretClass = !isDropdownFilter ? styles.hideCaret : '';\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle\n id={props.name}\n className={`${baseClass} ${caretClass} ${props.extraClasses ?? ''}`}\n variant={!isDropdownFilter ? 'dark' : 'outline-dark'}\n disabled={props.disabled}\n >\n {props.name}\n </Dropdown.Toggle>\n <Dropdown.Menu>\n <div className={`${!props.columnGroups ? 'py-1 ' : ''} ${props.columnGroups?.length ? 'd-flex flex-row' : ''} px-3`}>\n {(() => {\n if (!props.columnGroups || !props.columnGroups.length)\n return (\n <div className={`px-2 ${styles.baseWidth}`}>\n {props.columns.map((c: MatrixColumn, j: number) => (\n <Checkbox\n key={j}\n label={c.name}\n name={c.name}\n id={c.id}\n onChange={() => props.onToggleVisibility(c, !c.visible)}\n checked={c.visible}\n className='my-2'\n />\n ))}\n </div>\n );\n\n return props.columnGroups.map((groupName: string, i: number) => (\n <div className={`px-2 ${styles.baseWidth}`} key={i}>\n <h5 className='my-2'>{groupName}</h5>\n {props.columns.filter((c: MatrixColumn) => c.type === groupName).map((c: MatrixColumn, j: number) => (\n <Checkbox\n key={j}\n label={c.name}\n name={c.name}\n id={c.id}\n onChange={() => props.onToggleVisibility(c, !c.visible)}\n checked={c.visible}\n className='my-2'\n />\n ))\n }\n </div>\n ));\n })()}\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import React from 'react';\nimport { IdType } from 'react-table';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Table } from 'libs/shared/components/table/Table';\nimport { CurationStatusString } from 'libs/shared/enums/CurationStatus';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { CuratedDashboard, DashboardStatus, Playlist, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { CuratorTableTheme } from 'shared/constants';\nimport { ColumnProperty } from 'shared/enums';\nimport { MatrixColumn } from 'shared/interfaces/models/MatrixColumn';\nimport { VideoWithCuratedTopics } from 'shared/interfaces/models/VideoWithCuratedTopics';\n\nimport { VideoCuratedTopics } from 'apps/assembly-line/interfaces/responses/VideoCuratedTopics';\n\nimport { BuildColumns } from './columns/Columns';\nimport { MemberMatrixEmptyState } from './empty-state/MemberMatrixEmptyState';\nimport { MemberMatrixFilter } from './filter/MemberMatrixFilter';\n\ninterface ExtraData {\n allAudiences?: PresentationAudience[];\n pinnedVideoId?: string;\n visibleVideos?: HashObject;\n getExtraAppLinkActions?: (...args: any[]) => ExtraAppLinkActionOptions[];\n disableActions?: boolean;\n checkboxManager?: ReturnType<typeof useBulkCheckboxManager>;\n}\n\nexport interface ColumnData {\n actions?: (...args: any[]) => ActionOptions[];\n appLinks?: HashObject;\n extraData?: ExtraData;\n}\n\ntype Status = DashboardStatus | CurationStatusString;\n\nexport interface ExtraAppLinkActionOptions {\n status: Status;\n appLink: Core.AppLink;\n svg: SvgIcon;\n // When not showing confirm popup, we update dashboard status directly\n updateDashboardStatus?: (dashboardId: string, targetStatus: Status) => void;\n disabledFn?: (status?: Status) => { disabled: boolean, disabledMessage?: string };\n showPopup?: boolean;\n}\n\nexport type MatrixMember = Video | Series | Playlist | CuratedDashboard | VideoCuratedTopics | VideoWithCuratedTopics;\n\ninterface MemberMatrixProps {\n members: MatrixMember[];\n columns: MatrixColumn[];\n columnData: ColumnData;\n searchQuery?: string;\n hiddenColumns?: IdType<string>[];\n columnGroups?: string[];\n emptyStateText?: string;\n isFetching?: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n hasMoreMembers?: boolean;\n classNames?: {\n filterContainer?: string\n };\n /**\n * If enabled, only the table will be hidden if there are no members, \n * which means we will still show the filter container and children.\n */\n onlyHideTableOnEmpty?: boolean;\n}\n\nexport function MemberMatrix(props: React.PropsWithChildren<MemberMatrixProps>): JSX.Element {\n const [ columns, setColumns ] = React.useState(props.columns);\n\n const fullColumns = React.useMemo(() => BuildColumns({\n columns: props.columns,\n columnData: props.columnData\n }), [props.columnData.extraData]);\n\n const onToggleVisibility = (column: MatrixColumn, nextVisibleState: boolean) => {\n setColumns(currentCols => currentCols.map(c => {\n if (c.id === column.id)\n return { ...c, visible: nextVisibleState };\n return c;\n }));\n };\n\n const hiddenColumnsIds = columns.filter(c => !c.visible).map(c => c.id);\n const filterableColumns = columns.filter(c => c.name !== ColumnProperty.Actions);\n\n if (!props.members?.length && !props.onlyHideTableOnEmpty)\n return <MemberMatrixEmptyState emptyStateText={props.emptyStateText} />;\n\n return (\n <>\n <div className={classNames('pt-2 pb-3 d-flex', props.classNames?.filterContainer)}>\n <div className='d-inline-flex'>\n <MemberMatrixFilter\n name='Edit Columns'\n type='dropdown'\n columnGroups={props.columnGroups}\n columns={filterableColumns}\n onToggleVisibility={onToggleVisibility}\n />\n <span className='px-2 text-secondary align-self-center'>{props.members.length} items</span>\n </div>\n {props.children}\n </div>\n <Table\n columns={fullColumns}\n data={props.members}\n theme={CuratorTableTheme}\n globalFilter={props.searchQuery}\n hiddenColumns={hiddenColumnsIds}\n autoResetSortBy={false}\n autoResetHiddenColumns={false}\n emptyState={<MemberMatrixEmptyState emptyStateText={props.emptyStateText} />}\n enableSort\n />\n {(props.hasMoreMembers || props.isFetching) &&\n <InfiniteScrollFooter\n isFetching={props.isFetching}\n fetchNext={props.fetchNext}\n nextCursor={props.nextCursor}\n />\n }\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DB-51xws2.chunk.js","names":[],"sources":["../../../../../src/shared/components/member-matrix/empty-state/MemberMatrixEmptyState.tsx","../../../../../src/shared/components/member-matrix/filter/member-matrix-filter.module.scss","../../../../../src/shared/components/member-matrix/filter/MemberMatrixFilter.tsx","../../../../../src/shared/components/member-matrix/MemberMatrix.tsx"],"sourcesContent":["import React from 'react';\n\ninterface MemberMatrixEmptyStateProps {\n emptyStateText?: string;\n}\n\nexport function MemberMatrixEmptyState(props: MemberMatrixEmptyStateProps): JSX.Element {\n return (\n <div className='py-5 text-center'>\n {props.emptyStateText ?? 'No data available.'}\n </div>\n );\n}\n",":local {\n .filterButton {\n font-weight: $cv-btn-font-weight;\n }\n\n .hideCaret::after {\n display: none;\n }\n\n .baseWidth {\n min-width: 10rem;\n }\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\nimport { MatrixColumn } from 'shared/interfaces';\n\nimport styles from './member-matrix-filter.module.scss';\n\ninterface MemberMatrixFilterProps {\n name: string;\n type: string;\n columns: MatrixColumn[];\n onToggleVisibility: (column: MatrixColumn, nextVisibleState: boolean) => void;\n columnGroups?: string[];\n disabled?: boolean;\n extraClasses?: string;\n}\n\nexport function MemberMatrixFilter(props: MemberMatrixFilterProps): JSX.Element {\n const isDropdownFilter = props.type === 'dropdown';\n\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n }\n\n const baseClass = `${styles.filterButton} mx-1 btn`;\n const caretClass = !isDropdownFilter ? styles.hideCaret : '';\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle\n id={props.name}\n className={`${baseClass} ${caretClass} ${props.extraClasses ?? ''}`}\n variant={!isDropdownFilter ? 'dark' : 'outline-dark'}\n disabled={props.disabled}\n >\n {props.name}\n </Dropdown.Toggle>\n <Dropdown.Menu>\n <div className={`${!props.columnGroups ? 'py-1 ' : ''} ${props.columnGroups?.length ? 'd-flex flex-row' : ''} px-3`}>\n {(() => {\n if (!props.columnGroups || !props.columnGroups.length)\n return (\n <div className={`px-2 ${styles.baseWidth}`}>\n {props.columns.map((c: MatrixColumn, j: number) => (\n <Checkbox\n key={j}\n label={c.name}\n name={c.name}\n id={c.id}\n onChange={() => props.onToggleVisibility(c, !c.visible)}\n checked={c.visible}\n className='my-2'\n />\n ))}\n </div>\n );\n\n return props.columnGroups.map((groupName: string, i: number) => (\n <div className={`px-2 ${styles.baseWidth}`} key={i}>\n <h5 className='my-2'>{groupName}</h5>\n {props.columns.filter((c: MatrixColumn) => c.type === groupName).map((c: MatrixColumn, j: number) => (\n <Checkbox\n key={j}\n label={c.name}\n name={c.name}\n id={c.id}\n onChange={() => props.onToggleVisibility(c, !c.visible)}\n checked={c.visible}\n className='my-2'\n />\n ))\n }\n </div>\n ));\n })()}\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import React from 'react';\nimport { IdType } from 'react-table';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Table } from 'libs/shared/components/table/Table';\nimport { CurationStatusString } from 'libs/shared/enums/CurationStatus';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { CuratedDashboard, DashboardStatus, Playlist, PresentationAudience, Series, Video } from 'libs/shared/interfaces';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { CuratorTableTheme } from 'shared/constants';\nimport { ColumnProperty } from 'shared/enums';\nimport { MatrixColumn } from 'shared/interfaces/models/MatrixColumn';\nimport { VideoWithCuratedTopics } from 'shared/interfaces/models/VideoWithCuratedTopics';\n\nimport { VideoCuratedTopics } from 'apps/assembly-line/interfaces/responses/VideoCuratedTopics';\n\nimport { BuildColumns } from './columns/Columns';\nimport { MemberMatrixEmptyState } from './empty-state/MemberMatrixEmptyState';\nimport { MemberMatrixFilter } from './filter/MemberMatrixFilter';\n\ninterface ExtraData {\n allAudiences?: PresentationAudience[];\n pinnedVideoId?: string;\n visibleVideos?: HashObject;\n getExtraAppLinkActions?: (...args: any[]) => ExtraAppLinkActionOptions[];\n disableActions?: boolean;\n checkboxManager?: ReturnType<typeof useBulkCheckboxManager>;\n}\n\nexport interface ColumnData {\n actions?: (...args: any[]) => ActionOptions[];\n appLinks?: HashObject;\n extraData?: ExtraData;\n}\n\ntype Status = DashboardStatus | CurationStatusString;\n\nexport interface ExtraAppLinkActionOptions {\n status: Status;\n appLink: Core.AppLink;\n svg: SvgIcon;\n // When not showing confirm popup, we update dashboard status directly\n updateDashboardStatus?: (dashboardId: string, targetStatus: Status) => void;\n disabledFn?: (status?: Status) => { disabled: boolean, disabledMessage?: string };\n showPopup?: boolean;\n}\n\nexport type MatrixMember = Video | Series | Playlist | CuratedDashboard | VideoCuratedTopics | VideoWithCuratedTopics;\n\ninterface MemberMatrixProps {\n members: MatrixMember[];\n columns: MatrixColumn[];\n columnData: ColumnData;\n searchQuery?: string;\n hiddenColumns?: IdType<string>[];\n columnGroups?: string[];\n emptyStateText?: string;\n isFetching?: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n hasMoreMembers?: boolean;\n classNames?: {\n filterContainer?: string\n };\n /**\n * If enabled, only the table will be hidden if there are no members, \n * which means we will still show the filter container and children.\n */\n onlyHideTableOnEmpty?: boolean;\n}\n\nexport function MemberMatrix(props: React.PropsWithChildren<MemberMatrixProps>): JSX.Element {\n const [ columns, setColumns ] = React.useState(props.columns);\n\n const fullColumns = React.useMemo(() => BuildColumns({\n columns: props.columns,\n columnData: props.columnData\n }), [props.columnData.extraData]);\n\n const onToggleVisibility = (column: MatrixColumn, nextVisibleState: boolean) => {\n setColumns(currentCols => currentCols.map(c => {\n if (c.id === column.id)\n return { ...c, visible: nextVisibleState };\n return c;\n }));\n };\n\n const hiddenColumnsIds = columns.filter(c => !c.visible).map(c => c.id);\n const filterableColumns = columns.filter(c => c.name !== ColumnProperty.Actions);\n\n if (!props.members?.length && !props.onlyHideTableOnEmpty)\n return <MemberMatrixEmptyState emptyStateText={props.emptyStateText} />;\n\n return (\n <>\n <div className={classNames('pt-2 pb-3 d-flex', props.classNames?.filterContainer)}>\n <div className='d-inline-flex'>\n <MemberMatrixFilter\n name='Edit Columns'\n type='dropdown'\n columnGroups={props.columnGroups}\n columns={filterableColumns}\n onToggleVisibility={onToggleVisibility}\n />\n <span className='px-2 text-secondary align-self-center'>{props.members.length} items</span>\n </div>\n {props.children}\n </div>\n <Table\n columns={fullColumns}\n data={props.members}\n theme={CuratorTableTheme}\n globalFilter={props.searchQuery}\n hiddenColumns={hiddenColumnsIds}\n autoResetSortBy={false}\n autoResetHiddenColumns={false}\n emptyState={<MemberMatrixEmptyState emptyStateText={props.emptyStateText} />}\n enableSort\n />\n {(props.hasMoreMembers || props.isFetching) &&\n <InfiniteScrollFooter\n isFetching={props.isFetching}\n fetchNext={props.fetchNext}\n nextCursor={props.nextCursor}\n />\n }\n </>\n );\n}\n"],"mappings":"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"}