@clickview/exchange 0.48.0 → 0.49.1-dev.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 (378) hide show
  1. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  2. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  3. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  4. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  5. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  6. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  7. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  8. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  9. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  10. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  11. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  12. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  13. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  14. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  15. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  16. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  17. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  18. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  19. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  20. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  21. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  22. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  23. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  24. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  25. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  27. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  28. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  29. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  30. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  31. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  32. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  33. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  34. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  35. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  36. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  37. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  38. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  39. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  43. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  44. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  45. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  46. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  47. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  48. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  49. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  50. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  51. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  52. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  53. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  54. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  55. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  56. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  57. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  58. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  59. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  60. package/dist/bundles.json +2 -2
  61. package/dist/css/B57G3PZD.chunk.css +1 -0
  62. package/dist/css/BBV1d-ZI.chunk.css +1 -0
  63. package/dist/css/BDOTXlob.chunk.css +1 -0
  64. package/dist/css/BIeUeS4h.chunk.css +1 -0
  65. package/dist/css/BPdg7JW4.chunk.css +1 -0
  66. package/dist/css/BiRz4h1c.chunk.css +1 -0
  67. package/dist/css/Bt3pBBLn.chunk.css +1 -0
  68. package/dist/css/Bz8F9buU.chunk.css +1 -0
  69. package/dist/css/C2R4QydJ.chunk.css +1 -0
  70. package/dist/css/C7XoyEPr.chunk.css +1 -0
  71. package/dist/css/CAdv9Saa.chunk.css +1 -0
  72. package/dist/css/CC5F5C8O.chunk.css +1 -0
  73. package/dist/css/CCsCPLDG.chunk.css +1 -0
  74. package/dist/css/CD1qrI1T.chunk.css +1 -0
  75. package/dist/css/CDiJwtuL.chunk.css +1 -0
  76. package/dist/css/CM-cscAF.chunk.css +1 -0
  77. package/dist/css/CY0yvCW4.chunk.css +1 -0
  78. package/dist/css/Ci6HCTb5.chunk.css +1 -0
  79. package/dist/css/CifDVjr-.chunk.css +1 -0
  80. package/dist/css/CphXVlxY.chunk.css +1 -0
  81. package/dist/css/CrSv-tYo.chunk.css +1 -0
  82. package/dist/css/DD13UQOa.chunk.css +1 -0
  83. package/dist/css/DGyCCqtO.chunk.css +1 -0
  84. package/dist/css/DI4l_5OJ.chunk.css +1 -0
  85. package/dist/css/DL_jCfRl.chunk.css +1 -0
  86. package/dist/css/DRlDmMhN.chunk.css +1 -0
  87. package/dist/css/Dkh6sNpi.chunk.css +1 -0
  88. package/dist/css/DlOtoSz0.chunk.css +1 -0
  89. package/dist/css/DnhNnDZN.chunk.css +1 -0
  90. package/dist/css/EnQ3abug.chunk.css +1 -0
  91. package/dist/css/O777zV0C.chunk.css +1 -0
  92. package/dist/css/fs02hBfZ.chunk.css +1 -0
  93. package/dist/css/jbMisi9r.chunk.css +1 -0
  94. package/dist/css/w4TLT4f5.chunk.css +1 -0
  95. package/dist/en.json +1 -0
  96. package/dist/scripts/-OkQC3ld.chunk.js +2 -0
  97. package/dist/scripts/-OkQC3ld.chunk.js.map +1 -0
  98. package/dist/scripts/1--zOUke.chunk.js +2 -0
  99. package/dist/scripts/1--zOUke.chunk.js.map +1 -0
  100. package/dist/scripts/B1pmJy9w.chunk.js +2 -0
  101. package/dist/scripts/B1pmJy9w.chunk.js.map +1 -0
  102. package/dist/scripts/B1sQeAw1.chunk.js +2 -0
  103. package/dist/scripts/B1sQeAw1.chunk.js.map +1 -0
  104. package/dist/scripts/B2HQh_vn.chunk.js +2 -0
  105. package/dist/scripts/B2HQh_vn.chunk.js.map +1 -0
  106. package/dist/scripts/B55exgI3.chunk.js +2 -0
  107. package/dist/scripts/B55exgI3.chunk.js.map +1 -0
  108. package/dist/scripts/B668bf5B.chunk.js +2 -0
  109. package/dist/scripts/B668bf5B.chunk.js.map +1 -0
  110. package/dist/scripts/B6QdLVkd.chunk.js +2 -0
  111. package/dist/scripts/B6QdLVkd.chunk.js.map +1 -0
  112. package/dist/scripts/B9JNzh8J.chunk.js +2 -0
  113. package/dist/scripts/B9JNzh8J.chunk.js.map +1 -0
  114. package/dist/scripts/BAFefpdu.chunk.js +2 -0
  115. package/dist/scripts/BAFefpdu.chunk.js.map +1 -0
  116. package/dist/scripts/BEM-fEAF.chunk.js +2 -0
  117. package/dist/scripts/BEM-fEAF.chunk.js.map +1 -0
  118. package/dist/scripts/BGyYkDnT.chunk.js +2 -0
  119. package/dist/scripts/BGyYkDnT.chunk.js.map +1 -0
  120. package/dist/scripts/BIdpr1Qt.chunk.js +2 -0
  121. package/dist/scripts/BIdpr1Qt.chunk.js.map +1 -0
  122. package/dist/scripts/BIgz-kuD.chunk.js +5 -0
  123. package/dist/scripts/BIgz-kuD.chunk.js.map +1 -0
  124. package/dist/scripts/BKFoap_e.chunk.js +2 -0
  125. package/dist/scripts/BKFoap_e.chunk.js.map +1 -0
  126. package/dist/scripts/BPgR5vGs.chunk.js +2 -0
  127. package/dist/scripts/BPgR5vGs.chunk.js.map +1 -0
  128. package/dist/scripts/BQso9AQl.chunk.js +2 -0
  129. package/dist/scripts/BQso9AQl.chunk.js.map +1 -0
  130. package/dist/scripts/BSZIQf6b.chunk.js +2 -0
  131. package/dist/scripts/BSZIQf6b.chunk.js.map +1 -0
  132. package/dist/scripts/BVnGsVC0.chunk.js +2 -0
  133. package/dist/scripts/BVnGsVC0.chunk.js.map +1 -0
  134. package/dist/scripts/BabLz50F.chunk.js +2 -0
  135. package/dist/scripts/BabLz50F.chunk.js.map +1 -0
  136. package/dist/scripts/BeAXnr0Y.chunk.js +2 -0
  137. package/dist/scripts/BeAXnr0Y.chunk.js.map +1 -0
  138. package/dist/scripts/Bei6waJp.chunk.js +2 -0
  139. package/dist/scripts/Bei6waJp.chunk.js.map +1 -0
  140. package/dist/scripts/BesZ5ef9.chunk.js +2 -0
  141. package/dist/scripts/BesZ5ef9.chunk.js.map +1 -0
  142. package/dist/scripts/Bfzs9Sl1.chunk.js +2 -0
  143. package/dist/scripts/Bfzs9Sl1.chunk.js.map +1 -0
  144. package/dist/scripts/BlDVEZsX.chunk.js +2 -0
  145. package/dist/scripts/BlDVEZsX.chunk.js.map +1 -0
  146. package/dist/scripts/BlhmwaPM.chunk.js +3 -0
  147. package/dist/scripts/BlhmwaPM.chunk.js.map +1 -0
  148. package/dist/scripts/BnG9RTEw.chunk.js +2 -0
  149. package/dist/scripts/BnG9RTEw.chunk.js.map +1 -0
  150. package/dist/scripts/BoOaRkjh.chunk.js +2 -0
  151. package/dist/scripts/BoOaRkjh.chunk.js.map +1 -0
  152. package/dist/scripts/BtB8UFKw.chunk.js +2 -0
  153. package/dist/scripts/BtB8UFKw.chunk.js.map +1 -0
  154. package/dist/scripts/BvBjT_FP.chunk.js +2 -0
  155. package/dist/scripts/BvBjT_FP.chunk.js.map +1 -0
  156. package/dist/scripts/Bwi6Bruj.chunk.js +2 -0
  157. package/dist/scripts/Bwi6Bruj.chunk.js.map +1 -0
  158. package/dist/scripts/C-Aq4Xkl.chunk.js +2 -0
  159. package/dist/scripts/C-Aq4Xkl.chunk.js.map +1 -0
  160. package/dist/scripts/C6DEEFsr.chunk.js +2 -0
  161. package/dist/scripts/C6DEEFsr.chunk.js.map +1 -0
  162. package/dist/scripts/C7bOWWn5.chunk.js +2 -0
  163. package/dist/scripts/C7bOWWn5.chunk.js.map +1 -0
  164. package/dist/scripts/C7hyn4la.chunk.js +2 -0
  165. package/dist/scripts/C7hyn4la.chunk.js.map +1 -0
  166. package/dist/scripts/C85NI7Ud.chunk.js +2 -0
  167. package/dist/scripts/C85NI7Ud.chunk.js.map +1 -0
  168. package/dist/scripts/C956LU-_.chunk.js +2 -0
  169. package/dist/scripts/C956LU-_.chunk.js.map +1 -0
  170. package/dist/scripts/CAEqKa2O.chunk.js +2 -0
  171. package/dist/scripts/CAEqKa2O.chunk.js.map +1 -0
  172. package/dist/scripts/CDQmFQKb.chunk.js +8 -0
  173. package/dist/scripts/CDQmFQKb.chunk.js.map +1 -0
  174. package/dist/scripts/CEm6gEC5.chunk.js +2 -0
  175. package/dist/scripts/CEm6gEC5.chunk.js.map +1 -0
  176. package/dist/scripts/CG3lXZKd.chunk.js +2 -0
  177. package/dist/scripts/CG3lXZKd.chunk.js.map +1 -0
  178. package/dist/scripts/CIC9gqwS.chunk.js +2 -0
  179. package/dist/scripts/CIC9gqwS.chunk.js.map +1 -0
  180. package/dist/scripts/CJ3oIQlG.chunk.js +2 -0
  181. package/dist/scripts/CJ3oIQlG.chunk.js.map +1 -0
  182. package/dist/scripts/CJyM8Xpz.chunk.js +2 -0
  183. package/dist/scripts/CJyM8Xpz.chunk.js.map +1 -0
  184. package/dist/scripts/CKEc1C50.chunk.js +2 -0
  185. package/dist/scripts/CKEc1C50.chunk.js.map +1 -0
  186. package/dist/scripts/CNNFzIQb.chunk.js +2 -0
  187. package/dist/scripts/CNNFzIQb.chunk.js.map +1 -0
  188. package/dist/scripts/COTdau6A.chunk.js +2 -0
  189. package/dist/scripts/COTdau6A.chunk.js.map +1 -0
  190. package/dist/scripts/CRCiqh7u.chunk.js +2 -0
  191. package/dist/scripts/CRCiqh7u.chunk.js.map +1 -0
  192. package/dist/scripts/CRTvC3qC.chunk.js +2 -0
  193. package/dist/scripts/CRTvC3qC.chunk.js.map +1 -0
  194. package/dist/scripts/CSBkyxHZ.chunk.js +2 -0
  195. package/dist/scripts/CSBkyxHZ.chunk.js.map +1 -0
  196. package/dist/scripts/CUaampu9.chunk.js +2 -0
  197. package/dist/scripts/CUaampu9.chunk.js.map +1 -0
  198. package/dist/scripts/CW0X_Az5.chunk.js +2 -0
  199. package/dist/scripts/CW0X_Az5.chunk.js.map +1 -0
  200. package/dist/scripts/CbaWlt2e.chunk.js +2 -0
  201. package/dist/scripts/CbaWlt2e.chunk.js.map +1 -0
  202. package/dist/scripts/CeKBw2vH.chunk.js +2 -0
  203. package/dist/scripts/CeKBw2vH.chunk.js.map +1 -0
  204. package/dist/scripts/Cmu1J2M7.chunk.js +262 -0
  205. package/dist/scripts/Cmu1J2M7.chunk.js.map +1 -0
  206. package/dist/scripts/CnoR_GVG.chunk.js +2 -0
  207. package/dist/scripts/CnoR_GVG.chunk.js.map +1 -0
  208. package/dist/scripts/CogvVbpP.chunk.js +2 -0
  209. package/dist/scripts/CogvVbpP.chunk.js.map +1 -0
  210. package/dist/scripts/Cty2AOK7.chunk.js +2 -0
  211. package/dist/scripts/Cty2AOK7.chunk.js.map +1 -0
  212. package/dist/scripts/D-VkpSW0.chunk.js +50 -0
  213. package/dist/scripts/D-VkpSW0.chunk.js.map +1 -0
  214. package/dist/scripts/D2WOxvRg.chunk.js +2 -0
  215. package/dist/scripts/D2WOxvRg.chunk.js.map +1 -0
  216. package/dist/scripts/D7wAo_p-.chunk.js +2 -0
  217. package/dist/scripts/D7wAo_p-.chunk.js.map +1 -0
  218. package/dist/scripts/D8qEOAnP.chunk.js +2 -0
  219. package/dist/scripts/D8qEOAnP.chunk.js.map +1 -0
  220. package/dist/scripts/D97YVAoS.chunk.js +2 -0
  221. package/dist/scripts/D97YVAoS.chunk.js.map +1 -0
  222. package/dist/scripts/DBhZPu6x.chunk.js +2 -0
  223. package/dist/scripts/DBhZPu6x.chunk.js.map +1 -0
  224. package/dist/scripts/DHE-sUO-.chunk.js +2 -0
  225. package/dist/scripts/DHE-sUO-.chunk.js.map +1 -0
  226. package/dist/scripts/DInJ42HN.chunk.js +2 -0
  227. package/dist/scripts/DInJ42HN.chunk.js.map +1 -0
  228. package/dist/scripts/DLXENX3X.chunk.js +2 -0
  229. package/dist/scripts/DLXENX3X.chunk.js.map +1 -0
  230. package/dist/scripts/DLlygSGB.chunk.js +6 -0
  231. package/dist/scripts/DLlygSGB.chunk.js.map +1 -0
  232. package/dist/scripts/DMora6f7.chunk.js +2 -0
  233. package/dist/scripts/DMora6f7.chunk.js.map +1 -0
  234. package/dist/scripts/DOatLOGk.chunk.js +2 -0
  235. package/dist/scripts/DOatLOGk.chunk.js.map +1 -0
  236. package/dist/scripts/DTQRX2Z5.chunk.js +15 -0
  237. package/dist/scripts/DTQRX2Z5.chunk.js.map +1 -0
  238. package/dist/scripts/DV2PfQB1.chunk.js +2 -0
  239. package/dist/scripts/DV2PfQB1.chunk.js.map +1 -0
  240. package/dist/scripts/Di6TX7bW.chunk.js +2 -0
  241. package/dist/scripts/Di6TX7bW.chunk.js.map +1 -0
  242. package/dist/scripts/DiXTMx9M.chunk.js +2 -0
  243. package/dist/scripts/DiXTMx9M.chunk.js.map +1 -0
  244. package/dist/scripts/Do3_vYj7.chunk.js +2 -0
  245. package/dist/scripts/Do3_vYj7.chunk.js.map +1 -0
  246. package/dist/scripts/DoUAuskL.chunk.js +2 -0
  247. package/dist/scripts/DoUAuskL.chunk.js.map +1 -0
  248. package/dist/scripts/Dotf-cjL.chunk.js +2 -0
  249. package/dist/scripts/Dotf-cjL.chunk.js.map +1 -0
  250. package/dist/scripts/Dq4chRUI.chunk.js +2 -0
  251. package/dist/scripts/Dq4chRUI.chunk.js.map +1 -0
  252. package/dist/scripts/Dr_uQct3.chunk.js +2 -0
  253. package/dist/scripts/Dr_uQct3.chunk.js.map +1 -0
  254. package/dist/scripts/DwC7tXo7.chunk.js +2 -0
  255. package/dist/scripts/DwC7tXo7.chunk.js.map +1 -0
  256. package/dist/scripts/DzLRlab-.chunk.js +2 -0
  257. package/dist/scripts/DzLRlab-.chunk.js.map +1 -0
  258. package/dist/scripts/I2TdsaDo.chunk.js +2 -0
  259. package/dist/scripts/I2TdsaDo.chunk.js.map +1 -0
  260. package/dist/scripts/Kj832An8.chunk.js +2 -0
  261. package/dist/scripts/Kj832An8.chunk.js.map +1 -0
  262. package/dist/scripts/NFCjXwMo.chunk.js +2 -0
  263. package/dist/scripts/NFCjXwMo.chunk.js.map +1 -0
  264. package/dist/scripts/QfCSKVqV.chunk.js +2 -0
  265. package/dist/scripts/QfCSKVqV.chunk.js.map +1 -0
  266. package/dist/scripts/UTlJo9et.chunk.js +2 -0
  267. package/dist/scripts/UTlJo9et.chunk.js.map +1 -0
  268. package/dist/scripts/Va6df4HV.chunk.js +2 -0
  269. package/dist/scripts/Va6df4HV.chunk.js.map +1 -0
  270. package/dist/scripts/VjKgglJA.chunk.js +2 -0
  271. package/dist/scripts/VjKgglJA.chunk.js.map +1 -0
  272. package/dist/scripts/ZX9cci3Q.chunk.js +2 -0
  273. package/dist/scripts/ZX9cci3Q.chunk.js.map +1 -0
  274. package/dist/scripts/_sYSSSUN.chunk.js +2 -0
  275. package/dist/scripts/_sYSSSUN.chunk.js.map +1 -0
  276. package/dist/scripts/app-C44h5z5p.js +219 -0
  277. package/dist/scripts/app-C44h5z5p.js.map +1 -0
  278. package/dist/scripts/hiCMZ4pZ.chunk.js +2 -0
  279. package/dist/scripts/hiCMZ4pZ.chunk.js.map +1 -0
  280. package/dist/scripts/kpWgY6h_.chunk.js +2 -0
  281. package/dist/scripts/kpWgY6h_.chunk.js.map +1 -0
  282. package/dist/scripts/nWPqxcEa.chunk.js +2 -0
  283. package/dist/scripts/nWPqxcEa.chunk.js.map +1 -0
  284. package/dist/scripts/oaUqawuU.chunk.js +2 -0
  285. package/dist/scripts/oaUqawuU.chunk.js.map +1 -0
  286. package/dist/scripts/onGT4kCC.chunk.js +2 -0
  287. package/dist/scripts/onGT4kCC.chunk.js.map +1 -0
  288. package/dist/scripts/pkzD5BEm.chunk.js +2 -0
  289. package/dist/scripts/pkzD5BEm.chunk.js.map +1 -0
  290. package/dist/scripts/w9Re11Oi.chunk.js +362 -0
  291. package/dist/scripts/w9Re11Oi.chunk.js.map +1 -0
  292. package/dist/scripts/z-Nrq5UI.chunk.js +2 -0
  293. package/dist/scripts/z-Nrq5UI.chunk.js.map +1 -0
  294. package/package.json +7 -4
  295. package/typings/utils/imports.d.ts +1 -1
  296. package/vite.config.ts +6 -0
  297. package/dist/css/1068-exchange-b5eaf8af44.chunk.css +0 -35
  298. package/dist/css/1127-exchange-0eab318199.chunk.css +0 -40
  299. package/dist/css/1226-exchange-217b44f8b4.chunk.css +0 -57
  300. package/dist/css/1861-exchange-f3ff7e4f0d.chunk.css +0 -85
  301. package/dist/css/2494-exchange-02d7a0249c.chunk.css +0 -2
  302. package/dist/css/2538-exchange-4cbfe56ba3.chunk.css +0 -1
  303. package/dist/css/3291-exchange-3a8e198338.chunk.css +0 -11
  304. package/dist/css/3858-exchange-06944bdfa4.chunk.css +0 -1
  305. package/dist/css/4075-exchange-6d2304419c.chunk.css +0 -5
  306. package/dist/css/5027-exchange-2284222ca6.chunk.css +0 -25
  307. package/dist/css/6298-exchange-78ece5c7c5.chunk.css +0 -37
  308. package/dist/css/6332-exchange-2a22bfa655.chunk.css +0 -1
  309. package/dist/css/6356-exchange-8c5b220bf6.chunk.css +0 -1
  310. package/dist/css/7095-exchange-4cbfe56ba3.chunk.css +0 -1
  311. package/dist/css/7759-exchange-23bb5dd175.chunk.css +0 -8
  312. package/dist/css/8294-exchange-c797263ac2.chunk.css +0 -1
  313. package/dist/css/8589-exchange-71b6bc18f9.chunk.css +0 -11
  314. package/dist/css/8866-exchange-e80e6c6649.chunk.css +0 -10
  315. package/dist/css/9212-exchange-d71527fc65.chunk.css +0 -1
  316. package/dist/css/9611-exchange-cbf2bb5621.chunk.css +0 -5
  317. package/dist/css/9958-exchange-1387f35e92.chunk.css +0 -14
  318. package/dist/css/lite-exchange-306a09841f.css +0 -15
  319. package/dist/languages/en.json +0 -1
  320. package/dist/scripts/1068-0b00683666-exchange.chunk.js +0 -1
  321. package/dist/scripts/1127-356b23351e-exchange.chunk.js +0 -1
  322. package/dist/scripts/1136-4d8336cfdf-exchange.chunk.js +0 -2
  323. package/dist/scripts/1136-4d8336cfdf-exchange.chunk.js.LICENSE.txt +0 -1
  324. package/dist/scripts/1226-a4c0643661-exchange.chunk.js +0 -1
  325. package/dist/scripts/1861-dbceb13d3f-exchange.chunk.js +0 -2
  326. package/dist/scripts/1861-dbceb13d3f-exchange.chunk.js.LICENSE.txt +0 -1
  327. package/dist/scripts/2087-bbc1fd721f-exchange.chunk.js +0 -1
  328. package/dist/scripts/2117-5d867c698d-exchange.chunk.js +0 -1
  329. package/dist/scripts/2127-71bf57d74b-exchange.chunk.js +0 -1
  330. package/dist/scripts/2494-98cce57764-exchange.chunk.js +0 -2
  331. package/dist/scripts/2494-98cce57764-exchange.chunk.js.LICENSE.txt +0 -1
  332. package/dist/scripts/2507-1911a9bdb2-exchange.chunk.js +0 -1
  333. package/dist/scripts/2538-997edb9433-exchange.chunk.js +0 -2
  334. package/dist/scripts/2538-997edb9433-exchange.chunk.js.LICENSE.txt +0 -1
  335. package/dist/scripts/2648-4197959943-exchange.chunk.js +0 -1
  336. package/dist/scripts/2877-eee7fe484e-exchange.chunk.js +0 -1
  337. package/dist/scripts/3291-f9ccc2ea28-exchange.chunk.js +0 -1
  338. package/dist/scripts/3858-cd9d38c31c-exchange.chunk.js +0 -1
  339. package/dist/scripts/4075-6624f96fc6-exchange.chunk.js +0 -1
  340. package/dist/scripts/4299-36e5929cc6-exchange.chunk.js +0 -1
  341. package/dist/scripts/4312-552ca118ad-exchange.chunk.js +0 -1
  342. package/dist/scripts/442-47e3927b49-exchange.chunk.js +0 -1
  343. package/dist/scripts/455-ceeb969c54-exchange.chunk.js +0 -1
  344. package/dist/scripts/4558-057650ef22-exchange.chunk.js +0 -1
  345. package/dist/scripts/5027-357264982b-exchange.chunk.js +0 -1
  346. package/dist/scripts/5173-9cde8f68d3-exchange.chunk.js +0 -1
  347. package/dist/scripts/5267-443f3cdd59-exchange.chunk.js +0 -1
  348. package/dist/scripts/601-a3c22b0a9f-exchange.chunk.js +0 -1
  349. package/dist/scripts/6156-2bf99d5991-exchange.chunk.js +0 -1
  350. package/dist/scripts/6298-1c7a0ba516-exchange.chunk.js +0 -1
  351. package/dist/scripts/6332-9d2d42e2f9-exchange.chunk.js +0 -1
  352. package/dist/scripts/6356-dd8ff70cbb-exchange.chunk.js +0 -1
  353. package/dist/scripts/6725-25d1542dec-exchange.chunk.js +0 -1
  354. package/dist/scripts/6831-30fa3e741e-exchange.chunk.js +0 -1
  355. package/dist/scripts/7095-bbe1bfbe2f-exchange.chunk.js +0 -2
  356. package/dist/scripts/7095-bbe1bfbe2f-exchange.chunk.js.LICENSE.txt +0 -1
  357. package/dist/scripts/7170-cc2ea0de18-exchange.chunk.js +0 -1
  358. package/dist/scripts/7759-2740213eb8-exchange.chunk.js +0 -1
  359. package/dist/scripts/7782-36924dba92-exchange.chunk.js +0 -1
  360. package/dist/scripts/7925-978cf5d7fb-exchange.chunk.js +0 -1
  361. package/dist/scripts/851-d89fb94a66-exchange.chunk.js +0 -2
  362. package/dist/scripts/851-d89fb94a66-exchange.chunk.js.LICENSE.txt +0 -1
  363. package/dist/scripts/8536-dc903c2f54-exchange.chunk.js +0 -1
  364. package/dist/scripts/8589-912ab9f055-exchange.chunk.js +0 -1
  365. package/dist/scripts/8619-e5f595a594-exchange.chunk.js +0 -1
  366. package/dist/scripts/8866-0993e6b43a-exchange.chunk.js +0 -1
  367. package/dist/scripts/8937-727d080ed9-exchange.chunk.js +0 -1
  368. package/dist/scripts/9212-e8bde56a84-exchange.chunk.js +0 -1
  369. package/dist/scripts/9414-85c7657c8f-exchange.chunk.js +0 -2
  370. package/dist/scripts/9414-85c7657c8f-exchange.chunk.js.LICENSE.txt +0 -60
  371. package/dist/scripts/9566-0625fb0cbe-exchange.chunk.js +0 -1
  372. package/dist/scripts/9611-6fe32ccc83-exchange.chunk.js +0 -1
  373. package/dist/scripts/9866-2d10067a4e-exchange.chunk.js +0 -1
  374. package/dist/scripts/9899-2b571c961b-exchange.chunk.js +0 -1
  375. package/dist/scripts/9958-7f8f5ae2c6-exchange.chunk.js +0 -2
  376. package/dist/scripts/9958-7f8f5ae2c6-exchange.chunk.js.LICENSE.txt +0 -1
  377. package/dist/scripts/bundle-8466638d7c.min.js +0 -2
  378. package/dist/scripts/bundle-8466638d7c.min.js.LICENSE.txt +0 -108
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CAEqKa2O.chunk.js","sources":["../../../../libs/shared/src/interfaces/models/CalendarEvent.ts","../../../../libs/shared/src/apps/search/interfaces/SearchTypes.ts","../../../../libs/shared/src/apps/search/components/filter-actions/FilterActions.tsx","../../../../libs/shared/src/apps/search/reducers/FilterReducer.tsx","../../../../libs/shared/src/apps/search/components/filter-dropdown-title/FilterDropdownTitle.tsx","../../../../libs/shared/src/apps/search/components/filter-types/checkbox-filter/CheckboxFilterList.tsx","../../../../libs/shared/src/apps/search/components/filter-types/checkbox-filter/CheckboxFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/nested-checkbox-filter/components/NestedFilterOptions.tsx","../../../../libs/shared/src/apps/search/components/filter-types/nested-checkbox-filter/components/SecondLayerOptions.tsx","../../../../libs/shared/src/apps/search/components/filter-types/nested-checkbox-filter/NestedCheckboxFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/switch-filter/SwitchFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/dropdown-filter/DropdownFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/radio-filter/RadioFilter.tsx","../../../../libs/shared/src/components/rating-range-selector/RatingRangeSelector.tsx","../../../../libs/shared/src/apps/search/components/filter-types/rating-filter/RatingFilter.tsx","../../../../libs/shared/src/apps/search/constants/FilterConstants.ts","../../../../libs/shared/src/apps/search/utils/SourceFilterHelper.ts","../../../../libs/shared/src/enums/CustomerStatus.ts","../../../../libs/shared/src/apps/calendar/constants/SpecialEventTypeLabelMap.ts","../../../../libs/shared/src/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/activation-action-info/BulkUserActivationActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/activation-email-info/BulkUserActivationEmailActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/add-to-classroom-action-info/BulkAddToClassroomActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/change-year-group-action-info/ChangeYearGroupActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/delete-action-info/BulkUserDeleteActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/remove-action-info/BulkUserRemoveActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/reset-email-info/BulkUserResetEmailActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/reset-password-action-info/BulkResetPasswordActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/year-group-rollover-action-info/BulkUserYearGroupRolloverActionInfo.tsx","../../../../libs/shared/src/images/svg/status/CheckCircleSvg.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/UserStatusBadge.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/BasicUserDetails.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/RoleOrYearGroup.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/UserItemAvatar.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/bulk-user-actions-errored-user-item/BulkUserActionsErroredUserItem.tsx","../../../../libs/shared/src/apps/user-manager/enums/UserManagerClient.ts","../../../../libs/shared/src/context/WizardLayoutContext.tsx","../../../../libs/shared/src/enums/BatchDataType.ts","../../../../libs/shared/src/enums/BatchJobName.ts","../../../../libs/shared/src/enums/BatchJobResultErrorCode.ts","../../../../libs/shared/src/enums/BatchJobType.ts","../../../../libs/shared/src/images/svg/objects/KeySvg.tsx","../../../../libs/shared/src/apps/user-manager/utils/BulkUserActionsHelper.tsx","../../../../libs/shared/src/apps/search/components/filter-types/custom/duration-filter/DurationFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/custom/movies-and-tv-filter/MoviesAndTvFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/grouped-checkbox-filter/GroupedCheckboxFilter.tsx","../../../../libs/shared/src/apps/search/utils/ClassificationFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/DurationFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/PresentationFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/ProductionYearFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/RatingFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/FilterHelper.tsx","../../../../libs/shared/src/apps/search/components/filter-button/FilterButton.tsx","../../../../libs/shared/src/utils/StateHelper.ts","../../../../libs/shared/src/apps/search/components/filter-button/MoreFiltersButton.tsx","../../../../libs/shared/src/components/tags/PartialTagItem.tsx","../../../../libs/shared/src/components/widgets/hooks/useWidgetKeyboard.ts","../../../../libs/shared/src/enums/CssMeasurement.ts","../../../../libs/shared/src/utils/DragHelper.ts","../../../../libs/shared/src/components/widgets/sliding-list/SlidingListContainer.tsx","../../../../libs/shared/src/images/svg/arrows/ChevronRightSvg.tsx","../../../../libs/shared/src/components/widgets/widget-button/WidgetButton.tsx","../../../../libs/shared/src/enums/WidgetInteraction.ts","../../../../libs/shared/src/hooks/UseResizeListener.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetEventHandlers.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetReducer.tsx","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidget.tsx","../../../../libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.tsx","../../../../libs/shared/src/apps/search/components/filter-types/tag-filter/TagFilter.tsx","../../../../libs/shared/src/apps/search/components/reset-button/ResetButton.tsx","../../../../libs/shared/src/apps/search/components/search-filters/SearchFilters.tsx"],"sourcesContent":["import { BaseObject, BasePaginatedCollection, Classification, Livestream } from 'libs/shared/interfaces';\n\nexport type CalendarEventType = 'Observance' | 'ReligiousEvent' | 'Holiday' | 'Livestream';\n\nexport enum SpecialEventType {\n Holiday = 'Holiday',\n SportingEvent = 'SportingEvent',\n Observance = 'Observance',\n NaturalDisaster = 'NaturalDisaster',\n HistoricalEvent = 'HistoricalEvent',\n BreakingNews = 'BreakingNews',\n Informal = 'Informal',\n ReligiousEvent = 'ReligiousEvent',\n Livestream = 'Livestream',\n Other = 'Other'\n}\n\nexport enum CalendarEventContentType {\n Classification,\n Livestream\n}\n\nexport enum CalendarEventFrequency {\n Regular = 'Regular',\n Daily = 'Daily',\n Weekly = 'Weekly',\n Monthly = 'Monthly',\n Yearly = 'Yearly'\n}\n\nexport enum CalendarEventStatus {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport type CalendarEventContent = Classification | Livestream;\n\nexport interface CalendarEvent<T extends CalendarEventContent = Classification> {\n id: string;\n type: CalendarEventType;\n name: string;\n description?: string;\n startDate: string;\n endDate?: string;\n content: T;\n specialEventId?: string;\n specialEventPolicyId?: string;\n metadata?: {\n objectType: 'Topic' | 'Livestream';\n objectId: string;\n };\n}\n\nexport interface SpecialEvent<T extends CalendarEventContent = Classification> {\n id: string;\n name: string;\n description: string;\n policies: SpecialEventPolicy<T>[];\n status: CalendarEventStatus;\n type: SpecialEventType;\n}\n\nexport type SpecialEventCollection<T extends CalendarEventContent = Classification>\n = BasePaginatedCollection<SpecialEvent<T>>;\n\nexport interface SpecialEventPolicy<T extends CalendarEventContent = Classification> extends BaseObject {\n content: T;\n specialEventId: string;\n status: CalendarEventStatus;\n presentationId: string;\n startDate: string;\n endDate: string;\n frequency: CalendarEventFrequency;\n interval: number;\n visible: boolean;\n metadata: {\n objectId: string;\n objectType: 'Topic' | 'Livestream';\n };\n}","import { ObjectHash } from 'backbone';\nimport Bloodhound from 'bloodhound';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface RemoteSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n remote: Bloodhound.RemoteOptions<T>;\n}\n\nexport interface LocalSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n local: T[] | (() => T[]);\n}\n\nexport type TypeaheadDataSource<T> = Bloodhound<T> |\n((query: string, syncResults: (result: T[]) => void, asyncResults?: (result: T[]) => void) => void);\n\nexport interface InstantSearchBloodhound<T> {\n bloodhound: TypeaheadDataSource<T>;\n name: string;\n}\n\nexport type TypeaheadConfig<T> = Twitter.Typeahead.Dataset<T>;\n\nexport interface TypeaheadConfigHandler<T> {\n (source?: InstantSearchBloodhound<T>, index?: number, options?: ObjectHash): Twitter.Typeahead.Dataset<T>;\n}\n\nexport interface BloodhoundConfigHandler<T> {\n (source: string, options?: ObjectHash): LocalSearch<T> | RemoteSearch<T>;\n}\n\nexport interface TypeaheadSourceItem<T> {\n name: string;\n typeaheadConfig: TypeaheadConfigHandler<T>;\n bloodhoundConfig?: BloodhoundConfigHandler<T>;\n options?: ObjectHash;\n}\n\nexport const AllSearchIndicesVideoStyle: SearchIndices[] = [ 'video', 'clip', 'interactive' ];\nexport const AllSearchIndicesInSearch: SearchIndices[] = [ 'playlist', 'series', 'clip', 'classification', 'interactive', 'video', 'company', 'category' ];\nexport const AllSearchIndicesInUserManager: SearchIndices[] = ['user'];","import * as React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.filterActions';\n\ninterface FilterActionsProps {\n className?: string;\n onClickReset: () => void;\n onClickApply: () => void;\n active: boolean;\n}\n\nFilterActions.defaultProps = {\n active: false,\n className: ''\n};\n\nexport function FilterActions(props: FilterActionsProps): JSX.Element {\n return (\n <div className={`d-flex justify-content-between ${props.className}`}>\n {props.active ? (\n <DivButton className='text-secondary hover-text-underline cursor-pointer' onClick={props.onClickReset}>\n <Text namespace={namespace} phrase='reset' />\n </DivButton>\n ) : (\n <div className='invisible' />\n )}\n\n <DivButton className='info-link' onClick={props.onClickApply}>\n <Text namespace={namespace} phrase='apply' />\n </DivButton>\n </div>\n );\n}","import { createContext } from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { FilterIds, FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\n\nexport type FilterState = {\n active: boolean;\n selection?: FilterOption[];\n};\n\nexport type DraftState = {\n [key in FilterIds]?: FilterState;\n};\n\ntype FilterStateHashFilters = {\n [key in FilterIds]: FilterState;\n};\n\nexport type FilterStateHash = FilterStateHashFilters & {\n appLink: Core.AppLink;\n moreFilters?: Omit<FilterStateHash, 'moreFilters'>;\n};\n\nexport type FilterActionType = 'update';\n\nexport type FilterPayloadType = {\n filter: SearchFilter;\n state: FilterState;\n};\n\n/**\n * Context\n */\ninterface FilterContextType {\n state: FilterStateHash;\n dispatch: React.Dispatch<ReducerActions<FilterActionType>>;\n}\n\nexport const FilterContext = createContext<FilterContextType>(null);\n\n/**\n * Reducer - root level keys should match the filter object's corresponding \"id\" field\n */\nexport function FilterReducer(\n state: FilterStateHash,\n action: ReducerActions<FilterActionType, FilterStateHash>\n): FilterStateHash {\n switch (action.type) {\n case 'update': {\n return action.payload;\n }\n\n default:\n return state;\n }\n}\n","import React from 'react';\n\ninterface FilterDropdownTitleProps {\n id?: string;\n title: string;\n}\n\nexport function FilterDropdownTitle(props: FilterDropdownTitleProps): JSX.Element {\n return (\n <label htmlFor={props.id} className='mb-0'>\n <h3 className='h6 mb-2'>{props.title}</h3>\n </label>\n );\n}","import React from 'react';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\nimport { FilterOption, MoreFilters, SearchFilter } from '../../../interfaces';\nimport { FilterState } from '../../../reducers';\n\ninterface CheckboxFilterListProps {\n displayOptionsIn2Columns: boolean;\n filter: SearchFilter | MoreFilters;\n draftState: FilterState;\n setDraftState: (state: FilterState) => void;\n options: FilterOption[];\n}\n\nexport function CheckboxFilterList(props: CheckboxFilterListProps): JSX.Element {\n const selections = props.draftState.selection;\n\n function onToggleItem(option: FilterOption, isCurrentlyChecked: boolean): void {\n /**\n * If the item is currently checked, we remove it from the array\n */\n if (isCurrentlyChecked) {\n let indexOfItem: number = -1;\n\n // Find the index of the clicked item\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n // Return a new array with the clicked item sliced out\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n\n props.setDraftState({ active: !!newItems.length, selection: newItems });\n\n return;\n }\n\n /**\n * If the item wasn't checked, simply push it onto the selections array\n */\n const newItems = [...selections];\n newItems.push(option);\n\n props.setDraftState({\n active: !!newItems.length,\n selection: newItems\n });\n }\n\n const options = props.options.map(option => {\n const isDisabled = props.filter.disabled || option.disabled;\n const isChecked = !!props.draftState.selection.find(s => s.id.toString() === option.id.toString());\n const joinedIds = Array.isArray(option.id) ? option.id.join('_') : option.id;\n \n return (\n <li key={joinedIds} className={`my-1 ${props.displayOptionsIn2Columns ? 'col-md-6 col-12' : ''}`}>\n <Checkbox\n label={option.name}\n name={joinedIds}\n id={joinedIds}\n onChange={() => onToggleItem(option, isChecked)}\n checked={!isDisabled && isChecked}\n isLabelEllipsis={props.displayOptionsIn2Columns}\n disabled={isDisabled}\n />\n </li>\n );\n });\n \n return <ul className={`list-unstyled ${props.displayOptionsIn2Columns ? 'd-flex flex-wrap' : ''}`}>{options}</ul>;\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\n\nimport { CheckboxFilterList } from './CheckboxFilterList';\n\nexport function CheckboxFilter(props: FilterProps): JSX.Element {\n const displayOptionsIn2Columns = FilterHelper.displayTwoColumns(props.filter);\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <Form className='mb-3'>\n <CheckboxFilterList\n displayOptionsIn2Columns={displayOptionsIn2Columns}\n options={props.filter.options}\n filter={props.filter}\n draftState={props.draftState}\n setDraftState={props.setDraftState}\n />\n </Form>\n </>\n );\n}\n","import * as React from 'react';\n\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\ntype NestedFilterOptionsProps = FilterProps & {\n onToggleItem: (selectedOption: FilterOption, isCurrentlyCheckedOrIndeterminate: boolean) => void;\n onToggleChildItem: (selectedOption: FilterOption, isCurrentlyChecked: boolean, parentOption: FilterOption) => void;\n}\n\nexport function NestedFilterOptions(props: NestedFilterOptionsProps): JSX.Element {\n const allOptions: JSX.Element[] = [];\n\n for (const firstLayerOption of props.filter.options) {\n const isFirstLayerOptionDisabled = props.filter.disabled || firstLayerOption.disabled;\n const currentSelection = props.draftState.selection?.find(s => s?.id === firstLayerOption.id);\n const secondLayerOptions = firstLayerOption.secondLayerOptions ?? [];\n const isFirstLayerIndeterminate = getIsFirstLayerIndeterminate(currentSelection, secondLayerOptions);\n const isFirstLayerOptionChecked = !isFirstLayerIndeterminate && !!currentSelection;\n\n // 1st layer\n allOptions.push(\n <Checkbox\n key={firstLayerOption.id}\n label={firstLayerOption.name}\n name={firstLayerOption.id}\n id={firstLayerOption.id}\n indeterminate={isFirstLayerIndeterminate}\n onChange={() => props.onToggleItem(firstLayerOption, isFirstLayerOptionChecked || isFirstLayerIndeterminate)}\n checked={ !isFirstLayerOptionDisabled && isFirstLayerOptionChecked}\n className='my-1'\n disabled={isFirstLayerOptionDisabled}\n />\n );\n\n // 2nd layer\n const showSecondLayer = FilterHelper.hasManyFilterOptions(secondLayerOptions);\n\n showSecondLayer && allOptions.push(\n ...secondLayerOptions.map(secondLayerOption => {\n const isSecondLayerOptionDisabled = isFirstLayerOptionDisabled || secondLayerOption.disabled;\n const isSecondLayerOptionChecked = !!currentSelection?.secondLayerSelection\n ?.find(s => s.id === secondLayerOption.id);\n\n return (\n <Checkbox\n key={secondLayerOption.id}\n label={secondLayerOption.name}\n name={secondLayerOption.id}\n id={secondLayerOption.id}\n onChange={() => props.onToggleChildItem(secondLayerOption, isSecondLayerOptionChecked, firstLayerOption)}\n checked={!isSecondLayerOptionDisabled && isSecondLayerOptionChecked}\n className={'my-1 ms-3'}\n disabled={isSecondLayerOptionDisabled}\n />\n );\n })\n );\n }\n\n return <>{allOptions}</>;\n}\n\nfunction getIsFirstLayerIndeterminate(currentSelection: FilterOption, secondLayerOptions: FilterOption[]): boolean {\n const hasSecondLayerSelection = currentSelection?.secondLayerSelection?.length > 0;\n const allSecondLayerOptionsChecked = currentSelection?.secondLayerSelection?.length === secondLayerOptions.length;\n return hasSecondLayerSelection && !allSecondLayerOptionsChecked;\n}","import * as React from 'react';\n\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\ntype SecondLayerOptionProps = FilterProps & {\n onToggleChildItem: (selectedOption: FilterOption, isCurrentlyChecked: boolean, parentOption: FilterOption) => void;\n}\n\nexport function SecondLayerOptions(props: SecondLayerOptionProps): JSX.Element {\n for (const firstLayerOption of props.filter.options) {\n const isFirstLayerOptionDisabled = props.filter.disabled || firstLayerOption.disabled;\n const currentSelection = props.draftState.selection?.find(s => s?.id === firstLayerOption.id);\n const secondLayerOptions = firstLayerOption.secondLayerOptions ?? [];\n\n const options = secondLayerOptions.map(secondLayerOption => {\n const isSecondLayerOptionDisabled = isFirstLayerOptionDisabled || secondLayerOption.disabled;\n const isSecondLayerOptionChecked = !!currentSelection?.secondLayerSelection\n ?.find(s => s.id === secondLayerOption.id);\n\n return (\n <Checkbox\n key={secondLayerOption.id}\n label={secondLayerOption.name}\n name={secondLayerOption.id}\n id={secondLayerOption.id}\n onChange={() => props.onToggleChildItem(secondLayerOption, isSecondLayerOptionChecked, firstLayerOption)}\n checked={!isSecondLayerOptionDisabled && isSecondLayerOptionChecked}\n className={'my-1'}\n disabled={isSecondLayerOptionDisabled}\n />\n );\n });\n\n return <>{options}</>;\n }\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\n\nimport { NestedFilterOptions } from './components/NestedFilterOptions';\nimport { SecondLayerOptions } from './components/SecondLayerOptions';\n\nexport function NestedCheckboxFilter(props: FilterProps): JSX.Element {\n const options = props.filter.options;\n\n function onToggleItem(selectedOption: FilterOption, isCurrentlyCheckedOrIndeterminate: boolean): void {\n const { selection } = props.draftState;\n const indexOfOption = selection.findIndex(o => o.id === selectedOption.id);\n\n /**\n * If the item wasn't checked, simply push it onto the selections array\n */\n if (!isCurrentlyCheckedOrIndeterminate) {\n const enabled2ndLayerOptions = (options\n ?.find(o => o.id === selectedOption.id).secondLayerOptions)\n ?.filter(o => !o.disabled);\n\n // Also select all enabled 2nd layer options\n const newSelectedOptionWith2ndLayerOptions =\n { ...selectedOption, secondLayerSelection: enabled2ndLayerOptions };\n\n // Add new option\n if (selection.length === 0 || indexOfOption === -1) {\n const newSelection = [ ...selection, newSelectedOptionWith2ndLayerOptions ];\n\n props.setDraftState({\n active: true,\n selection: newSelection\n });\n\n return;\n }\n\n // Merge selectedItem into selection\n if (indexOfOption !== -1) {\n const newSelection = selection.map(firstLayer => {\n if (firstLayer.id === selectedOption.id) {\n return newSelectedOptionWith2ndLayerOptions;\n }\n\n return firstLayer;\n });\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n\n return;\n }\n }\n\n /**\n * If the item is currently checked, we remove it from the array\n */\n const newSelection = ArrayHelper.removeItemFromIndex(\n selection,\n selection.findIndex(selectionItem => selectionItem.id === selectedOption.id)\n );\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n }\n\n function onToggleChildItem(\n selectedOption: FilterOption,\n isCurrentlyChecked: boolean,\n parentOption: FilterOption\n ): void {\n const { selection } = props.draftState;\n const indexOfParentOption = selection.findIndex(o => o.id === parentOption.id);\n\n if (!isCurrentlyChecked) {\n const newChildSelection = [ ...selection[indexOfParentOption]?.secondLayerSelection ?? [], selectedOption ];\n\n // If no selection/new item is not in selection, add new option\n if (selection.length === 0 || indexOfParentOption === -1) {\n const newParentSelection = {\n ...parentOption,\n secondLayerSelection: newChildSelection\n };\n\n const newSelection = [ ...selection, newParentSelection ];\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n\n return;\n }\n\n // Merge selectedItem into selection\n if (indexOfParentOption !== -1) {\n const newSelection = selection.map(firstLayer => {\n if (firstLayer.id === parentOption.id) {\n return {\n ...firstLayer,\n secondLayerSelection: newChildSelection\n };\n }\n\n return firstLayer;\n });\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n\n return;\n }\n }\n\n // Uncheck child\n let newSelection = selection.map(firstLayer => {\n if (firstLayer.id === parentOption.id) {\n const new2ndLayerSelection = ArrayHelper.removeItem(firstLayer.secondLayerSelection, selectedOption);\n return { ...parentOption, secondLayerSelection: new2ndLayerSelection };\n }\n\n return firstLayer;\n });\n\n // Uncheck parent if no child\n if (newSelection[indexOfParentOption].secondLayerSelection.length === 0) {\n newSelection = ArrayHelper.removeItem(newSelection, parentOption);\n }\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n }\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n <Form className='mb-3'>\n { FilterHelper.hasManyFilterOptions(options)\n ? <NestedFilterOptions onToggleItem={onToggleItem} onToggleChildItem={onToggleChildItem} {...props} />\n : <SecondLayerOptions onToggleChildItem={onToggleChildItem} {...props} />\n }\n </Form>\n </>\n );\n}\n","import * as React from 'react';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nexport function SwitchFilter(props: FilterProps): JSX.Element {\n const isActive = props.draftState.active;\n\n function onToggle(): void {\n props.setDraftState({ active: !isActive });\n }\n\n return (\n <>\n <FilterDropdownTitle id={props.filter.id} title={props.filter.name} />\n\n <div className='d-flex align-items-start justify-content-between'>\n <p className='d-inline-block w-75'>{props.filter.description}</p>\n\n <ToggleSwitch id={props.filter.id} disabled={props.filter.disabled} onClick={onToggle} on={isActive} />\n </div>\n </>\n );\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nexport function DropdownFilter(props: FilterProps): JSX.Element {\n function onSelect(option: FilterOption): void {\n props.setDraftState({\n active: !option.default,\n selection: [option]\n });\n }\n\n return (\n <>\n {props.filter.options.map(option => (\n <Dropdown.Item\n key={option.id}\n onClick={() => onSelect(option)}\n disabled={props.filter.disabled || option.disabled}\n >\n {option.name}\n </Dropdown.Item>\n ))}\n </>\n );\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nimport styles from './radio-filter.module.scss';\n\nexport function RadioFilter(props: FilterProps): JSX.Element {\n function onSelect(option: FilterOption): void {\n props.setDraftState({\n active: !option.default,\n selection: [option]\n });\n }\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <Form>\n <ul className={`${props.isOnMoreFilters ? 'd-flex flex-wrap' : ''} list-unstyled`}>\n {props.filter.options.map(option => {\n const isDisabled = props.filter.disabled || option.disabled;\n const isSelected = ArrayHelper.first(props.draftState.selection)?.id.toString() === option.id.toString();\n return (\n <li key={option.id} className={`${props.isOnMoreFilters ? 'w-50' : ''}`}>\n <Form.Check\n type='radio'\n label={option.name}\n name={option.id}\n id={option.id}\n value={option.id}\n onChange={() => onSelect(option)}\n checked={!isDisabled && isSelected}\n className={`${styles.radioFilter}`}\n disabled={isDisabled}\n />\n </li>\n );\n })}\n </ul>\n </Form>\n </>\n );\n}","import React from 'react';\nimport { ButtonGroup } from 'react-bootstrap';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { Rating, YearGroup } from 'libs/shared/interfaces';\n\ninterface RatingButtonProps {\n rating: Rating;\n isActive: boolean;\n onClick: () => void;\n onHover: (rating: Rating) => void;\n getButtonClasses: (rating: Rating, isActive: boolean, isHovering: boolean) => string;\n disabled?: boolean;\n}\n\nfunction RatingButton(props: RatingButtonProps): JSX.Element {\n const [ ref, isHovering ] = useHover<HTMLDivElement>({ delay: 1 });\n\n React.useEffect(() => {\n props.onHover(isHovering ? props.rating : null);\n }, [isHovering]);\n\n if (!props.rating.code)\n return <></>;\n\n const button = (\n <DivButton\n ref={ref}\n className={props.getButtonClasses(props.rating, props.isActive, isHovering)}\n onClick={props.onClick}\n disabled={props.disabled}\n >\n {props.rating.code}\n </DivButton>\n );\n\n if (props.disabled)\n return button;\n\n return (\n <Tooltip title={props.rating.name} spanHack>\n {button}\n </Tooltip>\n );\n}\n\ninterface RatingRangeSelectorProps {\n ratings: Rating[];\n yearGroup?: YearGroup;\n yearGroups?: YearGroup[];\n selections: Rating[];\n onSelectRange: (range: Rating[]) => void;\n getButtonClasses: (rating: Rating, isActive: boolean, isHovering: boolean) => string;\n isDisabled?: (rating: Rating) => boolean;\n disabled?: boolean;\n}\n\nRatingRangeSelector.defaultProps = {\n selections: []\n};\n\nexport function RatingRangeSelector(props: RatingRangeSelectorProps): JSX.Element {\n const [ hoverRange, setHoverRange ] = React.useState<Rating[]>([]);\n\n function getRange(rating: Rating): Rating[] {\n return props.ratings.filter(r => r.code && r.value <= rating.value);\n }\n\n function onClickRating(rating: Rating): void {\n props.onSelectRange(getRange(rating));\n }\n\n function onHover(rating: Rating): void {\n if (!rating || props.isDisabled(rating)) {\n setHoverRange([]);\n return;\n }\n }\n\n function isActive(rating: Rating): boolean {\n if (hoverRange.length)\n return !!hoverRange.find(r => r.id === rating.id);\n\n return !!props.selections.find(r => r.id === rating.id);\n }\n\n return (\n <div>\n <ButtonGroup as='ul' className='list-unstyled mb-0'>\n {props.ratings.map(rating => (\n <li key={rating.id}>\n <RatingButton\n rating={rating}\n onClick={() => onClickRating(rating)}\n onHover={onHover}\n isActive={isActive(rating)}\n disabled={props.disabled || props.isDisabled?.(rating)}\n getButtonClasses={props.getButtonClasses}\n />\n </li>\n ))}\n </ButtonGroup>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { RatingRangeSelector } from 'libs/shared/components/rating-range-selector/RatingRangeSelector';\nimport { Rating } from 'libs/shared/interfaces';\n\nimport styles from './rating-filter.module.scss';\n\ntype OptionType = FilterOption & Rating;\n\nexport function RatingFilter(props: FilterProps): JSX.Element {\n const options = props.filter.options as OptionType[];\n\n function onSelectRange(range: OptionType[]): void {\n props.setDraftState({\n active: !!range.length,\n selection: range as FilterOption[]\n });\n }\n\n const filteredRatings: Rating[] = options.filter(r => r.code);\n const [firstRating] = filteredRatings;\n const lastRating = filteredRatings[filteredRatings.length - 1];\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <div className='mb-2'>\n <RatingRangeSelector\n ratings={options}\n selections={props.draftState.selection as Rating[]}\n onSelectRange={onSelectRange}\n disabled={props.filter.disabled}\n isDisabled={(rating: Rating & FilterOption) => rating.disabled}\n getButtonClasses={(rating, isActive, isHovering) => {\n let className = 'btn border text-nowrap';\n\n if (isActive || isHovering)\n className += ' btn-dark';\n else\n className += ' btn-outline-dark';\n\n if (isHovering)\n className += ' active';\n\n if (filteredRatings.length === 1)\n className += ' rounded';\n else if (firstRating.id === rating.id)\n className += ' ' + styles.firstButton;\n else if (lastRating.id === rating.id)\n className += ' ' + styles.lastButton;\n else\n className += ' rounded-0';\n\n return className;\n }}\n />\n </div>\n </>\n );\n}","export const FilterConstants = {\n FILTER_PARAM_PREFIX: 'filters.',\n MAX_CHECKBOXES_PER_COLUMN: 10\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { FilterOption, SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { Library } from 'libs/shared/interfaces';\n\nconst namespace = 'sharedSearch.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst LIBRARY_FILTER = `${FilterConstants.FILTER_PARAM_PREFIX}library`;\n\nfunction getTypeMap(libraries: Library[]): HashObject {\n return libraries.reduce<HashObject>((prev, next) => {\n return {\n ...prev,\n [next.type]: true\n };\n }, {});\n}\n\nexport const SourceFilterHelper = {\n getOptions(opts: {\n libraries: Library[],\n isLearner: boolean,\n isGuest: boolean,\n hasCustomLibraries: boolean\n }): FilterOption<SourceFilterOptions>[] {\n const { libraries, isLearner, isGuest, hasCustomLibraries } = opts;\n\n const options: FilterOption<SourceFilterOptions>[] = [];\n\n const libraryTypes = getTypeMap(libraries);\n\n if (libraryTypes[MasterObjectTypes.Workspace] && !isGuest)\n options.push({ id: SourceFilterOptions.MyVideos, name: getPhrase('myVideos') });\n\n if (libraryTypes[MasterObjectTypes.CustomLibrary] && (!isLearner || hasCustomLibraries))\n options.push({ id: SourceFilterOptions.School, name: getPhrase('schoolVideos') });\n\n if (libraryTypes[MasterObjectTypes.Exchange])\n options.push({ id: SourceFilterOptions.ExchangeArchive, name: getPhrase('exchangeArchiveVideos') });\n\n if (libraryTypes[MasterObjectTypes.HostedLibrary])\n options.push({ id: SourceFilterOptions.ClickView, name: getPhrase('clickViewVideos') });\n\n return options;\n },\n\n getBackendParamValue(\n val: SourceFilterOptions | SourceFilterOptions[],\n libraries: Library[]\n ): HashObject {\n const values = Array.isArray(val) ? val : [val];\n\n return values.reduce((acc, value) => {\n return libraries.reduce((prev, next) => {\n const libraryIds = prev[LIBRARY_FILTER] || [];\n \n if (value === SourceFilterOptions.MyVideos && next.type === MasterObjectTypes.Workspace)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n \n if (value === SourceFilterOptions.School && next.type === MasterObjectTypes.CustomLibrary)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n\n if (value === SourceFilterOptions.ExchangeArchive && next.type === MasterObjectTypes.Exchange)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n \n if (value === SourceFilterOptions.ClickView && next.type === MasterObjectTypes.HostedLibrary)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n \n return prev;\n }, acc);\n }, {} as HashObject);\n }\n};","export enum CustomerStatus {\n Unclassified = 0,\n Active = 1,\n Prospect = 2,\n LostCustomer = 3,\n Disabled = 4,\n Other = 5\n}\n\nexport enum CustomerStatusString {\n Unclassified = 'Unclassified',\n Active = 'Active',\n Prospect = 'Prospect',\n LostCustomer = 'LostCustomer',\n Disabled = 'Disabled',\n Other = 'Other'\n}","import { SpecialEventType } from 'libs/shared/interfaces';\n\nexport const SpecialEventTypeLabelMap: Record<SpecialEventType, string> = {\n [SpecialEventType.BreakingNews]: 'Breaking news',\n [SpecialEventType.HistoricalEvent]: 'Historical event',\n [SpecialEventType.Holiday]: 'Holiday',\n [SpecialEventType.Informal]: 'Informal',\n [SpecialEventType.Livestream]: 'Livestream',\n [SpecialEventType.NaturalDisaster]: 'Natural disaster',\n [SpecialEventType.Observance]: 'Observance',\n [SpecialEventType.ReligiousEvent]: 'Religious event',\n [SpecialEventType.SportingEvent]: 'Sporting event',\n \n [SpecialEventType.Other]: 'Other'\n};","import React from 'react';\n\nexport function WizardActionInfoContainer(props: React.PropsWithChildren<any>): JSX.Element {\n return (\n <div className='alert text-dark bg-light-blue px-2 rounded-3'>\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserActivationActionInfo';\n\ninterface BulkUserActivationActionInfoProps {\n userType: UserGroup;\n}\n\nexport function BulkUserActivationActionInfo(props: BulkUserActivationActionInfoProps): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='deactivate' /></h4>\n <p>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'deactivateInfoStudent' : 'deactivateInfoStaff'} />\n </p>\n\n <h4 className='h5'><Text namespace={namespace} phrase='reactivate' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'reactivateInfoStudent' : 'reactivateInfoStaff'} />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkUserActivationEmailActionInfo';\n\nexport function BulkUserActivationEmailActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.addToClassroomActionInfo';\n\nexport function BulkAddToClassroomActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.changeYearGroupActionInfo';\n\nexport function BulkChangeYearGroupActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserDeleteActionInfo';\n\ninterface BulkUserDeleteActionInfoProps {\n userType: UserGroup;\n}\n\nexport function BulkUserDeleteActionInfo(props: BulkUserDeleteActionInfoProps): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='delete' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'infoStudent' : 'infoStaff'} />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserRemoveActionInfo';\n\ninterface BulkUserRemoveActionInfoProps {\n userType: UserGroup;\n}\n\nexport function BulkUserRemoveActionInfo(props: BulkUserRemoveActionInfoProps): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='remove' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'infoStudent' : 'infoStaff'} />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkUserResetEmailActionInfo';\n\nexport function BulkUserResetEmailActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkResetPasswordActionInfo';\n\nexport function BulkResetPasswordActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkUserYearGroupRolloverActionInfo';\n\nexport function BulkUserYearGroupRolloverActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nexport function CheckCircleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M12 3c4.972 0 9 4.028 9 9s-4.028 9-9 9-9-4.028-9-9 4.028-9 9-9m4.244 5.578a.77.77 0 0 0-1.058.068l-4.722 5.18-1.684-1.615a.77.77 0 0 0-1.06 0 .7.7 0 0 0 0 1.018l2.25 2.16a.77.77 0 0 0 1.094-.035l5.25-5.76a.7.7 0 0 0-.07-1.016'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './user-item-components.module.scss';\n\nconst namespace = 'userManager.userList';\n\ninterface UserStatusBadgeProps {\n user?: Partial<User>;\n status?: ObjectStatus;\n currentUser?: CurrentUser;\n className?: string;\n showActiveBadge?: boolean;\n}\n\nexport function UserStatusBadge(props: UserStatusBadgeProps): JSX.Element {\n return (\n <>\n {/* \"Deactivated\" badge */}\n {(UserHelper.getUserStatusFromValue(props.user?.status ?? props.status) === ObjectStatus.Disabled) && (\n <div className={`text-white px-1 ${styles.badge} bg-danger ${props.className ?? ''}`}>\n <Text namespace={namespace} phrase='deactivated' />\n </div>\n )}\n\n {/* \"Pending badge\" */}\n {(UserHelper.getUserStatusFromValue(props.user?.status ?? props.status) === ObjectStatus.Inactive) && (\n <div className={`text-white px-1 ${styles.badge} ${styles.pending} ${props.className ?? ''}`}>\n <Tooltip title={LanguageService.getPhrase(namespace, 'pendingTooltip')} spanHack>\n <Text namespace={namespace} phrase='pending' />\n </Tooltip>\n </div>\n )}\n\n\n {/* \"Active badge\" */}\n {props.showActiveBadge &&\n (UserHelper.getUserStatusFromValue(props.user?.status ?? props.status) === ObjectStatus.Active)\n && (\n <div className={`text-white px-1 ${styles.badge} ${styles.active} ${props.className ?? ''}`}>\n <Tooltip title={LanguageService.getPhrase(namespace, 'active')} spanHack>\n <Text namespace={namespace} phrase='active' />\n </Tooltip>\n </div>\n )}\n\n {/* \"That's me\" badge */}\n {props.user?.id.toString() === props.currentUser?.id.toString() && (\n <div className={`text-white px-1 ${styles.badge} bg-blue ${props.className ?? ''}`}>\n <Text namespace={namespace} phrase='thatsYou' />\n </div>\n )}\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CheckCircleSvg } from 'libs/shared/images/svg/status/CheckCircleSvg';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { UserStatusBadge } from './UserStatusBadge';\n\nimport styles from './user-item-components.module.scss';\n\nconst namespace = 'userManager.userList';\n\ninterface BasicUserDetailsProps {\n user: Partial<User>;\n currentUser?: CurrentUser;\n wrapperClassName?: string;\n}\n\nexport function BasicUserDetails(props: BasicUserDetailsProps): JSX.Element {\n const { user, currentUser } = props;\n\n return (\n <div className={`d-flex flex-column justify-content-center me-auto w-100 ${props.wrapperClassName}`}>\n <div className='pb-1 d-flex align-items-center'>\n {/* Name, username, and status */}\n <div className={`d-flex ${styles.name}`}>\n {user.name ? (\n <h2\n className='h5 m-0 me-1 d-inline-block align-middle text-truncate'\n title={`${user.name} ${user.surname || ''}`}\n >\n {user.name} {user.surname || ''}\n </h2>\n ) : (\n <span className='fst-italic text-secondary me-2'>\n <Text namespace={namespace} phrase='noName' />\n </span>\n )}\n {user.username && (\n <>\n (\n <p title={user.username} className={`m-0 d-inline-block align-middle text-truncate ${styles.username}`}>\n {user.username}\n </p>\n )\n </>\n )}\n </div>\n\n <UserStatusBadge user={user} currentUser={currentUser} className='ms-2' />\n </div>\n\n {/* Email and verification status */}\n <div className='d-flex'>\n {!!user.metadata?.isEmailVerified && (\n <SvgContainer\n className={`svg-container text-secondary ms-n1 ${styles.verifiedEmail}`}\n svg={CheckCircleSvg}\n title={LanguageService.getPhrase(namespace, 'emailVerified')}\n tooltipSpanHack\n tooltipPlacement='top'\n />\n )}\n <p className='text-truncate mb-0 overflow-visible'>\n {user.email\n ? user.email\n : (\n <span className='fst-italic'>\n <Text namespace={namespace} phrase='noEmail' />\n </span>\n )\n }\n </p>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { User } from 'libs/shared/interfaces';\n\nconst namespace = 'userManager.userList';\n\ninterface RoleOrYearGroupProps {\n userType: UserGroup;\n user?: Partial<User>;\n countryCode?: string;\n badgeText?: string;\n}\n\nfunction getBadgeText(props: RoleOrYearGroupProps): string {\n if (props.userType === UserGroup.Learner) {\n if (props.user?.masterYearGroup?.name)\n return props.user?.masterYearGroup.name;\n\n if (props.user?.yearGroups?.data?.length)\n return ArrayHelper.first(props.user?.yearGroups.data).name;\n\n return null;\n }\n\n if (props.userType === UserGroup.Staff) {\n if (props.user?.userProfile?.role === UserRole.Admin)\n return LanguageService.getPhrase(namespace, 'admin');\n \n if (props.user?.userProfile?.role === UserRole.SuperAdmin)\n return LanguageService.getPhrase(namespace, props.countryCode === 'US' ? 'superAdminUs' : 'superAdmin');\n\n return null;\n }\n}\n\nexport function RoleOrYearGroup(props: RoleOrYearGroupProps): JSX.Element {\n const badgeText = props.badgeText || getBadgeText(props);\n\n if (!badgeText)\n return <></>;\n\n return (\n <div className={`rounded-pill border border-dark bg-white px-2 me-3 d-inline-block flex-shrink-0`}>\n {badgeText}\n </div>\n );\n}","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './user-item-components.module.scss';\n\ninterface UserItemAvatarProps {\n user: Partial<User>;\n imageCdnUrl: string;\n}\n\nexport function UserItemAvatar(props: UserItemAvatarProps): JSX.Element {\n return (\n <div className={`${styles.avatarContainer} mx-2`}>\n <Avatar\n imageUrl={props.user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.user.name, props.user.surname)}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { BaseUserItemProps } from 'libs/shared/apps/user-manager/components/user-list/UserList';\nimport { BasicUserDetails } from 'libs/shared/apps/user-manager/components/user-list-items/components/BasicUserDetails';\nimport { RoleOrYearGroup } from 'libs/shared/apps/user-manager/components/user-list-items/components/RoleOrYearGroup';\nimport { UserItemAvatar } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserItemAvatar';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\ninterface BulkUserActionsErroredUserItemProps extends BaseUserItemProps {\n imageCdnUrl: string;\n errorMessage: string;\n currentUser?: CurrentUser;\n}\n\nexport function BulkUserActionsErroredUserItem(props: BulkUserActionsErroredUserItemProps): JSX.Element {\n return (\n <li className='d-flex align-items-center p-2'>\n <UserItemAvatar user={props.user} imageCdnUrl={props.imageCdnUrl} />\n\n <BasicUserDetails user={props.user} currentUser={props.currentUser} />\n\n <RoleOrYearGroup userType={props.userType} user={props.user} />\n\n <p className='mb-0 mx-2 text-danger'>\n {props.errorMessage}\n </p>\n </li>\n );\n}","export enum UserManagerClient {\n Online = 'online',\n Primary = 'primary',\n Curator = 'curator'\n}","import React from 'react';\n\ntype WizardContext = {\n disableNext?: boolean;\n setDisableNext?: (val: boolean) => void;\n\n onClickConfirm?: () => void;\n setOnClickConfirm?: (cb: () => void) => void;\n\n showButtons?: boolean;\n setShowButtons?: (val: boolean) => void;\n\n showSpinner?: boolean;\n setShowSpinner?: (val: boolean) => void;\n};\n\nexport const WizardLayoutContext = React.createContext<WizardContext>({});\n\nexport const WizardLayoutContextProvider = (props: React.PropsWithChildren<any>) => {\n const [ disableNext, setDisableNext ] = React.useState(false);\n const [ onClickConfirm, setOnClickConfirm ] = React.useState(null);\n const [ showButtons, setShowButtons ] = React.useState(true);\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n return (\n <WizardLayoutContext.Provider value={{\n disableNext,\n setDisableNext,\n onClickConfirm,\n setOnClickConfirm,\n showButtons,\n setShowButtons,\n showSpinner,\n setShowSpinner\n }}>\n {props.children}\n </WizardLayoutContext.Provider>\n );\n};","export enum BatchDataType {\n Unknown = 0,\n Staff = 1,\n Learner = 2,\n MasterVideo = 3,\n Rostering = 8,\n MarketingProfile = 16\n}","export enum BatchJobName {\n YearGroupRollover = 'year-group-rollover',\n ChangeYearGroup = 'change-year-group',\n DeleteUser = 'delete-user',\n RemoveUser = 'remove-user',\n DeactivateUser = 'deactivate-user',\n ActivateUser = 'activate-user',\n AddToClassroom = 'add-to-classroom',\n ResetPassword = 'reset-password',\n SendResetPasswordEmail = 'send-reset-password-email',\n SendAccountActivationEmail = 'send-account-activation-email',\n CreateUser = 'create-user',\n\n AddToAudience = 'add-to-audience',\n AddToBackboneClassification = 'add-to-backbone-classification',\n AddToBackboneAudience = 'add-to-backbone-audience',\n AddToClassification = 'add-to-classification',\n AddToSeries = 'add-to-series',\n AddToDirector = 'add-to-director',\n AddToDistributor = 'add-to-distributor',\n AddToProductionCompany = 'add-to-production-company',\n AddToProducer = 'add-to-producer',\n SetProductionYear = 'set-production-year',\n AddToLibrary = 'add-to-library',\n AddToCurationTag = 'add-to-curation-tag',\n AddToSkillTag = 'add-to-skill-tag',\n AddToPedagogyTag = 'add-to-pedagogy-tag',\n AddToNormalTag = 'add-to-normal-tag',\n AddToHiddenTag = 'add-to-hidden-tag',\n AddResourceAndLink = 'add-resource-and-link',\n\n Rostering = 'rostering',\n MarketingProfile = 'marketing-profile'\n}","export enum BatchJobResultErrorCode {\n NoAction = 1,\n // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\n Succeed = 1,\n Unknown = 10,\n\n CustomerNotFound = 100,\n UserNotFound = 101,\n\n EmailNotVerified = 131,\n UserDisabled = 133,\n\n InvalidYearGroup = 200,\n MissingYearGroup = 201,\n NewYearGroupNotSet = 202,\n\n ObjectNotFoundInBackboneClassification = 300,\n ObjectNotFoundInBackboneAudience = 301\n}","export enum BatchJobType {\n RolloverYearGroup = 1,\n DeactivateUser = 2,\n ChangeYearGroup = 3,\n DeleteUser = 4,\n CreateUser = 5,\n ResetPassword = 6,\n AddUsersClassroom = 7,\n SendAccountReminderEmail = 8,\n ActivateUser = 9,\n AddToBackboneClassification = 10,\n AddToClassification = 11,\n AddToBackboneAudience = 12,\n AddToAudience = 13,\n AddVideosSeries = 14,\n AddVideosDistributor = 15,\n AddVideosProductionCompany = 16,\n AddVideosProducer = 17,\n AddVideosDirector = 18,\n AddVideosLibrary = 19,\n AddVideosResourceAndLinks = 21,\n AddVideosTag = 22,\n SendAccountActivationEmail = 23,\n RemoveUser = 24,\n Rostering = 25,\n MarketingProfile = 26,\n SetProductionYear = 28\n}","import React from 'react';\n\nexport function KeySvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path d='M12.335 4C14.7258 4.00011 16.6631 5.90392 16.6631 8.26074C16.6629 9.95954 15.6586 11.3904 13.877 12.2334L15.2314 13.5742C15.4776 13.8297 15.4899 14.2192 15.2373 14.4619L13.7734 15.8994L14.7773 16.8828C15.0235 17.1318 15.0366 17.5149 14.7842 17.7705L12.7822 19.7441C12.523 19.9933 12.153 19.9618 11.8809 19.7383L10.8252 18.8252C10.6373 18.6591 10.5723 18.4158 10.5723 18.2051V12.1758C8.99791 11.4924 8.00018 9.97233 8 8.26074C8 5.89108 9.9246 4 12.335 4ZM12.335 5.02832C10.5078 5.02832 9.03711 6.47232 9.03711 8.26074C9.03732 9.79975 10.0929 11.096 11.6152 11.4346V18.0264L12.335 18.7285L13.7471 17.3174L12.8271 16.4229V15.3633L14.2012 14.0283L12.9307 12.7695V11.4795C14.5568 11.0963 15.6199 9.78709 15.6201 8.26074C15.6201 6.47238 14.1556 5.02843 12.335 5.02832ZM12.3496 5.875C13.125 5.875 13.7559 6.50584 13.7559 7.28125C13.7559 8.05666 13.125 8.6875 12.3496 8.6875C11.5744 8.68728 10.9434 8.05652 10.9434 7.28125C10.9434 6.50598 11.5744 5.87522 12.3496 5.875ZM12.3496 6.8125C12.0913 6.81272 11.8809 7.02291 11.8809 7.28125C11.8809 7.53959 12.0913 7.74978 12.3496 7.75C12.6081 7.75 12.8184 7.53972 12.8184 7.28125C12.8184 7.02278 12.6081 6.8125 12.3496 6.8125Z\" fill=\"#313543' />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { BulkUserActionOptions, BulkUserActionStepId, BulkUserSubAction } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BulkUserActivationActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/activation-action-info/BulkUserActivationActionInfo';\nimport { BulkUserActivationEmailActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/activation-email-info/BulkUserActivationEmailActionInfo';\nimport { BulkAddToClassroomActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/add-to-classroom-action-info/BulkAddToClassroomActionInfo';\nimport { BulkChangeYearGroupActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/change-year-group-action-info/ChangeYearGroupActionInfo';\nimport { BulkUserDeleteActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/delete-action-info/BulkUserDeleteActionInfo';\nimport { BulkUserRemoveActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/remove-action-info/BulkUserRemoveActionInfo';\nimport { BulkUserResetEmailActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/reset-email-info/BulkUserResetEmailActionInfo';\nimport { BulkResetPasswordActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/reset-password-action-info/BulkResetPasswordActionInfo';\nimport { BulkUserYearGroupRolloverActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/year-group-rollover-action-info/BulkUserYearGroupRolloverActionInfo';\nimport { BulkUserActionsErroredUserItem } from 'libs/shared/apps/user-manager/components/user-list-items/bulk-user-actions-errored-user-item/BulkUserActionsErroredUserItem';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { AllowYearGroupRollover } from 'libs/shared/apps/user-manager/hooks/useAllowAnnualYearGroupRollover';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { BulkUserActionsAddToClassroomViewModel, BulkUserActionsResetPasswordViewModel, BulkUserActionsViewModel, BulkUserActionsYearGroupRolloverViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { WizardOptionHash } from 'libs/shared/components/wizard/options/WizardOptions';\nimport { ObjectWithErrorCode } from 'libs/shared/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError';\nimport { WizardStep } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { BatchDataType } from 'libs/shared/enums/BatchDataType';\nimport { BatchJobName } from 'libs/shared/enums/BatchJobName';\nimport { BatchJobResultErrorCode } from 'libs/shared/enums/BatchJobResultErrorCode';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { ClassroomsSvg } from 'libs/shared/images/svg/objects/ClassroomsSvg';\nimport { EmailSvg } from 'libs/shared/images/svg/objects/EmailSvg';\nimport { FolderSvg } from 'libs/shared/images/svg/objects/FolderSvg';\nimport { GraduationCapSvg } from 'libs/shared/images/svg/objects/GraduationCapSvg';\nimport { GroupSvg } from 'libs/shared/images/svg/objects/GroupSvg';\nimport { KeySvg } from 'libs/shared/images/svg/objects/KeySvg';\nimport { AddToClassroomJobMetadata, BaseBatchJobMetadata, BatchJobMetadata, ChangeYearGroupJobMetadata, CreateBatchJobRequest, CurrentUser, ResetPasswordJobMetadata, User, WizardActionVerb, YearGroup, YearGroupRolloverJobMetadata } from 'libs/shared/interfaces';\nimport { CountsByStatus } from 'libs/shared/interfaces/models/SearchAggregation';\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.utils');\n\nexport const SUPPORTED_BATCH_JOB_TYPES = [\n BatchJobType.ActivateUser,\n BatchJobType.AddUsersClassroom,\n BatchJobType.ChangeYearGroup,\n BatchJobType.DeactivateUser,\n BatchJobType.DeleteUser,\n BatchJobType.ResetPassword,\n BatchJobType.RolloverYearGroup,\n BatchJobType.SendAccountReminderEmail,\n BatchJobType.CreateUser,\n BatchJobType.SendAccountActivationEmail,\n BatchJobType.RemoveUser\n];\n\nexport const BulkUserActionsHelper = {\n getSteps(\n userType: UserGroup,\n userCount: number,\n appLinks?: UserManagerAppLinks,\n action?: BulkUserActionOptions\n ): WizardStep<BulkUserActionStepId>[] {\n const actions: WizardStep<BulkUserActionStepId>[] = [\n {\n id: 'select-action',\n text: getPhrase('choose'),\n appLink: appLinks?.bulkActionsSelectAction\n },\n {\n id: 'action-details',\n text: getPhrase('details'),\n appLink: appLinks?.bulkActionsActionDetails?.[action],\n disabled: !appLinks?.bulkActionsActionDetails?.[action]\n },\n {\n id: 'confirmation',\n text: getPhrase('confirmation')\n },\n {\n id: 'status',\n text: getPhrase('status')\n }\n ];\n\n const reviewAccountsAction: WizardStep<BulkUserActionStepId> = {\n id: 'review-accounts',\n text: getPhrase(userType === UserGroup.Learner ? 'reviewStudents' : 'reviewStaff'),\n subText: getPhrase(userType === UserGroup.Learner ? 'reviewSubTextStudents' : 'reviewSubTextStaff', { smartCount: userCount }),\n appLink: appLinks?.bulkActionsReviewAccounts\n };\n\n if (typeof (userCount) !== 'number')\n delete reviewAccountsAction.subText;\n\n actions.unshift(reviewAccountsAction);\n\n return actions;\n },\n\n getActionOptions({\n userType,\n allowYearGroupRollover,\n countsByStatus,\n client,\n products,\n yearGroups,\n hasClassroomsFeature\n }: {\n userType: UserGroup,\n allowYearGroupRollover: AllowYearGroupRollover,\n countsByStatus: CountsByStatus,\n client: UserManagerClient,\n products?: ProductId[],\n yearGroups?: YearGroup[],\n hasClassroomsFeature: boolean\n}): WizardOptionHash<BulkUserActionOptions>[] {\n const actions: WizardOptionHash<BulkUserActionOptions>[] = [];\n\n actions.push({\n order: 40,\n id: 'activation',\n icon: FolderSvg,\n name: getPhrase('deactivateReactivate'),\n infoComponent: () => <BulkUserActivationActionInfo userType={userType} />\n });\n\n const disableDeleteAction = !countsByStatus?.Disabled && !countsByStatus?.Inactive;\n\n const showDelete = client !== UserManagerClient.Primary || products?.includes(ProductId.Online);\n if (showDelete) {\n actions.push({\n order: 50,\n id: 'delete',\n icon: DeleteSvg,\n name: getPhrase('delete'),\n infoComponent: () => <BulkUserDeleteActionInfo userType={userType} />,\n disabled: disableDeleteAction,\n tooltip: disableDeleteAction ? getPhrase('deleteDisabledTooltip') : ''\n });\n }\n const showRemove = client !== UserManagerClient.Online && !products?.includes(ProductId.Online);\n\n if (showRemove) {\n actions.push({\n order: 50,\n id: 'removeFromSchool',\n icon: DeleteSvg,\n name: getPhrase('removeFromSchool'),\n infoComponent: () => <BulkUserRemoveActionInfo userType={userType} />,\n disabled: disableDeleteAction,\n tooltip: disableDeleteAction ? getPhrase('removeFromSchoolDisabledTooltip') : ''\n });\n }\n\n if (userType === UserGroup.Learner) {\n if (yearGroups?.length > 1) {\n actions.push({\n order: 20,\n id: 'changeYearGroup',\n icon: GroupSvg,\n name: getPhrase('changeYearGroup'),\n infoComponent: () => <BulkChangeYearGroupActionInfo />\n });\n }\n \n actions.push({\n order: 30,\n id: 'resetPassword',\n icon: KeySvg,\n name: getPhrase('resetPassword'),\n // TODO: Replace all of these info components with a shared component that accepts a heading and message prop\n infoComponent: () => <BulkResetPasswordActionInfo />\n });\n\n actions.push({\n order: 35,\n id: 'activationEmail',\n icon: EmailSvg,\n name: getPhrase('activationEmail'),\n infoComponent: () => <BulkUserActivationEmailActionInfo />\n });\n\n if (hasClassroomsFeature) {\n actions.push({\n order: 60,\n id: 'addToClassroom',\n icon: ClassroomsSvg,\n name: getPhrase('addToClassroom'),\n infoComponent: () => <BulkAddToClassroomActionInfo />\n });\n }\n \n if (yearGroups?.length > 1) {\n actions.push({\n order: 70,\n id: 'yearGroupRollover',\n icon: GraduationCapSvg,\n name: getPhrase('yearGroupRollover'),\n infoComponent: () => <BulkUserYearGroupRolloverActionInfo />,\n disabled: !allowYearGroupRollover?.canRollover,\n tooltip: getYearGroupRolloverDisabledTooltip(allowYearGroupRollover)\n });\n }\n }\n\n if (userType === UserGroup.Staff) {\n actions.push({\n order: 60,\n id: 'resetEmail',\n icon: EmailSvg,\n name: getPhrase('resetEmail'),\n infoComponent: () => <BulkUserResetEmailActionInfo />\n });\n }\n\n return actions.sort((a, b) => a.order - b.order);\n },\n\n mapSubActionToDisplayName(subAction: BulkUserSubAction): string {\n switch (subAction) {\n case 'yearGroupRollover':\n return getPhrase('yearGroupRolloverDisplayName');\n case 'changeYearGroup':\n return getPhrase('changeYearGroupDisplayName');\n case 'deactivate':\n return getPhrase('deactivateDisplayName');\n case 'reactivate':\n return getPhrase('reactivateDisplayName');\n case 'delete':\n return getPhrase('deleteDisplayName');\n case 'addToClassroom':\n return getPhrase('addToClassroomDisplayName');\n case 'resetPassword':\n return getPhrase('resetPasswordDisplayName');\n case 'resetEmail':\n return getPhrase('resetEmailDisplayName');\n case 'activationEmail':\n return getPhrase('activationEmailDisplayName');\n case 'removeFromSchool':\n return getPhrase('removeFromSchoolDisplayName');\n default:\n return '';\n }\n },\n\n getWizardAppLinks(appLinks: UserManagerAppLinks): Core.AppLink[] {\n const actionDetailsActions = Object.keys(appLinks.bulkActionsActionDetails)\n .map((key: keyof typeof appLinks.bulkActionsActionDetails) => {\n return appLinks.bulkActionsActionDetails[key];\n });\n\n const confirmationAppLinks = Object.keys(appLinks.bulkActionsConfirmation)\n .map((key: keyof typeof appLinks.bulkActionsConfirmation) => {\n return appLinks.bulkActionsConfirmation[key];\n });\n\n const statusAppLinks = Object.keys(appLinks.bulkActionsStatus)\n .map((key: keyof typeof appLinks.bulkActionsStatus) => {\n return appLinks.bulkActionsStatus[key];\n });\n\n return [\n appLinks.bulkActionsReviewAccounts,\n appLinks.bulkActionsSelectAction,\n ...actionDetailsActions,\n ...confirmationAppLinks,\n ...statusAppLinks\n ];\n },\n\n getErrorListItem(\n object: ObjectWithErrorCode<User>,\n imageCdnUrl: string,\n currentUser?: CurrentUser\n ): JSX.Element {\n const errorMessage = this.getUserErrorMessage(object.errorCode);\n return (\n <BulkUserActionsErroredUserItem\n user={object}\n userType={object.userType}\n imageCdnUrl={imageCdnUrl}\n errorMessage={errorMessage}\n currentUser={currentUser}\n />\n );\n },\n\n getUserErrorMessage(errorCode: BatchJobResultErrorCode): string {\n switch (errorCode) {\n case BatchJobResultErrorCode.NoAction:\n case BatchJobResultErrorCode.Succeed:\n return '';\n\n case BatchJobResultErrorCode.InvalidYearGroup:\n return getPhrase('invalidYearGroupError');\n case BatchJobResultErrorCode.MissingYearGroup:\n return getPhrase('missingYearGroupError');\n case BatchJobResultErrorCode.NewYearGroupNotSet:\n return getPhrase('yearGroupUpdateError');\n\n case BatchJobResultErrorCode.EmailNotVerified:\n return getPhrase('emailNotVerifiedError');\n\n case BatchJobResultErrorCode.UserDisabled:\n return getPhrase('userDeactivatedError');\n\n /**\n * I feel like by the this point, none of these errors should be getting thrown.\n * If they do get thrown, we use a generic error message and append the error code\n * in case it does happen and a screenshot is sent to support (hoping this helps).\n */\n case BatchJobResultErrorCode.Unknown:\n case BatchJobResultErrorCode.CustomerNotFound:\n case BatchJobResultErrorCode.UserNotFound:\n default:\n return getPhrase('genericUnexpectedError', { errorCode });\n }\n },\n\n getCreateJobRequestData(\n viewModel: BulkUserActionsViewModel,\n customerId: string,\n userType: UserGroup,\n currentUser?: CurrentUser\n ): CreateBatchJobRequest {\n switch (viewModel.subAction) {\n case 'yearGroupRollover': {\n return {\n name: BatchJobName.YearGroupRollover,\n type: BatchJobType.RolloverYearGroup,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getYearGroupRolloverJobMetadata(\n viewModel as BulkUserActionsYearGroupRolloverViewModel,\n customerId\n )\n };\n }\n\n case 'changeYearGroup': {\n return {\n name: BatchJobName.ChangeYearGroup,\n type: BatchJobType.ChangeYearGroup,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getChangeYearGroupJobMetadata(\n viewModel as BulkUserActionsYearGroupRolloverViewModel\n )\n };\n }\n\n case 'delete': {\n return {\n name: BatchJobName.DeleteUser,\n type: BatchJobType.DeleteUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'removeFromSchool': {\n return {\n name: BatchJobName.RemoveUser,\n type: BatchJobType.RemoveUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'deactivate': {\n return {\n name: BatchJobName.DeactivateUser,\n type: BatchJobType.DeactivateUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getDeactivateUsersJobMetadata(viewModel, currentUser)\n };\n }\n\n case 'reactivate': {\n return {\n name: BatchJobName.ActivateUser,\n type: BatchJobType.ActivateUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'addToClassroom': {\n return {\n name: BatchJobName.AddToClassroom,\n type: BatchJobType.AddUsersClassroom,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getAddToClassroomJobMetadata(\n viewModel as BulkUserActionsAddToClassroomViewModel\n )\n };\n }\n\n case 'resetPassword': {\n return {\n name: BatchJobName.ResetPassword,\n type: BatchJobType.ResetPassword,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getResetPasswordJobMetadata(viewModel as BulkUserActionsResetPasswordViewModel)\n };\n }\n\n case 'resetEmail': {\n return {\n name: BatchJobName.SendResetPasswordEmail,\n type: BatchJobType.SendAccountReminderEmail,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'activationEmail': {\n return {\n name: BatchJobName.SendAccountActivationEmail,\n type: BatchJobType.SendAccountActivationEmail,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n default:\n Core.ErrorHelper.throw(\n new DevError(`No handler for type ${viewModel.subAction} in BulkUserActionsHelper.getCreateJobRequestData`)\n );\n }\n\n return null;\n },\n\n useSetWizardConfirmationCallback(onClickConfirm: () => void): void {\n const { setOnClickConfirm } = React.useContext(WizardLayoutContext);\n const [viewModel] = useViewModel<BulkUserActionsViewModel>(SharedViewModelKeys.BULK_USER_ACTIONS);\n\n React.useEffect(() => {\n setOnClickConfirm(() => onClickConfirm);\n }, [viewModel?.subAction]);\n },\n\n useCreateJobErrorAlert(): () => void {\n const alerts = useAlerts();\n return () => {\n alerts.error(getPhrase('failedToCreateJob'));\n };\n },\n\n mapDataTypeToUserType(dataType: BatchDataType): UserGroup {\n switch (dataType) {\n case BatchDataType.Staff:\n return UserGroup.Staff;\n case BatchDataType.Learner:\n return UserGroup.Learner;\n default:\n return UserGroup.Unknown;\n }\n },\n\n mapUserTypeToDataType(userType: UserGroup): BatchDataType {\n switch (userType) {\n case UserGroup.Learner:\n return BatchDataType.Learner;\n case UserGroup.Staff:\n return BatchDataType.Staff;\n case UserGroup.Unknown:\n return BatchDataType.Unknown;\n }\n },\n\n getActionTypeFilterOptions(): FilterOption<BatchJobType>[] {\n return [{\n id: BatchJobType.ActivateUser,\n name: getPhrase('activate')\n }, {\n id: BatchJobType.DeactivateUser,\n name: getPhrase('deactivate')\n }, {\n id: BatchJobType.DeleteUser,\n name: getPhrase('deleteUser')\n }, {\n id: BatchJobType.RolloverYearGroup,\n name: getPhrase('yearGroupRollover')\n }, {\n id: BatchJobType.ChangeYearGroup,\n name: getPhrase('changeYearGroup')\n }, {\n id: BatchJobType.CreateUser,\n name: getPhrase('createUser')\n }, {\n id: BatchJobType.ResetPassword,\n name: getPhrase('resetPassword')\n }, {\n id: BatchJobType.SendAccountReminderEmail,\n name: getPhrase('resetEmail')\n }, {\n id: BatchJobType.AddUsersClassroom,\n name: getPhrase('addToClassroom')\n }, {\n id: BatchJobType.SendAccountActivationEmail,\n name: getPhrase('activationEmail')\n }, {\n id: BatchJobType.RemoveUser,\n name: getPhrase('removeFromSchool')\n }];\n },\n\n getUserTypeFilterOptions(): FilterOption<UserGroup>[] {\n return [{\n id: UserGroup.Staff,\n name: getPhrase('staff')\n }, {\n id: UserGroup.Learner,\n name: getPhrase('students')\n }];\n },\n\n mapSubActionToVerb(subAction: BulkUserSubAction): WizardActionVerb {\n if (subAction === 'delete')\n return 'Delete';\n\n if (subAction === 'removeFromSchool')\n return 'Remove';\n\n if (subAction === 'resetEmail' || subAction === 'activationEmail')\n return 'Email';\n\n if (subAction === 'addToClassroom')\n return 'Add';\n\n return 'Update';\n },\n\n mapJobTypeToName(type: BatchJobType): string {\n switch (type) {\n case BatchJobType.ActivateUser:\n return getPhrase('activate');\n case BatchJobType.AddUsersClassroom:\n return getPhrase('addToClassroom');\n case BatchJobType.ChangeYearGroup:\n return getPhrase('changeYearGroup');\n case BatchJobType.DeactivateUser:\n return getPhrase('deactivate');\n case BatchJobType.DeleteUser:\n return getPhrase('delete');\n case BatchJobType.ResetPassword:\n return getPhrase('resetPassword');\n case BatchJobType.RolloverYearGroup:\n return getPhrase('yearGroupRollover');\n case BatchJobType.SendAccountReminderEmail:\n return getPhrase('sendAccountReminderEmail');\n case BatchJobType.CreateUser:\n return getPhrase('bulkUpload');\n case BatchJobType.SendAccountActivationEmail:\n return getPhrase('sendAccountActivationEmail');\n case BatchJobType.RemoveUser:\n return getPhrase('removeUser');\n default:\n return getPhrase('unknown');\n }\n },\n\n hasFilterOrQuery(params: UserManagerQueryParams): boolean {\n return !!(params.query ||\n params.isAdmin ||\n params.status ||\n params.yearGroup);\n }\n};\n\nfunction setupBaseJobMetadata(\n viewModel: BulkUserActionsViewModel\n): BatchJobMetadata {\n return {\n batchObjectIds: [...viewModel.userIdMap.keys()],\n fullBatchObjects: undefined\n };\n}\n\nfunction getYearGroupRolloverJobMetadata(\n viewModel: BulkUserActionsYearGroupRolloverViewModel,\n customerId: string\n): YearGroupRolloverJobMetadata {\n // Year level rollover can only ever be run with all students\n return {\n fullBatchObjects: {\n source: 'UserApi',\n ownerId: customerId,\n objectType: MasterType.User,\n query: `{userType:${UserGroup.Learner}}`\n },\n finalYearGroupId: viewModel.yearGroup.id\n };\n}\n\nfunction getChangeYearGroupJobMetadata(\n viewModel: BulkUserActionsYearGroupRolloverViewModel\n): ChangeYearGroupJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as ChangeYearGroupJobMetadata;\n\n metadata.newYearGroupId = viewModel.yearGroup.id;\n\n return metadata;\n}\n\nfunction getResetPasswordJobMetadata(\n viewModel: BulkUserActionsResetPasswordViewModel\n): ResetPasswordJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as ResetPasswordJobMetadata;\n\n metadata.newPassword = viewModel.password;\n metadata.changeOnNextLogin = viewModel.changeOnNextLogin;\n\n return metadata;\n}\n\nfunction getYearGroupRolloverDisabledTooltip(status: AllowYearGroupRollover): string {\n if (status.canRollover)\n return '';\n\n switch (status.reason) {\n case 'select-all-students':\n return getPhrase('selectAllStudents');\n case 'cooldown':\n return getPhrase('rolloverCooldown', {\n date: DateHelper.format(status.lastRolloverDate, 'DD/MM/YYYY')\n });\n }\n}\n\nfunction getAddToClassroomJobMetadata(\n viewModel: BulkUserActionsAddToClassroomViewModel\n): AddToClassroomJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as AddToClassroomJobMetadata;\n\n metadata.classroomIds = [viewModel.classroom.id];\n\n return metadata;\n}\n\nfunction getDeactivateUsersJobMetadata(\n viewModel: BulkUserActionsViewModel,\n currentUser: CurrentUser\n): BatchJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as BaseBatchJobMetadata;\n\n if (!currentUser?.id)\n return metadata;\n\n metadata.batchObjectIds = metadata.batchObjectIds?.filter(id => {\n return id.toString() !== currentUser.id.toString();\n }) ?? [];\n\n return metadata;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { DurationFilterOptions, FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nconst namespace = 'search.durationFilter';\n\nfunction mapOptionToDurationRange(option: FilterOption<DurationFilterOptions>): string {\n let phraseKey = '';\n\n switch (option.id) {\n case 'bite-sized':\n phraseKey = 'rangeBiteSized';\n break;\n\n case 'short':\n phraseKey = 'rangeShort';\n break;\n \n case 'medium':\n phraseKey = 'rangeMedium';\n break;\n\n case 'long':\n phraseKey = 'rangeLong';\n break;\n }\n \n return LanguageService.getPhrase(namespace, phraseKey);\n}\n\ninterface DurationOptionProps {\n onClick: (option: FilterOption<DurationFilterOptions>) => void;\n option: FilterOption<DurationFilterOptions>;\n active: boolean;\n disabled?: boolean;\n}\n\nfunction DurationOption(props: DurationOptionProps): JSX.Element {\n return (\n <li className='d-flex flex-fill flex-column align-items-center mb-2 mb-md-0 mx-1'>\n <button\n onClick={() => props.onClick(props.option)}\n className={`btn w-100 text-center btn-${props.active ? 'dark' : 'outline-dark'} mb-1`}\n disabled={props.disabled}\n >\n {props.option.name}\n </button>\n\n <span>{mapOptionToDurationRange(props.option)}</span>\n </li>\n );\n}\n\nexport function DurationFilter(props: FilterProps): JSX.Element {\n const currentSelection = ArrayHelper.first(props.draftState.selection);\n\n function onClickDuration(duration: FilterOption<DurationFilterOptions>): void {\n // If the clicked option is already selected, deselect it\n if (currentSelection?.id === duration.id) {\n props.setDraftState({\n active: false,\n selection: []\n });\n \n return;\n }\n\n props.setDraftState({\n active: true,\n selection: [duration]\n });\n }\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <ul className='d-flex list-unstyled flex-column flex-md-row mx-n1 mb-2'>\n {props.filter.options.map(option => (\n <DurationOption\n key={option.id}\n option={option as FilterOption<DurationFilterOptions>}\n onClick={onClickDuration}\n active={currentSelection?.id === option.id}\n disabled={props.filter.disabled || option.disabled}\n />\n ))}\n </ul>\n </>\n );\n}","import React from 'react';\n\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './movies-and-tv-filter.module.scss';\n\nconst namespace = 'search.moviesAndTvFilter';\n\ninterface MoviesAndTvFilterProps {\n filter: SearchFilter;\n iconUrl: string;\n extraIconUrl: string\n}\n\nexport function MoviesAndTvFilter(props: MoviesAndTvFilterProps): JSX.Element {\n const filter = props.filter;\n const { state } = React.useContext(FilterContext);\n\n const currentFilterState = state[filter.id];\n const isActive = currentFilterState?.active;\n\n // local state to correct attach & detach animation class\n const [ isFloating, setIsFloating ] = React.useState(false);\n const activeRef = React.useRef(isFloating);\n\n React.useEffect(() => {\n if (isActive !== activeRef.current) {\n activeRef.current = isActive;\n }\n if (isFloating !== activeRef.current)\n setIsFloating(activeRef.current);\n }, [isActive]);\n\n function applyFilter(newState: FilterState): void {\n FilterHelper.applyFilter(\n [filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n return (\n <DivButton\n onClick={() => {\n setIsFloating(!isActive);\n applyFilter({ active: !isActive });\n }}\n className={`mx-1 btn ${isActive ? 'btn-dark' : 'btn-outline-dark'} position-relative fw-semibold d-flex align-items-center flex-shrink-0`}\n >\n \n <img src={props.iconUrl} className={`${styles.icon} position-absolute ${isActive ? styles.activeIcon : ''}`}/>\n \n <div className={styles.text}>\n <Text namespace={namespace} phrase={'title'}/>\n </div>\n\n <img src={props.extraIconUrl} className={`position-absolute ${styles.floatingIcon} ${isFloating ? styles.active : styles.default}`}/>\n </DivButton>\n );\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nimport { CheckboxFilterList } from '../checkbox-filter/CheckboxFilterList';\n\nexport function GroupedCheckboxFilter(props: FilterProps): JSX.Element {\n const optionGroups: Record<string, FilterOption[]> = {};\n\n for (const option of props.filter.options) {\n if (!option.group)\n continue;\n\n if (!optionGroups[option.group])\n optionGroups[option.group] = [];\n\n optionGroups[option.group].push(option);\n }\n\n return (\n <Form className='mb-3'>\n {Object.entries(optionGroups).map(([ groupName, options ]) => {\n return (\n <ul className='list-unstyled' key={groupName}>\n <FilterDropdownTitle title={groupName} />\n <CheckboxFilterList\n filter={props.filter}\n options={options}\n draftState={props.draftState}\n setDraftState={props.setDraftState}\n displayOptionsIn2Columns={false}\n />\n </ul>\n );\n })}\n </Form>\n );\n}\n","import { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\n\nexport const ClassificationFilterHelper = {\n deriveInitialClassificationFilterStateFromQueryParams(filter: SearchFilter, selections: any): FilterOption[] {\n return filter?.options?.filter(option => {\n const areAllIdsInOptionFoundInSelections = option.id.split(':').every(id => {\n const isIdFoundInSelections = selections.find(\n (selectedId: number | string) => selectedId.toString() === id.toString()\n );\n\n return isIdFoundInSelections;\n });\n\n return areAllIdsInOptionFoundInSelections;\n }) ?? [];\n }\n};\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DurationFilterOptions, FilterOption } from 'libs/shared/apps/search/interfaces';\n\nconst namespace = 'sharedSearch.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const DurationFilterHelper = {\n getOptions(): FilterOption<DurationFilterOptions>[] {\n return [\n {\n id: 'bite-sized',\n name: getPhrase('durationBiteSized')\n },\n {\n id: 'short',\n name: getPhrase('durationShort')\n },\n {\n id: 'medium',\n name: getPhrase('durationMedium')\n },\n {\n id: 'long',\n name: getPhrase('durationLong')\n }\n ];\n },\n\n getBackendParamValue(value: DurationFilterOptions): string {\n switch (value) {\n case 'bite-sized':\n return '...179999'; // 3 minutes in ms\n case 'short':\n return '180000...299999'; // 3 - 5 minutes in ms\n \n case 'medium':\n return '300000...899999'; // 5 - 15 minutes in ms\n \n case 'long':\n return '900000...'; // 15 minutes in ms\n }\n }\n};","import { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\n\nimport { getSelectedOptions } from './FilterHelper';\n\nexport const PresentationFilterHelper = {\n deriveInitialPresentationFilterStateFromQueryParams:\n (filterOptions: FilterOption[], selections: any, queryParams: HashObject): FilterOption[] => {\n return getSelectedOptions(filterOptions, selections)\n .map(option => {\n const audienceSelection = queryParams['audience'];\n\n if (!audienceSelection?.length)\n return option;\n\n const secondLayerSelection = getSelectedOptions(option.secondLayerOptions, audienceSelection);\n\n return { ...option, secondLayerSelection };\n }).filter(r => {\n return !!r.secondLayerSelection?.length;\n });\n }\n};\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FilterOption, ProductionYearFilterOptions } from 'libs/shared/apps/search/interfaces';\n\nconst namespace = 'sharedSearch.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const ProductionYearFilterHelper = {\n getOptions(): FilterOption<ProductionYearFilterOptions>[] {\n return [\n {\n id: 'any-year',\n name: getPhrase('anyYear'),\n default: true\n },\n {\n id: 'this-year',\n name: getPhrase('thisYear')\n },\n {\n id: 'last-3-years',\n name: getPhrase('last3Years')\n },\n {\n id: 'last-5-years',\n name: getPhrase('last5Years')\n }\n ];\n },\n\n getBackendParamValue(value: ProductionYearFilterOptions): string {\n const currentYear = new Date().getFullYear();\n \n switch (value) {\n case 'any-year':\n return '';\n \n case 'this-year':\n return `${currentYear}...`;\n \n case 'last-3-years':\n return `${currentYear - 3}...`;\n \n case 'last-5-years':\n return `${currentYear - 5}...`;\n }\n }\n};","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { Rating, User, YearGroup } from 'libs/shared/interfaces';\n\nexport const RatingFilterHelper = {\n deriveInitialRatingFilterStateFromQueryParams(range: string | [], filter: SearchFilter): FilterOption[] {\n /**\n * When the rating filter is cleared, the app router temporarily sets the rating query param\n * value to an empty array instead of a string. In this case, we just return no selections\n */\n if (Array.isArray(range))\n return range;\n\n const ratingOptions = filter.options as Rating[];\n\n const ratingRange = getRatingsFromFrontendQuery(range, ratingOptions);\n\n if (!ratingRange.length)\n return [];\n\n const highestRating = ArrayHelper.last(ratingRange);\n\n return ratingOptions.filter(option => {\n return option.value > 0 && option.value <= highestRating.value;\n }) as FilterOption[];\n },\n\n getFrontendParamValue(selections: Rating[]): string {\n if (!selections?.length)\n return '';\n \n const first = ArrayHelper.first(selections);\n const last = ArrayHelper.last(selections);\n\n if (selections.length === 1)\n return first.code;\n \n return `${first.code}-to-${last.code}`;\n },\n \n getBackendParamValue(range: string, ratings: Rating[]): string {\n const selectedRatings = getRatingsFromFrontendQuery(range, ratings);\n \n if (!selectedRatings.length)\n return undefined;\n \n if (selectedRatings.length === 1) {\n const upperValue = ArrayHelper.first(selectedRatings);\n return `0...${upperValue.value}`;\n }\n \n const upperValue = ArrayHelper.last(selectedRatings);\n return `0...${upperValue.value}`;\n },\n\n getStudentMaxRating(yearGroups: YearGroup[], user: User): Rating {\n const studentYearGroup = ArrayHelper.findWhere(\n yearGroups,\n { value: user.masterYearGroup?.value }\n );\n\n return studentYearGroup?.rating;\n }\n};\n\nfunction getRatingsFromFrontendQuery(range: string, ratings: Rating[]): Rating[] {\n const codes = range.split('-to-');\n const foundRatings = codes.map(code => ratings.find(r => r.code === code));\n\n /**\n * If we can't map all our values, don't use any values.\n */\n if (!foundRatings.every(r => !!r))\n return [];\n\n return foundRatings;\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, FilterDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { CheckboxFilter, DropdownFilter, NestedCheckboxFilter, RadioFilter, SwitchFilter } from 'libs/shared/apps/search/components/filter-types';\nimport { RatingFilter } from 'libs/shared/apps/search/components/filter-types/rating-filter/RatingFilter';\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { AllSearchIndicesInSearch, AllSearchIndicesInUserManager, AllSearchIndicesVideoStyle, FilterIds, FilterOption, FilterProps, FilterType, FilterWhitelist, MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { AnalyticsFilterHash } from 'libs/shared/apps/search/interfaces/AnalyticsFilterHash';\nimport { DraftState, FilterPayloadType, FilterState, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { SourceFilterHelper } from 'libs/shared/apps/search/utils/SourceFilterHelper';\nimport { TopicsConstants } from 'libs/shared/constants/TopicsConstants';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { CurationTag } from 'libs/shared/enums/CurationTag';\nimport { CustomerStatus, CustomerStatusString } from 'libs/shared/enums/CustomerStatus';\nimport { CustomerType, CustomerTypeString } from 'libs/shared/enums/CustomerType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, Customer, Library, MasterNestedObject, PresentationWithAudiences, Rating, SpecialEventType, YearGroup } from 'libs/shared/interfaces';\n\nimport { SpecialEventTypeLabelMap } from '../../calendar/constants/SpecialEventTypeLabelMap';\nimport { BulkUserActionsHelper } from '../../user-manager/utils/BulkUserActionsHelper';\nimport { DurationFilter } from '../components/filter-types/custom/duration-filter/DurationFilter';\nimport { MoviesAndTvFilter } from '../components/filter-types/custom/movies-and-tv-filter/MoviesAndTvFilter';\nimport { GroupedCheckboxFilter } from '../components/filter-types/grouped-checkbox-filter/GroupedCheckboxFilter';\n\nimport { ClassificationFilterHelper } from './ClassificationFilterHelper';\nimport { DurationFilterHelper } from './DurationFilterHelper';\nimport { PresentationFilterHelper } from './PresentationFilterHelper';\nimport { ProductionYearFilterHelper } from './ProductionYearFilterHelper';\nimport { RatingFilterHelper } from './RatingFilterHelper';\nimport { SEARCH_CURRICULUM_CODE_PARAM } from './SharedSearchHelper';\n\nconst getPhrase = LanguageService.encloseNamespace('sharedSearch.utils');\n\ntype MixinDisableFieldsFn = {\n mainFilters: SearchFilter[];\n moreFilters?: MoreFilters;\n};\n\nconst TwoColumnFilters: Record<string, boolean> = {\n classification: true,\n categoryId: true,\n channel: true\n};\n\nconst ValidIndices: Record<string, boolean> = {\n series: true,\n video: true,\n playlist: true,\n classification: true,\n clip: true,\n interactive: true,\n company: true,\n category: true\n};\n\nexport const Filters: Filters = {\n SortBy: (options: FilterOption[], labelPrefix?: string) => ({\n id: 'sort',\n name: getPhrase('newest'),\n type: 'dropdown',\n options,\n compatibleIndices: [ ...AllSearchIndicesInSearch, ...AllSearchIndicesInUserManager ],\n labelPrefix\n }),\n Presentation: (options: PresentationWithAudiences[], _hasNewSearch: boolean) => ({\n id: 'presentation',\n secondaryId: 'audience',\n name: getPhrase('schoolLevels'),\n type: 'nested-checkbox',\n options: getMappedPresentationOptions(options),\n compatibleIndices: _hasNewSearch ?\n [ 'playlist', 'series', 'clip', 'interactive', 'video', 'company', 'category' ] :\n AllSearchIndicesInSearch\n }),\n Topics: (options: FilterOption[]) => ({\n compatibleIndices: [ 'playlist', 'series', 'clip', 'classification', 'interactive', 'video' ],\n options,\n type: 'checkbox',\n name: getPhrase('topicsFilter'),\n id: 'classification'\n }),\n Source: (options: FilterOption[]) => ({\n id: 'source',\n type: 'checkbox',\n name: getPhrase('sources'),\n options,\n compatibleIndices: [ 'video', 'clip', 'interactive', 'category' ]\n }),\n MoviesAndTv: (url: string, extraUrl: string) => ({\n id: 'moviesAndTv',\n name: getPhrase('moviesAndTv'),\n type: 'button',\n compatibleIndices: [ 'video', 'series', 'clip', 'interactive', 'classification', 'playlist', 'company' ],\n customComponent: props => (\n <MoviesAndTvFilter\n {...props}\n filter={props.filter as SearchFilter}\n iconUrl={url}\n extraIconUrl={extraUrl} />\n )\n }),\n YearGroup: (options: FilterOption[]) => ({\n id: 'yearGroup', // \"id\" should match the state keys in `FilterReducer`\n name: getPhrase('yearGroup'),\n type: 'checkbox',\n options,\n compatibleIndices: AllSearchIndicesInUserManager\n }),\n ObjectTypes: (inaccessibleIndices: SearchIndices[] = [], _hasNewSearch = false) => ({\n id: 'type',\n name: getPhrase('types'),\n type: _hasNewSearch ? 'grouped-checkbox' : 'checkbox',\n options: FilterHelper.getObjectTypeOptions(inaccessibleIndices, _hasNewSearch),\n disableOptions: FilterHelper.getIsObjectTypeOptionDisabled,\n compatibleIndices: AllSearchIndicesInSearch\n }),\n Rating: (options: FilterOption[], maxRating: Rating) => ({\n id: 'rating',\n name: getPhrase('rating'),\n type: 'rating',\n options: options && maxRating ? options.filter((rating: Rating) => rating.value <= maxRating.value) : options,\n compatibleIndices: [ 'video', 'series' ]\n }),\n Interactives: () => ({\n id: 'interactives',\n name: getPhrase('interactives'),\n type: 'switch',\n description: getPhrase('interactivesDescription'),\n compatibleIndices: [ 'video', 'clip' ]\n }),\n Clips: () => ({\n id: 'clips',\n name: getPhrase('clips'),\n type: 'switch',\n description: getPhrase('clipsDescription'),\n compatibleIndices: ['video']\n }),\n HasResources: () => ({\n id: 'hasResources',\n name: getPhrase('resources'),\n type: 'switch',\n description: getPhrase('resourcesDescription'),\n compatibleIndices: [ 'video', 'clip' ]\n }),\n HasSubtitles: () => ({\n id: 'hasSubtitles',\n name: getPhrase('subtitles'),\n type: 'switch',\n description: getPhrase('subtitlesDescription'),\n compatibleIndices: AllSearchIndicesVideoStyle\n }),\n ProductionYear: () => ({\n id: 'productionYear',\n name: getPhrase('productionYear'),\n type: 'radio',\n options: ProductionYearFilterHelper.getOptions(),\n compatibleIndices: [ ...AllSearchIndicesVideoStyle, 'series' ]\n }),\n IsHD: () => ({\n id: 'isHd',\n name: getPhrase('isHd'),\n type: 'switch',\n description: getPhrase('isHdDescription'),\n compatibleIndices: AllSearchIndicesVideoStyle\n }),\n IsClickViewContent: () => ({\n id: 'producedByClickView',\n name: getPhrase('producedByClickView'),\n type: 'switch',\n description: getPhrase('producedByClickViewDescription'),\n compatibleIndices: AllSearchIndicesInSearch\n }),\n Duration: () => ({\n id: 'duration',\n name: getPhrase('duration'),\n type: 'radio',\n customComponent: DurationFilter,\n options: DurationFilterHelper.getOptions(),\n compatibleIndices: AllSearchIndicesVideoStyle\n }),\n TagOrClassification: (options: string[]) => ({\n id: 'tagOrClassification',\n type: 'tag',\n options: options && options.map(option => ({\n id: option,\n name: option\n })),\n compatibleIndices: AllSearchIndicesInSearch\n }),\n Status: (options?: FilterOption[]) => ({\n id: 'status',\n name: getPhrase('status'),\n type: 'checkbox',\n compatibleIndices: [ ...AllSearchIndicesInUserManager, 'customer' ],\n options: options || FilterHelper.getStatusOptions()\n }),\n JobStatus: () => ({\n id: 'jobStatus',\n name: getPhrase('status'),\n type: 'checkbox',\n compatibleIndices: [],\n options: FilterHelper.getJobStatusOptions()\n }),\n IsAdmin: (customer: Customer, countryCode: string) => {\n const hasOrg = !!customer?.organisation;\n const isUs = countryCode === 'US';\n const description = !hasOrg ? getPhrase('isAdminDescription')\n : isUs ? getPhrase('isAdminDescriptionOrgUs') : getPhrase('isAdminDescriptionOrg');\n\n return {\n id: 'isAdmin',\n name: getPhrase('isAdmin'),\n type: 'switch',\n compatibleIndices: AllSearchIndicesInUserManager,\n description\n };\n },\n BulkActionType: () => ({\n id: 'bulkActionType',\n name: getPhrase('actionType'),\n type: 'checkbox',\n options: BulkUserActionsHelper.getActionTypeFilterOptions(),\n compatibleIndices: []\n }),\n UserType: () => ({\n id: 'userType',\n name: getPhrase('users'),\n type: 'checkbox',\n options: BulkUserActionsHelper.getUserTypeFilterOptions(),\n compatibleIndices: []\n }),\n TvFields: () => ({\n id: 'filter',\n name: getPhrase('tvFields'),\n type: 'radio',\n options: FilterHelper.getTvFieldsOptions(),\n compatibleIndices: []\n }),\n TvChannel: (channels: BaseObject[]) => ({\n id: 'channel',\n name: getPhrase('tvChannel'),\n type: 'checkbox',\n options: FilterHelper.getTvChannelOptions(channels),\n compatibleIndices: []\n }),\n TvDateBroadcast: () => ({\n id: 'dateBroadcast',\n name: getPhrase('tvDateBroadcast'),\n type: 'radio',\n options: FilterHelper.getTvDateBroadcastOptions(),\n compatibleIndices: []\n }),\n Categories: (categories: MasterNestedObject<Library>[]) => ({\n id: 'categoryId',\n name: getPhrase('categories'),\n type: 'checkbox',\n options: FilterHelper.getCategoriesOptions(categories),\n compatibleIndices: []\n }),\n CustomerStatus: () => ({\n id: 'customerStatus',\n name: getPhrase('customerStatus'),\n type: 'radio',\n options: FilterHelper.getCustomerStatusOptions(),\n compatibleIndices: []\n }),\n SpecialEventTypes: () => ({\n id: 'specialEventType',\n type: 'checkbox',\n name: 'Event Type',\n compatibleIndices: [],\n options: FilterHelper.getSpecialEventTypeOptions()\n }),\n CustomerType: () => ({\n id: 'customerType',\n name: getPhrase('customerType'),\n type: 'radio',\n options: FilterHelper.getCustomerTypeOptions(),\n compatibleIndices: []\n })\n};\n\ninterface Filters {\n SortBy: (options: FilterOption[], labelPrefix?: string) => SearchFilter;\n Presentation: (options: PresentationWithAudiences[], _hasNewSearch?: boolean) => SearchFilter;\n Topics: (options: FilterOption[]) => SearchFilter;\n YearGroup: (options: FilterOption[]) => SearchFilter;\n MoviesAndTv: (iconUrl: string, extraUrl: string) => SearchFilter;\n ObjectTypes: (inaccessibleIndices: SearchIndices[], _hasNewSearch?: boolean) => SearchFilter;\n Rating: (options: FilterOption[], maxRating: Rating) => SearchFilter;\n Interactives: () => SearchFilter;\n Clips: () => SearchFilter;\n HasResources: () => SearchFilter;\n HasSubtitles: () => SearchFilter;\n ProductionYear: () => SearchFilter;\n IsHD: () => SearchFilter;\n IsClickViewContent: () => SearchFilter;\n Duration: () => SearchFilter;\n TagOrClassification: (options: string[]) => SearchFilter;\n Status: (options?: FilterOption[]) => SearchFilter;\n JobStatus: () => SearchFilter;\n IsAdmin: (customer?: Customer, countryCode?: string) => SearchFilter;\n BulkActionType: () => SearchFilter<BatchJobType>;\n UserType: () => SearchFilter<UserGroup>;\n TvFields: () => SearchFilter;\n TvChannel: (channels: BaseObject[]) => SearchFilter;\n TvDateBroadcast: () => SearchFilter;\n Categories: (categories: MasterNestedObject<Library>[]) => SearchFilter;\n Source: (options: FilterOption[]) => SearchFilter;\n CustomerStatus: () => SearchFilter;\n SpecialEventTypes: () => SearchFilter;\n CustomerType: () => SearchFilter;\n}\n\nfunction getMappedPresentationOptions(options: PresentationWithAudiences[]): FilterOption[] {\n if (!options)\n return [];\n\n return options.map(opt => ({\n ...opt,\n id: opt.id.toString(),\n secondLayerOptions: opt.audiences.map(a => ({ ...a, id: a.id.toString() }))\n }));\n}\n\nexport const FilterHelper = {\n displayTwoLayers(filter: SearchFilter): boolean {\n if (filter.type !== 'nested-checkbox')\n return false;\n\n // With one presso we only show second layer options\n if (!this.hasManyFilterOptions(filter.options))\n return false;\n\n // Show first layer only\n if (filter.options.every(o => !this.hasManyFilterOptions(o?.secondLayerOptions)))\n return false;\n\n return true;\n },\n\n hasManyFilterOptions(options: FilterOption[]) {\n return options.length >= TopicsConstants.MULTI_PRESENTATION_THRESHOLD;\n },\n\n displayTwoColumns(filter: SearchFilter | MoreFilters): boolean {\n return (\n (TwoColumnFilters[filter.id]) &&\n filter.options?.length >= FilterConstants.MAX_CHECKBOXES_PER_COLUMN\n );\n },\n\n showPresentationFilter(presentationFilter: SearchFilter): boolean {\n // If the school's topic presentation has no audiences, don't show\n if (!presentationFilter.options?.length)\n return false;\n\n // If the school has more than 1 topic presentation, always show\n if (presentationFilter.options.length > 1)\n return true;\n \n // If the school has only 1 topic presentation but it has >1 audience, always show\n if (ArrayHelper.first(presentationFilter.options).secondLayerOptions?.length > 1)\n return true;\n\n return false;\n },\n\n getMoreFilters(filters: SearchFilter[]): MoreFilters {\n return {\n id: 'moreFilters',\n name: getPhrase('moreFilters'),\n type: 'more-filters',\n filters\n };\n },\n\n mapTypeToComponent(type: FilterType): (props: FilterProps) => JSX.Element {\n switch (type) {\n case 'switch':\n return (props: any) => <SwitchFilter key={props.id} {...props} />;\n case 'checkbox':\n return (props: any) => <CheckboxFilter key={props.id} {...props} />;\n case 'nested-checkbox':\n return (props: any) => <NestedCheckboxFilter key={props.id} {...props} />;\n case 'grouped-checkbox':\n return (props: any) => <GroupedCheckboxFilter key={props.id} {...props} />;\n case 'radio':\n return (props: any) => <RadioFilter key={props.id} {...props} />;\n case 'rating':\n return (props: any) => <RatingFilter key={props.id} {...props} />;\n case 'dropdown':\n return (props: any) => <DropdownFilter key={props.id} {...props} />;\n default:\n return () => <></>;\n }\n },\n\n deriveInitialStateFromQuery(\n queryParams: HashObject = {},\n mainFilters: SearchFilter[] = null,\n moreFilters: MoreFilters = null,\n appLink: Core.AppLink\n ): FilterStateHash {\n const initialStates: Omit<FilterStateHash, 'appLink' | 'moreFilters'> = {\n sort: {\n active: !!queryParams.sort,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'sort')\n },\n\n classification: {\n active: !!queryParams.classification,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'classification')\n },\n\n presentation: {\n active: !!queryParams.presentation,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'presentation')\n },\n\n type: {\n active: !!queryParams.type,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'type')\n },\n\n specialEventType: {\n active: !!queryParams.specialEventType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'specialEventType')\n },\n\n rating: {\n active: !!queryParams.rating,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'rating')\n },\n \n interactives: {\n active: queryParams.interactives?.toString() === 'true'\n },\n\n clips: {\n active: queryParams.clips?.toString() === 'true'\n },\n\n yearGroup: {\n active: !!queryParams.yearGroup,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'yearGroup')\n },\n\n moviesAndTv: {\n active: queryParams.moviesAndTv?.toString() === 'true'\n },\n\n classroom: {\n active: !!queryParams.classroom,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'classroom')\n },\n\n audience: {\n active: !!queryParams.audience,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'audience')\n },\n\n hasResources: {\n active: queryParams.hasResources?.toString() === 'true'\n },\n\n hasSubtitles: {\n active: queryParams.hasSubtitles?.toString() === 'true'\n },\n\n productionYear: {\n active: !!queryParams.productionYear,\n selection: getFilterSelectionsFromQueryParams(queryParams, moreFilters?.filters, 'productionYear')\n },\n\n isHd: {\n active: queryParams.isHd?.toString() === 'true'\n },\n\n producedByClickView: {\n active: queryParams.producedByClickView?.toString() === 'true'\n },\n\n duration: {\n active: queryParams.duration,\n selection: getFilterSelectionsFromQueryParams(queryParams, moreFilters?.filters, 'duration')\n },\n\n tagOrClassification: {\n active: !!queryParams.tagOrClassification,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'tagOrClassification')\n },\n\n status: {\n active: !!queryParams.status,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'status')\n },\n\n jobStatus: {\n active: !!queryParams.jobStatus,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'jobStatus')\n },\n isAdmin: {\n active: queryParams.isAdmin?.toString() === 'true'\n },\n\n bulkActionType: {\n active: !!queryParams.bulkActionType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'bulkActionType')\n },\n\n userType: {\n active: !!queryParams.userType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'userType')\n },\n\n filter: {\n active: !!queryParams.filter,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'filter')\n },\n\n channel: {\n active: !!queryParams.channel,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'channel')\n },\n\n dateBroadcast: {\n active: !!queryParams.dateBroadcast,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'dateBroadcast')\n },\n\n categoryId: {\n active: !!queryParams.categoryId,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'categoryId')\n },\n \n hasInteractives: {\n active: !!queryParams.hasInteractives,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'hasInteractives')\n },\n\n source: {\n active: !!queryParams.source,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'source')\n },\n\n customerStatus: {\n active: !!queryParams.customerStatus,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'customerStatus')\n },\n\n customerType: {\n active: !!queryParams.customerType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'customerType')\n }\n };\n\n const reduceFunc = (state: FilterStateHash, filter: SearchFilter<string>) => {\n const filterState = initialStates[filter.id];\n\n /**\n * If we had the query param value, but were not able to parse it into a valid selection.\n * We're actually not active.\n * \n * e.g. For `?rating=bleep-to-bloop` the value of !!queryParams.rating is true, but we are not able\n * to extract any meaningful values from it so the call to getFilterSelectionsFromQueryParams returns an empty array.\n * \n * - Sha\n */\n if (filterState.active && 'selection' in filterState && !filterState.selection?.length)\n filterState.active = false;\n\n state[filter.id] = initialStates[filter.id];\n return state;\n };\n\n const derivedState = mainFilters.reduce<FilterStateHash>(reduceFunc, {} as FilterStateHash);\n\n if (moreFilters?.filters) {\n derivedState.moreFilters = moreFilters.filters.reduce<FilterStateHash>(reduceFunc, {} as FilterStateHash);\n }\n\n derivedState.appLink = appLink;\n\n return derivedState;\n },\n\n hasActiveFilters(queryParams: HashObject): boolean {\n const paramKeys = Object.keys(queryParams);\n\n if (!paramKeys.length)\n return false;\n\n const activeFilters = paramKeys.filter(q => {\n // 'query', 'cursor', and 'page' don't count as filters\n if (q === 'query' || q === 'cursor' || q === 'page' || q === SEARCH_CURRICULUM_CODE_PARAM)\n return false;\n\n // Filters that can have multiple selections (e.g. checkbox types) do not count as active if they are empty\n if (Array.isArray(queryParams[q]) && !queryParams[q].length)\n return false;\n\n return true;\n });\n\n return !!activeFilters.length;\n },\n\n getLabel(filter: SearchFilter, filterState: FilterState): string {\n if (!filterState?.selection?.length)\n return filter.name;\n\n if (filter.type === 'dropdown')\n return ArrayHelper.first(filterState.selection).name;\n\n if (filter.type === 'radio') {\n const selection = ArrayHelper.first(filterState.selection);\n if (!selection || selection.default)\n return filter.name;\n\n return selection.name;\n }\n\n if (filter.type === 'nested-checkbox' || filter.type === 'checkbox' || filter.type === 'grouped-checkbox') {\n const isDefaultState = filter.options.find(opt => {\n return opt.default && filterState.selection.find(selection => selection.id === opt.id);\n });\n\n if (isDefaultState)\n return filter.name;\n\n if (filter.secondaryId) {\n const count = filterState.selection?.reduce((acc, firstLayerSelection) => {\n const availableOptions = filter.options;\n const index = availableOptions.findIndex(option => option.id === firstLayerSelection.id);\n if (availableOptions[index].secondLayerOptions?.length === 0) {\n return acc + 1;\n }\n\n return acc + (firstLayerSelection.secondLayerSelection?.length ?? 0);\n }, 0);\n\n return `${filter.name} - ${count}`;\n }\n\n return `${filter.name} - ${filterState.selection.length}`;\n }\n\n if (filter.type === 'rating') {\n if (!filterState.selection.length)\n return filter.name;\n\n const first = ArrayHelper.first(filterState.selection) as Rating;\n const last = ArrayHelper.last(filterState.selection) as Rating;\n\n if (filterState.selection.length === 1)\n return `${filter.name}: ${first.code}`;\n\n return `${filter.name}: ${first.code} to ${last.code}`;\n }\n },\n\n buildFrontendFilterParams(queryParams: HashObject, filterStates: Array<FilterPayloadType>): HashObject {\n const updatedParams = { ...queryParams };\n\n filterStates.forEach(filterState => {\n if (!filterState?.filter)\n return;\n\n const { id: param, type } = filterState.filter;\n const { active, selection } = filterState.state;\n\n switch (type) {\n case 'switch':\n updatedParams[param] = active ? 'true' : '';\n break;\n\n case 'radio':\n case 'dropdown':\n const isDefault =\n filterState.state.selection?.length === 1 && ArrayHelper.first(filterState.state.selection)?.default;\n\n updatedParams[param] = (filterState.state.selection.length && !isDefault) ? ArrayHelper.first(filterState.state.selection).id : '';\n break;\n\n case 'nested-checkbox':\n updatedParams[param] = active ? selection.map(option => option.id) : null;\n const { secondaryId: secondaryParam } = filterState.filter;\n\n if (secondaryParam) {\n // FlatMap\n updatedParams[secondaryParam] = [].concat(...selection.map(s => s.secondLayerSelection.map(o => o.id)));\n }\n\n break;\n\n case 'checkbox':\n case 'grouped-checkbox':\n if (!active) {\n updatedParams[param] = null;\n break;\n }\n\n const options = [];\n for (const option of selection) {\n const ids = option.id.toString().split(':');\n if (ids.length > 1) {\n // When an option has more than one id\n // e.g. An topic option can used by many presentations\n for (const id of ids) {\n options.push(id);\n }\n } else {\n options.push(option.id);\n }\n }\n\n updatedParams[param] = options;\n break;\n\n case 'tag':\n updatedParams[param] = active ? selection.map(option => option.id) : null;\n break;\n\n case 'rating':\n updatedParams[param] = active ? RatingFilterHelper.getFrontendParamValue(selection as Rating[]) : null;\n break;\n\n case 'button':\n updatedParams[param] = active ? 'true' : '';\n break;\n }\n\n if (!updatedParams[param]) // If the param is empty, delete it\n delete updatedParams[param];\n });\n\n return ObjectHelper.omit(updatedParams, ['cursor']);\n },\n\n buildBackendFilterParams(\n queryParams: HashObject,\n ratings: Rating[] = [],\n presentationIds: string[],\n isLearner: boolean,\n libraries: Library[]\n ): HashObject {\n const defaultParams: HashObject = isLearner ? {\n ['filters.presentation']: presentationIds,\n isLearner\n } : {};\n\n return Object.keys(queryParams).reduce((acc: HashObject, paramName: FilterIds) => {\n const values = queryParams[paramName];\n\n if ((Array.isArray(values) && !values.length) || !values)\n return acc;\n\n if (!FilterWhitelist[paramName])\n return acc;\n\n if (paramName === 'rating') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = RatingFilterHelper.getBackendParamValue(values, ratings);\n return acc;\n }\n\n if (paramName === 'productionYear') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = ProductionYearFilterHelper.getBackendParamValue(values);\n return acc;\n }\n\n if (paramName === 'duration') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = DurationFilterHelper.getBackendParamValue(values);\n return acc;\n }\n\n if (paramName === 'moviesAndTv') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}curationTag`] = CurationTag.MOVIES_AND_TV;\n return acc;\n }\n\n if (paramName === 'source') {\n return {\n ...acc,\n ...SourceFilterHelper.getBackendParamValue(values, libraries)\n };\n }\n\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = values;\n\n return acc;\n }, defaultParams);\n },\n\n getAppliedIndices(queryParams: HashObject = {}, _hasNewSearch: boolean = false): SearchIndices[] {\n const { type: indices } = queryParams;\n\n const newIndices: SearchIndices[] = ['category'];\n\n function validateIndices(indice: SearchIndices): boolean {\n if (_hasNewSearch) {\n return ValidIndices[indice];\n }\n\n return !newIndices.includes(indice) && ValidIndices[indice];\n }\n\n if (indices) {\n if (!Array.isArray(indices))\n return [indices].filter(validateIndices);\n\n if (indices.length)\n return indices.filter(validateIndices);\n }\n\n const extraIndices: SearchIndices[] = [];\n if (_hasNewSearch)\n extraIndices.push(...newIndices);\n \n if (queryParams.source)\n return [ 'video', 'clip', 'interactive', ...extraIndices ];\n\n return [ 'series', 'video', 'playlist', 'classification', 'clip', 'interactive', 'company', ...extraIndices ];\n },\n\n applyFilter(\n filters: Array<SearchFilter>,\n currentFilterState: FilterState | FilterStateHash,\n draftState: DraftState,\n baseAppLink: Core.AppLink\n ): void {\n if (ObjectHelper.isEqual(currentFilterState, draftState))\n return;\n\n const filterIds = Object.keys(draftState) as FilterIds[];\n\n const payload: Array<FilterPayloadType> = filterIds.map(filterId => {\n const filter = filters.find(f => f.id === filterId);\n const draftFilterState = draftState[filterId];\n\n const isDefaultValue =\n draftFilterState.selection?.length === 1 && ArrayHelper.first(draftFilterState.selection)?.default;\n\n return {\n filter,\n state: {\n active: draftFilterState.active && !isDefaultValue,\n selection: draftFilterState.selection\n }\n };\n });\n\n const currentQueryParams = Core.LocationUtils.GetQuery();\n Core.AppLinkHelper.trigger({\n ...baseAppLink,\n params: FilterHelper.buildFrontendFilterParams(currentQueryParams, payload)\n }, { replace: true });\n },\n\n mixinDisabledFields(\n state: FilterStateHash,\n indices: SearchIndices[],\n mainFilters: SearchFilter[],\n moreFilters?: MoreFilters\n ): MixinDisableFieldsFn {\n let allFilters = [ ...mainFilters, ...(moreFilters?.filters ?? []) ];\n\n // Iterate through each filter, and disable them if they should be disabled\n allFilters = disableFilters(state, allFilters, indices);\n\n // Iterate through each filter option, and disable them if they should be disabled\n allFilters = disableFilterOptions(state, allFilters);\n\n const response: MixinDisableFieldsFn = {\n mainFilters: allFilters.filter(filter => mainFilters.find(f => f.id === filter.id))\n };\n\n if (moreFilters?.filters) {\n response.moreFilters = {\n ...moreFilters,\n filters: allFilters.filter(filter => moreFilters.filters.find(f => f.id === filter.id))\n };\n }\n\n return response;\n },\n\n logFilterEvent(\n mainFilters: SearchFilter[],\n moreFilters: MoreFilters,\n state: FilterStateHash,\n query: string,\n analyticsOptions: AnalyticsOptions\n ): void {\n const analyticsFilterObjects: AnalyticsFilterHash[] = [];\n\n mainFilters?.forEach(f => {\n const filterState = state[f.id];\n\n if (filterState.active) {\n analyticsFilterObjects.push({\n type: f.id,\n selection: filterState.selection\n });\n }\n });\n\n moreFilters?.filters?.forEach(f => {\n const filterState = state.moreFilters[f.id];\n\n if (filterState.active) {\n analyticsFilterObjects.push({\n type: f.id,\n selection: filterState.selection\n });\n }\n });\n\n if (!analyticsFilterObjects.length)\n analyticsOptions.descriptor = FilterDescriptor.Reset;\n\n AnalyticsHelper.logUserAction({\n query: query ?? '',\n filters: analyticsFilterObjects\n }, AnalyticsHelper.mergeOptions(analyticsOptions, {\n workflowPhase: WorkflowPhase.Complete,\n actionType: UserAction.Filter\n }));\n },\n\n /**\n * Helpers below this comment return hard coded filter options for a particular filter.\n * If you are adding a new filter with hard coded options, add a new function here.\n */\n getObjectTypeOptions(\n inaccessibleIndices: SearchIndices[] = [],\n _hasNewSearch: boolean\n ): FilterOption<SearchIndices>[] {\n if (_hasNewSearch) {\n return [\n {\n id: 'video',\n name: getPhrase('videos'),\n group: getPhrase('videoTypes')\n },\n {\n id: 'interactive',\n name: getPhrase('interactives'),\n group: getPhrase('videoTypes')\n },\n {\n id: 'clip',\n name: getPhrase('clips'),\n group: getPhrase('videoTypes')\n },\n {\n id: 'classification',\n name: getPhrase('topics'),\n group: getPhrase('collections')\n },\n {\n id: 'series',\n name: getPhrase('series'),\n group: getPhrase('collections')\n },\n {\n id: 'playlist',\n name: getPhrase('playlists'),\n group: getPhrase('collections')\n },\n {\n id: 'category',\n name: getPhrase('category'),\n group: getPhrase('collections')\n }\n ].filter(opt => !inaccessibleIndices.find(i => i === opt.id)) as FilterOption<SearchIndices>[];\n }\n\n return [\n {\n id: 'classification',\n name: getPhrase('topics')\n },\n {\n id: 'playlist',\n name: getPhrase('playlists')\n },\n {\n id: 'series',\n name: getPhrase('series')\n },\n {\n id: 'video',\n name: getPhrase('videos')\n },\n {\n id: 'clip',\n name: getPhrase('clips')\n },\n {\n id: 'interactive',\n name: getPhrase('interactives')\n }\n ].filter(opt => !inaccessibleIndices.find(i => i === opt.id)) as FilterOption<SearchIndices>[];\n },\n\n /**\n * Loops through each option on the \"object type\" filter, and determines whether\n * they should be disabled based on the currently active filters\n */\n getIsObjectTypeOptionDisabled(\n options: FilterOption<SearchIndices>[],\n filters: SearchFilter[],\n state: FilterStateHash\n ): FilterOption<SearchIndices>[] {\n return options.map(option => {\n let isDisabled = false;\n\n filters.forEach(filter => {\n if (isDisabled)\n return;\n\n const filterState = state[filter.id] || state.moreFilters[filter.id];\n\n if (!filterState?.active || !filter.compatibleIndices?.length)\n return;\n\n if (!filter.compatibleIndices.find(i => option.id === i))\n isDisabled = true;\n });\n\n return {\n ...option,\n disabled: isDisabled\n };\n });\n },\n\n getNameSortOptions(): FilterOption[] {\n return [\n {\n id: 'newest',\n name: getPhrase('newest')\n },\n {\n id: 'oldest',\n name: getPhrase('oldest')\n },\n {\n id: 'first-name-atoz',\n name: getPhrase('firstNameAToZ')\n },\n {\n id: 'first-name-ztoa',\n name: getPhrase('firstNameZToA')\n },\n {\n id: 'surname-atoz',\n name: getPhrase('surnameAToZ')\n },\n {\n id: 'surname-ztoa',\n name: getPhrase('surnameZToA')\n }\n ];\n },\n\n getYearGroupOptions(yearGroups: YearGroup[]): FilterOption[] {\n if (!yearGroups?.length)\n return [];\n\n return yearGroups.map(y => ({\n id: y.value.toString(),\n name: y.name\n }));\n },\n\n getStatusOptions(): FilterOption[] {\n return [\n {\n id: 'active',\n name: getPhrase('active')\n },\n {\n id: 'deactivated',\n name: getPhrase('deactivated')\n },\n {\n id: 'pending',\n name: getPhrase('pending')\n }\n ];\n },\n\n getJobStatusOptions(): FilterOption[] {\n return [\n {\n id: 'completed',\n name: getPhrase('completed')\n },\n {\n id: 'failed',\n name: getPhrase('errored')\n },\n {\n id: 'inProgress',\n name: getPhrase('inProgress')\n }\n ];\n },\n\n getTvFieldsOptions(): FilterOption[] {\n return [\n {\n id: '0',\n name: getPhrase('allFields'),\n default: true\n },\n {\n id: '1',\n name: getPhrase('titleDescriptionField')\n },\n {\n id: '2',\n name: getPhrase('captionsField')\n }\n ];\n },\n\n getTvChannelOptions(channels: BaseObject[]): FilterOption[] {\n if (!channels?.length)\n return [];\n\n return channels.map(channel => ({\n id: channel.name,\n name: channel.name\n }));\n },\n\n getTvDateBroadcastOptions(): FilterOption[] {\n return [\n {\n id: 'any-time',\n name: getPhrase('anyTime'),\n default: true\n },\n {\n id: 'yesterday',\n name: getPhrase('yesterday')\n },\n {\n id: 'last-week',\n name: getPhrase('lastWeek')\n },\n {\n id: 'last-2-weeks',\n name: getPhrase('last2Weeks')\n }\n ];\n },\n\n getCustomerStatusOptions(): FilterOption[] {\n return [\n {\n id: CustomerStatus.Unclassified.toString(),\n name: CustomerStatusString.Unclassified\n },\n {\n id: CustomerStatus.Active.toString(),\n name: CustomerStatusString.Active\n },\n {\n id: CustomerStatus.Prospect.toString(),\n name: CustomerStatusString.Prospect\n },\n {\n id: CustomerStatus.LostCustomer.toString(),\n name: CustomerStatusString.LostCustomer\n },\n {\n id: CustomerStatus.Disabled.toString(),\n name: CustomerStatusString.Disabled\n },\n {\n id: CustomerStatus.Other.toString(),\n name: CustomerStatusString.Other\n }\n ];\n },\n\n getCustomerTypeOptions(): FilterOption[] {\n return [\n {\n id: CustomerType.Unclassified.toString(),\n name: CustomerTypeString.Unclassified\n },\n {\n id: CustomerType.Primary.toString(),\n name: CustomerTypeString.Primary\n },\n {\n id: CustomerType.Secondary.toString(),\n name: CustomerTypeString.Secondary\n },\n {\n id: CustomerType.K12.toString(),\n name: CustomerTypeString.K12\n },\n {\n id: CustomerType.Tertiary.toString(),\n name: CustomerTypeString.Tertiary\n },\n {\n id: CustomerType.NonEducational.toString(),\n name: CustomerTypeString.NonEducational\n },\n {\n id: CustomerType.Partners.toString(),\n name: CustomerTypeString.Partners\n },\n {\n id: CustomerType.Internal.toString(),\n name: CustomerTypeString.Internal\n },\n {\n id: CustomerType.Other.toString(),\n name: CustomerTypeString.Other\n },\n {\n id: CustomerType.ClickView.toString(),\n name: CustomerTypeString.ClickView\n },\n {\n id: CustomerType.System.toString(),\n name: CustomerTypeString.System\n }\n ];\n },\n \n getCategoriesOptions(categories: MasterNestedObject<Library>[]): FilterOption[] {\n if (!categories?.length)\n return [];\n\n // TODO: Custom nested checkbox\n return categories.map(category => {\n return {\n id: category.data.id,\n name: category.data.name\n // secondLayerOptions: category.children.map(\n // nestedCategory => ({ id: nestedCategory.data.id, name: nestedCategory.data.name })\n // )\n };\n });\n },\n\n getSpecialEventTypeOptions(): FilterOption[] {\n return [\n {\n id: SpecialEventType.BreakingNews,\n name: SpecialEventTypeLabelMap[SpecialEventType.BreakingNews]\n },\n {\n id: SpecialEventType.SportingEvent,\n name: SpecialEventTypeLabelMap[SpecialEventType.SportingEvent]\n },\n {\n id: SpecialEventType.Observance,\n name: SpecialEventTypeLabelMap[SpecialEventType.Observance]\n },\n {\n id: SpecialEventType.NaturalDisaster,\n name: SpecialEventTypeLabelMap[SpecialEventType.NaturalDisaster]\n },\n {\n id: SpecialEventType.HistoricalEvent,\n name: SpecialEventTypeLabelMap[SpecialEventType.HistoricalEvent]\n },\n {\n id: SpecialEventType.Holiday,\n name: SpecialEventTypeLabelMap[SpecialEventType.Holiday]\n },\n {\n id: SpecialEventType.Informal,\n name: SpecialEventTypeLabelMap[SpecialEventType.Informal]\n },\n {\n id: SpecialEventType.ReligiousEvent,\n name: SpecialEventTypeLabelMap[SpecialEventType.ReligiousEvent]\n },\n {\n id: SpecialEventType.Other,\n name: SpecialEventTypeLabelMap[SpecialEventType.Other]\n }\n ];\n }\n};\n\n// This allows us to determine which filters should be applied based on the query params set on first load\nfunction getFilterSelectionsFromQueryParams(\n queryParams: HashObject,\n filters: SearchFilter[] = [],\n filterId: FilterIds\n): FilterOption[] {\n const filter = filters.find(f => f.id === filterId);\n\n if (!filter)\n return [];\n\n if (!queryParams[filterId])\n return filter.options?.filter(option => option.default) ?? [];\n\n if (filterId === 'rating')\n return RatingFilterHelper.deriveInitialRatingFilterStateFromQueryParams(queryParams[filterId], filter);\n\n let selections = queryParams[filterId];\n\n if (!Array.isArray(selections))\n selections = [selections];\n\n if (filterId === 'classification') {\n return ClassificationFilterHelper.deriveInitialClassificationFilterStateFromQueryParams(filter, selections);\n }\n\n if (filterId === 'presentation') {\n return PresentationFilterHelper.\n deriveInitialPresentationFilterStateFromQueryParams(filter.options, selections, queryParams);\n }\n\n return getSelectedOptions(filter.options, selections);\n}\n\nexport function getSelectedOptions(options: FilterOption[] | undefined, selections: any): any[] {\n if (!Array.isArray(selections))\n selections = [selections];\n\n return options?.filter(option => {\n return selections.find((id: number | string) => id.toString() === option.id.toString());\n }) ?? [];\n}\n\n/**\n * This basically iterates through every filter, and works out if that filter should be disabled.\n * This is based on:\n * - If the filter is compatible with any of the currently applied search indices\n * - If the filter is compatible with any of the filter indices that are compatible with any of the active filters\n */\nfunction disableFilters(state: FilterStateHash, filters: SearchFilter[], indices: SearchIndices[]): SearchFilter[] {\n // Convert the currently applied search indices into a hashmap\n const appliedIndices = indices.reduce((acc: HashObject, index) => {\n acc[index] = true;\n return acc;\n }, {});\n\n return filters.map(filter => {\n if (!filter.compatibleIndices?.length)\n return filter;\n\n // If none of the applied indices works with the filter, it should be disabled.\n // For example, if the user filters by \"playlists\", the \"has resources\" filter will be disabled.\n if (!filter.compatibleIndices.find(i => appliedIndices[i])) {\n return {\n ...filter,\n disabled: true\n };\n }\n \n // Get all currently active filters\n const activeFilterIds = Object.keys(state).filter((filterId: keyof typeof state) => {\n const filterState = state[filterId];\n\n if (!('active' in filterState))\n return false;\n\n return filterState.active;\n });\n\n let shouldDisableFilter = false;\n\n activeFilterIds.forEach(activeFilterId => {\n if (shouldDisableFilter)\n return;\n\n const activeFilter = filters.find(f => f.id === activeFilterId);\n\n if (!activeFilter.compatibleIndices?.length)\n return;\n\n const activeFilterIndices = activeFilter.compatibleIndices.reduce((acc: HashObject, index) => {\n acc[index] = true;\n return acc;\n }, {});\n\n /**\n * Check if the active filter's indices are compatible with the current filter's indices.\n * For example, if the \"has resources\" filter is active, then all filters that are incompatible\n * with videos will be disabled.\n */\n if (!filter.compatibleIndices.find(i => activeFilterIndices[i]))\n shouldDisableFilter = true;\n });\n\n return {\n ...filter,\n disabled: shouldDisableFilter\n };\n });\n}\n\n/**\n * This will disable particular option on a filter if they are incompatible with the currently\n * active filters.\n *\n * For example, if we apply the \"rating\" filter, then the \"playlist\" and \"classification\" options\n * on the \"ObjectTypes\" filter will be disabled, as we cannot filter by those options _and_ by rating\n * at the same time.\n */\nfunction disableFilterOptions(state: FilterStateHash, filters: SearchFilter[]): SearchFilter[] {\n return filters.map(filter => {\n if (!FunctionHelper.isFunction(filter.disableOptions))\n return filter;\n\n // Only filters that have a `disableOptions` function will run here.\n const options = filter.disableOptions(filter.options, filters, state);\n\n return {\n ...filter,\n options\n };\n });\n}","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './filter-button.module.scss';\n\n/**\n * If your filter requires some customisations to the default width, add a use case here.\n */\nfunction getCustomWidthClass(filter: SearchFilter): string {\n if (FilterHelper.displayTwoColumns(filter))\n return styles.twoColumnsWidth;\n\n // Some classifications has long names, so we make them wider\n if (filter.id === 'classification')\n return styles.classificationWidth;\n \n if (FilterHelper.displayTwoLayers(filter))\n return styles.nestedCheckboxesWidth;\n\n if (filter.type === 'switch')\n return styles.switchWidth;\n\n return '';\n}\n\nFilterButton.defaultProps = {\n hideCaret: true\n};\n\ninterface FilterButtonProps {\n filter: SearchFilter;\n hideCaret?: boolean;\n}\n\nexport function FilterButton(props: FilterButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state[props.filter.id];\n\n const isDropdownFilter = props.filter.type === 'dropdown';\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<FilterState>(currentFilterState);\n\n React.useEffect(() => {\n setLabel(FilterHelper.getLabel(props.filter, currentFilterState));\n setDraftState(currentFilterState);\n }, [ props.filter, currentFilterState?.selection ]);\n\n function onSelectItem(state: FilterState): void {\n setDraftState(state);\n\n if (isDropdownFilter)\n applyFilter(state);\n }\n\n function onClickReset(): void {\n const defaultOption = props.filter.options?.find(o => o.default);\n\n setDraftState({\n active: false,\n selection: defaultOption ? [defaultOption] : []\n });\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function applyFilter(newState: FilterState = draftState): void {\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing || isDropdownFilter)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n const FilterComponent = React.useMemo(() => {\n return props.filter.customComponent\n ? props.filter.customComponent\n : FilterHelper.mapTypeToComponent(props.filter.type);\n }, [props.filter.type]);\n\n const baseClass = `fw-semibold mx-1 btn d-flex align-items-center`;\n const caretClass = props.hideCaret && !isDropdownFilter ? styles.hideCaret : '';\n const customWidthClass = getCustomWidthClass(props.filter);\n\n if (props.filter.type === 'button')\n return (\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n );\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle\n id={`filterButton-${props.filter.id}`}\n className={`${baseClass} ${caretClass}`}\n variant={(currentFilterState.active && !isDropdownFilter) ? 'dark' : 'outline-dark'}\n disabled={props.filter.disabled}\n >\n {!!props.filter.icon && (\n <div className={styles.svgContainer}>\n <SvgContainer svg={props.filter.icon} />\n </div>\n )}\n {props.filter.labelPrefix} {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n <div className={`mx-1 ${styles.filterMenu} ${customWidthClass} ${!isDropdownFilter ? 'px-2 py-1' : ''}`}>\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n\n {(!isDropdownFilter && !props.filter.disabled) && (\n <FilterActions\n active={draftState.active}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n )}\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nexport const StateHelper = {\n /**\n * Helper function to get the setState function for an individual key in a state object.\n * \n * @param setState React setState action\n * @param key Property within the state object we're updating\n * @param callback Optional callback to modify data before setting state. Uses identity fn by default.\n * \n * @returns Newly updated state object\n */\n getSetStateByKey<T extends HashObject>(\n setState: React.Dispatch<React.SetStateAction<T>>,\n key: keyof T,\n callback?: (data: any, state?: T) => T[keyof T]\n ): (data: any) => void {\n return (data: any) => setState(state => {\n const fn = FunctionHelper.isFunction(callback) ? callback : FunctionHelper.useIdentity<T>();\n return { ...state, [key]: fn(data, state) };\n });\n }\n};","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { FilterIds, MoreFilters } from 'libs/shared/apps/search/interfaces';\nimport { DraftState, FilterContext, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport styles from './filter-button.module.scss';\n\nfunction getTotalActiveFilters(currentState: FilterStateHash): number {\n const total = Object.keys(currentState).reduce((acc: number, key: FilterIds) => {\n return currentState[key].active\n ? acc + 1\n : acc;\n }, 0);\n\n return total;\n}\n\ninterface MoreFiltersButtonProps {\n filter: MoreFilters;\n}\n\nexport function MoreFiltersButton(props: MoreFiltersButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state.moreFilters;\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<DraftState>(currentFilterState);\n const [ totalActiveFilters, setTotalActiveFilters ] = React.useState(getTotalActiveFilters(currentFilterState));\n\n const currentFilterStateKey = Object.keys(currentFilterState).map((id: FilterIds) => {\n return `${id}:${currentFilterState[id].active}`;\n }).join('-');\n\n React.useEffect(() => {\n setDraftState(currentFilterState);\n setTotalActiveFilters(getTotalActiveFilters(currentFilterState));\n }, [ props.filter, currentFilterStateKey ]);\n\n React.useEffect(() => {\n setLabel(totalActiveFilters ? `${props.filter.name} - ${totalActiveFilters}` : props.filter.name);\n }, [totalActiveFilters]);\n\n function onClickReset(): void {\n const filterIds = Object.keys(currentFilterState) as FilterIds[];\n\n const newState = filterIds.reduce((acc: DraftState, filterId) => {\n const filter = props.filter.filters.find(f => f.id === filterId);\n const defaultOption = filter.options?.find(o => o.default);\n\n acc[filterId] = {\n active: false,\n selection: defaultOption ? [defaultOption] : []\n };\n\n return acc;\n }, {});\n\n setDraftState(newState);\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n function applyFilter(): void {\n FilterHelper.applyFilter(\n props.filter.filters,\n currentFilterState,\n draftState,\n state.appLink\n );\n }\n\n const baseClass = `fw-semibold ${styles.hideCaret} mx-1 btn`;\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle id={props.filter.id} className={baseClass} variant={totalActiveFilters ? 'dark' : 'outline-dark'}>\n {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n <div className={`mx-1 ${styles.moreFiltersWidth} ${props.filter.type !== 'dropdown' ? 'px-2 py-1' : ''}`}>\n {props.filter.filters.map(filter => {\n const FilterComponent = filter.customComponent\n ? filter.customComponent\n : FilterHelper.mapTypeToComponent(filter.type);\n\n return (\n <fieldset key={filter.id}>\n <FilterComponent\n filter={filter}\n draftState={draftState[filter.id]}\n setDraftState={StateHelper.getSetStateByKey(setDraftState, filter.id)}\n isOnMoreFilters\n />\n </fieldset>\n );\n })}\n\n <FilterActions\n active={!!Object.keys(draftState).find((key: FilterIds) => draftState[key].active)}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}","import React from 'react';\n\nimport styles from './tags.module.scss';\n\ninterface PartialTagItemProps {\n tagClass?: string;\n}\n\nexport const PartialTagItem = React.memo(function({ tagClass = '' }: PartialTagItemProps): JSX.Element {\n const classNames = `partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${tagClass} ${styles.partialTag}`;\n\n return (\n <div className='mt-1'>\n <span className={classNames}>&nbsp;</span>\n </div>\n );\n});","import React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { DynamicWidgetState } from 'libs/shared/components/widgets/dynamic-widget';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\n\n// Sync with transition time in SlidingListContainer.tsx\nconst SLIDER_ANIMATION_TIME = 400;\n\ntype FixedWidgetKeyboardOptions = {\n type: 'fixed',\n state: FixedWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery?: never;\n}\n\ntype DynamicWidgetKeyboardOptions = {\n type: 'dynamic',\n state: DynamicWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery: string\n}\n\ntype UseWidgetKeyboard = FixedWidgetKeyboardOptions | DynamicWidgetKeyboardOptions\n\nexport function useWidgetKeyboard(options: UseWidgetKeyboard) {\n const { type, state, containerRef, mediaQuery } = options;\n\n const [ isTabbing, setIsTabbing ] = React.useState(false);\n const [ dynamicAttributes, setDynamicAttributes ] = React.useState<HashObject>({});\n const [ focusedWidgetIndex, setFocusedWidgetIndex ] = React.useState(null);\n\n const isTouch = React.useMemo(() => UserAgentHelper.isTouchScreen(), []);\n\n /**\n * Get accessibility attributes for dynamic widget items\n * */\n React.useEffect(() => {\n if (type !== 'dynamic' || !containerRef.current || !(state as DynamicWidgetState).containerLeftPosition || isTouch) return;\n\n setTimeout(() => getDynamicAttributes(), SLIDER_ANIMATION_TIME + 50);\n }, [\n containerRef.current,\n mediaQuery,\n (state as DynamicWidgetState).offset,\n (state as DynamicWidgetState).containerLeftPosition\n ]);\n\n function getDynamicAttributes() {\n const dynamicWidgetState = state as DynamicWidgetState;\n\n if (!containerRef.current?.children)\n return;\n\n const focusableItems = Array.from(containerRef.current.children).reduce((acc, item) => {\n const rect = item?.getBoundingClientRect();\n\n /**\n * When any part of the widget item is visible it should be focusable,\n * otherwise prevent interaction and the slider should be the next focusable element\n * */\n const isItemVisable =\n rect.left < dynamicWidgetState.containerRightPosition &&\n rect.right > dynamicWidgetState.containerLeftPosition;\n\n return {\n ...acc,\n [item.id]: isItemVisable\n ? {\n 'aria-hidden': false\n } : {\n 'aria-hidden': true,\n 'inert': 'true'\n }\n };\n }, {});\n\n setDynamicAttributes(focusableItems);\n }\n\n /**\n * Get accessibility attributes for fixed widget items\n * */\n function getFixedAttributes(index?: number) {\n const fixedWidgetState = state as FixedWidgetState;\n\n const isItemVisible =\n isTouch ||\n index >= (fixedWidgetState.offset - fixedWidgetState.viewableItems) &&\n index < fixedWidgetState.offset;\n if (isItemVisible) {\n return {\n 'aria-hidden': false\n };\n }\n\n return {\n 'inert': 'true',\n 'aria-hidden': true\n };\n }\n\n /**\n * When the user is not signed in, there may be videos which are not focusable.\n * setTimeout is required because the transition time is 400ms\n */\n function focusNext() {\n setTimeout(() => {\n if (!containerRef.current)\n return;\n\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let nextFocusableElement: HTMLElement = null;\n\n for (let i = (focusedWidgetIndex + 1); i < items.length; i++) {\n if (nextFocusableElement)\n break;\n\n nextFocusableElement = items[i].querySelector('a[tabindex=\"0\"]');\n }\n\n if (nextFocusableElement)\n nextFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function focusPrev() {\n setTimeout(() => {\n if (!containerRef.current)\n return;\n\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let prevFocusableElement: HTMLElement = null;\n for (let i = focusedWidgetIndex - 1; i >= 0; i--) {\n if (prevFocusableElement) break;\n\n const item = items[i];\n prevFocusableElement = item.querySelector('a[tabindex=\"0\"]');\n }\n\n if (prevFocusableElement)\n prevFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function onFocusWidget(index: number) {\n if (document.querySelector('.user-is-tabbing')) {\n setIsTabbing(true);\n setFocusedWidgetIndex(index);\n }\n }\n\n function onBlurWidget() {\n if (!document.querySelector('.user-is-tabbing')) {\n setIsTabbing(false);\n setFocusedWidgetIndex(null);\n }\n }\n\n return {\n isTabbing,\n onFocusWidget,\n onBlurWidget,\n getFixedAttributes,\n dynamicAttributes,\n focusNext,\n focusPrev\n };\n}","export enum CssMeasurement {\n Percentage = '%',\n Pixels = 'px'\n}","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst blankImage = new Image();\nblankImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';\n\nexport const DragHelper = {\n // This removes the image that appears when you drag a draggable HTML element\n hideDragImage(event: React.DragEvent<HTMLElement>): void {\n if (!event.dataTransfer.setDragImage || !FunctionHelper.isFunction(event.dataTransfer.setDragImage))\n return;\n\n event.dataTransfer.setDragImage(blankImage, 0, 0);\n }\n};","import * as React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { DragHelper } from 'libs/shared/utils/DragHelper';\n\nconst isTouchScreen = UserAgentHelper.isTouchScreen();\n\nconst getPositionStyling = (xPosition: number, measurement: CssMeasurement, dragPercentage?: number) => {\n // Used in situations where a touch screen user is dragging the `<FixedWidget />`\n if (measurement === CssMeasurement.Percentage && dragPercentage)\n xPosition = xPosition - dragPercentage;\n \n return {\n transform: `translate3d(${xPosition}${measurement}, 0px, 0px)`,\n // Sync with transition time in useWidgetKeyboard.ts\n transition: 'transform .4s ease-in-out'\n };\n};\n\ninterface SlidingListContainerProps extends React.PropsWithChildren<unknown> {\n position: number;\n positionType: CssMeasurement;\n\n onDrag?: (event: React.DragEvent<HTMLUListElement>) => void;\n onDragEnd?: () => void;\n\n onTouchMove?: (event: React.TouchEvent<HTMLUListElement>) => void;\n onTouchEnd?: () => void;\n\n percentageDragged?: number;\n}\n\nexport const SlidingListContainer = React.forwardRef((\n props: SlidingListContainerProps,\n ref: React.MutableRefObject<HTMLUListElement>\n): JSX.Element => {\n const { children, positionType, onDrag, onDragEnd, onTouchMove, onTouchEnd, percentageDragged, position = 0 } = props;\n\n function getEventListeners(): HashObject {\n const listenerProps: HashObject = {};\n\n if (onDrag && onDragEnd) {\n listenerProps.draggable = true;\n listenerProps.onDragEnd = onDragEnd;\n listenerProps.onDragStart = DragHelper.hideDragImage;\n listenerProps.onDragOver = onDrag;\n }\n\n if (onTouchMove && onTouchEnd && isTouchScreen) {\n listenerProps.onTouchMoveCapture = onTouchMove;\n listenerProps.onTouchEndCapture = onTouchEnd;\n }\n\n return listenerProps;\n }\n\n return (\n <ul\n className='list-unstyled d-flex flex-nowrap position-relative w-100 mb-0'\n style={getPositionStyling(position, positionType, percentageDragged)}\n ref={ref}\n {...getEventListeners()}\n >\n {children}\n </ul>\n );\n});","import React from 'react';\n\nexport function ChevronRightSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M15.695 11.267c.407.41.407 1.056 0 1.466L9.79 18.696a1.046 1.046 0 0 1-1.474 0l-.01-.01a1.034 1.034 0 0 1 0-1.467L13.474 12l-5.17-5.22a1.034 1.034 0 0 1 0-1.465l.012-.011a1.046 1.046 0 0 1 1.474 0z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport { ChevronRightSvg } from 'libs/shared/images/svg/arrows/ChevronRightSvg';\n\nimport styles from './widget-button.module.scss';\n\nconst namespace = 'shared.widgetButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport enum WidgetButtonDirection {\n Left,\n Right\n}\n\ninterface WidgetButtonProps {\n onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n direction: WidgetButtonDirection;\n hide: boolean;\n contents?: WidgetContents;\n useGradientBackdrop?: boolean;\n className?: string;\n hoverText?: string;\n hideExtendedClickableArea?: boolean;\n state?: FixedWidgetState;\n\n leftButtonClassName?: string;\n rightButtonClassName?: string;\n leftGradientClassName?: string;\n rightGradientClassName?: string;\n containerClassName?: string;\n}\n\nexport const WidgetButton = React.memo(function(props: WidgetButtonProps): JSX.Element {\n const isLeft = props.direction === WidgetButtonDirection.Left;\n\n const arrowSvg = isLeft ? ChevronLeftSvg : ChevronRightSvg;\n\n function getPositionClass(): string {\n let className = styles.topPos;\n \n // Left / Right\n if (isLeft)\n className += ` ${styles.left} ${props.leftButtonClassName}`;\n else\n className += ` ${styles.right} ${props.rightButtonClassName}`;\n \n return className;\n }\n\n function getStyle(): React.CSSProperties {\n if (props.state?.contents === 'videos')\n return { paddingBottom: (56.25 / props.state?.viewableItems) + '%' };\n\n return { height: '100%' };\n }\n\n if (props.hide)\n return <></>;\n\n return (\n <div className={`${styles.buttonContainer} ${props.containerClassName ? props.containerClassName : ''}`} style={getStyle()}>\n {props.useGradientBackdrop &&\n <div className={isLeft ? `${styles.gradientLeft} ${props.leftGradientClassName}` : `${styles.gradientRight} ${props.rightGradientClassName}`} />\n }\n\n {!props.hideExtendedClickableArea && (\n <button\n onClick={props.onClick}\n className={`${styles.extendedClickableArea} ${isLeft ? styles.left : styles.right}`}\n tabIndex={-1}\n />\n )}\n\n <button\n className={`${getPositionClass()} ${styles.button} ${props.className || ''}`}\n onClick={props.onClick}\n aria-label={isLeft ? getPhrase('previous') : getPhrase('next')}\n >\n {props.hoverText && (\n <span className={`ps-3 pe-2 ${styles.hoverText}`}>{props.hoverText}</span>\n )}\n <SvgContainer\n svg={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.chevron}`}\n />\n </button>\n </div>\n );\n});","export enum WidgetInteraction {\n Init = 'init',\n Next = 'next',\n Previous = 'previous',\n Resize = 'resize',\n Drag = 'drag',\n Update = 'update',\n JumpToIndex = 'jump-to-index'\n}","import * as React from 'react';\n\n/**\n * Hook function for listening to scroll events\n * @param onResize - gets called on resize.\n * @param onResizeEnd (optional) - gets called 100ms after the last resize event. Timer restarts everytime the callback\n * runs so that endCallback only fires after a stretch of resize events.\n * @param dependencies - values from the component (e.g. state, props and functions) that are used \n * inside the effect hook.\n */\nexport function useResizeListener(onResize: () => void, onResizeEnd?: () => void, dependencies: any[] = []): void {\n let resizeTimeout: number;\n\n const onResizeModified = () => {\n onResize();\n\n window.clearTimeout(resizeTimeout);\n resizeTimeout = window.setTimeout(onResizeEnd, 100);\n };\n\n React.useEffect(() => {\n window.addEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n return () => window.removeEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n }, [...dependencies]);\n}","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nimport { DynamicWidgetState } from './DynamicWidgetReducer';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\n/**\n * Resize events\n */\nexport const getResizeHandler = (\n elementRefs: SlidingListRefs,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n mediaQuery: MediaQueryStrings\n) => () => {\n if (elementRefs.container.current)\n elementRefs.container.current.style.transition = '';\n\n dispatch({\n type: WidgetInteraction.Resize,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n};\n\nexport const getResizeEndHandler = (containerRef: React.MutableRefObject<HTMLUListElement>) => () => {\n if (containerRef.current)\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n};\n\nexport const getDragHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n widgetState: DynamicWidgetState,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n widgetSnapshot: WidgetSnapshot,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => (event: React.DragEvent<HTMLUListElement>): void => {\n const mouseX = event.clientX;\n\n let snapshot = widgetSnapshot;\n\n if (!snapshot) {\n snapshot = { ...widgetState, initialMouseX: mouseX };\n setWidgetSnapshot(snapshot);\n containerRef.current.style.transition = '';\n }\n\n dispatch({\n type: WidgetInteraction.Drag,\n payload: {\n widgetSnapshot: snapshot,\n currentMouseX: mouseX\n }\n });\n};\n\nexport const getDragEndHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => () => {\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n setWidgetSnapshot(null);\n};","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nexport interface DynamicWidgetState {\n /**\n * X-position argument for `translate3d()` to determine where the slider is positioned.\n */\n offset: number;\n\n /**\n * Left position of the slider container.\n * Set on `Init`, and updated on `Resize`.\n * Used for calculations on `Previous`, or for dragging to the right.\n */\n containerLeftPosition: number;\n\n /**\n * Right position of the slider container.\n * Set on Init, and updated on Resize.\n * Used for calculations on `Next`, or for dragging to the left.\n */\n containerRightPosition: number;\n\n /**\n * The position of the left edge of the very first element in the slider list.\n * Initially this will always be equal to `containerLeftPosition`.\n */\n firstElementPosition: number;\n\n /**\n * The position of the right edge of the very last element in the slider list.\n */\n lastElementPosition: number;\n\n /**\n * True when `firstElementPosition === containerLeftPosition`.\n */\n hideLeftButton: boolean;\n\n /**\n * True when `lastElementPositon === containerRightPosition`.\n */\n hideRightButton: boolean;\n\n /**\n * When clicking left or right, this number is the max distance in pixels that the slider.\n * will move.\n * Default 300.\n * Can only be set once on `Init` action.\n */\n maxSlideDistance: number;\n\n /**\n * This is calculated on `Init`, and is the lowest number the `offset` state can ever be.\n * This is needed for the `Drag` event, as the `Drag` event can only calculate whole numbers.\n * 99% of the time, the leftOffsetLimit is a very specific decimal number, so we calculate it\n * on `Init` and reference it on `Drag` events when necessary.\n */\n leftOffsetLimit: number;\n}\n\nfunction getMaxSlideDistance(mediaQuery: MediaQueryStrings): number {\n if (mediaQuery === MediaQueryStrings.XS)\n return 200;\n\n if (mediaQuery === MediaQueryStrings.SM || mediaQuery === MediaQueryStrings.MD)\n return 350;\n\n return 500;\n}\n\n/**\n * `null` values are initialized in the `Init` action. This is dispatched\n * later, because it uses JQuery elements that aren't immediately available\n * when `useReducer` is called.\n */\nexport const initialSliderState: DynamicWidgetState = {\n offset: 0,\n containerLeftPosition: null,\n containerRightPosition: null,\n firstElementPosition: null,\n lastElementPosition: null,\n hideLeftButton: true,\n hideRightButton: true,\n maxSlideDistance: 0,\n leftOffsetLimit: null\n};\n\ninterface InitPayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onInit = (payload: InitPayload): DynamicWidgetState => {\n const { container, lastElement } = payload.elementRefs;\n\n if (!container?.current || !lastElement?.current)\n return initialSliderState;\n\n const containerRect = container.current.getBoundingClientRect();\n const containerLeftPosition = containerRect.left;\n const containerRightPosition = containerRect.right;\n\n const firstElementPosition = containerLeftPosition;\n const lastElementPosition = lastElement.current.getBoundingClientRect().right;\n const leftOffsetLimit = containerRightPosition - lastElementPosition;\n\n return {\n ...initialSliderState,\n containerLeftPosition,\n containerRightPosition,\n firstElementPosition,\n lastElementPosition,\n hideRightButton: lastElementPosition < containerRightPosition,\n leftOffsetLimit,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\ninterface ResizePayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onResize = (payload: ResizePayload): DynamicWidgetState => {\n const initialState = onInit({\n ...payload,\n ...payload.elementRefs\n });\n\n return {\n ...initialState,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\nconst onNext = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { firstElementPosition, lastElementPosition, maxSlideDistance, offset, containerRightPosition } = prevState;\n\n /**\n * The distance in pixels that the slider will move along the x-axis.\n * This will be the `maxSlideDistance` constant value, or if that value is too large we calculate\n * the remaining overflowing space and only slide by that amount.\n */\n const slideDistance = lastElementPosition - containerRightPosition >= maxSlideDistance\n ? maxSlideDistance\n : lastElementPosition - containerRightPosition;\n\n return {\n firstElementPosition: firstElementPosition - slideDistance,\n lastElementPosition: lastElementPosition - slideDistance,\n offset: offset - slideDistance,\n hideRightButton: lastElementPosition - slideDistance === containerRightPosition,\n hideLeftButton: false\n };\n};\n\nconst onPrevious = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { containerLeftPosition, firstElementPosition, lastElementPosition, maxSlideDistance, offset } = prevState;\n\n const fullSlide = firstElementPosition + maxSlideDistance <= containerLeftPosition;\n const slideDistance = fullSlide ? maxSlideDistance : Math.abs(offset);\n\n return {\n firstElementPosition: firstElementPosition + slideDistance,\n lastElementPosition: lastElementPosition + slideDistance,\n offset: offset + slideDistance,\n hideLeftButton: !fullSlide || firstElementPosition + slideDistance === containerLeftPosition,\n hideRightButton: false\n };\n};\n\nconst onDrag = (prevState: DynamicWidgetState, payload: any): Partial<DynamicWidgetState> => {\n const { widgetSnapshot, currentMouseX } = payload;\n\n // Disable dragging if the slider isn't long enough\n if (widgetSnapshot.hideLeftButton && widgetSnapshot.hideRightButton)\n return {};\n\n // The distance from the initial `MouseDown` event x-coordinate, to the present x-coordinate\n const dragDistance = widgetSnapshot.initialMouseX - currentMouseX;\n\n let offset = widgetSnapshot.offset - dragDistance;\n let firstElementPosition = widgetSnapshot.firstElementPosition - dragDistance;\n let lastElementPosition = widgetSnapshot.lastElementPosition - dragDistance;\n let hideLeftButton = false;\n let hideRightButton = false;\n\n if (firstElementPosition > prevState.containerLeftPosition) {\n offset = 0;\n firstElementPosition = prevState.containerLeftPosition;\n lastElementPosition = prevState.lastElementPosition;\n hideLeftButton = true;\n }\n\n if (lastElementPosition <= prevState.containerRightPosition) {\n offset = prevState.leftOffsetLimit;\n firstElementPosition = prevState.containerLeftPosition - Math.abs(prevState.leftOffsetLimit);\n lastElementPosition = widgetSnapshot.containerRightPosition;\n hideRightButton = true;\n }\n\n return {\n offset,\n firstElementPosition,\n lastElementPosition,\n hideLeftButton,\n hideRightButton\n };\n};\n\nexport function DynamicWidgetReducer(\n prevState: DynamicWidgetState,\n action: ReducerActions<WidgetInteraction>\n): DynamicWidgetState {\n switch (action.type) {\n case WidgetInteraction.Init:\n return {\n ...prevState,\n ...onInit(action.payload)\n };\n\n case WidgetInteraction.Resize:\n return {\n ...prevState,\n ...onResize(action.payload)\n };\n\n case WidgetInteraction.Next:\n return {\n ...prevState,\n ...onNext(prevState)\n };\n\n case WidgetInteraction.Previous:\n return {\n ...prevState,\n ...onPrevious(prevState)\n };\n\n case WidgetInteraction.Drag:\n return {\n ...prevState,\n ...onDrag(prevState, action.payload)\n };\n\n default:\n return prevState;\n }\n}","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { useWidgetKeyboard } from 'libs/shared/components/widgets/hooks/useWidgetKeyboard';\nimport { SlidingListContainer } from 'libs/shared/components/widgets/sliding-list/SlidingListContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\nimport { PartialLoadingHelper, PartialLoadingOptions } from 'libs/shared/utils/PartialLoadingHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport { getDragEndHandler, getDragHandler, getResizeEndHandler, getResizeHandler } from './DynamicWidgetEventHandlers';\nimport { DynamicWidgetReducer, DynamicWidgetState, initialSliderState } from './DynamicWidgetReducer';\n\nimport styles from './dynamic-widget.module.scss';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\ninterface StaticChild {\n position: 'start' | 'end';\n component: React.ElementType;\n}\n\ninterface DynamicWidgetProps {\n id?: string;\n childComponent: React.ElementType;\n childComponentProps?: any;\n partialLoadingComponent: React.ElementType;\n partialLoadingOptions?: PartialLoadingOptions;\n\n widgetDataDeps?: (any)[];\n getChildAppLink?: (data: any) => Core.AppLink;\n\n staticChildren?: StaticChild[];\n collection?: BaseObject[];\n fetch?: (...args: any[]) => any;\n lazyLoad?: boolean;\n\n heading?: string;\n headingAppLink?: Core.AppLink;\n description?: string;\n getSubtitle?: (data: any) => string\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n getWidgetItemAnalyticsData?: (data: any) => HashObject;\n hideButtons?: boolean;\n childClassName?: string;\n // set to true if the widget get cut off by the container\n noNegativePadding?: boolean;\n}\n\nDynamicWidget.defaultProps = {\n heading: '',\n description: '',\n childComponentProps: {}\n};\n\nexport function DynamicWidget(props: DynamicWidgetProps): JSX.Element {\n const { childComponent: WidgetItemComponent, staticChildren, getWidgetItemAnalyticsData = () => {} } = props;\n\n const [ state, dispatch ] = React.useReducer(DynamicWidgetReducer, initialSliderState);\n\n // A snapshot of the widget state is captured on the very first `Drag` event as a point of reference\n const [ widgetSnapshot, setWidgetSnapshot ] = React.useState<WidgetSnapshot>(null);\n\n const elementRefs: SlidingListRefs = {\n container: React.useRef(null),\n firstElement: React.useRef(null),\n lastElement: React.useRef(null)\n };\n\n const mediaQuery = useGetMediaQueryString();\n const isTouchScreen = UserAgentHelper.isTabletOrMobile();\n \n const { dynamicAttributes, focusNext, focusPrev, onFocusWidget, onBlurWidget } = useWidgetKeyboard({ type: 'dynamic', state, containerRef: elementRefs.container, mediaQuery });\n\n useResizeListener(\n getResizeHandler(elementRefs, dispatch, mediaQuery),\n getResizeEndHandler(elementRefs.container),\n [mediaQuery]\n );\n\n const { ref, inView } = useLazyLoad({ prevent: !props.lazyLoad });\n\n let widgetData = props.collection;\n\n if (!props.collection && FunctionHelper.isFunction(props.fetch)) {\n const request = props.fetch(inView);\n widgetData = request.data;\n }\n\n /**\n * Once the widget data has been set, we can initialize the reducer. This is because\n * the reducer depends on the refs being set, but they don't get set until the markup has been loaded.\n */\n React.useEffect(() => {\n if (!widgetData || ObjectHelper.isEmpty(widgetData))\n return;\n\n dispatch({\n type: WidgetInteraction.Init,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n }, [widgetData]);\n\n function getWidgetItems(): JSX.Element {\n if (!widgetData)\n return;\n\n const firstChildren = staticChildren?.filter(child => child.position === 'start') ?? [];\n const lastChildren = staticChildren?.filter(child => child.position === 'end') ?? [];\n\n let items = widgetData.map((widgetItem, index) => {\n let itemRef: React.MutableRefObject<HTMLLIElement>;\n\n if (widgetItem === ArrayHelper.first(widgetData) && firstChildren?.length)\n itemRef = elementRefs.firstElement;\n\n if (widgetItem === ArrayHelper.last(widgetData) && !lastChildren?.length)\n itemRef = elementRefs.lastElement;\n\n const isLast = index + 1 === widgetData.length;\n\n return (\n <li\n id={widgetItem.id}\n key={widgetItem.id}\n ref={itemRef}\n onFocus={() => onFocusWidget(index)}\n onBlur={() => onBlurWidget()}\n className={`${styles.itemSpacing} ${props.childClassName || ''} ${(isLast && isTouchScreen) ? 'pe-4' : ''}`}\n {...dynamicAttributes[widgetItem.id]}\n >\n <WidgetItemComponent\n getChildAppLink={props.getChildAppLink}\n data={widgetItem}\n getSubtitle={props.getSubtitle}\n analyticsData={{\n itemIndex: index,\n ...props.analyticsData,\n ...getWidgetItemAnalyticsData(widgetItem)\n }}\n analyticsOptions={{ ...props?.analyticsOptions, ...WidgetHelper.getSliderItemAnalyticsOptions() }}\n {...props.childComponentProps}\n />\n </li>\n );\n });\n\n if (firstChildren.length) {\n items = [\n ...firstChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`first-widget-component:${i}`}\n ref={i === 0 ? elementRefs.firstElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n }),\n ...items\n ];\n }\n\n if (lastChildren.length) {\n items = [\n ...items,\n ...lastChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`end-widget-component:${i}`}\n ref={i === lastChildren.length - 1 ? elementRefs.lastElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n })\n ];\n }\n\n return <>{items}</>;\n }\n const widgetItems = React.useMemo(getWidgetItems, [\n widgetData, dynamicAttributes, state.offset, mediaQuery, ...props.widgetDataDeps || []\n ]);\n\n if (widgetData && !widgetData.length && !staticChildren?.length)\n return <></>;\n\n if (!widgetData || ObjectHelper.isEmpty(widgetData)) {\n return (\n <div ref={ref}>\n <PartialDynamicWidget\n partialLoadingComponent={props.partialLoadingComponent}\n partialLoadingOptions={props.partialLoadingOptions}\n />\n </div>\n );\n }\n\n const getSliderAnalyticsData = (type: WidgetInteraction) => ({\n ...props.analyticsData,\n id: props.id,\n name: props.heading,\n direction: type === WidgetInteraction.Next ? 'right' : 'left'\n });\n\n const hideButtons = isTouchScreen || props.hideButtons;\n\n return (\n <div className={`${props.noNegativePadding ? '' : 'mx-n4'}`}>\n <div className={`px-4 ${styles.header}`}>\n <WidgetHeader\n name={props.heading}\n description={props.description}\n appLink={props.headingAppLink}\n showSeeMoreLink={!!props.headingAppLink}\n />\n </div>\n\n <div className='position-relative'>\n <div className={`${props.noNegativePadding ? '' : 'px-4' } py-3 my-n3 position-relative ${isTouchScreen ? styles.mobileScroll : 'overflow-hidden-x'}`}>\n <div className={`position-relative ${props.hideButtons ? 'overflow-hidden-x' : ''}`}>\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => {\n focusPrev();\n\n dispatch({ type: WidgetInteraction.Previous });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Previous),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n leftButtonClassName={`${styles.leftButton} ${props.noNegativePadding ? styles.leftButtonNoPadding : ''}`}\n leftGradientClassName={`${styles.leftGradient} ${props.noNegativePadding ? styles.leftGradientNoPadding : ''}`}\n hide={state.hideLeftButton}\n useGradientBackdrop\n />\n )}\n\n <SlidingListContainer\n position={state.offset}\n positionType={CssMeasurement.Pixels}\n onDrag={getDragHandler(elementRefs.container, state, dispatch, widgetSnapshot, setWidgetSnapshot)}\n onDragEnd={getDragEndHandler(elementRefs.container, setWidgetSnapshot)}\n ref={elementRefs.container}\n >\n {widgetItems}\n </SlidingListContainer>\n\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => {\n focusNext();\n\n dispatch({ type: WidgetInteraction.Next });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Next),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n hide={state.hideRightButton}\n rightButtonClassName={`${styles.rightButton} ${props.noNegativePadding ? styles.rightButtonNoPadding : ''}`}\n rightGradientClassName={`${styles.rightGradient} ${props.noNegativePadding ? styles.rightGradientNoPadding : ''}`}\n useGradientBackdrop\n />\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ntype PartialDynamicWidgetProps = Pick<DynamicWidgetProps, 'partialLoadingComponent'> & {\n partialLoadingOptions?: PartialLoadingOptions;\n}\n\nexport const PartialDynamicWidget = (props: PartialDynamicWidgetProps) => {\n const { partialLoadingComponent: Component, partialLoadingOptions } = props;\n\n return (\n <div className='d-flex flex-nowrap overflow-hidden'>\n {PartialLoadingHelper.getPartialLoadingItems(partialLoadingOptions).map((item, idx) => <Component key={idx} />)}\n </div>\n );\n};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { TagItem } from 'libs/shared/components/tags/TagItem';\nimport { BaseObject, Tag } from 'libs/shared/interfaces';\n\nexport interface TagWidgetItemProps {\n appLink: Core.AppLink;\n data: Tag;\n selectedItems?: BaseObject[];\n onClick?: (data: Tag | FilterOption) => void;\n}\n\nexport function TagWidgetItem(props: TagWidgetItemProps): JSX.Element {\n const isSelected = props.selectedItems.find(selection => selection.id === props.data.id);\n\n const colorClass = isSelected ? `bg-gray-900 text-white` : 'bg-light';\n\n return (\n <TagItem\n tag={props.data}\n appLink={props.appLink}\n tagClass={`no-decoration ${colorClass} lh-1`}\n onClick={() => props.onClick(props.data)}\n />\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { PartialTagItem } from 'libs/shared/components/tags/PartialTagItem';\nimport { DynamicWidget } from 'libs/shared/components/widgets/dynamic-widget/DynamicWidget';\nimport { TagWidgetItem, TagWidgetItemProps } from 'libs/shared/components/widgets/items/tag-widget-item/TagWidgetItem';\n\nimport styles from './tag-filter.module.scss';\n\ninterface TagFilterProps {\n filter: SearchFilter;\n queryParams: HashObject;\n isFetching?: boolean;\n}\n\nexport function TagFilter(props: TagFilterProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n if (!props.filter?.id)\n return <></>;\n\n const currentFilterState = state[props.filter.id];\n\n const { selection: selections } = currentFilterState;\n\n const unappliedOptions = props.filter?.options?.filter(opt => {\n return !selections?.find(selection => selection.id === opt.id);\n }) ?? [];\n\n function onClickOption(option: FilterOption): void {\n let nextFilterState: FilterState = null;\n\n let indexOfItem: number = -1;\n\n // Find the index of the selected item if it's already selected\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n if (indexOfItem >= 0) {\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n \n nextFilterState = {\n active: !!newItems.length,\n selection: newItems\n };\n } else {\n nextFilterState = {\n active: true,\n selection: selections.concat(option)\n };\n }\n\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: nextFilterState },\n state.appLink\n );\n }\n\n function getContainerClass(): string {\n let className = 'mb-3';\n\n if (collection.length && props.isFetching)\n className += ' mt-n1';\n else if (!collection.length && !props.isFetching)\n className += ' d-none';\n\n return className;\n }\n\n const collection = [ ...selections, ...(props.isFetching ? [] : unappliedOptions) ];\n\n return (\n <div className={(props.isFetching || collection.length) ? 'py-2' : ''}>\n <div className={getContainerClass()}>\n {(!!collection.length || props.isFetching) && (\n <DynamicWidget\n collection={collection}\n childComponent={(props: TagWidgetItemProps) => (\n <TagWidgetItem\n {...props}\n selectedItems={selections}\n onClick={onClickOption}\n />\n )}\n staticChildren={props.isFetching\n ? new Array(3).fill({\n component: () => <PartialTagItem tagClass={styles.tagItem} />,\n position: 'end'\n })\n : []\n }\n partialLoadingComponent={() => (\n <div className='me-2'>\n <PartialTagItem tagClass={`${styles.tagItem}`} />\n </div>\n )}\n />\n )}\n </div>\n </div>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { MoreFilters, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext } from 'libs/shared/apps/search/reducers';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { SEARCH_CURRICULUM_CODE_PARAM } from '../../utils/SharedSearchHelper';\n\ntype ResetButtonProps = PropsWithAnalyticsOptions<{\n currentQueryParam: string;\n mainFilters: Array<SearchFilter>;\n moreFilters: MoreFilters;\n alignLeft?: boolean;\n}>;\n\nexport function ResetButton(props: ResetButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n const onClickReset = () => {\n const currentParams = (ContextService.getCurrentRoute().appLink?.params ?? {}) as HashObject;\n const savedParams = ObjectHelper.pick(currentParams, [ 'query', SEARCH_CURRICULUM_CODE_PARAM ]);\n\n Core.AppLinkHelper.trigger({\n ...state.appLink,\n params: savedParams\n });\n };\n\n return (\n <DivButton\n onClick={onClickReset}\n className={`${props.alignLeft ? 'order-first' : ''} hover-text-underline cursor-pointer d-flex align-items-center mx-2`}\n >\n <Text namespace='search.resetButton' phrase='reset' />\n </DivButton>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterButton } from 'libs/shared/apps/search/components/filter-button/FilterButton';\nimport { MoreFiltersButton } from 'libs/shared/apps/search/components/filter-button/MoreFiltersButton';\nimport { TagFilter } from 'libs/shared/apps/search/components/filter-types/tag-filter/TagFilter';\nimport { ResetButton } from 'libs/shared/apps/search/components/reset-button/ResetButton';\nimport { MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterReducer } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport styles from './search-filters.module.scss';\n\ntype SearchFiltersProps = {\n queryParams: HashObject;\n mainFilters: SearchFilter[];\n appLink: Core.AppLink;\n moreFilters?: MoreFilters;\n isFetchingOptions?: boolean;\n constantIndices?: SearchIndices[];\n analyticsOptions?: AnalyticsOptions;\n\n hideHeading?: boolean;\n hideDivider?: boolean;\n hideResetButton?: boolean;\n alignResetButtonLeft?: boolean;\n hideCaret?: boolean;\n\n /**\n * Incremental changes flag for new search\n */\n _hasNewSearch?: boolean;\n};\n\nexport function SearchFilters(props: SearchFiltersProps): JSX.Element {\n const { queryParams, appLink, hideHeading, isFetchingOptions, constantIndices = []} = props;\n\n const newState = React.useMemo(() => {\n return FilterHelper.deriveInitialStateFromQuery(queryParams, props.mainFilters, props.moreFilters, appLink);\n }, [ queryParams, isFetchingOptions ]);\n\n const [ state, dispatch ] = React.useReducer(FilterReducer, newState);\n\n React.useEffect(() => {\n if (ObjectHelper.isEqual(newState, state))\n return;\n\n dispatch({\n type: 'update',\n payload: newState\n });\n\n if (props.analyticsOptions) {\n FilterHelper.logFilterEvent(\n props.mainFilters,\n props.moreFilters,\n newState,\n queryParams.query,\n props.analyticsOptions\n );\n }\n }, [newState]);\n\n const indices = ArrayHelper.uniq([\n ...FilterHelper.getAppliedIndices(queryParams, props._hasNewSearch),\n ...constantIndices\n ]);\n\n const { mainFilters, moreFilters } = FilterHelper.mixinDisabledFields(\n state,\n indices,\n props.mainFilters,\n props.moreFilters\n );\n\n // Separate the tag filter as it's rendered differently\n const mainFiltersWithoutTags = mainFilters.filter(f => f.type !== 'tag');\n const tagFilter = mainFilters.find(f => f.type === 'tag');\n\n return (\n <FilterContext.Provider value={{ state, dispatch }}>\n <LanguageNamespaceContext.Provider value='search.searchFilters'>\n <section>\n <div className={classNames(\n 'd-flex',\n !props.hideDivider && 'border-bottom pb-3 mb-3',\n (props._hasNewSearch && props.hideDivider && 'pb-3'),\n (props._hasNewSearch && !props.hideDivider && 'border-gray-300')\n )}>\n {!hideHeading && (\n <h2 className='h5 mb-0 d-inline-block pe-2 border-end d-flex align-items-center'>\n <Text phrase='heading' />\n </h2>\n )}\n\n <div className={classNames(`d-flex flex-wrap ${styles.filtersContainer}`, !hideHeading && 'ms-2')}>\n {mainFiltersWithoutTags.map(f => (\n <FilterButton key={f.id} filter={f} hideCaret={props.hideCaret} />\n ))}\n\n {moreFilters && <MoreFiltersButton filter={moreFilters} />}\n\n {FilterHelper.hasActiveFilters(queryParams) && !props.hideResetButton && (\n <ResetButton\n mainFilters={props.mainFilters}\n moreFilters={props.moreFilters}\n currentQueryParam={queryParams.query}\n analyticsOptions={props.analyticsOptions}\n alignLeft={props.alignResetButtonLeft}\n />\n )}\n </div>\n </div>\n \n <TagFilter\n filter={tagFilter}\n queryParams={queryParams}\n isFetching={props.isFetchingOptions}\n />\n </section>\n </LanguageNamespaceContext.Provider>\n </FilterContext.Provider>\n );\n}\n"],"names":["SpecialEventType","AllSearchIndicesVideoStyle","AllSearchIndicesInSearch","AllSearchIndicesInUserManager","namespace","FilterActions","props","jsx","DivButton","Text","FilterContext","createContext","FilterReducer","state","action","FilterDropdownTitle","CheckboxFilterList","selections","onToggleItem","option","isCurrentlyChecked","indexOfItem","selection","i","newItems","options","isDisabled","isChecked","s","joinedIds","Checkbox","CheckboxFilter","displayOptionsIn2Columns","FilterHelper","jsxs","Fragment","Form","NestedFilterOptions","allOptions","firstLayerOption","isFirstLayerOptionDisabled","currentSelection","_a","secondLayerOptions","isFirstLayerIndeterminate","getIsFirstLayerIndeterminate","isFirstLayerOptionChecked","secondLayerOption","isSecondLayerOptionDisabled","isSecondLayerOptionChecked","hasSecondLayerSelection","allSecondLayerOptionsChecked","_b","SecondLayerOptions","NestedCheckboxFilter","selectedOption","isCurrentlyCheckedOrIndeterminate","indexOfOption","o","enabled2ndLayerOptions","newSelectedOptionWith2ndLayerOptions","newSelection","firstLayer","ArrayHelper","selectionItem","onToggleChildItem","parentOption","indexOfParentOption","newChildSelection","newParentSelection","new2ndLayerSelection","SwitchFilter","isActive","onToggle","ToggleSwitch","DropdownFilter","onSelect","Dropdown","RadioFilter","isSelected","styles","RatingButton","ref","isHovering","useHover","React","button","Tooltip","RatingRangeSelector","hoverRange","setHoverRange","getRange","rating","r","onClickRating","onHover","ButtonGroup","RatingFilter","onSelectRange","range","filteredRatings","firstRating","lastRating","className","FilterConstants","getPhrase","LanguageService","LIBRARY_FILTER","getTypeMap","libraries","prev","next","SourceFilterHelper","opts","isLearner","isGuest","hasCustomLibraries","libraryTypes","MasterObjectTypes","SourceFilterOptions","val","acc","value","libraryIds","CustomerStatus","CustomerStatusString","SpecialEventTypeLabelMap","WizardActionInfoContainer","BulkUserActivationActionInfo","UserGroup","BulkUserActivationEmailActionInfo","BulkAddToClassroomActionInfo","BulkChangeYearGroupActionInfo","BulkUserDeleteActionInfo","BulkUserRemoveActionInfo","BulkUserResetEmailActionInfo","BulkResetPasswordActionInfo","BulkUserYearGroupRolloverActionInfo","CheckCircleSvg","UserStatusBadge","UserHelper","ObjectStatus","_c","_d","_e","BasicUserDetails","user","currentUser","SvgContainer","getBadgeText","_f","_g","_i","_h","UserRole","_k","_j","RoleOrYearGroup","badgeText","UserItemAvatar","Avatar","BulkUserActionsErroredUserItem","UserManagerClient","WizardLayoutContext","BatchDataType","BatchJobName","BatchJobResultErrorCode","BatchJobType","KeySvg","BulkUserActionsHelper","userType","userCount","appLinks","actions","reviewAccountsAction","allowYearGroupRollover","countsByStatus","client","products","yearGroups","hasClassroomsFeature","FolderSvg","disableDeleteAction","ProductId","DeleteSvg","GroupSvg","EmailSvg","ClassroomsSvg","GraduationCapSvg","getYearGroupRolloverDisabledTooltip","a","b","subAction","actionDetailsActions","key","confirmationAppLinks","statusAppLinks","object","imageCdnUrl","errorMessage","errorCode","viewModel","customerId","getYearGroupRolloverJobMetadata","getChangeYearGroupJobMetadata","setupBaseJobMetadata","getDeactivateUsersJobMetadata","getAddToClassroomJobMetadata","getResetPasswordJobMetadata","Core.ErrorHelper","DevError","onClickConfirm","setOnClickConfirm","useViewModel","SharedViewModelKeys","alerts","useAlerts","dataType","type","params","MasterType","metadata","status","DateHelper","id","mapOptionToDurationRange","phraseKey","DurationOption","DurationFilter","onClickDuration","duration","MoviesAndTvFilter","filter","currentFilterState","isFloating","setIsFloating","activeRef","applyFilter","newState","GroupedCheckboxFilter","optionGroups","groupName","ClassificationFilterHelper","selectedId","DurationFilterHelper","PresentationFilterHelper","filterOptions","queryParams","getSelectedOptions","audienceSelection","secondLayerSelection","ProductionYearFilterHelper","currentYear","RatingFilterHelper","ratingOptions","ratingRange","getRatingsFromFrontendQuery","highestRating","first","last","ratings","selectedRatings","studentYearGroup","foundRatings","code","TwoColumnFilters","ValidIndices","Filters","labelPrefix","_hasNewSearch","getMappedPresentationOptions","url","extraUrl","inaccessibleIndices","maxRating","customer","countryCode","hasOrg","description","channels","categories","opt","TopicsConstants","presentationFilter","filters","mainFilters","moreFilters","appLink","initialStates","getFilterSelectionsFromQueryParams","reduceFunc","filterState","derivedState","paramKeys","q","SEARCH_CURRICULUM_CODE_PARAM","count","firstLayerSelection","availableOptions","index","filterStates","updatedParams","param","active","isDefault","secondaryParam","ids","ObjectHelper","presentationIds","defaultParams","paramName","values","FilterWhitelist","CurationTag","indices","newIndices","validateIndices","indice","extraIndices","draftState","baseAppLink","payload","filterId","f","draftFilterState","isDefaultValue","currentQueryParams","Core.LocationUtils","Core.AppLinkHelper","allFilters","disableFilters","disableFilterOptions","response","query","analyticsOptions","analyticsFilterObjects","FilterDescriptor","AnalyticsHelper","WorkflowPhase","UserAction","y","channel","CustomerType","CustomerTypeString","category","appliedIndices","activeFilterIds","shouldDisableFilter","activeFilterId","activeFilter","activeFilterIndices","FunctionHelper","getCustomWidthClass","FilterButton","React.useContext","isDropdownFilter","label","setLabel","React.useState","showDropdown","setShowDropdown","setDraftState","React.useEffect","onSelectItem","onClickReset","defaultOption","onClickApply","onToggleDropdown","isShowing","FilterComponent","React.useMemo","baseClass","caretClass","customWidthClass","StateHelper","setState","callback","data","fn","getTotalActiveFilters","currentState","MoreFiltersButton","totalActiveFilters","setTotalActiveFilters","currentFilterStateKey","e","PartialTagItem","tagClass","classNames","SLIDER_ANIMATION_TIME","useWidgetKeyboard","containerRef","mediaQuery","isTabbing","setIsTabbing","dynamicAttributes","setDynamicAttributes","focusedWidgetIndex","setFocusedWidgetIndex","isTouch","UserAgentHelper","getDynamicAttributes","dynamicWidgetState","focusableItems","item","rect","isItemVisable","getFixedAttributes","fixedWidgetState","focusNext","items","nextFocusableElement","focusPrev","prevFocusableElement","onFocusWidget","onBlurWidget","CssMeasurement","blankImage","DragHelper","event","isTouchScreen","getPositionStyling","xPosition","measurement","dragPercentage","SlidingListContainer","React.forwardRef","children","positionType","onDrag","onDragEnd","onTouchMove","onTouchEnd","percentageDragged","position","getEventListeners","listenerProps","ChevronRightSvg","WidgetButtonDirection","WidgetButton","React.memo","isLeft","arrowSvg","ChevronLeftSvg","getPositionClass","getStyle","SvgContainerSize","WidgetInteraction","useResizeListener","onResize","onResizeEnd","dependencies","resizeTimeout","onResizeModified","getResizeHandler","elementRefs","dispatch","getResizeEndHandler","getDragHandler","widgetState","widgetSnapshot","setWidgetSnapshot","mouseX","snapshot","getDragEndHandler","getMaxSlideDistance","MediaQueryStrings","initialSliderState","onInit","container","lastElement","containerRect","containerLeftPosition","containerRightPosition","firstElementPosition","lastElementPosition","leftOffsetLimit","onNext","prevState","maxSlideDistance","offset","slideDistance","onPrevious","fullSlide","currentMouseX","dragDistance","hideLeftButton","hideRightButton","DynamicWidgetReducer","DynamicWidget","WidgetItemComponent","staticChildren","getWidgetItemAnalyticsData","React.useReducer","React.useRef","useGetMediaQueryString","inView","useLazyLoad","widgetData","getWidgetItems","firstChildren","child","lastChildren","widgetItem","itemRef","isLast","WidgetHelper","Component","widgetItems","PartialDynamicWidget","getSliderAnalyticsData","hideButtons","WidgetHeader","partialLoadingOptions","PartialLoadingHelper","idx","TagWidgetItem","colorClass","TagItem","TagFilter","unappliedOptions","onClickOption","nextFilterState","getContainerClass","collection","ResetButton","currentParams","ContextService","savedParams","SearchFilters","hideHeading","isFetchingOptions","constantIndices","mainFiltersWithoutTags","tagFilter","LanguageNamespaceContext"],"mappings":"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"}