@clickview/streamable-learning 0.34.1-dev.2 → 0.35.0-rc.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 (437) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/103-streamable-learning-5060b6cda5.chunk.css +7 -0
  3. package/dist/css/1269-streamable-learning-a12c4ebc99.chunk.css +2 -0
  4. package/dist/css/1457-streamable-learning-c8c8b3b9b1.chunk.css +50 -0
  5. package/dist/css/2334-streamable-learning-de03ae073a.chunk.css +2 -0
  6. package/dist/css/3322-streamable-learning-510e1aa3f3.chunk.css +34 -0
  7. package/dist/css/3838-streamable-learning-da10685fe8.chunk.css +22 -0
  8. package/dist/css/4254-streamable-learning-e493f4a027.chunk.css +2 -0
  9. package/dist/css/4607-streamable-learning-2605302fc2.chunk.css +90 -0
  10. package/dist/css/4772-streamable-learning-f83b838d71.chunk.css +9 -0
  11. package/dist/css/5003-streamable-learning-b38d2ddbbe.chunk.css +98 -0
  12. package/dist/css/5565-streamable-learning-0caae3809b.chunk.css +13 -0
  13. package/dist/css/6017-streamable-learning-098a205d01.chunk.css +6 -0
  14. package/dist/css/6356-streamable-learning-8c5b220bf6.chunk.css +1 -0
  15. package/dist/css/6987-streamable-learning-8f682301c6.chunk.css +1 -0
  16. package/dist/css/7317-streamable-learning-b5d226bbb6.chunk.css +5 -0
  17. package/dist/css/8058-streamable-learning-539cf7be18.chunk.css +12 -0
  18. package/dist/css/8294-streamable-learning-c797263ac2.chunk.css +1 -0
  19. package/dist/css/8496-streamable-learning-ce19f6ca52.chunk.css +13 -0
  20. package/dist/css/8601-streamable-learning-f525210660.chunk.css +6 -0
  21. package/dist/css/9514-streamable-learning-251703c6d1.chunk.css +2 -0
  22. package/dist/css/9766-streamable-learning-31650ffe5d.chunk.css +8 -0
  23. package/dist/css/9842-streamable-learning-24729103f7.chunk.css +4 -0
  24. package/dist/css/9899-streamable-learning-0338f8d2dc.chunk.css +4 -0
  25. package/dist/css/streamable-learning-dd0c1095d5.css +23 -0
  26. package/dist/languages/en.json +1 -0
  27. package/dist/scripts/103-aceced8961-streamable-learning.chunk.js +1 -0
  28. package/dist/scripts/1097-680a971192-streamable-learning.chunk.js +2 -0
  29. package/dist/scripts/1097-680a971192-streamable-learning.chunk.js.LICENSE.txt +105 -0
  30. package/dist/scripts/1269-2d0b903343-streamable-learning.chunk.js +2 -0
  31. package/dist/scripts/1269-2d0b903343-streamable-learning.chunk.js.LICENSE.txt +1 -0
  32. package/dist/scripts/1457-899f40d09a-streamable-learning.chunk.js +1 -0
  33. package/dist/scripts/1482-b1dd75897c-streamable-learning.chunk.js +1 -0
  34. package/dist/scripts/1934-fc017df0da-streamable-learning.chunk.js +2 -0
  35. package/dist/scripts/1934-fc017df0da-streamable-learning.chunk.js.LICENSE.txt +9 -0
  36. package/dist/scripts/2042-d51622d63e-streamable-learning.chunk.js +1 -0
  37. package/dist/scripts/2087-eba9033b1c-streamable-learning.chunk.js +1 -0
  38. package/dist/scripts/2245-8cd3224e1b-streamable-learning.chunk.js +1 -0
  39. package/dist/scripts/2334-00b028191d-streamable-learning.chunk.js +1 -0
  40. package/dist/scripts/2676-c842ec7e8d-streamable-learning.chunk.js +2 -0
  41. package/dist/scripts/2676-c842ec7e8d-streamable-learning.chunk.js.LICENSE.txt +1 -0
  42. package/dist/scripts/2877-5ffc9711f6-streamable-learning.chunk.js +1 -0
  43. package/dist/scripts/2911-2ec3a6600a-streamable-learning.chunk.js +1 -0
  44. package/dist/scripts/3057-731a8ca978-streamable-learning.chunk.js +1 -0
  45. package/dist/scripts/3093-efbcc927ea-streamable-learning.chunk.js +1 -0
  46. package/dist/scripts/3186-d1a6ccffde-streamable-learning.chunk.js +1 -0
  47. package/dist/scripts/3322-33c015dec9-streamable-learning.chunk.js +1 -0
  48. package/dist/scripts/3472-50ca92bde3-streamable-learning.chunk.js +1 -0
  49. package/dist/scripts/3838-4a38f33dc2-streamable-learning.chunk.js +1 -0
  50. package/dist/scripts/3941-2ef15ca9ac-streamable-learning.chunk.js +1 -0
  51. package/dist/scripts/4254-ef581b8105-streamable-learning.chunk.js +1 -0
  52. package/dist/scripts/4607-a4edb06dba-streamable-learning.chunk.js +2 -0
  53. package/dist/scripts/4607-a4edb06dba-streamable-learning.chunk.js.LICENSE.txt +1 -0
  54. package/dist/scripts/4772-3cb280f959-streamable-learning.chunk.js +2 -0
  55. package/dist/scripts/4772-3cb280f959-streamable-learning.chunk.js.LICENSE.txt +1 -0
  56. package/dist/scripts/4951-df701c6a8d-streamable-learning.chunk.js +1 -0
  57. package/dist/scripts/5003-7468a75d64-streamable-learning.chunk.js +2 -0
  58. package/dist/scripts/5003-7468a75d64-streamable-learning.chunk.js.LICENSE.txt +1 -0
  59. package/dist/scripts/5088-2e09e1ba6e-streamable-learning.chunk.js +1 -0
  60. package/dist/scripts/5173-a800a17d0d-streamable-learning.chunk.js +1 -0
  61. package/dist/scripts/5446-2cbe9f9d1b-streamable-learning.chunk.js +1 -0
  62. package/dist/scripts/5543-205aaa36a6-streamable-learning.chunk.js +1 -0
  63. package/dist/scripts/5565-224d86dc1b-streamable-learning.chunk.js +1 -0
  64. package/dist/scripts/578-2cc99f46f7-streamable-learning.chunk.js +1 -0
  65. package/dist/scripts/6017-5bd6f9bf7a-streamable-learning.chunk.js +2 -0
  66. package/dist/scripts/6017-5bd6f9bf7a-streamable-learning.chunk.js.LICENSE.txt +1 -0
  67. package/dist/scripts/6356-eefa3ff22e-streamable-learning.chunk.js +1 -0
  68. package/dist/scripts/6979-ef9a3931a2-streamable-learning.chunk.js +2 -0
  69. package/dist/scripts/6979-ef9a3931a2-streamable-learning.chunk.js.LICENSE.txt +1 -0
  70. package/dist/scripts/6987-e58de31cfe-streamable-learning.chunk.js +1 -0
  71. package/dist/scripts/7317-6b7186c85d-streamable-learning.chunk.js +1 -0
  72. package/dist/scripts/7347-772848ba8a-streamable-learning.chunk.js +1 -0
  73. package/dist/scripts/7570-cd4f70ff52-streamable-learning.chunk.js +2 -0
  74. package/dist/scripts/7570-cd4f70ff52-streamable-learning.chunk.js.LICENSE.txt +1 -0
  75. package/dist/scripts/7904-96574373ca-streamable-learning.chunk.js +1 -0
  76. package/dist/scripts/7925-1e1cfa2a04-streamable-learning.chunk.js +1 -0
  77. package/dist/scripts/8058-51c4b442d6-streamable-learning.chunk.js +1 -0
  78. package/dist/scripts/8126-9d09959b28-streamable-learning.chunk.js +2 -0
  79. package/dist/scripts/8126-9d09959b28-streamable-learning.chunk.js.LICENSE.txt +60 -0
  80. package/dist/scripts/8397-39ce77876d-streamable-learning.chunk.js +1 -0
  81. package/dist/scripts/8496-1b2519f9fd-streamable-learning.chunk.js +2 -0
  82. package/dist/scripts/8496-1b2519f9fd-streamable-learning.chunk.js.LICENSE.txt +1 -0
  83. package/dist/scripts/8599-b74e1ab6e3-streamable-learning.chunk.js +1 -0
  84. package/dist/scripts/8601-37783cf18b-streamable-learning.chunk.js +1 -0
  85. package/dist/scripts/8819-2a50dd6a9b-streamable-learning.chunk.js +1 -0
  86. package/dist/scripts/8937-5103db88d8-streamable-learning.chunk.js +1 -0
  87. package/dist/scripts/9390-bbaf07ad0f-streamable-learning.chunk.js +1 -0
  88. package/dist/scripts/9514-a31ca9af06-streamable-learning.chunk.js +1 -0
  89. package/dist/scripts/9766-48d72d9285-streamable-learning.chunk.js +2 -0
  90. package/dist/scripts/9766-48d72d9285-streamable-learning.chunk.js.LICENSE.txt +1 -0
  91. package/dist/scripts/9842-36d830ee87-streamable-learning.chunk.js +1 -0
  92. package/dist/scripts/9899-f33e8f1d43-streamable-learning.chunk.js +2 -0
  93. package/dist/scripts/9899-f33e8f1d43-streamable-learning.chunk.js.LICENSE.txt +1 -0
  94. package/dist/scripts/bundle-7ea4deeaa8.min.js +2 -0
  95. package/dist/scripts/bundle-7ea4deeaa8.min.js.LICENSE.txt +108 -0
  96. package/dist/scripts/pdf.worker.entry-a2092a6670.min.worker.js +2 -0
  97. package/dist/scripts/pdf.worker.entry-a2092a6670.min.worker.js.LICENSE.txt +21 -0
  98. package/package.json +3 -5
  99. package/typings/utils/imports.d.ts +1 -2
  100. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  101. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  102. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  103. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  104. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  105. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  106. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  107. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  108. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  109. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  110. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  111. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  112. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  113. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  114. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  115. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  116. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  117. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  118. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  119. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  120. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  121. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  122. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  123. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  124. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  125. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  126. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  127. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  128. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  129. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  130. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  131. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  132. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  133. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  134. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  135. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  136. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  137. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  138. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  139. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  140. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  141. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  142. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  143. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  144. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  145. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  146. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  147. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  148. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  149. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  150. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  151. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  152. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  153. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  154. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  155. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  156. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  157. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  158. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  159. package/dist/css/B-attovs.chunk.css +0 -9
  160. package/dist/css/B1NucFMn.chunk.css +0 -1
  161. package/dist/css/BPdg7JW4.chunk.css +0 -1
  162. package/dist/css/BPrUSCaY.chunk.css +0 -1
  163. package/dist/css/BR0fUt9D.chunk.css +0 -1
  164. package/dist/css/BhYm6SRm.chunk.css +0 -1
  165. package/dist/css/BiRz4h1c.chunk.css +0 -1
  166. package/dist/css/Bq1ChJn4.chunk.css +0 -1
  167. package/dist/css/Bt85j9js.chunk.css +0 -1
  168. package/dist/css/BuYrqi9E.chunk.css +0 -1
  169. package/dist/css/BugV1Bpa.chunk.css +0 -1
  170. package/dist/css/BuuVPl7n.chunk.css +0 -1
  171. package/dist/css/C1NkrNqQ.chunk.css +0 -1
  172. package/dist/css/C1qv5jz5.chunk.css +0 -1
  173. package/dist/css/C7XoyEPr.chunk.css +0 -1
  174. package/dist/css/C7_MDu56.chunk.css +0 -1
  175. package/dist/css/CC5F5C8O.chunk.css +0 -1
  176. package/dist/css/CChSC6Ta.chunk.css +0 -1
  177. package/dist/css/CCsCPLDG.chunk.css +0 -1
  178. package/dist/css/CD1qrI1T.chunk.css +0 -1
  179. package/dist/css/CKqvCBj4.chunk.css +0 -1
  180. package/dist/css/CLZ0Ycds.chunk.css +0 -1
  181. package/dist/css/CO7M4rZW.chunk.css +0 -1
  182. package/dist/css/CY0yvCW4.chunk.css +0 -1
  183. package/dist/css/CYGsw8FT.chunk.css +0 -1
  184. package/dist/css/Cbi3KYBa.chunk.css +0 -1
  185. package/dist/css/CliS8Q8r.chunk.css +0 -1
  186. package/dist/css/D-kQKsZN.chunk.css +0 -1
  187. package/dist/css/D2NwUVrK.chunk.css +0 -1
  188. package/dist/css/D4g1IoUU.chunk.css +0 -1
  189. package/dist/css/DBgpcO3T.chunk.css +0 -1
  190. package/dist/css/DDnpOnVB.chunk.css +0 -1
  191. package/dist/css/DZJSONGP.chunk.css +0 -1
  192. package/dist/css/Dc0zNt2E.chunk.css +0 -1
  193. package/dist/css/DeAfaPiD.chunk.css +0 -1
  194. package/dist/css/Dj731zLm.chunk.css +0 -1
  195. package/dist/css/DjPPxa0A.chunk.css +0 -1
  196. package/dist/css/DlOtoSz0.chunk.css +0 -1
  197. package/dist/css/DwduQat7.chunk.css +0 -1
  198. package/dist/css/Dzuu2GTx.chunk.css +0 -1
  199. package/dist/css/JAvsJreH.chunk.css +0 -1
  200. package/dist/css/NKlFYVOc.chunk.css +0 -1
  201. package/dist/css/VZd8qGtK.chunk.css +0 -1
  202. package/dist/css/Y7U--2na.chunk.css +0 -1
  203. package/dist/css/ir3IcK_l.chunk.css +0 -1
  204. package/dist/css/jbMisi9r.chunk.css +0 -1
  205. package/dist/css/kS5aDtIJ.chunk.css +0 -1
  206. package/dist/css/mqCL1o7m.chunk.css +0 -1
  207. package/dist/css/qZzkUeZk.chunk.css +0 -1
  208. package/dist/css/sC_H3yXE.chunk.css +0 -1
  209. package/dist/css/wR_6C_NV.chunk.css +0 -1
  210. package/dist/en.json +0 -1
  211. package/dist/scripts/7tlnqdEj.chunk.js +0 -2
  212. package/dist/scripts/7tlnqdEj.chunk.js.map +0 -1
  213. package/dist/scripts/82OY25pR.chunk.js +0 -2
  214. package/dist/scripts/82OY25pR.chunk.js.map +0 -1
  215. package/dist/scripts/8JOxjlae.chunk.js +0 -15
  216. package/dist/scripts/8JOxjlae.chunk.js.map +0 -1
  217. package/dist/scripts/B-_Kgmt0.chunk.js +0 -2
  218. package/dist/scripts/B-_Kgmt0.chunk.js.map +0 -1
  219. package/dist/scripts/B0KMLOp5.chunk.js +0 -2
  220. package/dist/scripts/B0KMLOp5.chunk.js.map +0 -1
  221. package/dist/scripts/B1QWJfPw.chunk.js +0 -3
  222. package/dist/scripts/B1QWJfPw.chunk.js.map +0 -1
  223. package/dist/scripts/B26T27lj.chunk.js +0 -2
  224. package/dist/scripts/B26T27lj.chunk.js.map +0 -1
  225. package/dist/scripts/B32lL5ga.chunk.js +0 -2
  226. package/dist/scripts/B32lL5ga.chunk.js.map +0 -1
  227. package/dist/scripts/B5lCwpXp.chunk.js +0 -2
  228. package/dist/scripts/B5lCwpXp.chunk.js.map +0 -1
  229. package/dist/scripts/B8qPNVvK.chunk.js +0 -2
  230. package/dist/scripts/B8qPNVvK.chunk.js.map +0 -1
  231. package/dist/scripts/BBnDr_iy.chunk.js +0 -2
  232. package/dist/scripts/BBnDr_iy.chunk.js.map +0 -1
  233. package/dist/scripts/BCQ0kOEO.chunk.js +0 -6
  234. package/dist/scripts/BCQ0kOEO.chunk.js.map +0 -1
  235. package/dist/scripts/BCyuhFou.chunk.js +0 -2
  236. package/dist/scripts/BCyuhFou.chunk.js.map +0 -1
  237. package/dist/scripts/BF7Uu3LW.chunk.js +0 -2
  238. package/dist/scripts/BF7Uu3LW.chunk.js.map +0 -1
  239. package/dist/scripts/BG6_Ss4G.chunk.js +0 -2
  240. package/dist/scripts/BG6_Ss4G.chunk.js.map +0 -1
  241. package/dist/scripts/BMrWb7Ku.chunk.js +0 -2
  242. package/dist/scripts/BMrWb7Ku.chunk.js.map +0 -1
  243. package/dist/scripts/BQH1xd9z.chunk.js +0 -2
  244. package/dist/scripts/BQH1xd9z.chunk.js.map +0 -1
  245. package/dist/scripts/BW1iqZG2.chunk.js +0 -2
  246. package/dist/scripts/BW1iqZG2.chunk.js.map +0 -1
  247. package/dist/scripts/BdHxGaRy.chunk.js +0 -2
  248. package/dist/scripts/BdHxGaRy.chunk.js.map +0 -1
  249. package/dist/scripts/BdniDID_.chunk.js +0 -2
  250. package/dist/scripts/BdniDID_.chunk.js.map +0 -1
  251. package/dist/scripts/BeTQIGnj.chunk.js +0 -2
  252. package/dist/scripts/BeTQIGnj.chunk.js.map +0 -1
  253. package/dist/scripts/Bf3WCYXw.chunk.js +0 -8
  254. package/dist/scripts/Bf3WCYXw.chunk.js.map +0 -1
  255. package/dist/scripts/Bh4NsrSi.chunk.js +0 -2
  256. package/dist/scripts/Bh4NsrSi.chunk.js.map +0 -1
  257. package/dist/scripts/BjOv-usB.chunk.js +0 -2
  258. package/dist/scripts/BjOv-usB.chunk.js.map +0 -1
  259. package/dist/scripts/BkGt8Gr1.chunk.js +0 -2
  260. package/dist/scripts/BkGt8Gr1.chunk.js.map +0 -1
  261. package/dist/scripts/BlFiywl_.chunk.js +0 -2
  262. package/dist/scripts/BlFiywl_.chunk.js.map +0 -1
  263. package/dist/scripts/BoNyBWaZ.chunk.js +0 -2
  264. package/dist/scripts/BoNyBWaZ.chunk.js.map +0 -1
  265. package/dist/scripts/Bvum7-8x.chunk.js +0 -8
  266. package/dist/scripts/Bvum7-8x.chunk.js.map +0 -1
  267. package/dist/scripts/BwDmMfAz.chunk.js +0 -2
  268. package/dist/scripts/BwDmMfAz.chunk.js.map +0 -1
  269. package/dist/scripts/BwgQZkdi.chunk.js +0 -2
  270. package/dist/scripts/BwgQZkdi.chunk.js.map +0 -1
  271. package/dist/scripts/C-7yn3rc.chunk.js +0 -2
  272. package/dist/scripts/C-7yn3rc.chunk.js.map +0 -1
  273. package/dist/scripts/C-pJ0Wi3.chunk.js +0 -2
  274. package/dist/scripts/C-pJ0Wi3.chunk.js.map +0 -1
  275. package/dist/scripts/C35NlkUr.chunk.js +0 -2
  276. package/dist/scripts/C35NlkUr.chunk.js.map +0 -1
  277. package/dist/scripts/C36-3UWl.chunk.js +0 -2
  278. package/dist/scripts/C36-3UWl.chunk.js.map +0 -1
  279. package/dist/scripts/C3fMNXil.chunk.js +0 -2
  280. package/dist/scripts/C3fMNXil.chunk.js.map +0 -1
  281. package/dist/scripts/C8Br2CdQ.chunk.js +0 -2
  282. package/dist/scripts/C8Br2CdQ.chunk.js.map +0 -1
  283. package/dist/scripts/CEmtkty-.chunk.js +0 -2
  284. package/dist/scripts/CEmtkty-.chunk.js.map +0 -1
  285. package/dist/scripts/CFs3kdQx.chunk.js +0 -53
  286. package/dist/scripts/CFs3kdQx.chunk.js.map +0 -1
  287. package/dist/scripts/CGNCg1fO.chunk.js +0 -2
  288. package/dist/scripts/CGNCg1fO.chunk.js.map +0 -1
  289. package/dist/scripts/CPXlV0fg.chunk.js +0 -2
  290. package/dist/scripts/CPXlV0fg.chunk.js.map +0 -1
  291. package/dist/scripts/CSoZBG8v.chunk.js +0 -2
  292. package/dist/scripts/CSoZBG8v.chunk.js.map +0 -1
  293. package/dist/scripts/CW7x8M-z.chunk.js +0 -2
  294. package/dist/scripts/CW7x8M-z.chunk.js.map +0 -1
  295. package/dist/scripts/CWHjB5Ye.chunk.js +0 -2
  296. package/dist/scripts/CWHjB5Ye.chunk.js.map +0 -1
  297. package/dist/scripts/CXslDtbb.chunk.js +0 -2
  298. package/dist/scripts/CXslDtbb.chunk.js.map +0 -1
  299. package/dist/scripts/CZLZ0bbA.chunk.js +0 -2
  300. package/dist/scripts/CZLZ0bbA.chunk.js.map +0 -1
  301. package/dist/scripts/CZafJWQk.chunk.js +0 -2
  302. package/dist/scripts/CZafJWQk.chunk.js.map +0 -1
  303. package/dist/scripts/CbFIe2Y6.chunk.js +0 -2
  304. package/dist/scripts/CbFIe2Y6.chunk.js.map +0 -1
  305. package/dist/scripts/Cg8SIDnK.chunk.js +0 -8
  306. package/dist/scripts/Cg8SIDnK.chunk.js.map +0 -1
  307. package/dist/scripts/Cib9o4sK.chunk.js +0 -2
  308. package/dist/scripts/Cib9o4sK.chunk.js.map +0 -1
  309. package/dist/scripts/Ciyuu-YU.chunk.js +0 -356
  310. package/dist/scripts/Ciyuu-YU.chunk.js.map +0 -1
  311. package/dist/scripts/CkMhHhda.chunk.js +0 -2
  312. package/dist/scripts/CkMhHhda.chunk.js.map +0 -1
  313. package/dist/scripts/CmAQo6rx.chunk.js +0 -2
  314. package/dist/scripts/CmAQo6rx.chunk.js.map +0 -1
  315. package/dist/scripts/CmcmWGL0.chunk.js +0 -2
  316. package/dist/scripts/CmcmWGL0.chunk.js.map +0 -1
  317. package/dist/scripts/Cmu1J2M7.chunk.js +0 -262
  318. package/dist/scripts/Cmu1J2M7.chunk.js.map +0 -1
  319. package/dist/scripts/CrkRNOU9.chunk.js +0 -2
  320. package/dist/scripts/CrkRNOU9.chunk.js.map +0 -1
  321. package/dist/scripts/CskJerl_.chunk.js +0 -2
  322. package/dist/scripts/CskJerl_.chunk.js.map +0 -1
  323. package/dist/scripts/Ct_IIxaS.chunk.js +0 -2
  324. package/dist/scripts/Ct_IIxaS.chunk.js.map +0 -1
  325. package/dist/scripts/Cuuw0EUi.chunk.js +0 -8
  326. package/dist/scripts/Cuuw0EUi.chunk.js.map +0 -1
  327. package/dist/scripts/Cz45aonc.chunk.js +0 -2
  328. package/dist/scripts/Cz45aonc.chunk.js.map +0 -1
  329. package/dist/scripts/D-I94wdL.chunk.js +0 -7
  330. package/dist/scripts/D-I94wdL.chunk.js.map +0 -1
  331. package/dist/scripts/D0UlXsF8.chunk.js +0 -2
  332. package/dist/scripts/D0UlXsF8.chunk.js.map +0 -1
  333. package/dist/scripts/D0cZC7S-.chunk.js +0 -2
  334. package/dist/scripts/D0cZC7S-.chunk.js.map +0 -1
  335. package/dist/scripts/D1D6Gqx1.chunk.js +0 -2
  336. package/dist/scripts/D1D6Gqx1.chunk.js.map +0 -1
  337. package/dist/scripts/D3tziVkG.chunk.js +0 -2
  338. package/dist/scripts/D3tziVkG.chunk.js.map +0 -1
  339. package/dist/scripts/D4MOOnR6.chunk.js +0 -2
  340. package/dist/scripts/D4MOOnR6.chunk.js.map +0 -1
  341. package/dist/scripts/D83kc0Wf.chunk.js +0 -2
  342. package/dist/scripts/D83kc0Wf.chunk.js.map +0 -1
  343. package/dist/scripts/D8dAIhzO.chunk.js +0 -2
  344. package/dist/scripts/D8dAIhzO.chunk.js.map +0 -1
  345. package/dist/scripts/DBp0J6X9.chunk.js +0 -2
  346. package/dist/scripts/DBp0J6X9.chunk.js.map +0 -1
  347. package/dist/scripts/DCds0mCy.chunk.js +0 -2
  348. package/dist/scripts/DCds0mCy.chunk.js.map +0 -1
  349. package/dist/scripts/DEwFBSVv.chunk.js +0 -2
  350. package/dist/scripts/DEwFBSVv.chunk.js.map +0 -1
  351. package/dist/scripts/DF55CDS8.chunk.js +0 -2
  352. package/dist/scripts/DF55CDS8.chunk.js.map +0 -1
  353. package/dist/scripts/DFw_xy-Y.chunk.js +0 -2
  354. package/dist/scripts/DFw_xy-Y.chunk.js.map +0 -1
  355. package/dist/scripts/DIGYepWa.chunk.js +0 -2
  356. package/dist/scripts/DIGYepWa.chunk.js.map +0 -1
  357. package/dist/scripts/DKeFeMvi.chunk.js +0 -2
  358. package/dist/scripts/DKeFeMvi.chunk.js.map +0 -1
  359. package/dist/scripts/DKqLfL60.chunk.js +0 -5
  360. package/dist/scripts/DKqLfL60.chunk.js.map +0 -1
  361. package/dist/scripts/DLJB8vZh.chunk.js +0 -2
  362. package/dist/scripts/DLJB8vZh.chunk.js.map +0 -1
  363. package/dist/scripts/DNtSrq_L.chunk.js +0 -2
  364. package/dist/scripts/DNtSrq_L.chunk.js.map +0 -1
  365. package/dist/scripts/DOHPsm0Q.chunk.js +0 -2
  366. package/dist/scripts/DOHPsm0Q.chunk.js.map +0 -1
  367. package/dist/scripts/DP-ErTOD.chunk.js +0 -2
  368. package/dist/scripts/DP-ErTOD.chunk.js.map +0 -1
  369. package/dist/scripts/DUwkrIwb.chunk.js +0 -2
  370. package/dist/scripts/DUwkrIwb.chunk.js.map +0 -1
  371. package/dist/scripts/DUyJfVnL.chunk.js +0 -2
  372. package/dist/scripts/DUyJfVnL.chunk.js.map +0 -1
  373. package/dist/scripts/DVfbSloY.chunk.js +0 -2
  374. package/dist/scripts/DVfbSloY.chunk.js.map +0 -1
  375. package/dist/scripts/DWvpibWQ.chunk.js +0 -2
  376. package/dist/scripts/DWvpibWQ.chunk.js.map +0 -1
  377. package/dist/scripts/DYmgSjx-.chunk.js +0 -10
  378. package/dist/scripts/DYmgSjx-.chunk.js.map +0 -1
  379. package/dist/scripts/D_EfITTc.chunk.js +0 -2
  380. package/dist/scripts/D_EfITTc.chunk.js.map +0 -1
  381. package/dist/scripts/DayWKE6G.chunk.js +0 -2
  382. package/dist/scripts/DayWKE6G.chunk.js.map +0 -1
  383. package/dist/scripts/DcOpKno_.chunk.js +0 -2
  384. package/dist/scripts/DcOpKno_.chunk.js.map +0 -1
  385. package/dist/scripts/DgMPP2NS.chunk.js +0 -2
  386. package/dist/scripts/DgMPP2NS.chunk.js.map +0 -1
  387. package/dist/scripts/DhWvZ3GP.chunk.js +0 -2
  388. package/dist/scripts/DhWvZ3GP.chunk.js.map +0 -1
  389. package/dist/scripts/Digrmnl9.chunk.js +0 -2
  390. package/dist/scripts/Digrmnl9.chunk.js.map +0 -1
  391. package/dist/scripts/DjWOPQVv.chunk.js +0 -2
  392. package/dist/scripts/DjWOPQVv.chunk.js.map +0 -1
  393. package/dist/scripts/DkSHJqHu.chunk.js +0 -2
  394. package/dist/scripts/DkSHJqHu.chunk.js.map +0 -1
  395. package/dist/scripts/Dpq10cRY.chunk.js +0 -2
  396. package/dist/scripts/Dpq10cRY.chunk.js.map +0 -1
  397. package/dist/scripts/DrsDxQ8i.chunk.js +0 -2
  398. package/dist/scripts/DrsDxQ8i.chunk.js.map +0 -1
  399. package/dist/scripts/DrsVPpSl.chunk.js +0 -3
  400. package/dist/scripts/DrsVPpSl.chunk.js.map +0 -1
  401. package/dist/scripts/DvDdiDQN.chunk.js +0 -7
  402. package/dist/scripts/DvDdiDQN.chunk.js.map +0 -1
  403. package/dist/scripts/DwU9lZgg.chunk.js +0 -2
  404. package/dist/scripts/DwU9lZgg.chunk.js.map +0 -1
  405. package/dist/scripts/I8EoNmf8.chunk.js +0 -2
  406. package/dist/scripts/I8EoNmf8.chunk.js.map +0 -1
  407. package/dist/scripts/Im8afRMN.chunk.js +0 -2
  408. package/dist/scripts/Im8afRMN.chunk.js.map +0 -1
  409. package/dist/scripts/N_QgBckB.chunk.js +0 -2
  410. package/dist/scripts/N_QgBckB.chunk.js.map +0 -1
  411. package/dist/scripts/SnHtKbiQ.chunk.js +0 -2
  412. package/dist/scripts/SnHtKbiQ.chunk.js.map +0 -1
  413. package/dist/scripts/U-eF69sj.chunk.js +0 -2
  414. package/dist/scripts/U-eF69sj.chunk.js.map +0 -1
  415. package/dist/scripts/XarUQJMp.chunk.js +0 -2
  416. package/dist/scripts/XarUQJMp.chunk.js.map +0 -1
  417. package/dist/scripts/ZYx7Po5r.chunk.js +0 -2
  418. package/dist/scripts/ZYx7Po5r.chunk.js.map +0 -1
  419. package/dist/scripts/app-DfSv_-O3.js +0 -220
  420. package/dist/scripts/app-DfSv_-O3.js.map +0 -1
  421. package/dist/scripts/awsfwCdu.chunk.js +0 -2
  422. package/dist/scripts/awsfwCdu.chunk.js.map +0 -1
  423. package/dist/scripts/b1pZWz43.chunk.js +0 -2
  424. package/dist/scripts/b1pZWz43.chunk.js.map +0 -1
  425. package/dist/scripts/cvX-F_mx.chunk.js +0 -2
  426. package/dist/scripts/cvX-F_mx.chunk.js.map +0 -1
  427. package/dist/scripts/lBHPAFYv.chunk.js +0 -2
  428. package/dist/scripts/lBHPAFYv.chunk.js.map +0 -1
  429. package/dist/scripts/mP-Ymt5z.chunk.js +0 -2
  430. package/dist/scripts/mP-Ymt5z.chunk.js.map +0 -1
  431. package/dist/scripts/nay4aGaa.chunk.js +0 -2
  432. package/dist/scripts/nay4aGaa.chunk.js.map +0 -1
  433. package/dist/scripts/pkzD5BEm.chunk.js +0 -2
  434. package/dist/scripts/pkzD5BEm.chunk.js.map +0 -1
  435. package/dist/scripts/tHf2V3t0.chunk.js +0 -2
  436. package/dist/scripts/tHf2V3t0.chunk.js.map +0 -1
  437. package/vite.config.ts +0 -6
@@ -1 +0,0 @@
1
- {"version":3,"file":"DayWKE6G.chunk.js","sources":["../../../../libs/shared/src/apps/subjects/components/classification-dashboard/classification-header-details/ClassificationHeaderDetails.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/empty-state/CuratedClassificationEmptyState.tsx","../../../../libs/shared/src/components/table-of-contents-list/TableOfContentsList.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/table-of-contents/TableOfContents.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/teacher-only/TeacherOnlyEmptyState.tsx","../../../../libs/shared/src/apps/subjects/hooks/useGetTopicsWidgets.ts","../../../../libs/shared/src/hooks/useTableOfContentsActiveHeading.tsx","../../../../libs/shared/src/hooks/usePrevious.ts","../../../../libs/shared/src/hooks/useTableOfContentsScroll.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/classification-coming-soon/ClassificationComingSoon.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/audiences/ClassificationDashboardAudiences.tsx","../../../../libs/shared/src/context/product-tips-context/ProductTipsContext.tsx","../../../../libs/shared/src/images/svg/widgets/WidgetSeriesSvg.tsx","../../../../libs/shared/src/apps/subjects/hooks/useDirectoryTabProductTipSwitcher.ts","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/classification-tabs/ClassificationTabs.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/classification-dashboard-nav/ClassificationDashboardNav.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/ClassificationDashboard.tsx","../../src/apps/subjects/errors/TopicNotFoundError.ts","../../src/apps/subjects/views/classification/partial-loading/PartialClassification.tsx","../../src/apps/subjects/views/classification/StreamableClassificationViewUtils.ts","../../src/apps/subjects/views/classification/StreamableClassificationView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Classification } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nconst namespace = 'subject.classificationHeaderDetails';\n\nconst Separator = ({ className }: { className: string }) =>\n <span className={className}>&bull;</span>;\n\ninterface ClassificationHeaderDetailsProps {\n classification: Classification;\n}\n\nexport function ClassificationHeaderDetails(props: ClassificationHeaderDetailsProps): React.ReactElement {\n const {\n dashboardVideoCount,\n childDashboardVideoCount,\n dashboardResourceCount,\n childDashboardResourceCount,\n childClassificationCount\n } = TopicsHelper.getCounts(props.classification);\n\n const videoCount = dashboardVideoCount + childDashboardVideoCount;\n const resourceCount = dashboardResourceCount + childDashboardResourceCount;\n\n return (\n <p className='mb-n1 font-size-normal fw-normal mt-1'>\n {!!childClassificationCount && (\n <Text\n namespace={namespace}\n phrase='topics'\n options={{ count: childClassificationCount.toLocaleString(), smartCount: childClassificationCount }}\n />\n )}\n\n {!!videoCount && (\n <>\n {childClassificationCount > 0 && <Separator className='mx-2' />}\n <Text\n namespace={namespace}\n phrase='videos'\n options={{ count: videoCount.toLocaleString(), smartCount: videoCount }}\n />\n </>\n )}\n {!!resourceCount && (\n <>\n <Separator className='mx-2' />\n <Text\n namespace={namespace}\n phrase='resources'\n options={{ count: resourceCount.toLocaleString(), smartCount: resourceCount }}\n />\n </>\n )}\n </p>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { CuratedDashboard, DashboardStatus } from 'libs/shared/interfaces';\n\n\nconst namespace = 'subjects.curatedClassificationEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CuratedClassificationEmptyStateProps {\n dashboard: CuratedDashboard;\n imageUrl: string;\n isReadonly: boolean;\n addWidgetApplink?: () => Core.AppLink;\n}\n\nexport function CuratedClassificationEmptyState(props: CuratedClassificationEmptyStateProps): JSX.Element {\n const isArchived = props.dashboard?.status === DashboardStatus.Archived;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('headingForNP')} />\n {!props.isReadonly ? (\n <EmptyState.Heading>\n <Text phrase='headingForNP' />\n </EmptyState.Heading>\n ) : (\n <>\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='headingForCurator' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='info' />\n </EmptyState.Info>\n <Tooltip title={isArchived ? LanguageService.getPhrase(namespace, 'archivedCtaTooltip') : ''} spanHack>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'add')}\n appLink={props.addWidgetApplink?.()}\n className='btn btn-dark'\n icon={PlusSvg}\n disabled={isArchived}\n />\n </Tooltip>\n </>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\n\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './table-of-contents-list.module.scss';\n\nexport interface TableOfContentsItem<T=string> {\n name: string;\n id: T;\n tocIndentation?: number;\n}\n\ninterface TableOfContentsProps<T> {\n items: TableOfContentsItem<T>[];\n activeId: string;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n // set to true if the TOC is controlled by a local state rather than query params\n localState?: boolean;\n getAppLink?: (args: TableOfContentsItem<T>) => Core.AppLink;\n onItemClick?: (args: TableOfContentsItem<T>) => void;\n}\n\nexport function TableOfContentsList<T extends string>(props: TableOfContentsProps<T>): JSX.Element {\n const analyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Widget,\n location: LocationContext.TableOfContents\n };\n\n function onItemSelect(item: TableOfContentsItem<T>) {\n ScrollHelper.preventScrollTop();\n props.setControlledId(item.id);\n \n props.onItemClick?.(item);\n \n setTimeout(() => document.getElementById(item.id)?.focus());\n }\n\n function getTocIndentClass(item: TableOfContentsItem<T>): string {\n if (item.tocIndentation === 1)\n return styles.tocIndent1;\n \n if (item.tocIndentation === 2)\n return styles.tocIndent2;\n\n return '';\n }\n\n return (\n <div className={`${styles.itemsWrapper}`}>\n {props.items.map((item, idx) => {\n if (props.localState) {\n return (\n <DivButton\n key={item.id}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n onItemSelect(item);\n }}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} `}>\n {item.name}\n </div>\n </DivButton>\n );\n }\n\n return (\n <AppLink\n key={item.id}\n appLink={props.getAppLink(item)}\n appLinkOptions={{ replace: true }}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n onItemSelect(item);\n }}\n analyticsData={{\n ...props.analyticsData,\n id: item.id,\n name: item.name\n }}\n analyticsOptions={analyticsOptions}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} ${getTocIndentClass(item)}`}>\n {item.name}\n </div>\n </AppLink>\n );\n })}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { TableOfContentsList } from 'libs/shared/components/table-of-contents-list/TableOfContentsList';\nimport { TableOfContentsSvg } from 'libs/shared/images/svg/objects/TableOfContentsSvg';\nimport { CuratedWidget } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport styles from './table-of-contents.module.scss';\n\ninterface TableOfContentsContainerProps {\n widgets: CuratedWidget[];\n title: string;\n activeId: string;\n appLink?: Core.AppLink;\n clickable?: boolean;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n isSmallScreen?: boolean;\n}\ninterface TableOfContentsProps extends TableOfContentsContainerProps {\n getAppLink: (widget: CuratedWidget) => Core.AppLink\n}\n\nfunction TableOfContentsMobile(props: TableOfContentsProps) {\n const [ isExpanded, setIsExpanded ] = React.useState(false);\n\n function logUserAction() {\n const analyticsOptions = {\n actionType: !isExpanded ? UserAction.Open : UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.Dashboard\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function onClickIcon() {\n setIsExpanded(!isExpanded);\n logUserAction();\n }\n\n return (\n <div className={`${styles.mobile} d-inline-flex gap-1`}>\n \n {isExpanded && (\n <div className='bg-white px-3 pt-3 pb-2 border border-dark rounded-1 ps-3'>\n <h2 className='h5'>{props.title}</h2>\n <TableOfContentsList\n items={props.widgets.map(widget => (\n { name: widget.name, id: widget.id, tocIndentation: widget.metadata.tocIndentation }\n ))}\n activeId={props.activeId}\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n setControlledId={props.setControlledId}\n getAppLink={props.getAppLink}\n onItemClick={() => setIsExpanded(false)}\n />\n </div>\n )}\n <div className={styles.container}>\n <IconButton\n className='btn btn-outline-dark'\n svg={TableOfContentsSvg}\n onClick={onClickIcon}\n />\n </div>\n </div>\n );\n}\n\nfunction TableOfContents(props: TableOfContentsProps): JSX.Element {\n return (\n <aside className='col-3 order-1'>\n <div className={`${styles.container} ps-3`}>\n <h2 className='h5'>{props.title}</h2>\n \n <TableOfContentsList\n items={props.widgets.map(widget => (\n { name: widget.name, id: widget.id, tocIndentation: widget.metadata.tocIndentation }\n ))}\n activeId={props.activeId}\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n setControlledId={props.setControlledId}\n getAppLink={props.getAppLink}\n />\n </div>\n </aside>\n );\n}\n\nexport function TableOfContentsContainer(props: TableOfContentsContainerProps): JSX.Element {\n function getAppLink(widget: CuratedWidget): Core.AppLink {\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n \n const params: HashObject = currentAppLink.params\n ? { ...(currentAppLink.params as HashObject) }\n : {};\n\n params.tocId = widget.id;\n\n return {\n ...currentAppLink,\n params\n };\n }\n\n return (\n <>\n {!props.isSmallScreen\n ? <TableOfContents {...props} getAppLink={getAppLink} />\n : <TableOfContentsMobile {...props} getAppLink={getAppLink} />\n }\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'subjects.teacherOnlyEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TeacherOnlyEmptyStateProps {\n imageUrl: string;\n ctaAppLink?: () => Core.AppLink;\n}\n\nexport function TeacherOnlyEmptyState(props: TeacherOnlyEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('heading')} />\n <EmptyState.Heading>\n <Text phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text phrase='info' />\n </EmptyState.Info>\n\n <EmptyState.Cta\n text={getPhrase('cta')}\n appLink={props.ctaAppLink?.()}\n className='btn btn-dark'\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { CuratedDashboard, CuratedMediaWidget, CuratedWidget, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\n\nexport interface Response {\n widgets: CuratedWidget[];\n\n videoList?: Video[];\n videoListWidgetId?: string;\n}\n\n/**\n * This hook helps us with custom logic for to display system generated dashboards in a slightly\n * different way.\n */\nexport function useGetTopicsWidgets(dashboard: CuratedDashboard, activeAudiences: PresentationAudience[]): Response {\n const {\n isSystemGeneratedDashboard,\n systemGeneratedVideoWidget\n } = React.useMemo(() => {\n if (!dashboard) {\n return {\n isSystemGeneratedDashboard: false,\n systemGeneratedVideoWidget: null\n };\n }\n\n const isSystemGeneratedDashboard = CuratedDashboardHelper.isSystemGeneratedDashboard(dashboard.widgets);\n\n return {\n isSystemGeneratedDashboard,\n systemGeneratedVideoWidget: dashboard.widgets.find(widget => {\n return (\n widget.widgetId === WidgetTypeId.ClassificationPinnedVideos &&\n widget.templateId !== WidgetTemplate.ThumbnailVerticalList\n );\n })\n };\n }, [dashboard?.id]);\n\n const systemGeneratedVideoContent = Flight.useBasicFetch<CuratedMediaWidget<Video[]>>(\n !!systemGeneratedVideoWidget &&\n DashboardRequests.dashboardWidgetContent(\n systemGeneratedVideoWidget?.id,\n CuratedDashboardHelper.getWidgetParams(\n systemGeneratedVideoWidget.widgetId,\n systemGeneratedVideoWidget.templateId,\n CuratedDashboardHelper.getDashboardTargetType(dashboard),\n activeAudiences?.map(a => a.masterId)\n ),\n systemGeneratedVideoWidget?.templateId\n )\n );\n\n // Non system generated dashboards are returned as per usual\n if (!isSystemGeneratedDashboard)\n return { widgets: ArrayHelper.sortBy(dashboard?.widgets, 'index') };\n\n // System generated dashboard have the video widget removed and returned as a separate video list\n return {\n widgets: dashboard?.widgets?.filter(widget => {\n if (widget.widgetId !== WidgetTypeId.ClassificationPinnedVideos)\n return true;\n\n if (widget.templateId === WidgetTemplate.ThumbnailVerticalList)\n return true;\n\n return false;\n }) ?? [],\n videoList: systemGeneratedVideoContent.data?.content ?? [],\n videoListWidgetId: systemGeneratedVideoWidget?.id\n };\n}","import React from 'react';\n\ntype TableOfContentsActiveOption = {\n setActiveId: (id: string) => void;\n headingElements: Element[];\n controlledId?: string;\n setControlledId?: (arg: string) => void;\n}\n\nlet timer: number;\n\nexport const useTableOfContentsActiveHeading = (\n { setActiveId, headingElements, controlledId, setControlledId }: TableOfContentsActiveOption\n) => {\n const scrollPositionRef = React.useRef(0);\n\n React.useEffect(() => {\n const callback = (headings: IntersectionObserverEntry[]) => {\n headings.forEach(heading => {\n if (controlledId) {\n setActiveId(controlledId);\n // can use scrollEnd event when the new event type is supported\n timer = window.setTimeout(() => {\n setControlledId('');\n }, 800);\n return;\n }\n if (heading.isIntersecting) {\n setActiveId(heading.target.id);\n scrollPositionRef.current = window.scrollY;\n } else {\n const scrollDistance = scrollPositionRef.current - window.scrollY;\n const isScrollingUp = scrollDistance > 0;\n const curIndex = headingElements.findIndex(h => h.id === heading.target.id);\n const prevHeading = headingElements[curIndex - 1];\n if (isScrollingUp && prevHeading?.id) {\n setActiveId(prevHeading?.id);\n }\n }\n });\n };\n\n const observer = new IntersectionObserver(callback, {\n // rootMargin top: same as the cv-nav-height\n rootMargin: '-67px 0px -80% 0px'\n });\n\n headingElements.forEach(element => observer.observe(element));\n\n return () => {\n timer && window.clearTimeout(timer);\n observer.disconnect();\n };\n }, [ setActiveId, headingElements.length, controlledId ]);\n};\n\n","import React from 'react';\n\n// https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state\nexport function usePrevious<T>(value: T): T {\n const ref = React.useRef<T>(null);\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}","import React from 'react';\n\nimport { usePrevious } from './usePrevious';\n\nconst HEADER_OFFSET = 80; // Size of header + some extra spacing\n\nexport const useTableOfContentsScroll = (elements: Element[], activeId: string) => {\n const [ hasDoneInitialScroll, setHasDoneInitialScroll ] = React.useState(false);\n\n const previousId = usePrevious(activeId);\n const currentId = activeId;\n\n React.useLayoutEffect(() => {\n if (!hasDoneInitialScroll || previousId !== currentId) {\n const target = elements.find(heading => heading && (heading?.id === currentId));\n\n if (target) {\n const rec = target.getBoundingClientRect();\n\n window.scrollBy({\n top: rec.top - HEADER_OFFSET,\n behavior: 'smooth'\n });\n \n if (!hasDoneInitialScroll)\n setHasDoneInitialScroll(true);\n }\n }\n }, [ elements, previousId, currentId, hasDoneInitialScroll ]);\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionButton } from 'libs/shared/components/actions/ActionButton';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { BellFilledSvg } from 'libs/shared/images/svg/objects/BellFilledSvg';\nimport { BellSvg } from 'libs/shared/images/svg/objects/BellSvg';\nimport { Classification } from 'libs/shared/interfaces';\n\n\nconst namespace = 'subjects.classificationComingSoon';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ComingSoonProps {\n data: Classification;\n onToggleFollow?: () => void;\n canFollowSubjects: boolean;\n imageUrl: string;\n showFollowButtonSpinner: boolean;\n showSignUp: boolean;\n signUpAppLink: Core.AppLink;\n}\n\nexport function ClassificationComingSoon(props: ComingSoonProps): JSX.Element {\n const isFollowing = !!props.data.followers?.data?.length;\n function onClick(): void {\n props.onToggleFollow?.();\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState className='pt-0'>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('comingSoon')} />\n\n <EmptyState.Heading>\n <Text phrase='comingSoon' />\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase={props.showSignUp ? 'infoAnon' : 'info'} />\n </EmptyState.Info>\n\n {props.canFollowSubjects && (\n <ActionButton\n svg={isFollowing ? BellFilledSvg : BellSvg}\n onClick={onClick}\n showSpinner={props.showFollowButtonSpinner}\n className={`btn follow-btn me-2 ${isFollowing ? 'btn-outline-dark' : 'btn-dark'}`}\n >\n <Text phrase={isFollowing ? 'following' : 'follow'} />\n </ActionButton>\n )}\n\n {props.showSignUp && !props.canFollowSubjects && (\n <AppLink\n appLink={props.signUpAppLink}\n className='btn btn-dark d-none d-lg-inline-block'\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.ClassificationComingSoon,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n analyticsData={{}}\n tag='button'\n >\n {getPhrase('signUp')}\n </AppLink>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AudienceFilter } from 'libs/shared/apps/subjects/components/audience-filter/AudienceFilter';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\ninterface ClassificationDashboardAudiencesProps {\n audiences: PresentationAudience[];\n activeAudiences: PresentationAudience[];\n appLink: Core.AppLink;\n disabled: boolean;\n disablePersist: boolean;\n tooltip: string;\n}\n\nexport function ClassificationDashboardAudiences(props: ClassificationDashboardAudiencesProps): JSX.Element {\n return (\n <AudienceFilter\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n disabled={props.disabled}\n appLink={props.appLink}\n disablePersist={props.disablePersist}\n tooltip={props.tooltip}\n />\n );\n}","import React from 'react';\n\nimport { ProductTipId } from 'libs/shared/interfaces';\n\ntype RefsHash = Partial<Record<ProductTipId, HTMLElement | null>>;\n\nexport interface ProductTipsContextValues {\n refs?: RefsHash;\n setProductTipRef?: (id: ProductTipId, ref: HTMLElement) => void;\n cleanUpProductTipRef?: (id: ProductTipId) => void;\n}\n\nconst ProductTipsContext = React.createContext<ProductTipsContextValues>({\n setProductTipRef: () => {},\n cleanUpProductTipRef: () => {},\n refs: {}\n});\n\nexport function useProductTipsContext(tipId?: ProductTipId) {\n const { setProductTipRef, cleanUpProductTipRef, refs } = React.useContext(ProductTipsContext);\n\n React.useEffect(() => {\n if (!tipId)\n return;\n\n return () => cleanUpProductTipRef(tipId);\n }, [tipId]);\n\n return {\n setProductTipRef: (ref: HTMLElement) => setProductTipRef(tipId, ref),\n refs\n };\n}\n\n\nexport function ProductTipsContextProvider(props: React.PropsWithChildren) {\n const [ refs, setRefs ] = React.useState<RefsHash>({});\n\n function setProductTipRef(id: ProductTipId, element: HTMLElement) {\n if (refs[id] || !element || !id)\n return;\n \n setRefs({\n ...refs,\n [id]: element\n });\n }\n\n function cleanUpProductTipRef(id: ProductTipId) {\n if (!id)\n return;\n\n setRefs({\n ...refs,\n [id]: null\n });\n }\n\n return (\n <ProductTipsContext.Provider value={{\n refs,\n setProductTipRef,\n cleanUpProductTipRef\n }}>\n {props.children}\n </ProductTipsContext.Provider>\n );\n}","import React from 'react';\n\nexport function WidgetSeriesSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M4.5 4a.5.5 0 0 0 0 1h16a.5.5 0 0 1 .5.5v12a.5.5 0 0 0 1 0v-12A1.5 1.5 0 0 0 20.5 4zM9 10.26a.256.256 0 0 1 .39-.218l4.482 2.74a.256.256 0 0 1 0 .437L9.39 15.958A.256.256 0 0 1 9 15.739zM18.5 6A1.5 1.5 0 0 1 20 7.5v11a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 2 18.5v-11A1.5 1.5 0 0 1 3.5 6zm-15 1a.5.5 0 0 0-.5.5v11a.5.5 0 0 0 .5.5h15a.5.5 0 0 0 .5-.5v-11a.5.5 0 0 0-.5-.5z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ClassificationTab } from '../components/classification-dashboard/classification-tabs/ClassificationTabs';\n\ninterface ViewModel {\n tab: ClassificationTab;\n on: boolean;\n}\n\nexport function useDirectoryTabProductTipSwitcher(initialTab?: ClassificationTab) {\n const initialState: ViewModel = {\n on: false,\n tab: initialTab || 'new-releases'\n };\n\n const [ viewModel, setViewModel ] = useViewModel<ViewModel>('directory:product:tip:switcher', initialState);\n\n React.useEffect(() => {\n if (!initialTab)\n return;\n\n setViewModel('tab', initialTab);\n }, [initialTab]);\n\n React.useEffect(() => {\n let interval: number = null;\n\n if (viewModel.on) {\n interval = window.setInterval(() => {\n if (viewModel.tab === 'new-releases' || viewModel.tab === 'all-topics')\n setViewModel('tab', viewModel.tab === 'new-releases' ? 'all-topics' : 'new-releases');\n else\n setViewModel('tab', viewModel.tab === 'curated-topic' ? 'video-list' : 'curated-topic');\n }, 2000);\n }\n\n return () => {\n window.clearInterval(interval);\n };\n }, [ viewModel.on, viewModel.tab ]);\n\n return {\n tab: viewModel.tab,\n isHighlighting: viewModel.on,\n start: () => setViewModel('on', true),\n stop: () => {\n setViewModel({\n on: false,\n tab: initialTab || viewModel.tab\n });\n }\n };\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { useProductTipsContext } from 'libs/shared/context/product-tips-context/ProductTipsContext';\nimport { Breakpoints, useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { GridSvg } from 'libs/shared/images/svg/objects/GridSvg';\nimport { RectanglesSvg } from 'libs/shared/images/svg/objects/RectanglesSvg';\nimport { SparkleSvg } from 'libs/shared/images/svg/objects/SparkleSvg';\nimport { WidgetSeriesSvg } from 'libs/shared/images/svg/widgets/WidgetSeriesSvg';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { useDirectoryTabProductTipSwitcher } from '../../../hooks/useDirectoryTabProductTipSwitcher';\n\nimport styles from './classification-tabs.module.scss';\n\nconst namespace = 'shared.classificationDashboard';\n\nexport type ClassificationTab = 'new-releases' | 'all-topics' | 'curated-topic' | 'curriculum';\n\nfunction getTabs(\n props: ClassificationTabsProps,\n breakpoints: Breakpoints,\n activeTab: ClassificationTab,\n isHighlighting: boolean\n): PillTab[] {\n const showText = breakpoints.lg || breakpoints.xl || breakpoints.xxl || breakpoints.xs;\n\n function getTopicTabClassName(): string {\n let className = isHighlighting ? styles.tabTransition : '';\n\n if (breakpoints.xs)\n return className + ' w-100';\n\n if (showText)\n return className = ` ${styles.curatedTopicTab}`;\n\n return className;\n }\n\n if (TopicsHelper.isTopLevelTopic(props.classification)) {\n return [{\n name: showText ? LanguageService.getPhrase(namespace, 'newReleases') : '',\n appLink: props.appLinks?.classification?.(props.classification),\n active: activeTab === 'new-releases',\n svg: SparkleSvg,\n analyticsData: {\n id: 'new-releases',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'newReleases'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classification?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: `${breakpoints.xs ? 'w-100' : ''} ${isHighlighting ? styles.tabTransition : ''}`\n }, {\n name: showText ? LanguageService.getPhrase(namespace, 'allTopics') : '',\n appLink: props.appLinks?.classificationDirectory?.(props.classification),\n active: activeTab === 'all-topics',\n svg: GridSvg,\n analyticsData: {\n id: 'all-topics',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'allTopics'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classificationDirectory?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: `${breakpoints.xs ? 'w-100' : ''} ${isHighlighting ? styles.tabTransition : ''}`\n }];\n }\n\n return [{\n name: showText ? LanguageService.getPhrase(namespace, 'topic') : '',\n appLink: props.appLinks?.classification?.(props.classification),\n active: activeTab === 'curated-topic',\n svg: RectanglesSvg,\n analyticsData: {\n id: 'curated-topic',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'topic'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classification?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: getTopicTabClassName()\n }, {\n name: showText ? LanguageService.getPhrase(namespace, 'curriculum') : '',\n appLink: props.appLinks?.classificationCurriculum?.(props.classification),\n active: activeTab === 'curriculum',\n svg: WidgetSeriesSvg,\n analyticsData: {\n id: 'curriculum',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'curriculum'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classificationCurriculum?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: `${breakpoints.xs ? 'w-100' : ''} ${isHighlighting ? styles.tabTransition : ''}`\n }];\n}\n\ninterface ClassificationTabsProps {\n classification: Classification;\n presentation: Presentation;\n appLinks: {\n classification: (classification: Classification | null) => Core.AppLink;\n classificationDirectory: (classification: Classification) => Core.AppLink;\n classificationCurriculum: (classification: Classification) => Core.AppLink;\n };\n activeTab: ClassificationTab;\n}\n\nexport function ClassificationTabs(props: ClassificationTabsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const { tab, isHighlighting } = useDirectoryTabProductTipSwitcher(props.activeTab);\n\n const { setProductTipRef } = useProductTipsContext('topics-directory-tab');\n\n return (\n <PillTabSelector\n borderRadius='sm'\n containerRef={el => setProductTipRef(el)}\n className={breakpoints.xs ? 'w-100' : ''}\n listClassName='d-flex flex-nowrap'\n tabs={getTabs(props, breakpoints, tab, isHighlighting)}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Classification, CuratedDashboard, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { ClassificationDashboardAudiences } from '../audiences/ClassificationDashboardAudiences';\nimport { ClassificationTab, ClassificationTabs } from '../classification-tabs/ClassificationTabs';\n\nfunction shouldHideAudiences(\n audiences: PresentationAudience[],\n activeAudiences: PresentationAudience[],\n activeTab: ClassificationTab,\n isEmpty: boolean,\n isComingSoon: boolean\n): boolean {\n if (isComingSoon)\n return true;\n\n if (isEmpty && !activeAudiences?.length)\n return true;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return true;\n\n if (activeTab === 'curriculum')\n return true;\n\n return false;\n}\n\ninterface ClassificationDashboardNavProps {\n dashboard: CuratedDashboard;\n classification: Classification;\n presentation: Presentation;\n appLinks: {\n audience: () => Core.AppLink;\n classification: (classification: Classification | null) => Core.AppLink;\n classificationDirectory: (classification: Classification) => Core.AppLink;\n classificationCurriculum: (classification: Classification) => Core.AppLink;\n };\n activeTab: ClassificationTab;\n audiences: PresentationAudience[];\n activeAudiences: PresentationAudience[];\n getBreadcrumbs: () => Breadcrumb[];\n\n hasTopicDirectoryDashboard: boolean;\n hasTopicCurriculumDashboard: boolean;\n isComingSoon: boolean;\n isEmpty: boolean;\n isViewingCurrentPresentation: boolean;\n disableAudiences: boolean;\n audienceTooltip: string;\n}\n\nexport function ClassificationDashboardNav(props: ClassificationDashboardNavProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const hideAudiences = shouldHideAudiences(\n props.audiences,\n props.activeAudiences,\n props.activeTab,\n props.isEmpty,\n props.isComingSoon\n );\n\n function canShowTabs(): boolean {\n if (!props.classification || !props.dashboard)\n return false;\n\n if (CuratedDashboardHelper.isSystemGeneratedDashboard(props.dashboard.widgets))\n return false;\n\n /**\n * For our top-level topics, we can show the topic tab if the topic has a directory dashboard.\n */\n if (TopicsHelper.isTopLevelTopic(props.classification))\n return props.hasTopicDirectoryDashboard;\n\n /**\n * For our curated topics, we can show the curriculum tab if the topic has one, which it should\n */\n if (props.classification.externalMetadata?.isCurated && props.hasTopicCurriculumDashboard)\n return true;\n\n return false;\n }\n\n function getContainerClass(): string {\n let className = 'd-flex flex-column py-3 mb-3';\n\n if (!props.isComingSoon)\n className += ' border-bottom';\n\n if ((canShowTabs() || hideAudiences) && !breakpoints.xs)\n return className;\n\n return className + ' row-gap-3';\n }\n\n function getTopRowClass(): string {\n if (hideAudiences) {\n if (breakpoints.xs)\n return 'd-flex flex-column justify-content-between row-gap-3';\n\n return 'd-flex align-items-center justify-content-between';\n }\n\n let className = '';\n\n className += 'd-flex align-items-center justify-content-between mb-1';\n\n if (breakpoints.xs)\n className += ' row-gap-3 mb-0';\n\n return className;\n }\n\n function getBottomRowClass(): string {\n let className = 'd-flex align-items-end justify-content-between';\n\n if (breakpoints.xs)\n className += ' row-gap-3 flex-wrap';\n\n return className;\n }\n\n return (\n <div className={getContainerClass()}>\n <div className={getTopRowClass()}>\n <Breadcrumbs breadcrumbs={props.getBreadcrumbs?.()} />\n\n {canShowTabs() && hideAudiences && (\n <ClassificationTabs\n classification={props.classification}\n activeTab={props.activeTab}\n appLinks={props.appLinks}\n presentation={props.presentation}\n />\n )}\n </div>\n\n <div className={getBottomRowClass()}>\n {!hideAudiences && (\n <ClassificationDashboardAudiences\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n appLink={props.appLinks.audience?.()}\n disabled={props.disableAudiences}\n tooltip={props.audienceTooltip}\n disablePersist={!props.isViewingCurrentPresentation}\n />\n )}\n\n {canShowTabs() && !hideAudiences && (\n <ClassificationTabs\n classification={props.classification}\n activeTab={props.activeTab}\n appLinks={props.appLinks}\n presentation={props.presentation}\n />\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsOptions, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { ClassificationHeaderDetails } from 'libs/shared/apps/subjects/components/classification-dashboard/classification-header-details/ClassificationHeaderDetails';\nimport { CuratedClassificationEmptyState } from 'libs/shared/apps/subjects/components/classification-dashboard/empty-state/CuratedClassificationEmptyState';\nimport { TableOfContentsContainer } from 'libs/shared/apps/subjects/components/classification-dashboard/table-of-contents/TableOfContents';\nimport { TeacherOnlyEmptyState } from 'libs/shared/apps/subjects/components/classification-dashboard/teacher-only/TeacherOnlyEmptyState';\nimport { useGetTopicsWidgets } from 'libs/shared/apps/subjects/hooks/useGetTopicsWidgets';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { DashboardFeedbackData } from 'libs/shared/components/feedback-form/FeedbackForm';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllClassificationWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { LocalPermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { HasLocalPermissionsFunc, HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { useTableOfContentsActiveHeading } from 'libs/shared/hooks/useTableOfContentsActiveHeading';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CalendarEvent, CalendarEventContentType, Classification, CuratedDashboard, CuratedWidget, CuratedWidgetQueryParams, CurriculumData, DashboardStatus, DashboardTargetType, InteractiveMetadata, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { ClassificationComingSoon } from './classification-coming-soon/ClassificationComingSoon';\nimport { ClassificationDashboardNav } from './classification-dashboard-nav/ClassificationDashboardNav';\nimport { ClassificationTab } from './classification-tabs/ClassificationTabs';\n\nconst namespace = 'shared.classificationDashboard';\n\nfunction isHeadingWidget(widget: CuratedWidget) {\n return widget.widgetId === WidgetTypeId.Blurb && widget.templateId === WidgetTemplate.Heading;\n}\n\nfunction isTopicWidget(widget: CuratedWidget) {\n return widget.widgetId === WidgetTypeId.CuratedClassifications || widget.widgetId === WidgetTypeId.Classifications;\n}\n\nexport interface ClassificationDashboardProps {\n dashboard: CuratedDashboard;\n classification: Classification;\n presentation: Presentation;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n resourceThumbnailFallbackImageUrl: string;\n hasTopicDirectoryDashboard: boolean;\n hasTopicCurriculumDashboard: boolean;\n isTertiaryCustomerWithoutExchange: boolean;\n tab: ClassificationTab;\n specialEvent?: CalendarEvent;\n curriculums: CurriculumData;\n\n audiences: PresentationAudience[];\n activeAudiences?: PresentationAudience[];\n\n getWidgetContentRequest: (\n id: string,\n params: CuratedWidgetQueryParams,\n widgetTemplate: WidgetTemplate\n ) => Flight.Request;\n\n getBannerActions?: () => ActionOptions[];\n getBreadcrumbs?: () => Breadcrumb[];\n onToggleFollow?: (classification: Classification, locationContext: LocationContext) => void;\n canFollowSubjects: boolean;\n onSubmitFeedback?: (feedback: DashboardFeedbackData) => Promise<void>;\n\n appLinks?: AllClassificationWidgetTemplates['appLinks'] & {\n signUp: () => Core.AppLink;\n widgetWizard: () => Core.AppLink;\n previewQuestions: (interactive: InteractiveMetadata) => Core.AppLink\n classificationCurriculum: (classification: Classification) => Core.AppLink;\n audience: () => Core.AppLink;\n };\n\n imageCdnUrl: string\n emptyImageUrl: string;\n comingSoonImageUrl?: string;\n\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n\n scrollToWidgetId?: string;\n tableOfContentsId?: string;\n\n // Means the dashboard contains no linked or working filters\n isReadonly?: boolean;\n\n // Means the dashboard is being previewed by ClickView staff either in product or in curator\n isPreviewing?: boolean;\n\n // Means the parent topic for the dashboard has a status of \"Coming Soon\"\n isComingSoon?: boolean;\n\n showFollowButtonSpinner?: boolean;\n \n isViewCurrentPresentation?: boolean;\n\n // By default widgets will always be lazyloaded. We override this behaviour only in extenuating \n // circumstances, such as dynamic rendering for SEO.\n lazyLoad?: boolean;\n\n moviesAndTv?: boolean;\n\n isTeacherOnly?: boolean;\n \n contentType?: CalendarEventContentType;\n\n isBot?: boolean;\n\n settings?: AllClassificationWidgetTemplates['settings'];\n\n commonVideoProps: CommonVideoProps;\n}\n\nClassificationDashboard.defaultProps = {\n appLinks: {}\n};\n\nexport function ClassificationDashboard(props: ClassificationDashboardProps): JSX.Element {\n const { widgets, videoList, videoListWidgetId } = useGetTopicsWidgets(props.dashboard, props.activeAudiences);\n\n const isSmallScreen = useMediaQuery(MediaQueryStrings.LGDown);\n const headingRef = React.useRef<Set<Element>>(new Set());\n\n const initialEmptyWidgets = React.useMemo(() => {\n return widgets.reduce((acc: HashObject<boolean>, widget) => {\n acc[widget.id] = false;\n return acc;\n }, {});\n }, [widgets?.length]);\n\n const [ emptyWidgets, setEmptyWidgets ] = React.useState(initialEmptyWidgets);\n\n const [ controlledId, setControlledId ] = React.useState(props.tableOfContentsId);\n\n const [ tableOfContentActiveId, setTableOfContentActiveId ] = React.useState<string>('');\n\n const headingElements = Array.from(headingRef.current);\n useTableOfContentsScroll(headingElements, controlledId);\n useTableOfContentsActiveHeading({\n setActiveId: setTableOfContentActiveId,\n headingElements,\n controlledId,\n setControlledId\n });\n\n function shouldShowEmptyState(): boolean {\n if (props.isComingSoon)\n return false;\n\n if (props.isTeacherOnly)\n return false;\n\n if (!props.dashboard)\n return true;\n\n if (props.dashboard.status === DashboardStatus.Archived && !props.isReadonly)\n return true;\n\n if (props.dashboard.status === DashboardStatus.Draft && !props.isPreviewing)\n return true;\n\n if (!widgets?.length)\n return true;\n\n if (videoList && videoList.length)\n return false;\n\n return Object.values(emptyWidgets).every(state => !!state);\n }\n\n function getWidgetContentRequest(id: string, widgetTypeId: WidgetTypeId, template: WidgetTemplate): Flight.Request {\n const params = CuratedDashboardHelper.getWidgetParams(\n widgetTypeId,\n template,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard),\n props.activeAudiences?.map(a => a.masterId),\n props.curriculums.preferredCurriculum?.id\n );\n\n return props.getWidgetContentRequest(id, params, template);\n }\n\n const showEmptyState = shouldShowEmptyState();\n\n React.useEffect(() => {\n /**\n * When we add the first widget of the dashboard, the showEmptyState is `true`, the WidgetContainer is not going to be rendered to lazyload the `content`\n * so we set the emptyWidget to initial make sure the widget container is rendered to lazyload `widget.content`\n * and let the WidgetContainer to re-set the empty state based on the actual `widget.content` from backend\n */\n if (showEmptyState) {\n setEmptyWidgets(initialEmptyWidgets);\n }\n }, [widgets?.length]);\n\n const onSetIsEmpty = React.useCallback((widgetId: string, isEmpty: boolean) => {\n if (emptyWidgets[widgetId] === isEmpty)\n return;\n\n const newEmptyState = {\n ...emptyWidgets,\n [widgetId]: isEmpty\n };\n\n // The logic beneath this if-block doesn't apply to classification directories. This is because\n // classification directories don't support audience filtering, so widgets should never be empty,\n // meaning headings should never be hidden.\n if (CuratedDashboardHelper.isType(props.dashboard, DashboardTargetType.ClassificationDirectory)) {\n setEmptyWidgets(newEmptyState);\n return;\n }\n\n let index = 0;\n\n /**\n * Every time a widget is identified as empty, we check each heading blurb widget\n * to see if it should be hidden. This will be the case when all widgets beneath a heading\n * (up until the next heading) are empty.\n */\n while (index < widgets.length) {\n const currentWidget = widgets[index];\n\n if (!isHeadingWidget(currentWidget)) {\n index++;\n continue;\n }\n\n let isHeadingEmpty = true;\n let subWidgetIndex = index + 1;\n\n while (isHeadingEmpty && subWidgetIndex < widgets.length) {\n const headingSubWidget = widgets[subWidgetIndex];\n\n if (isHeadingWidget(headingSubWidget))\n break;\n\n if (!newEmptyState[headingSubWidget.id] && !isTopicWidget(headingSubWidget))\n isHeadingEmpty = false;\n\n subWidgetIndex++;\n }\n\n index = subWidgetIndex;\n\n newEmptyState[currentWidget.id] = isHeadingEmpty;\n }\n\n setEmptyWidgets(newEmptyState);\n }, [ emptyWidgets, widgets ]);\n\n function hideWidget(widget: CuratedWidget): boolean {\n return isHeadingWidget(widget) && emptyWidgets[widget.id];\n }\n\n function useLargeDashboardSpacing(): boolean {\n const target = CuratedDashboardHelper.getDashboardTargetType(props.dashboard);\n\n if (props.moviesAndTv || target === DashboardTargetType.ClassificationCurriculum)\n return false;\n\n return true;\n }\n\n function getWidgetHeading(widget: CuratedWidget, index: number): string {\n if (widget.widgetId === WidgetTypeId.ClassificationDashboardExternalMedia) {\n const previousWidget = widgets[index - 1];\n\n if (emptyWidgets[previousWidget.id])\n return widget.name.replace('Other videos', 'Videos');\n\n return widget.name;\n }\n\n return widget.name;\n }\n\n const widgetsInTableOfContents = widgets.filter(w => {\n return !hideWidget(w) && !!w.metadata?.showInTableOfContents;\n });\n\n const isTopicOnlyDashboard = widgets.every(isTopicWidget);\n\n const shouldShowTableOfContents = widgetsInTableOfContents.length >= 2;\n const shouldShowSideTableOfContents = shouldShowTableOfContents && !isSmallScreen;\n\n const shouldShowTopicCounts = (\n props.settings?.hasTopicDirectories &&\n TopicsHelper.isTopLevelTopic(props.classification) &&\n !props.isTertiaryCustomerWithoutExchange\n );\n\n /**\n * We don't put the .topic-dashboard class when we're in a movies and tv classification\n * because we don't want the extra padding between widgets.\n */\n return (\n <div className={`bg-white px-4 ${useLargeDashboardSpacing() ? 'dashboard-spacing-lg' : ''}`}>\n <BannerHeader\n heading={props.classification.name}\n banner={props.classification.banner}\n imageCdnUrl={props.imageCdnUrl}\n actions={props.getBannerActions?.()}\n actionsDropdownClassName='btn btn-outline-dark'\n specialEvent={props.specialEvent}\n calendarTheme={{\n background: 'bg-light-blue',\n border: 'border-light-blue'\n }}\n showComingSoon={props.isComingSoon}\n detailsComponent={shouldShowTopicCounts\n ? () => <ClassificationHeaderDetails classification={props.classification} />\n : null\n }\n />\n\n <ClassificationDashboardNav\n dashboard={props.dashboard}\n classification={props.classification}\n presentation={props.presentation}\n appLinks={props.appLinks}\n activeTab={props.tab}\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n getBreadcrumbs={props.getBreadcrumbs}\n hasTopicDirectoryDashboard={props.hasTopicDirectoryDashboard}\n hasTopicCurriculumDashboard={props.hasTopicCurriculumDashboard}\n isComingSoon={props.isComingSoon}\n isEmpty={showEmptyState}\n isViewingCurrentPresentation={props.isViewCurrentPresentation}\n disableAudiences={isTopicOnlyDashboard || props.isReadonly}\n audienceTooltip={isTopicOnlyDashboard ? LanguageService.getPhrase(namespace, 'audienceTooltip') : ''}\n />\n\n {props.isComingSoon && (\n <ClassificationComingSoon\n imageUrl={props.comingSoonImageUrl}\n data={props.classification}\n canFollowSubjects={props.canFollowSubjects}\n showFollowButtonSpinner={props.showFollowButtonSpinner}\n onToggleFollow={() => props.onToggleFollow(props.classification, LocationContext.ClassificationComingSoon)}\n showSignUp={!props.hasLocalPermissions(LocalPermissionName.FollowComingSoonTopics)}\n signUpAppLink={props.appLinks.signUp?.()}\n />\n )}\n\n {!props.isComingSoon && (\n <div className={`${shouldShowSideTableOfContents ? 'row no-wrap' : ''}`}>\n {shouldShowTableOfContents && (\n <TableOfContentsContainer\n widgets={widgetsInTableOfContents}\n title={props.classification.name}\n activeId={tableOfContentActiveId}\n clickable={!props.isReadonly}\n analyticsData={props.analyticsData}\n setControlledId={setControlledId}\n isSmallScreen={isSmallScreen}\n />\n )}\n\n <div className={shouldShowSideTableOfContents ? 'col-9 order-0' : ''}>\n {widgets.map((widget, idx) => {\n if (hideWidget(widget))\n return <React.Fragment key={widget.id}></React.Fragment>;\n\n return (\n <WidgetContainerView\n widgetCollection={DashboardTargetType.Classification}\n headingElementRef={headingRef}\n key={widget.id}\n id={widget.id}\n name={getWidgetHeading(widget, idx)}\n description={widget.description}\n classification={props.classification}\n templateId={widget.templateId}\n widgetTypeId={widget.widgetId}\n audiences={props.audiences}\n getContentRequest={getWidgetContentRequest}\n setIsEmpty={onSetIsEmpty}\n appLinks={props.appLinks}\n presentation={props.presentation}\n analyticsData={props.analyticsData}\n isScrollToTargetWidget={props.scrollToWidgetId === widget.id}\n imageCdnUrl={props.imageCdnUrl}\n onSubmitFeedback={props.onSubmitFeedback}\n metadata={widget.metadata}\n isBot={props.isBot}\n hasTableOfContents={shouldShowSideTableOfContents}\n lazyLoad={props.lazyLoad}\n dashboardTarget={CuratedDashboardHelper.getDashboardTargetType(props.dashboard)}\n widgetIndex={idx}\n hasPermissions={props.hasPermissions}\n hasLocalPermissions={props.hasLocalPermissions}\n isPreviewing={props.isReadonly}\n contentType={props.contentType}\n resourceThumbnailFallbackImageUrl={props.resourceThumbnailFallbackImageUrl}\n onToggleFollowClassification={props.onToggleFollow}\n settings={props.settings}\n isEditing={props.isReadonly}\n isTertiaryCustomerWithoutExchange={props.isTertiaryCustomerWithoutExchange}\n commonVideoProps={props.commonVideoProps}\n curriculums={props.curriculums}\n\n // TODO: Do we actually need this shit if it wasn't even being passed in?\n limitTotalItems={false}\n seeMoreLink={null}\n onClickRemoveItem={null}\n badgeComponent={null}\n />\n );\n })}\n </div>\n\n {!!videoList?.length && (\n <>\n <WidgetHeader name={LanguageService.getPhrase(namespace, 'videos')} />\n <VideoList\n videos={videoList}\n getVideoAppLink={(video, opts) => props.appLinks.videoType(\n video,\n { ...opts, contextId: videoListWidgetId, includeContext: opts.includeContext }\n )}\n hasPermissions={props.hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={props.appLinks.previewQuestions}\n commonVideoProps={props.commonVideoProps}\n />\n </>\n )}\n </div>\n )}\n\n {showEmptyState && (\n <CuratedClassificationEmptyState\n dashboard={props.dashboard}\n isReadonly={props.isReadonly}\n imageUrl={props.emptyImageUrl}\n addWidgetApplink={props.appLinks.widgetWizard}\n />\n )}\n\n {props.isTeacherOnly && (\n <TeacherOnlyEmptyState\n imageUrl={props.emptyImageUrl}\n ctaAppLink={() => props.appLinks.allTopics(props.classification.presentationId)}\n />\n )}\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ErrorCta, ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\n\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\n\nconst namespace = 'subjects.topicNotFoundError';\n\nexport class TopicNotFoundError extends ErrorPageError {\n constructor() {\n super('Topic doesn\\'t exist');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'TopicNotFoundError';\n }\n\n // @ts-ignore\n public get heading(): string {\n return LanguageService.getPhrase(namespace, 'heading');\n }\n\n // @ts-ignore\n public get description(): string {\n return LanguageService.getPhrase(namespace, 'description');\n }\n\n // @ts-ignore\n public get cta(): ErrorCta {\n return {\n text: LanguageService.getPhrase(namespace, 'cta'),\n appLink: {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.CLASSIFICATION_ALL\n }\n };\n }\n}","import React from 'react';\n\nimport { PartialAudienceFilter } from 'libs/shared/apps/subjects/components/audience-filter/AudienceFilter';\nimport { PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\n\nexport function PartialClassification(): JSX.Element {\n return (\n <div className='bg-white px-4'>\n <PartialBannerHeader />\n\n <div className='d-flex flex-column row-gap-3 py-3 mb-3 border-bottom'>\n <PartialBreadcrumbs />\n <PartialAudienceFilter />\n </div>\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { ClassificationDashboardProps } from 'libs/shared/apps/subjects/components/classification-dashboard/ClassificationDashboard';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { StreamableAppLinks } from 'shared/utils/StreamableAppLinks';\n\nconst namespace = 'subjects.classificationView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function getClassificationAppLinks(\n classification: Classification,\n params: HashObject\n): ClassificationDashboardProps['appLinks'] {\n return {\n ...StreamableAppLinks,\n classification: c => StreamableAppLinks.classification(c || classification, params),\n classificationDirectory: () => StreamableAppLinks.classificationDirectory(params),\n audience: () => StreamableAppLinks.classification(classification, params),\n\n // TODO: Find a nice way around having to pass these in\n previewQuestions: () => null,\n series: () => null,\n latestReleases: () => null,\n classificationLatestReleases: () => null,\n playlist: () => null,\n signUp: () => null,\n widgetWizard: () => null,\n classificationCurriculum: () => null,\n searchSettings: () => null,\n searchHome: () => null,\n search: () => null,\n editCurriculum: () => null\n };\n}\n\ninterface GetClassificationBreadcrumbsOptions {\n classification: Classification;\n path: Classification[];\n appLinks: ClassificationDashboardProps['appLinks'];\n}\n\nexport function getClassificationBreadcrumbs(\n options: GetClassificationBreadcrumbsOptions\n): Breadcrumb[] {\n const { classification, path, appLinks } = options;\n\n const breadcrumbs: Breadcrumb[] = [{\n name: getPhrase('discover'),\n appLink: {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }\n }, {\n name: getPhrase('exploreAllTopicsHeading'),\n appLink: {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.CLASSIFICATION_ALL\n }\n }];\n\n path.forEach(item => {\n breadcrumbs.push({\n name: item.name,\n appLink: appLinks.classification(item),\n active: item.name === classification.name\n });\n });\n\n return breadcrumbs;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClassificationDashboard } from 'libs/shared/apps/subjects/components/classification-dashboard/ClassificationDashboard';\nimport { PreviewBanner } from 'libs/shared/apps/subjects/components/preview-banner/PreviewBanner';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { AudienceFilterParams, CalendarEventContentType, Classification, Config, CurrentUser, DashboardTargetType, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useFetchDashboard } from 'shared/hooks/useFetchDashboard';\nimport { useStreamableVideoActions } from 'shared/hooks/useStreamableVideoActions';\nimport { SeoHelper } from 'shared/utils/StreamableSeoHelper';\n\nimport { TopicNotFoundError } from 'apps/subjects/errors/TopicNotFoundError';\nimport { useCurriculums } from 'apps/videos/hooks/useCurriculums';\n\nimport { PartialClassification } from './partial-loading/PartialClassification';\nimport { getClassificationAppLinks, getClassificationBreadcrumbs } from './StreamableClassificationViewUtils';\n\nconst namespace = 'subjects.classificationView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface StreamableClassificationViewQueryParams extends AudienceFilterParams {\n dashboardId?: string;\n tocId?: string;\n}\n\nexport function sanitizeStreamableClassificationParams(\n queryParams: StreamableClassificationViewQueryParams\n): StreamableClassificationViewQueryParams {\n if (!queryParams)\n return {};\n\n return ObjectHelper.pick(queryParams, [ 'a', 'dashboardId', 'tocId' ]);\n}\n\ninterface StreamableClassificationViewProps {\n id: string;\n queryParams: StreamableClassificationViewQueryParams;\n}\n\nexport function StreamableClassificationView(props: StreamableClassificationViewProps): JSX.Element {\n const getVideoActions = useStreamableVideoActions('video-list');\n\n const { commonVideoProps } = useCommonVideoProps();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const curriculumData = useCurriculums();\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const classification = Flight.useBasicFetch<Classification>(\n ClassificationRequests.classification(props.id, currentUser.data?.id)\n );\n\n const { dashboard, isPreviewing } = useFetchDashboard({\n targetType: DashboardTargetType.Classification,\n dashboardId: props.queryParams?.dashboardId,\n classificationId: props.id\n });\n\n const appLinks = getClassificationAppLinks(classification.data, props.queryParams);\n\n useSetPageMetadata(PageMetadataHelper.getClassificationMetadata({\n content: { classification: classification.data },\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({\n customAppLink: appLinks.classification(classification.data)\n }),\n allowIndexing: true,\n product: StreamableConstants.PRODUCT_NAME\n }));\n\n useHandleObjectError(classification, {\n notFound: TopicNotFoundError\n });\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(presentation.data &&\n AudienceRequests.presentationAudiences(presentation.data.id, PresentationType.StreamableLearning));\n\n const path = Flight.useBasicFetch<Classification[]>(\n ClassificationRequests.path(props.id, PresentationType.StreamableLearning)\n );\n\n /**\n * We use the current active audiences to re-fetch content for that specific audience set.\n */\n const activeAudiences = AudienceHelper.getActiveAudiencesFromParams(audiences.data, props.queryParams);\n const activeAudienceIds = activeAudiences?.map(a => a.masterId) ?? [];\n\n /**\n * Additional topics data to be mixed in with lower-level component analytics collection\n */\n const analyticsData = {\n presentationId: presentation.data?.id,\n presentationName: presentation.data?.name,\n currentClassificationId: classification.data?.id,\n currentClassificationName: classification.data?.name,\n followingCurrentClassification: !!classification.data?.followers?.data?.length,\n activeAudienceNames: activeAudiences?.length ? activeAudiences.map(a => a.name) : null,\n activeAudienceIds: activeAudienceIds.length ? activeAudienceIds : null\n };\n\n\n function getBreadcrumbs(): () => Breadcrumb[] {\n return () => getClassificationBreadcrumbs({\n appLinks: appLinks,\n classification: classification.data,\n path: path.data\n });\n }\n\n const dataLoaded = !!config.data\n && dashboard.hasCompleted\n && !!classification.data\n && !!presentation.data\n && !!path.data\n && !!audiences.data;\n\n if (!dataLoaded)\n return <PartialClassification />;\n\n return (\n <VideoActionsContext.Provider value={{ getVideoActions }}>\n <div className='position-relative'>\n {!!(isPreviewing && dashboard.data) && <PreviewBanner status={dashboard.data.status} type='topic' />}\n <ClassificationDashboard\n dashboard={dashboard.data}\n classification={classification.data}\n getWidgetContentRequest={DashboardRequests.dashboardWidgetContent}\n getBreadcrumbs={getBreadcrumbs()}\n hasPermissions={() => false}\n hasLocalPermissions={() => false}\n presentation={presentation.data}\n getBannerActions={() => []}\n audiences={audiences.data}\n activeAudiences={activeAudiences}\n analyticsData={analyticsData}\n imageCdnUrl={config.data.imageCdnUrl}\n resourceThumbnailFallbackImageUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n emptyImageUrl={ImageUrls.EmptyStates.Topics.TOPIC}\n appLinks={appLinks}\n isPreviewing={isPreviewing}\n isViewCurrentPresentation\n canFollowSubjects={false}\n tableOfContentsId={props.queryParams.tocId}\n lazyLoad={!SeoHelper.isBot()}\n isTeacherOnly={false}\n contentType={CalendarEventContentType.Livestream}\n hasTopicDirectoryDashboard={false}\n hasTopicCurriculumDashboard={false}\n isTertiaryCustomerWithoutExchange={false}\n tab='curated-topic'\n curriculums={curriculumData}\n // just... one... more.. prop....\n commonVideoProps={commonVideoProps}\n />\n </div>\n </VideoActionsContext.Provider>\n );\n}"],"names":["namespace","Separator","className","jsx","ClassificationHeaderDetails","props","dashboardVideoCount","childDashboardVideoCount","dashboardResourceCount","childDashboardResourceCount","childClassificationCount","TopicsHelper","videoCount","resourceCount","jsxs","Text","Fragment","getPhrase","LanguageService","CuratedClassificationEmptyState","isArchived","_a","DashboardStatus","LanguageNamespaceContext","EmptyState","Tooltip","_b","PlusSvg","TableOfContentsList","analyticsOptions","UserAction","EntityType","LocationContext","onItemSelect","item","ScrollHelper","getTocIndentClass","styles","idx","DivButton","AppLink","TableOfContentsMobile","isExpanded","setIsExpanded","React","logUserAction","AnalyticsHelper","onClickIcon","widget","IconButton","TableOfContentsSvg","TableOfContents","TableOfContentsContainer","getAppLink","currentAppLink","ContextService","params","TeacherOnlyEmptyState","useGetTopicsWidgets","dashboard","activeAudiences","isSystemGeneratedDashboard","systemGeneratedVideoWidget","CuratedDashboardHelper","WidgetTypeId","WidgetTemplate","systemGeneratedVideoContent","Flight.useBasicFetch","DashboardRequests","a","ArrayHelper","timer","useTableOfContentsActiveHeading","setActiveId","headingElements","controlledId","setControlledId","scrollPositionRef","callback","headings","heading","isScrollingUp","curIndex","h","prevHeading","observer","element","usePrevious","value","ref","HEADER_OFFSET","useTableOfContentsScroll","elements","activeId","hasDoneInitialScroll","setHasDoneInitialScroll","previousId","currentId","target","rec","ClassificationComingSoon","isFollowing","onClick","ActionButton","BellFilledSvg","BellSvg","WorkflowPhase","SignUpDescriptors","ClassificationDashboardAudiences","AudienceFilter","ProductTipsContext","useProductTipsContext","tipId","setProductTipRef","cleanUpProductTipRef","refs","WidgetSeriesSvg","useDirectoryTabProductTipSwitcher","initialTab","initialState","viewModel","setViewModel","useViewModel","interval","getTabs","breakpoints","activeTab","isHighlighting","showText","getTopicTabClassName","SparkleSvg","Core.AppLinkHelper","_d","_c","_f","_e","GridSvg","_h","_g","_j","_i","RectanglesSvg","_l","_k","_n","_m","_p","_o","ClassificationTabs","useBreakpoints","tab","PillTabSelector","el","shouldHideAudiences","audiences","isEmpty","isComingSoon","AudienceHelper","ClassificationDashboardNav","hideAudiences","canShowTabs","getContainerClass","getTopRowClass","getBottomRowClass","Breadcrumbs","isHeadingWidget","isTopicWidget","ClassificationDashboard","widgets","videoList","videoListWidgetId","isSmallScreen","useMediaQuery","MediaQueryStrings","headingRef","initialEmptyWidgets","acc","emptyWidgets","setEmptyWidgets","tableOfContentActiveId","setTableOfContentActiveId","shouldShowEmptyState","state","getWidgetContentRequest","id","widgetTypeId","template","showEmptyState","onSetIsEmpty","widgetId","newEmptyState","DashboardTargetType","index","currentWidget","isHeadingEmpty","subWidgetIndex","headingSubWidget","hideWidget","useLargeDashboardSpacing","getWidgetHeading","previousWidget","widgetsInTableOfContents","w","isTopicOnlyDashboard","shouldShowTableOfContents","shouldShowSideTableOfContents","shouldShowTopicCounts","BannerHeader","LocalPermissionName","WidgetContainerView","WidgetHeader","VideoList","video","opts","TopicNotFoundError","ErrorPageError","AppChannels","Actions","PartialClassification","PartialBannerHeader","PartialBreadcrumbs","PartialAudienceFilter","getClassificationAppLinks","classification","StreamableAppLinks","c","getClassificationBreadcrumbs","options","path","appLinks","breadcrumbs","sanitizeStreamableClassificationParams","queryParams","ObjectHelper","StreamableClassificationView","getVideoActions","useStreamableVideoActions","commonVideoProps","useCommonVideoProps","config","ConfigRequests","currentUser","UserRequests","curriculumData","useCurriculums","presentation","PresentationRequests","ClassificationRequests","isPreviewing","useFetchDashboard","useSetPageMetadata","PageMetadataHelper","SeoHelper","StreamableConstants","useHandleObjectError","AudienceRequests","PresentationType","activeAudienceIds","analyticsData","getBreadcrumbs","VideoActionsContext","PreviewBanner","ImageUrls","CalendarEventContentType"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as l}from"./app-DfSv_-O3.js";const t=2;function r(e){var n;return((n=e.availableCurriculums)==null?void 0:n.length)<t||!e.selectedCurriculum?l.jsx(l.Fragment,{}):l.jsx("select",{className:`mb-3 form-select ${e.className}`,onChange:a=>e.onChangeCurriculum(a.target.value),value:e.selectedCurriculum.id,children:e.availableCurriculums.map(a=>l.jsx("option",{id:a.id,value:a.id,children:a.name},a.id))})}export{r as C};
2
- //# sourceMappingURL=DcOpKno_.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DcOpKno_.chunk.js","sources":["../../../../libs/shared/src/components/curriculum-links/CurriculumDropdown.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Presentation } from 'libs/shared/interfaces';\n\nconst MIN_CURRICULUMS = 2;\n\ninterface CurriculumDropdownProps {\n availableCurriculums: Presentation[];\n onChangeCurriculum: (id: string) => void;\n selectedCurriculum?: Presentation;\n className?: string;\n}\n\nexport function CurriculumDropdown(props: CurriculumDropdownProps): JSX.Element {\n // No need to show a dropdown if they don't have enough curriculums\n if (props.availableCurriculums?.length < MIN_CURRICULUMS || !props.selectedCurriculum)\n return <></>;\n\n return (\n <select\n className={`mb-3 form-select ${props.className}`}\n onChange={e => props.onChangeCurriculum(e.target.value)}\n value={props.selectedCurriculum.id}\n >\n {props.availableCurriculums.map(curriculum => {\n return (\n <option\n key={curriculum.id}\n id={curriculum.id}\n value={curriculum.id}\n >\n {curriculum.name}\n </option>\n );\n })}\n </select>\n );\n}"],"names":["MIN_CURRICULUMS","CurriculumDropdown","props","_a","jsx","Fragment","e","curriculum"],"mappings":"sCAIA,MAAMA,EAAkB,EASjB,SAASC,EAAmBC,EAA6C,OAE9E,QAAIC,EAAAD,EAAM,uBAAN,YAAAC,EAA4B,QAASH,GAAmB,CAACE,EAAM,mBAC1DE,EAAAA,IAAAC,EAAAA,SAAA,EAAE,EAGTD,EAAAA,IAAC,SAAA,CACC,UAAW,oBAAoBF,EAAM,SAAS,GAC9C,SAAUI,GAAKJ,EAAM,mBAAmBI,EAAE,OAAO,KAAK,EACtD,MAAOJ,EAAM,mBAAmB,GAE/B,SAAAA,EAAM,qBAAqB,IAAIK,GAE5BH,EAAAA,IAAC,SAAA,CAEC,GAAIG,EAAW,GACf,MAAOA,EAAW,GAEjB,SAAAA,EAAW,IAAA,EAJPA,EAAW,EAAA,CAOrB,CAAA,CAAA,CAGP"}
@@ -1,2 +0,0 @@
1
- import{c as h,g as A,ab as w,bs as p,bd as re,O as ae,bt as P,bf as G,at as N,aL as O,j as o,bu as U,bv as q,R as C,L as H,T as f,aB as Q,bw as se,a5 as te,bp as ne,a3 as ie,o as R,v as oe,aE as ue,bq as D,M as $,aK as M,h as Y,i as _,k as z}from"./app-DfSv_-O3.js";import{F as K}from"./D1D6Gqx1.chunk.js";import{l as S,a as X,F as I}from"./BCQ0kOEO.chunk.js";import{S as le}from"./Dpq10cRY.chunk.js";import{U as T,S as me}from"./CSoZBG8v.chunk.js";import"./CW7x8M-z.chunk.js";import"./C35NlkUr.chunk.js";import"./b1pZWz43.chunk.js";import"./DBp0J6X9.chunk.js";import"./CPXlV0fg.chunk.js";import"./B5lCwpXp.chunk.js";var t=(e=>(e.Ok="Ok",e.UsernameRequired="UsernameRequired",e.EmailRequired="EmailRequired",e.FirstnameRequired="FirstnameRequired",e.SurnameRequired="SurnameRequired",e.YearGroupRequired="YearGroupRequired",e.EmailAlreadyExisted="EmailAlreadyExisted",e.UsernameAlreadyExisted="UsernameAlreadyExisted",e.UserTypeRequired="UserTypeRequired",e.MasterYearGroupRequired="MasterYearGroupRequired",e.EmptyUserEntity="EmptyUserEntity",e.CustomerIdRequired="CustomerIdRequired",e.CustomerNotFoundInOnline="CustomerNotFoundInOnline",e.EmailTooLong="EmailTooLong",e.UsernameTooLong="UsernameTooLong",e.FirstnameTooLong="FirstnameTooLong",e.SurnameTooLong="SurnameTooLong",e.EmailInvalid="EmailInvalid",e.EmailInUse="EmailInUse",e.UsernameInvalid="UsernameInvalid",e.PasswordTooShort="PasswordTooShort",e.EmailDuplicated="EmailDuplicated",e.UsernameDuplicated="UsernameDuplicated",e.DisplayNameTooLong="DisplayNameTooLong",e.DisplayNameTooShort="DisplayNameTooShort",e.UsernameTooShort="UsernameTooShort",e.FirstnameInvalid="FirstnameInvalid",e.SurnameInvalid="SurnameInvalid",e.UserTypeMismatch="UserTypeMismatch",e.UserCanBeAddedInCustomer="UserCanBeAddedInCustomer",e.UserCanBeCreated="UserCanBeCreated",e.CustomerFoundInOnline="CustomerFoundInOnline",e.UserInCustomerWithOnline="UserInCustomerWithOnline",e.InvalidUserStatus="InvalidUserStatus",e.UserAlreadyExistsInCustomer="UserAlreadyExistsInCustomer",e.Rostered="UserRostered",e.InvalidYearGroup="InvalidYearGroup",e))(t||{});const de=8,k="userManager.utils",b={active:p.Active.toLowerCase(),deactivated:p.Disabled.toLowerCase(),pending:p.Inactive.toLowerCase()},j={filterIdenticalEntries(e){const i=a=>{var r,n,s,u,l,m,g;return[((r=a.firstName)==null?void 0:r.trim())??"",((n=a.surname)==null?void 0:n.trim())??"",((s=a.masterYearGroup)==null?void 0:s.id)??"",((l=(u=a.username)==null?void 0:u.toLowerCase())==null?void 0:l.trim())??"",((g=(m=a.email)==null?void 0:m.toLowerCase())==null?void 0:g.trim())??""].join(":")};return e.filter((a,r,n)=>r===n.findIndex(s=>i(s)===i(a)))},getNewDuplicates(e){if(!e)return null;const i=[],a=[],r={};e.forEach(s=>{if(!s.username){a.push(s);return}if(!r[s.username]){r[s.username]=[s];return}r[s.username].push(s)}),Object.keys(r).map(s=>{if(r[s].length===1){a.push(r[s][0]);return}i.push({errorCodes:[t.UsernameAlreadyExisted],users:r[s]})});const n={};return e.forEach(s=>{if(s.email){if(!n[s.email]){n[s.email]=[s];return}n[s.email].push(s)}}),Object.keys(n).map(s=>{if(n[s].length===1)return;const{username:u}=A.first(n[s]);if(!u||r[u].length===1)i.push({errorCodes:[t.EmailAlreadyExisted],users:n[s]});else{const l=i.findIndex(m=>A.first(m.users).username===u);i[l].errorCodes.push(t.EmailAlreadyExisted)}}),i},formatCreateOrValidateUserRequest(e,i,a){return{users:e.map(r=>{const n={firstName:r.firstName,email:r.email,surname:r.surname,username:r.username,userType:i,customerId:a,masterRole:r.masterRole||w.User,requirePasswordChange:!1,generatePassword:!!r.generatePassword,password:r.password,displayName:r.displayName||null};return i===N.Learner&&(n.masterYearGroup=r.masterYearGroup),n.username||delete n.username,n.password||delete n.password,n.password&&n.generatePassword&&(n.generatePassword=!1),r.userId&&(n.userId=r.userId),n})}},formatEditUserRequest(e){return e.displayName||(e.displayName=null),e},formatDeleteRequest(e,i,a){const r={customerId:e};if(!i.length){const n=O.DeserializeQueryParams(O.GetCurrentQueryString().substring(1));n.query&&(r.searchQuery=n.query);const s=n.status&&(Array.isArray(n.status)?n.status:[n.status]);s!=null&&s.length&&(r.userStatuses=[],s.forEach(u=>{u==="active"&&r.userStatuses.push(p.Active),u==="deactivated"&&r.userStatuses.push(p.Disabled),u==="pending"&&r.userStatuses.push(p.Inactive)})),n.yearGroup&&(r.yearGroupValues=Array.isArray(n.yearGroup)?n.yearGroup:[n.yearGroup])}return Object.keys(r).length===1?r.userIds=i.map(n=>n.id):r.userType=a,r},formatToggleStatusRequest(e,i,a){return{customerId:i,users:[{userId:e.id,status:a}]}},getErrorMessages(e,i,a,r){const n={},s=h.encloseNamespace("userManager.utils"),u={[t.Ok]:"",[t.UsernameRequired]:"",[t.EmailRequired]:s("emailRequired"),[t.FirstnameRequired]:s("nameRequired"),[t.SurnameRequired]:s("surnameRequired"),[t.YearGroupRequired]:s("yearGroupRequired"),[t.EmailAlreadyExisted]:s(a?"emailExistsShort":"emailExistsLong"),[t.UsernameAlreadyExisted]:s(a?"usernameExistsShort":"usernameExistsLong"),[t.UserTypeRequired]:"",[t.MasterYearGroupRequired]:s("yearGroupRequired"),[t.EmptyUserEntity]:"",[t.CustomerIdRequired]:"",[t.CustomerNotFoundInOnline]:"",[t.EmailTooLong]:s("emailExceeds"),[t.UsernameTooLong]:s("usernameExceeds"),[t.FirstnameTooLong]:s("nameExceeds"),[t.SurnameTooLong]:s("surnameExceeds"),[t.EmailInvalid]:s(a?"emailInvalidShort":"emailInvalidLong"),[t.EmailInUse]:s(a?"emailExistsShort":"emailExistsLong"),[t.UsernameInvalid]:s(a?"usernameInvalidShort":"usernameInvalidLong"),[t.PasswordTooShort]:s(a?"passwordTooShortShort":"passwordTooShortLong",{minLength:i}),[t.EmailDuplicated]:"",[t.UsernameDuplicated]:"",[t.DisplayNameTooLong]:s("displayNameExceeds"),[t.DisplayNameTooShort]:s("displayNameTooShort"),[t.UsernameTooShort]:s("usernameTooShort"),[t.FirstnameInvalid]:s("firstNameInvalid"),[t.SurnameInvalid]:s("surnameInvalid"),[t.CustomerFoundInOnline]:s("support"),[t.UserInCustomerWithOnline]:s("support"),[t.InvalidUserStatus]:s("support"),[t.UserTypeMismatch]:"",[t.UserCanBeAddedInCustomer]:"",[t.UserCanBeCreated]:"",[t.UserAlreadyExistsInCustomer]:"",[t.Rostered]:"",[t.InvalidYearGroup]:s("invalidYearGroupError")},l={[t.Ok]:"",[t.UsernameRequired]:"",[t.EmailRequired]:"email",[t.FirstnameRequired]:"firstName",[t.SurnameRequired]:"surname",[t.YearGroupRequired]:"masterYearGroup",[t.EmailAlreadyExisted]:"email",[t.UsernameAlreadyExisted]:"username",[t.UserTypeRequired]:"",[t.MasterYearGroupRequired]:"masterYearGroup",[t.EmptyUserEntity]:"",[t.CustomerIdRequired]:"",[t.CustomerNotFoundInOnline]:"",[t.EmailTooLong]:"email",[t.UsernameTooLong]:"username",[t.FirstnameTooLong]:"firstName",[t.SurnameTooLong]:"surname",[t.EmailInvalid]:"email",[t.EmailInUse]:"email",[t.UsernameInvalid]:"username",[t.PasswordTooShort]:"password",[t.EmailDuplicated]:"",[t.UsernameDuplicated]:"",[t.DisplayNameTooLong]:"displayName",[t.DisplayNameTooShort]:"displayName",[t.UsernameTooShort]:"username",[t.FirstnameInvalid]:"firstName",[t.SurnameInvalid]:"surname",[t.UserTypeMismatch]:"email",[t.UserCanBeAddedInCustomer]:"email",[t.UserCanBeCreated]:"email",[t.CustomerFoundInOnline]:"email",[t.UserInCustomerWithOnline]:"email",[t.InvalidUserStatus]:"email",[t.UserAlreadyExistsInCustomer]:"email",[t.Rostered]:"email",[t.InvalidYearGroup]:"masterYearGroup"};return e.forEach(m=>{var x;const g=(r==null?void 0:r[m])??u[m]??"";if(!g)return;const d=l[m];d&&(n[d]=((x=r==null?void 0:r[m])==null?void 0:x[d])??g)}),n},showEmptyState(e,i){var r;if(!e.data)return!1;const a=Object.keys(i).length;return"results"in e.data||a?!1:!((r=e.data.data)!=null&&r.length)},getFilters(e,i,a,r){const n=[P.SortBy(G.getNameSortOptions())];return i===N.Learner&&(a==null?void 0:a.length)>1&&n.push(P.YearGroup(G.getYearGroupOptions(a))),n.push(P.Status()),i===N.Staff&&n.push(P.IsAdmin(e,r)),n},getMinimumPasswordLength(e,i,a){var n;if(!e)return de;const r=(n=e.securitySettings)==null?void 0:n.find(s=>s.userRole===a&&s.userType===i);return r?r.minPasswordLength:a===w.Admin||a===w.SuperAdmin?e.defaultAdminMinPasswordLength:e.defaultMinPasswordLength},mapStatusParamsToValue(e){if(!e)return;const i=a=>{switch(a){case"active":return p.Active;case"deactivated":return p.Disabled;case"pending":return p.Inactive}};return Array.isArray(e)?e.map(i):[i(e)]},buildSearchData({customerId:e,userId:i,userType:a,queryParams:r={}}){const n=j.buildSearchFiltersData(e,a,r),s=j.buildSearchSortData(e,r);return{query:r.query,indices:["user"],searchType:"user",customerIdOverride:e,userId:i,customerId:e,filters:n,sorts:s}},buildSearchDataAndKey({customerId:e,userId:i,userType:a,queryParams:r,cursor:n}){const s=j.buildSearchData({customerId:e,userId:i||"",userType:a,queryParams:r||{}});n&&(s.cursor=n);let u=`search:users:${n||""}`;return u+=ae.flattenObjectToString(s),{key:u,data:s}},buildSearchParams(e,i,a={}){let r=j.buildSearchFiltersObject(e,i,a);return r=Object.keys(r).reduce((n,s)=>(n[`${re.FILTER_PARAM_PREFIX}${s}`]=r[s],n),{}),{query:a.query,index:"user",customerIdOverride:e,...r}},buildSearchSortData(e,i={}){const a={};if(i.sort)switch(i.sort){case"first-name-atoz":a.firstName="asc";break;case"first-name-ztoa":a.firstName="desc";break;case"surname-atoz":a.surname="asc";break;case"surname-ztoa":a.surname="desc";break;case"newest":a.userProfile={customerId:e,fieldOrders:{dateCreated:"desc"}};break;case"oldest":a.userProfile={customerId:e,fieldOrders:{dateCreated:"asc"}};break}else a.userProfile={customerId:e,fieldOrders:{dateCreated:"desc"}};return a},buildSearchFiltersData(e,i,a={}){const r={userType:i.toLowerCase()};return r.userProfile={customerId:e},a.isAdmin==="true"&&(r.userProfile.role=[w.Admin.toLowerCase(),w.SuperAdmin.toLowerCase()]),a.yearGroup&&(r.yearGroup={customerId:e},Array.isArray(a.yearGroup)?r.yearGroup.value=a.yearGroup:r.yearGroup.value=[a.yearGroup]),a.status&&(Array.isArray(a.status)?r.userProfile.status=a.status.map(n=>b[n]):r.userProfile.status=[b[a.status]]),r},buildSearchFiltersObject(e,i,a={}){const r={userType:i.toLowerCase(),customerId:e.toString()};return a.isAdmin==="true"&&(r.userRole=w.Admin.toLowerCase()),a.yearGroup&&(Array.isArray(a.yearGroup)?r.yearGroup=`${a.yearGroup.join(",")}`:r.yearGroup=a.yearGroup),a.status&&(Array.isArray(a.status)?r.userProfileStatus=a.status.map(n=>b[n]).join(","):r.userProfileStatus=b[a.status]),r},buildGetUsersQuery(e,i={}){const{yearGroup:a="",status:r="",isAdmin:n="",sort:s="newest"}=i,u=[`usertype:${e}`];if(a&&(Array.isArray(a)?u.push(`yeargroups.value:[${a.join(",")}]`):u.push(`yeargroups.value:${a}`)),n==="true"&&u.push(`userprofiles.role:${w.Admin}`),r&&(Array.isArray(r)?u.push(`status:[${r.map(l=>b[l]).join(",")}]`):u.push(`status:${b[r]}`)),s)switch(s){case"first-name-atoz":u.push("orderby:name");break;case"first-name-ztoa":u.push("orderbydesc:name");break;case"surname-atoz":u.push("orderby:surname");break;case"surname-ztoa":u.push("orderbydesc:surname");break;case"newest":u.push("orderbydesc:timestamp");break;case"oldest":u.push("orderby:timestamp");break}return`{${u.join(",")}}avatar`},shouldDisplayAuthenticationMethods(e){var r;return!(e!=null&&e.length)||!!!((r=A.first(e).authenticationMethods)!=null&&r.length)?!1:!!e.find(n=>{var u;return!!((u=n.authenticationMethods)==null?void 0:u.find(l=>!l.local))})},handleAsyncErrors(e,i,a,r){var u;const n=(u=e==null?void 0:e[0])==null?void 0:u.errorCodes;if(!(n!=null&&n.length))return!0;const s={};return(n.includes(t.EmailAlreadyExisted)||n.includes(t.EmailInUse))&&(!a||a.email!==i.email)&&(s.email=h.getPhrase(k,"emailExistsLong")),n.includes(t.UsernameAlreadyExisted)&&(!a||a.username!==i.username)&&(s.username=h.getPhrase(k,"usernameExistsLong")),Object.keys(s).length?(r({errors:s}),!1):!0},getInitialErrorsForInvalidYearGroups(e){return!e||e.value===0?{masterYearGroup:h.getPhrase(k,"yearGroupRequired")}:{}}},B="settings.emailSettings",ce=S.object().shape({email:S.string().required(()=>h.getPhrase(B,"emailRequired")).email(()=>h.getPhrase(B,"emailInvalid")).trim().default("")});function he(){return o.jsx(le,{children:o.jsx("svg",{viewBox:"0 0 24 24",children:o.jsx("path",{d:"M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z"})})})}const Z="settings.emailSettings",F=h.encloseNamespace(Z);function pe(e){const i=U(q.MDDown),[a,r]=C.useState(!i),n=e.currentUser.emailVerified;return C.useEffect(()=>{!i&&!a&&r(!0)},[i,a]),o.jsxs(H.Provider,{value:Z,children:[o.jsxs("h2",{className:"h4 d-flex align-items-center",children:[o.jsx(f,{phrase:"heading"}),n&&o.jsxs("span",{className:"font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2",children:[o.jsx(f,{phrase:"verified"}),o.jsx(he,{})]})]}),n&&o.jsx("p",{children:o.jsx(f,{phrase:"info",options:{email:e.currentUser.email}})}),a?o.jsx(X,{initialValues:{email:e.currentUser.email||""},onSubmit:e.onChangeEmail,validationSchema:ce,children:o.jsxs(Q,{children:[o.jsx(I,{className:"w-75",name:"email",placeholder:F("emailPlaceholder"),autoComplete:"email"}),o.jsxs("div",{className:`d-flex justify-content-end w-75 ${i?"ms-n2":""}`,children:[i&&o.jsx("button",{type:"button",className:"btn btn-link me-2",onClick:()=>r(!1),children:o.jsx(f,{phrase:"cancel"})}),o.jsx(K,{isNew:!1,submitText:F(n?"updateEmail":"verifyEmail"),variant:n?"outline-dark":"dark"})]})]})}):o.jsx(o.Fragment,{children:o.jsx("div",{className:"d-flex",children:o.jsx("button",{className:"btn btn-outline-dark me-2",onClick:()=>r(!0),children:o.jsx(f,{phrase:"change"})})})})]})}const fe="_partialLabel_1h6pk_1",ge="_partialInfo_1h6pk_5",ye="_partialInput_1h6pk_10",we="_partialSubmit_1h6pk_14",Se="_partialNote_1h6pk_18",E={partialLabel:fe,partialInfo:ge,partialInput:ye,partialSubmit:we,partialNote:Se};function xe(){return o.jsxs("div",{className:"w-50",children:[o.jsx("div",{className:`partial-loading-background mb-2 ${E.partialLabel}`}),o.jsx("div",{className:`partial-loading-background ${E.partialInfo}`}),o.jsx("div",{className:"form-group",children:o.jsx("div",{className:`partial-loading-background ${E.partialInput}`})}),o.jsx("div",{className:`partial-loading-background ${E.partialSubmit}`}),o.jsx("div",{className:`partial-loading-background mt-2 ${E.partialNote}`})]})}const J="shared.changePasswordForm",y=h.encloseNamespace(J);V.defaultProps={submitVariant:"outline-dark",buttonContainerClass:"btn-container d-flex justify-content-end align-items-center",inputWidthClass:"w-100"};function V(e){const i=se();return o.jsxs(Q,{children:[!e.hideCurrentPassword&&o.jsx(I,{className:e.inputWidthClass,name:"currentPassword",label:y("currentPassword"),placeholder:y("currentPasswordPlaceholder"),type:"password",autoComplete:"current-password",showRequiredStar:!0}),o.jsx(I,{className:e.inputWidthClass,name:"newPassword",label:y("newPassword"),placeholder:y("newPasswordPlaceholder"),type:"password",autoComplete:"new-password",showRequiredStar:!0}),o.jsx(I,{className:e.inputWidthClass,name:"confirmPassword",label:y("confirmPassword"),placeholder:y("confirmPasswordPlaceholder"),type:"password",autoComplete:"off",showRequiredStar:!0}),e.showChangeOnNextLogin&&o.jsx(I,{id:"changeOnNextLogin",name:"changeOnNextLogin",label:y("changeOnNextLogin"),type:"checkbox",checked:i.values.changeOnNextLogin,checkboxLabelFontWeight:"normal"}),!e.hideButtons&&o.jsxs("div",{className:e.buttonContainerClass,children:[!e.hideCancelButton&&!!e.onClickCancel&&o.jsx("button",{type:"button",className:`btn btn-link me-2 ${e.buttonSize==="lg"?"btn-lg":""}`,onClick:e.onClickCancel,children:o.jsx(f,{namespace:J,phrase:"cancel"})}),o.jsx(K,{isNew:!1,submitText:e.submitText||y("save"),variant:e.submitVariant,size:e.buttonSize})]})]})}const be="settings.passwordSettings",v=h.encloseNamespace(be),Ee=e=>S.object().shape({currentPassword:S.string().required(()=>v("currentPasswordRequired")).trim().default(""),newPassword:S.string().required(()=>v("newPasswordRequired")).min(e,()=>v("newPasswordMinLength",{minLen:e})).trim().default(""),confirmPassword:S.string().required(()=>v("confirmPasswordRequired")).oneOf([S.ref("newPassword"),null],()=>v("passwordsDontMatch")).trim().default("")}),W="settings.passwordSettings",ve={currentPassword:"",newPassword:"",confirmPassword:""};function Ie(e){const i=U(q.MDDown),[a,r]=C.useState(!i);C.useEffect(()=>{!i&&!a&&r(!0)},[i,a]);function n(s,u){e.onChangePassword(s,u,()=>u({reset:!0}))}return o.jsxs(H.Provider,{value:W,children:[o.jsx("h2",{className:"h4",children:o.jsx(f,{phrase:"heading"})}),a?o.jsxs(o.Fragment,{children:[o.jsx("p",{children:o.jsx(f,{phrase:"info"})}),o.jsx(X,{initialValues:ve,onSubmit:n,validationSchema:Ee(e.minPasswordLength),children:o.jsx(V,{onClickCancel:()=>r(!1),hideCancelButton:!i,submitText:h.getPhrase(W,"savePassword"),buttonContainerClass:i?"d-flex justify-content-end ms-n2 w-75":"d-flex justify-content-end w-75",inputWidthClass:"w-75"})})]}):o.jsx("button",{className:"btn btn-outline-dark ",onClick:()=>r(!0),children:o.jsx(f,{phrase:"change"})})]})}const je={getCustomerSecuritySettings(e,i,a){return{url:`{gateway}/v1/customers/${e}/settings/security`,key:"customers:security:settings",normalize:!1,success:i,error:a}},setCustomerSecuritySettings(e,i,a,r){return{url:`{gateway}/v1/customers/${e}/settings/security`,key:"update:security:settings",invalidationKeys:"customers:security:settings",type:te.PUT,normalize:!1,data:i,success:a,error:r}}},Le="settings.accountSettings",c=h.encloseNamespace(Le);function Oe(){var g;const e=ne(),i=ie(),a=U(q.MDDown),r=R(ue.currentUser()),n=R(r.data&&T.getUser(r.data.id)),s=R(r.data&&je.getCustomerSecuritySettings(r.data.customerId));oe({title:c("heading")});function u(d,x){D(e,T.changeEmail(d.email,()=>{$.logUserAction({id:r.data.id,oldEmail:r.data.email,newEmail:d.email},{actionType:z.VerifyEmail,entity:_.User,location:Y.Settings,workflowPhase:M.Start}),i.success(c("changeEmailRequestSuccess",{email:d.email,escapeText:!0}))},()=>{i.error(c("changeEmailRequestError"))},x))}function l(d,x,ee){D(e,T.changePassword(d,()=>{$.logUserAction({id:r.data.id,oldPassword:d.currentPassword,newPassword:d.newPassword},{actionType:z.ChangePassword,entity:_.User,location:Y.Settings,workflowPhase:M.Complete}),i.success(c("changePasswordSuccess")),ee()},({responseJSON:L})=>{L.errorCode==="user.password-too-short"?i.error(c("changePasswordRequirementsError")):L.errorCode==="user.invalid-password"?i.error(c("changePasswordInvalid")):L.errorCode==="user.same-password"?i.error(c("changePasswordSame")):L.errorCode==="user.locked-out"?i.error(c("changePasswordLockedOut")):i.error(c("changePasswordError"))},x))}const m=j.getMinimumPasswordLength(s.data,(g=n.data)==null?void 0:g.userType,r.data.role);return o.jsxs(me,{heading:c("heading"),breadcrumbs:[c("breadcrumb")],children:[o.jsx("div",{className:a?"w-100":"w-50",children:r.data?o.jsx(pe,{currentUser:r.data,onChangeEmail:u}):o.jsx(xe,{})}),o.jsx("hr",{}),o.jsx("div",{className:a?"w-100":"w-50",children:s.data&&o.jsx(Ie,{onChangePassword:l,minPasswordLength:m})})]})}export{Oe as AccountSettingsView};
2
- //# sourceMappingURL=DgMPP2NS.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DgMPP2NS.chunk.js","sources":["../../../../libs/shared/src/apps/user-manager/enums/UserValidationCode.ts","../../../../libs/shared/src/apps/user-manager/utils/UserManagerHelper.ts","../../src/apps/settings/components/email-settings/EmailSettingsValidationSchema.ts","../../src/apps/settings/components/email-settings/VerifiedEmailIcon.tsx","../../src/apps/settings/components/email-settings/EmailSettings.tsx","../../src/apps/settings/components/email-settings/partial-loading/PartialEmailSettings.tsx","../../../../libs/shared/src/apps/user-manager/components/change-password-form/ChangePasswordForm.tsx","../../src/apps/settings/components/password-settings/PasswordSettingsValidationSchema.ts","../../src/apps/settings/components/password-settings/PasswordSettings.tsx","../../src/apps/settings/flight-requests/SecuritySettingsRequests.ts","../../src/apps/settings/views/account-settings/AccountSettingsView.tsx"],"sourcesContent":["// Copied directly from User API\nexport enum UserValidationCode {\n Ok = 'Ok',\n UsernameRequired = 'UsernameRequired',\n EmailRequired = 'EmailRequired',\n FirstnameRequired = 'FirstnameRequired',\n SurnameRequired = 'SurnameRequired',\n YearGroupRequired = 'YearGroupRequired',\n EmailAlreadyExisted = 'EmailAlreadyExisted', // This means another user has this email address, and it's verified\n UsernameAlreadyExisted = 'UsernameAlreadyExisted',\n UserTypeRequired = 'UserTypeRequired',\n MasterYearGroupRequired = 'MasterYearGroupRequired',\n EmptyUserEntity = 'EmptyUserEntity',\n CustomerIdRequired = 'CustomerIdRequired',\n CustomerNotFoundInOnline = 'CustomerNotFoundInOnline',\n EmailTooLong = 'EmailTooLong',\n UsernameTooLong = 'UsernameTooLong',\n FirstnameTooLong = 'FirstnameTooLong',\n SurnameTooLong = 'SurnameTooLong',\n EmailInvalid = 'EmailInvalid',\n EmailInUse = 'EmailInUse', // This means another user has this email address, but it's unverified\n UsernameInvalid = 'UsernameInvalid',\n PasswordTooShort = 'PasswordTooShort',\n EmailDuplicated = 'EmailDuplicated', // Same email has been used in the same request\n UsernameDuplicated = 'UsernameDuplicated', // Same username has been used in the same request\n DisplayNameTooLong = 'DisplayNameTooLong',\n DisplayNameTooShort = 'DisplayNameTooShort',\n UsernameTooShort = 'UsernameTooShort',\n FirstnameInvalid = 'FirstnameInvalid',\n SurnameInvalid = 'SurnameInvalid',\n\n // user man 3.0\n UserTypeMismatch = 'UserTypeMismatch',\n UserCanBeAddedInCustomer = 'UserCanBeAddedInCustomer',\n UserCanBeCreated = 'UserCanBeCreated',\n CustomerFoundInOnline = 'CustomerFoundInOnline',\n UserInCustomerWithOnline = 'UserInCustomerWithOnline',\n InvalidUserStatus = 'InvalidUserStatus',\n UserAlreadyExistsInCustomer = 'UserAlreadyExistsInCustomer',\n\n // a user created by rostered\n Rostered='UserRostered',\n\n // Unknown year group\n InvalidYearGroup = 'InvalidYearGroup',\n}","import { FormikErrors } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { SearchFilter, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { BulkCreateOrValidateUserRequest, BulkDeleteUsersRequest, BulkUpdateUserStatusRequest, EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { FormSubmissionOptions } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { Customer, User, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nimport { FilterConstants } from '../../search/constants/FilterConstants';\nimport { DuplicateUserSet } from '../interfaces/viewmodels/BulkUserUploadViewModel';\n\nconst FALLBACK_MIN_PASSWORD_LENGTH = 8;\nconst namespace = 'userManager.utils';\n\nconst StatusMap: HashObject = {\n active: ObjectStatus.Active.toLowerCase(),\n deactivated: ObjectStatus.Disabled.toLowerCase(),\n pending: ObjectStatus.Inactive.toLowerCase()\n};\n\nexport const UserManagerHelper = {\n filterIdenticalEntries(spreadsheetEntries: EditUserRequest[]): EditUserRequest[] {\n const identify = (u: EditUserRequest) => {\n return [\n u.firstName?.trim() ?? '',\n u.surname?.trim() ?? '',\n u.masterYearGroup?.id ?? '',\n u.username?.toLowerCase()?.trim() ?? '',\n u.email?.toLowerCase()?.trim() ?? ''\n ].join(':');\n };\n\n return spreadsheetEntries.filter((entry, index, self) =>\n index === self.findIndex(u => identify(u) === identify(entry)));\n },\n\n getNewDuplicates(users?: EditUserRequest[]): DuplicateUserSet[] {\n if (!users)\n return null;\n\n const duplicateSets: DuplicateUserSet[] = [];\n const validUsers: EditUserRequest[] = [];\n\n /**\n * Find all users in uploaded spreadsheet with duplicate usernames.\n */\n const usernameDuplicateLookup: { [ username: string ]: EditUserRequest[]; } = {};\n\n users.forEach(user => {\n if (!user.username) {\n validUsers.push(user);\n return;\n }\n\n if (!usernameDuplicateLookup[user.username]) {\n usernameDuplicateLookup[user.username] = [user];\n return;\n }\n\n usernameDuplicateLookup[user.username].push(user);\n });\n\n Object.keys(usernameDuplicateLookup).map(username => {\n if (usernameDuplicateLookup[username].length === 1) {\n validUsers.push(usernameDuplicateLookup[username][0]);\n return;\n }\n\n duplicateSets.push({\n errorCodes: [UserValidationCode.UsernameAlreadyExisted],\n users: usernameDuplicateLookup[username]\n });\n });\n\n /**\n * Find all remaining users in spreadsheet with duplicate emails\n */\n const emailDuplicateLookup: { [ email: string ]: EditUserRequest[]; } = {};\n\n users.forEach(user => {\n if (!user.email)\n return;\n\n if (!emailDuplicateLookup[user.email]) {\n emailDuplicateLookup[user.email] = [user];\n return;\n }\n\n emailDuplicateLookup[user.email].push(user);\n });\n\n Object.keys(emailDuplicateLookup).map(email => {\n if (emailDuplicateLookup[email].length === 1)\n return;\n\n const { username } = ArrayHelper.first(emailDuplicateLookup[email]);\n\n if (!username || usernameDuplicateLookup[username].length === 1) {\n duplicateSets.push({\n errorCodes: [UserValidationCode.EmailAlreadyExisted],\n users: emailDuplicateLookup[email]\n });\n } else {\n const dupeSetIndex = duplicateSets.findIndex(set => ArrayHelper.first(set.users).username === username);\n\n duplicateSets[dupeSetIndex].errorCodes.push(UserValidationCode.EmailAlreadyExisted);\n }\n });\n\n return duplicateSets;\n },\n\n formatCreateOrValidateUserRequest(\n users: EditUserRequest[],\n userType: UserGroup,\n customerId: string\n ): BulkCreateOrValidateUserRequest {\n return {\n users: users.map((u: EditUserRequest) => {\n const obj: EditUserRequest = {\n firstName: u.firstName,\n email: u.email,\n surname: u.surname,\n username: u.username,\n userType,\n customerId,\n masterRole: u.masterRole || UserRole.User,\n requirePasswordChange: false,\n generatePassword: !!u.generatePassword,\n password: u.password,\n displayName: u.displayName || null\n };\n\n if (userType === UserGroup.Learner)\n obj.masterYearGroup = u.masterYearGroup;\n\n if (!obj.username)\n delete obj.username;\n\n if (!obj.password)\n delete obj.password;\n\n if (obj.password && obj.generatePassword)\n obj.generatePassword = false;\n\n if (u.userId)\n obj.userId = u.userId;\n\n return obj;\n })\n };\n },\n\n formatEditUserRequest(user: EditUserRequest): EditUserRequest {\n if (!user.displayName)\n user.displayName = null;\n\n return user;\n },\n\n formatDeleteRequest(customerId: string, users?: User[], userType?: UserGroup): BulkDeleteUsersRequest {\n const body: BulkDeleteUsersRequest = {\n customerId\n };\n\n if (!users.length) {\n const queryParams = Core.LocationUtils.DeserializeQueryParams(\n Core.LocationUtils.GetCurrentQueryString().substring(1)\n );\n\n if (queryParams.query)\n body.searchQuery = queryParams.query;\n\n const statuses = queryParams.status &&\n (Array.isArray(queryParams.status) ? queryParams.status : [queryParams.status]);\n\n if (statuses?.length) {\n body.userStatuses = [];\n\n statuses.forEach(status => {\n if (status === 'active') body.userStatuses.push(ObjectStatus.Active);\n if (status === 'deactivated') body.userStatuses.push(ObjectStatus.Disabled);\n if (status === 'pending') body.userStatuses.push(ObjectStatus.Inactive);\n });\n }\n \n if (queryParams.yearGroup) {\n body.yearGroupValues = Array.isArray(queryParams.yearGroup) ? queryParams.yearGroup : [queryParams.yearGroup];\n }\n }\n\n if (Object.keys(body).length === 1) {\n body.userIds = users.map(u => u.id);\n } else {\n body.userType = userType;\n }\n\n return body;\n },\n\n formatToggleStatusRequest(user: User, customerId: string, newStatus: ObjectStatus): BulkUpdateUserStatusRequest {\n return {\n customerId,\n users: [{\n userId: user.id,\n status: newStatus\n }]\n };\n },\n\n getErrorMessages(\n errorCodes: UserValidationCode[],\n minPasswordLength: number,\n shortMessages?: boolean,\n localMessage?: HashObject\n ) {\n const messages: HashObject = {};\n\n const getPhrase = LanguageService.encloseNamespace('userManager.utils');\n\n const CodeToMessageMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: getPhrase('emailRequired'),\n [UserValidationCode.FirstnameRequired]: getPhrase('nameRequired'),\n [UserValidationCode.SurnameRequired]: getPhrase('surnameRequired'),\n [UserValidationCode.YearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmailAlreadyExisted]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameAlreadyExisted]: getPhrase(shortMessages ? 'usernameExistsShort' : 'usernameExistsLong'),\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: getPhrase('emailExceeds'),\n [UserValidationCode.UsernameTooLong]: getPhrase('usernameExceeds'),\n [UserValidationCode.FirstnameTooLong]: getPhrase('nameExceeds'),\n [UserValidationCode.SurnameTooLong]: getPhrase('surnameExceeds'),\n [UserValidationCode.EmailInvalid]: getPhrase(shortMessages ? 'emailInvalidShort' : 'emailInvalidLong'),\n [UserValidationCode.EmailInUse]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameInvalid]: getPhrase(shortMessages ? 'usernameInvalidShort' : 'usernameInvalidLong'),\n [UserValidationCode.PasswordTooShort]: getPhrase(shortMessages ? 'passwordTooShortShort' : 'passwordTooShortLong', { minLength: minPasswordLength }),\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: getPhrase('displayNameExceeds'),\n [UserValidationCode.DisplayNameTooShort]: getPhrase('displayNameTooShort'),\n [UserValidationCode.UsernameTooShort]: getPhrase('usernameTooShort'),\n [UserValidationCode.FirstnameInvalid]: getPhrase('firstNameInvalid'),\n [UserValidationCode.SurnameInvalid]: getPhrase('surnameInvalid'),\n [UserValidationCode.CustomerFoundInOnline]: getPhrase('support'),\n [UserValidationCode.UserInCustomerWithOnline]: getPhrase('support'),\n [UserValidationCode.InvalidUserStatus]: getPhrase('support'),\n [UserValidationCode.UserTypeMismatch]: '',\n [UserValidationCode.UserCanBeAddedInCustomer]: '',\n [UserValidationCode.UserCanBeCreated]: '',\n [UserValidationCode.UserAlreadyExistsInCustomer]: '',\n [UserValidationCode.Rostered]: '',\n [UserValidationCode.InvalidYearGroup]: getPhrase('invalidYearGroupError')\n };\n\n const CodeToFieldMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: 'email',\n [UserValidationCode.FirstnameRequired]: 'firstName',\n [UserValidationCode.SurnameRequired]: 'surname',\n [UserValidationCode.YearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmailAlreadyExisted]: 'email',\n [UserValidationCode.UsernameAlreadyExisted]: 'username',\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: 'email',\n [UserValidationCode.UsernameTooLong]: 'username',\n [UserValidationCode.FirstnameTooLong]: 'firstName',\n [UserValidationCode.SurnameTooLong]: 'surname',\n [UserValidationCode.EmailInvalid]: 'email',\n [UserValidationCode.EmailInUse]: 'email',\n [UserValidationCode.UsernameInvalid]: 'username',\n [UserValidationCode.PasswordTooShort]: 'password',\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: 'displayName',\n [UserValidationCode.DisplayNameTooShort]: 'displayName',\n [UserValidationCode.UsernameTooShort]: 'username',\n [UserValidationCode.FirstnameInvalid]: 'firstName',\n [UserValidationCode.SurnameInvalid]: 'surname',\n [UserValidationCode.UserTypeMismatch]: 'email',\n [UserValidationCode.UserCanBeAddedInCustomer]: 'email',\n [UserValidationCode.UserCanBeCreated]: 'email',\n [UserValidationCode.CustomerFoundInOnline]: 'email',\n [UserValidationCode.UserInCustomerWithOnline]: 'email',\n [UserValidationCode.InvalidUserStatus]: 'email',\n [UserValidationCode.UserAlreadyExistsInCustomer]: 'email',\n [UserValidationCode.Rostered]: 'email',\n [UserValidationCode.InvalidYearGroup]: 'masterYearGroup'\n };\n\n errorCodes.forEach(code => {\n const message = localMessage?.[code] ?? CodeToMessageMap[code] ?? '';\n\n if (!message)\n return;\n\n const field = CodeToFieldMap[code];\n\n if (!field)\n return;\n\n messages[field] = localMessage?.[code]?.[field] ?? message;\n });\n\n return messages;\n },\n\n showEmptyState(userRequest: Flight.Response<UserCollection | SearchResults<User>>, queryParams: HashObject): boolean {\n if (!userRequest.data)\n return false;\n\n const hasQueryParams = Object.keys(queryParams).length;\n\n if (('results' in userRequest.data) || hasQueryParams)\n return false;\n\n return !userRequest.data.data?.length;\n },\n\n getFilters(customer: Customer, userType: UserGroup, yearGroups?: YearGroup[], countryCode?: string): SearchFilter[] {\n const filters = [Filters.SortBy(FilterHelper.getNameSortOptions())];\n\n if (userType === UserGroup.Learner && yearGroups?.length > 1)\n filters.push(Filters.YearGroup(FilterHelper.getYearGroupOptions(yearGroups)));\n\n filters.push(Filters.Status());\n \n if (userType === UserGroup.Staff)\n filters.push(Filters.IsAdmin(customer, countryCode));\n\n return filters;\n },\n\n getMinimumPasswordLength(\n securitySettings: SecuritySettingsResponse,\n userType: UserGroup,\n userRole: UserRole\n ): number {\n if (!securitySettings)\n return FALLBACK_MIN_PASSWORD_LENGTH;\n\n const customSetting = securitySettings.securitySettings?.find(s => {\n return s.userRole === userRole && s.userType === userType;\n });\n\n if (customSetting)\n return customSetting.minPasswordLength;\n\n if (userRole === UserRole.Admin || userRole === UserRole.SuperAdmin)\n return securitySettings.defaultAdminMinPasswordLength;\n\n return securitySettings.defaultMinPasswordLength;\n },\n\n mapStatusParamsToValue(statusParam: string | string[]): ObjectStatus[] {\n if (!statusParam)\n return;\n\n const convertToValue = (status: string): ObjectStatus => {\n switch (status) {\n case 'active':\n return ObjectStatus.Active;\n case 'deactivated':\n return ObjectStatus.Disabled;\n case 'pending':\n return ObjectStatus.Inactive;\n }\n };\n\n if (!Array.isArray(statusParam))\n return [convertToValue(statusParam)];\n\n return statusParam.map(convertToValue);\n },\n\n buildSearchData({\n customerId,\n userId,\n userType,\n queryParams = {}\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams\n }): HashObject {\n const filters = UserManagerHelper.buildSearchFiltersData(customerId, userType, queryParams);\n const sorts = UserManagerHelper.buildSearchSortData(customerId, queryParams);\n\n return {\n query: queryParams.query,\n indices: ['user'],\n searchType: 'user',\n customerIdOverride: customerId,\n userId,\n customerId,\n filters,\n sorts\n };\n },\n\n buildSearchDataAndKey({\n customerId,\n userId,\n userType,\n queryParams,\n cursor\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams?: UserManagerQueryParams,\n cursor?: string,\n }): {key: string, data: HashObject} {\n const data = UserManagerHelper.buildSearchData({\n customerId,\n userId: userId || '',\n userType,\n queryParams: queryParams || {}\n });\n\n if (cursor)\n data.cursor = cursor;\n\n let key = `search:users:${cursor || ''}`;\n key += ObjectHelper.flattenObjectToString(data);\n\n return { key, data };\n },\n\n buildSearchParams(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n let filters = UserManagerHelper.buildSearchFiltersObject(customerId, userType, queryParams);\n\n filters = Object.keys(filters).reduce((prev: HashObject, current) => {\n prev[`${FilterConstants.FILTER_PARAM_PREFIX}${current}`] = filters[current];\n return prev;\n }, {});\n\n return {\n query: queryParams.query,\n index: 'user',\n customerIdOverride: customerId,\n ...filters\n };\n },\n\n buildSearchSortData(customerId: string, queryParams: UserManagerQueryParams = {}): HashObject {\n const sorts: HashObject = {};\n\n if (queryParams.sort) {\n switch (queryParams.sort) {\n case 'first-name-atoz':\n sorts.firstName = 'asc';\n break;\n\n case 'first-name-ztoa':\n sorts.firstName = 'desc';\n break;\n\n case 'surname-atoz':\n sorts.surname = 'asc';\n break;\n\n case 'surname-ztoa':\n sorts.surname = 'desc';\n break;\n\n case 'newest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n break;\n case 'oldest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'asc'\n }\n };\n break;\n\n default:\n break;\n }\n } else {\n // default to newest sort\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n }\n\n return sorts;\n },\n\n buildSearchFiltersData(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase()\n };\n\n filters.userProfile = {\n customerId\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userProfile.role = [ UserRole.Admin.toLowerCase(), UserRole.SuperAdmin.toLowerCase() ];\n\n if (queryParams.yearGroup) {\n filters.yearGroup = { customerId };\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup.value = queryParams.yearGroup;\n } else {\n filters.yearGroup.value = [queryParams.yearGroup];\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfile.status = [StatusMap[queryParams.status]];\n } else {\n filters.userProfile.status = queryParams.status.map(val => StatusMap[val]);\n }\n }\n\n return filters;\n },\n\n buildSearchFiltersObject(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase(),\n customerId: customerId.toString()\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userRole = UserRole.Admin.toLowerCase();\n\n if (queryParams.yearGroup) {\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup = `${queryParams.yearGroup.join(',')}`;\n } else {\n filters.yearGroup = queryParams.yearGroup;\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfileStatus = StatusMap[queryParams.status];\n } else {\n filters.userProfileStatus = queryParams.status.map(val => StatusMap[val]).join(',');\n }\n }\n\n return filters;\n },\n\n buildGetUsersQuery(\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): string {\n const { yearGroup = '', status = '', isAdmin = '', sort = 'newest' } = queryParams;\n\n const filters = [`usertype:${userType}`];\n\n if (yearGroup) {\n if (Array.isArray(yearGroup)) {\n filters.push(`yeargroups.value:[${yearGroup.join(',')}]`);\n } else {\n filters.push(`yeargroups.value:${yearGroup}`);\n }\n }\n\n if (isAdmin === 'true')\n filters.push(`userprofiles.role:${UserRole.Admin}`);\n\n if (status) {\n if (!Array.isArray(status)) {\n filters.push(`status:${StatusMap[status]}`);\n } else {\n filters.push(`status:[${status.map(val => StatusMap[val]).join(',')}]`);\n }\n }\n\n if (sort) {\n switch (sort) {\n case 'first-name-atoz':\n filters.push('orderby:name');\n break;\n \n case 'first-name-ztoa':\n filters.push('orderbydesc:name');\n break;\n \n case 'surname-atoz':\n filters.push('orderby:surname');\n break;\n \n case 'surname-ztoa':\n filters.push('orderbydesc:surname');\n break;\n\n case 'newest':\n filters.push('orderbydesc:timestamp');\n break;\n\n case 'oldest':\n filters.push('orderby:timestamp');\n break;\n \n default:\n break;\n }\n }\n\n return `{${filters.join(',')}}avatar`;\n },\n\n shouldDisplayAuthenticationMethods(users: User[]): boolean {\n if (!users?.length)\n return false;\n\n const hasFetchedAuthenticationMethods = !!ArrayHelper.first(users).authenticationMethods?.length;\n\n if (!hasFetchedAuthenticationMethods)\n return false;\n\n const userWithSSO = users.find(u => {\n const ssoLoginMethod = u.authenticationMethods?.find(am => !am.local);\n\n return !!ssoLoginMethod;\n });\n\n /**\n * If any user in the list has an authentication method that isn't local (meaning it's SSO)\n * then we display authentication methods.\n * \n * Otherwise we don't show them, as every user list item would just say \"ClickView\"\n */\n if (userWithSSO)\n return true;\n\n return false;\n },\n\n handleAsyncErrors(\n errors: ErroredUsers,\n updatedUser: EditUserRequest,\n oldUser: User | null,\n onDone: (options: FormSubmissionOptions) => void\n ): boolean {\n const errorCodes = errors?.[0]?.errorCodes;\n\n if (!errorCodes?.length)\n return true;\n\n const errorMessages: FormikErrors<EditUserRequest> = {};\n\n if (\n errorCodes.includes(UserValidationCode.EmailAlreadyExisted) ||\n errorCodes.includes(UserValidationCode.EmailInUse)\n ) {\n if (!oldUser || oldUser.email !== updatedUser.email)\n errorMessages.email = LanguageService.getPhrase(namespace, 'emailExistsLong');\n }\n\n if (errorCodes.includes(UserValidationCode.UsernameAlreadyExisted)) {\n if (!oldUser || oldUser.username !== updatedUser.username)\n errorMessages.username = LanguageService.getPhrase(namespace, 'usernameExistsLong');\n }\n\n if (!Object.keys(errorMessages).length)\n return true;\n\n onDone({\n errors: errorMessages\n });\n\n return false;\n },\n\n getInitialErrorsForInvalidYearGroups(yearGroup: YearGroup): FormikErrors<EditUserRequest> {\n if (!yearGroup || yearGroup.value === 0)\n return {\n masterYearGroup: LanguageService.getPhrase(namespace, 'yearGroupRequired') as FormikErrors<YearGroup>\n };\n\n return {};\n }\n};","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.emailSettings';\n\nexport const EmailSettingsValidationSchema = object().shape({\n email: string()\n .required(() => LanguageService.getPhrase(namespace, 'emailRequired'))\n .email(() => LanguageService.getPhrase(namespace, 'emailInvalid'))\n .trim()\n .default('')\n});","import React from 'react';\n\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\n\nexport function VerifiedEmailIcon(): JSX.Element {\n return (\n <SvgContainer2>\n <svg viewBox='0 0 24 24'>\n <path d='M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z'/>\n </svg>\n </SvgContainer2>\n );\n}","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { EmailSettingsValidationSchema } from './EmailSettingsValidationSchema';\nimport { VerifiedEmailIcon } from './VerifiedEmailIcon';\n\nconst namespace = 'settings.emailSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface EmailSettingsModel {\n email: string;\n}\n\ninterface EmailSettingsProps {\n currentUser: CurrentUser;\n onChangeEmail: (emailModel: EmailSettingsModel) => void;\n}\n\nexport function EmailSettings(props: EmailSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n const isVerified = props.currentUser.emailVerified;\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4 d-flex align-items-center'>\n <Text phrase='heading' />\n {isVerified && (\n <span className='font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2'>\n <Text phrase='verified' />\n <VerifiedEmailIcon />\n </span>\n )}\n </h2>\n\n {isVerified && (\n <p><Text phrase='info' options={{ email: props.currentUser.email }} /></p>\n )}\n\n {!showForm\n ? (\n <>\n <div className='d-flex'>\n <button className='btn btn-outline-dark me-2' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n </div>\n </>\n ) : (\n <FormWrapper<EmailSettingsModel>\n initialValues={{ email: props.currentUser.email || '' }}\n onSubmit={props.onChangeEmail}\n validationSchema={EmailSettingsValidationSchema}\n >\n <Form>\n <FormField\n className='w-75'\n name='email'\n placeholder={getPhrase('emailPlaceholder')}\n autoComplete='email'\n />\n <div className={`d-flex justify-content-end w-75 ${isSmallScreen ? 'ms-n2' : ''}`}>\n {isSmallScreen && (\n <button type='button' className='btn btn-link me-2' onClick={() => setShowForm(false)}>\n <Text phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={isVerified ? getPhrase('updateEmail') : getPhrase('verifyEmail')}\n variant={isVerified ? 'outline-dark' : 'dark'}\n />\n </div>\n </Form>\n </FormWrapper>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport styles from './partial-email-settings.module.scss';\n\nexport function PartialEmailSettings(): JSX.Element {\n return (\n <div className='w-50'>\n <div className={`partial-loading-background mb-2 ${styles.partialLabel}`} />\n <div className={`partial-loading-background ${styles.partialInfo}`} />\n\n <div className='form-group'>\n <div className={`partial-loading-background ${styles.partialInput}`} />\n </div>\n <div className={`partial-loading-background ${styles.partialSubmit}`} />\n <div className={`partial-loading-background mt-2 ${styles.partialNote}`} />\n </div>\n );\n}","import React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField, FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.changePasswordForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ChangePasswordFormProps {\n onClickCancel?: () => void;\n \n hideButtons?: boolean;\n buttonContainerClass?: string;\n buttonSize?: FormSize;\n hideCancelButton?: boolean;\n hideCurrentPassword?: boolean;\n inputWidthClass?: string;\n showChangeOnNextLogin?: boolean;\n\n submitText?: string;\n submitVariant?: ButtonProps['variant'];\n}\n\nChangePasswordForm.defaultProps = {\n submitVariant: 'outline-dark',\n buttonContainerClass: 'btn-container d-flex justify-content-end align-items-center',\n inputWidthClass: 'w-100'\n};\n\nexport function ChangePasswordForm(props: ChangePasswordFormProps): JSX.Element {\n const formikProps = useFormikContext<ChangePasswordRequest>();\n\n return (\n <Form>\n {!props.hideCurrentPassword && (\n <FormField\n className={props.inputWidthClass}\n name='currentPassword'\n label={getPhrase('currentPassword')}\n placeholder={getPhrase('currentPasswordPlaceholder')}\n type='password'\n autoComplete='current-password'\n showRequiredStar\n />\n )}\n\n <FormField\n className={props.inputWidthClass}\n name='newPassword'\n label={getPhrase('newPassword')}\n placeholder={getPhrase('newPasswordPlaceholder')}\n type='password'\n autoComplete='new-password'\n showRequiredStar\n />\n\n <FormField\n className={props.inputWidthClass}\n name='confirmPassword'\n label={getPhrase('confirmPassword')}\n placeholder={getPhrase('confirmPasswordPlaceholder')}\n type='password'\n autoComplete='off'\n showRequiredStar\n />\n\n {props.showChangeOnNextLogin &&\n <FormField\n id='changeOnNextLogin'\n name='changeOnNextLogin'\n label={getPhrase('changeOnNextLogin')}\n type='checkbox'\n checked={formikProps.values.changeOnNextLogin}\n checkboxLabelFontWeight={'normal'}\n />\n }\n \n {!props.hideButtons && (\n <div className={props.buttonContainerClass}>\n {(!props.hideCancelButton && !!props.onClickCancel) && (\n <button\n type='button'\n className={`btn btn-link me-2 ${props.buttonSize === 'lg' ? 'btn-lg' : ''}`}\n onClick={props.onClickCancel}\n >\n <Text namespace={namespace} phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={props.submitText || getPhrase('save')}\n variant={props.submitVariant}\n size={props.buttonSize}\n />\n </div>\n )}\n </Form>\n );\n}","import { object, ref, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.passwordSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const getPasswordSettingsValidationSchema = (minPasswordLength: number) => object().shape({\n currentPassword: string()\n .required(() => getPhrase('currentPasswordRequired'))\n .trim()\n .default(''),\n newPassword: string()\n .required(() => getPhrase('newPasswordRequired'))\n .min(minPasswordLength, () => getPhrase('newPasswordMinLength', { minLen: minPasswordLength }))\n .trim()\n .default(''),\n confirmPassword: string()\n .required(() => getPhrase('confirmPasswordRequired'))\n .oneOf([ ref('newPassword'), null ], () => getPhrase('passwordsDontMatch'))\n .trim()\n .default('')\n});","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordForm } from 'libs/shared/apps/user-manager/components/change-password-form/ChangePasswordForm';\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormSubmissionOptions, FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\n\nimport { getPasswordSettingsValidationSchema } from './PasswordSettingsValidationSchema';\n\nconst namespace = 'settings.passwordSettings';\n\nconst initialValues: ChangePasswordRequest = {\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n};\n\ninterface PasswordSettingsProps {\n onChangePassword: (\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ) => void;\n minPasswordLength: number;\n}\n\nexport function PasswordSettings(props: PasswordSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n function onSubmitPassword(data: ChangePasswordRequest, onDone: (options?: FormSubmissionOptions) => void) {\n props.onChangePassword(data, onDone, () => onDone({ reset: true }));\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4'><Text phrase='heading' /></h2>\n\n {!showForm\n ? (\n <button className='btn btn-outline-dark ' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n ) : (\n <>\n <p><Text phrase='info' /></p>\n\n <FormWrapper<ChangePasswordRequest>\n initialValues={initialValues}\n onSubmit={onSubmitPassword}\n validationSchema={getPasswordSettingsValidationSchema(props.minPasswordLength)}\n >\n <ChangePasswordForm\n onClickCancel={() => setShowForm(false)}\n hideCancelButton={!isSmallScreen}\n submitText={LanguageService.getPhrase(namespace, 'savePassword')}\n buttonContainerClass={isSmallScreen\n ? 'd-flex justify-content-end ms-n2 w-75'\n : 'd-flex justify-content-end w-75'\n }\n inputWidthClass='w-75'\n />\n </FormWrapper>\n </>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\nimport { UpdateSecuritySettingsRequest } from 'apps/settings/interfaces/security/requests/UpdateSecuritySettingsRequest';\n\nexport const SecuritySettingsRequests = {\n getCustomerSecuritySettings(\n customerId: string,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `customers:security:settings`,\n normalize: false,\n success,\n error\n };\n },\n\n setCustomerSecuritySettings(\n customerId: string,\n data: UpdateSecuritySettingsRequest,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `update:security:settings`,\n invalidationKeys: `customers:security:settings`,\n type: HttpVerbs.PUT,\n normalize: false,\n data,\n success,\n error\n };\n }\n};","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces/ChangePasswordRequest';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { EmailSettings, EmailSettingsModel } from 'apps/settings/components/email-settings/EmailSettings';\nimport { PartialEmailSettings } from 'apps/settings/components/email-settings/partial-loading/PartialEmailSettings';\nimport { PasswordSettings } from 'apps/settings/components/password-settings/PasswordSettings';\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserManagerRequests } from 'apps/settings/flight-requests/UserManagerRequests';\n\nconst namespace = 'settings.accountSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function AccountSettingsView(): JSX.Element {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const masterCurrentUser = Flight.useBasicFetch<User>(currentUser.data &&\n UserManagerRequests.getUser(currentUser.data.id));\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n useSetPageMetadata({ title: getPhrase('heading') });\n\n function onChangeEmail(emailModel: EmailSettingsModel, onDone?: () => void): void {\n Flight.fetch(dispatch, UserManagerRequests.changeEmail(emailModel.email, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldEmail: currentUser.data.email,\n newEmail: emailModel.email\n }, {\n actionType: UserAction.VerifyEmail,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Start\n });\n\n alerts.success(getPhrase('changeEmailRequestSuccess', { email: emailModel.email, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('changeEmailRequestError'));\n }, onDone));\n }\n\n function onChangePassword(\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ): void {\n Flight.fetch(dispatch, UserManagerRequests.changePassword(passwordModel, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldPassword: passwordModel.currentPassword,\n newPassword: passwordModel.newPassword\n }, {\n actionType: UserAction.ChangePassword,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Complete\n });\n\n alerts.success(getPhrase('changePasswordSuccess'));\n onSuccess();\n }, ({ responseJSON }: JQuery.jqXHR) => {\n if (responseJSON.errorCode === 'user.password-too-short')\n alerts.error(getPhrase('changePasswordRequirementsError'));\n else if (responseJSON.errorCode === 'user.invalid-password')\n alerts.error(getPhrase('changePasswordInvalid'));\n else if (responseJSON.errorCode === 'user.same-password')\n alerts.error(getPhrase('changePasswordSame'));\n else if (responseJSON.errorCode === 'user.locked-out')\n alerts.error(getPhrase('changePasswordLockedOut'));\n else\n alerts.error(getPhrase('changePasswordError'));\n }, onDone));\n }\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n passwordPolicy.data,\n masterCurrentUser.data?.userType,\n currentUser.data.role\n );\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n >\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {(currentUser.data)\n ? (\n <EmailSettings\n currentUser={currentUser.data}\n onChangeEmail={onChangeEmail}\n />\n ) : <PartialEmailSettings />\n }\n </div>\n\n <hr />\n\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {passwordPolicy.data && (\n <PasswordSettings onChangePassword={onChangePassword} minPasswordLength={minPasswordLength} />\n )}\n </div>\n </SettingsLayout>\n );\n}"],"names":["UserValidationCode","FALLBACK_MIN_PASSWORD_LENGTH","namespace","StatusMap","ObjectStatus","UserManagerHelper","spreadsheetEntries","identify","u","_a","_b","_c","_e","_d","_g","_f","entry","index","self","users","duplicateSets","validUsers","usernameDuplicateLookup","user","username","emailDuplicateLookup","email","ArrayHelper","dupeSetIndex","set","userType","customerId","obj","UserRole","UserGroup","body","queryParams","Core.LocationUtils","statuses","status","newStatus","errorCodes","minPasswordLength","shortMessages","localMessage","messages","getPhrase","LanguageService","CodeToMessageMap","CodeToFieldMap","code","message","field","userRequest","hasQueryParams","customer","yearGroups","countryCode","filters","Filters","FilterHelper","securitySettings","userRole","customSetting","statusParam","convertToValue","userId","sorts","cursor","data","key","ObjectHelper","prev","current","FilterConstants","val","yearGroup","isAdmin","sort","am","errors","updatedUser","oldUser","onDone","errorMessages","EmailSettingsValidationSchema","object","string","VerifiedEmailIcon","jsx","SvgContainer2","EmailSettings","props","isSmallScreen","useMediaQuery","MediaQueryStrings","showForm","setShowForm","React","isVerified","jsxs","LanguageNamespaceContext","Text","FormWrapper","Form","FormField","FormButtons","Fragment","PartialEmailSettings","styles","ChangePasswordForm","formikProps","useFormikContext","getPasswordSettingsValidationSchema","ref","initialValues","PasswordSettings","onSubmitPassword","SecuritySettingsRequests","success","error","HttpVerbs","AccountSettingsView","dispatch","useDispatch","alerts","useAlerts","currentUser","Flight.useBasicFetch","UserRequests","masterCurrentUser","UserManagerRequests","passwordPolicy","useSetPageMetadata","onChangeEmail","emailModel","Flight.fetch","AnalyticsHelper","UserAction","EntityType","LocationContext","WorkflowPhase","onChangePassword","passwordModel","onSuccess","responseJSON","SettingsLayout"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{R as n,j as t}from"./app-DfSv_-O3.js";import{s as l,T as c}from"./tHf2V3t0.chunk.js";const m=n.memo(function({tagClass:a=""}){const e=`partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${a} ${l.partialTag}`;return t.jsx("div",{className:"mt-1",children:t.jsx("span",{className:e,children:" "})})});function r(a){const s=a.selectedItems.find(i=>i.id===a.data.id)?"bg-gray-900 text-white":"bg-light";return t.jsx(c,{tag:a.data,appLink:a.appLink,tagClass:`no-decoration ${s} lh-1`,onClick:()=>a.onClick(a.data)})}export{m as P,r as T};
2
- //# sourceMappingURL=DhWvZ3GP.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DhWvZ3GP.chunk.js","sources":["../../../../libs/shared/src/components/tags/PartialTagItem.tsx","../../../../libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.tsx"],"sourcesContent":["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 { 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}"],"names":["PartialTagItem","React","tagClass","classNames","styles","jsx","TagWidgetItem","props","colorClass","selection","TagItem"],"mappings":"4FAQO,MAAMA,EAAiBC,EAAM,KAAK,SAAS,CAAE,SAAAC,EAAW,IAAwC,CACrG,MAAMC,EAAa,0FAA0FD,CAAQ,IAAIE,EAAO,UAAU,GAE1I,OACEC,EAAAA,IAAC,OAAI,UAAU,OACb,eAAC,OAAA,CAAK,UAAWF,EAAY,SAAA,GAAA,CAAM,CAAA,CACrC,CAEJ,CAAC,ECDM,SAASG,EAAcC,EAAwC,CAGpE,MAAMC,EAFaD,EAAM,cAAc,QAAkBE,EAAU,KAAOF,EAAM,KAAK,EAAE,EAEvD,yBAA2B,WAE3D,OACEF,EAAAA,IAACK,EAAA,CACC,IAAKH,EAAM,KACX,QAASA,EAAM,QACf,SAAU,iBAAiBC,CAAU,QACrC,QAAS,IAAMD,EAAM,QAAQA,EAAM,IAAI,CAAA,CAAA,CAG7C"}
@@ -1,2 +0,0 @@
1
- import{j as n,R as h,av as C,d as $,b7 as P,k as E,i as I,ae as W,c as A,z as T,F as O,T as w,a5 as x,a6 as p,bc as z}from"./app-DfSv_-O3.js";const D="_audience_1o527_1",M="_area_1o527_6",R="_code_1o527_11",B="_description_1o527_16",b={audience:D,area:M,code:R,description:B},L=()=>n.jsxs(n.Fragment,{children:[n.jsx("div",{className:`partial-loading-background rounded-pill py-1 px-2 d-inline-block me-1 mb-2 ${b.audience}`}),n.jsxs("div",{children:[n.jsx("div",{className:`partial-loading-background mb-1 ${b.area}`}),n.jsxs("div",{className:"mb-2 d-flex",children:[n.jsx("div",{className:`me-1 align-self-start ${b.code}`,children:n.jsx("div",{className:"partial-loading-background rounded-pill py-1 px-2 d-inline-block w-100 h-100"})}),n.jsx("div",{className:`partial-loading-background ${b.description}`})]})]})]});function F(){return n.jsxs("div",{children:[n.jsx("div",{className:"mb-3",children:n.jsx(L,{})}),n.jsx("div",{className:"mb-3",children:n.jsx(L,{})}),n.jsx("div",{children:n.jsx(L,{})})]})}var o=(e=>(e.Subject="CurriculumSubject",e.Audience="CurriculumAudience",e.Area="CurriculumArea",e.Leaf="CurriculumLeaf",e))(o||{});const H="_curriculumSubject_snbcs_1",K="_curriculumSet_snbcs_2",q="_areaLeafSet_snbcs_3",U="_leafDescriptionOnly_snbcs_9",G="_tag_snbcs_12",Q="_cover_snbcs_17",V="_selected_snbcs_28",X="_codeAppLink_snbcs_34",u={curriculumSubject:H,curriculumSet:K,areaLeafSet:q,leafDescriptionOnly:U,tag:G,cover:Q,selected:V,codeAppLink:X},_=h.forwardRef((e,t)=>{let c=C("text-nowrap font-size-normal rounded-pill py-1 px-2 my-0 d-inline-block fw-semibold bg-white border",e.faded?"border-secondary text-secondary":"border-dark",e.className);if(e.appLink)return c=C(c,`text-decoration-none ${u.codeAppLink}`),n.jsx($,{appLink:e.appLink,analyticsData:{id:e.id,code:e.code,description:e.description},analyticsOptions:{location:e.locationContext,entity:I.CurriculumCode,actionType:E.Click,descriptor:P.Search},className:c,ref:t,children:e.code});const r=e.as||"div";return n.jsx(r,{className:c,ref:t,children:e.code})}),J="shared.curriculumLinks",Y=A.encloseNamespace(J);function Z(e){var c;const{data:t}=e;return n.jsxs(W,{className:`p-1 pe-2 rounded-pill d-inline-flex align-items-center ${u.tag} ${e.selected?u.selected:""}`,onClick:()=>e.onChangeCurriculum(t.id.toString()),"aria-label":`${Y("ariaFilter")} ${t.name}`,children:[((c=t.cover)==null?void 0:c.url)&&n.jsx("div",{className:`bg-white ${u.cover} rounded-circle border`,children:n.jsx("img",{src:T.createUrl(t.cover.url,{size:O.Small}),alt:t.name,className:"rounded-circle"})}),n.jsx("div",{className:"ms-2",children:t.name})]})}const ee=/(.*)\s\((.*)?\)/i,k="shared.curriculumLinks",ne="text-nowrap font-size-normal rounded-pill py-1 px-2 my-0 d-inline-block fw-semibold";function te(e){var r,l;const t=h.useRef(null);if(h.useEffect(()=>{if(!t.current||!e.trySetMaxCodeWidth)return;const{width:a}=t.current.getBoundingClientRect();e.trySetMaxCodeWidth(a)},[t.current]),!e.code&&!e.description)return n.jsx(n.Fragment,{});if(e.code&&e.description)return n.jsxs("div",{className:"d-flex",children:[n.jsx("div",{className:"me-2 align-self-start",style:{minWidth:e.codeWidth?`${e.codeWidth}px`:"auto"},children:n.jsx(_,{ref:t,id:e.id,code:e.code,description:e.description,appLink:(r=e.getCodeAppLink)==null?void 0:r.call(e,e.code,!0),locationContext:e.locationContext})}),n.jsx("p",{className:"m-0 align-self-center",dangerouslySetInnerHTML:{__html:e.description}})]});if(!e.code&&e.uiContainsCodes)return n.jsxs("div",{className:"d-flex",children:[n.jsx("div",{className:"me-2 align-self-start",style:{minWidth:e.codeWidth?`${e.codeWidth}px`:"auto"},children:n.jsx(_,{ref:t,id:e.id,code:A.getPhrase(k,"noCode"),description:e.description,locationContext:e.locationContext,faded:!0})}),n.jsx("p",{className:"m-0 align-self-center",dangerouslySetInnerHTML:{__html:e.description}})]});const c=e.code||e.description;return n.jsxs("div",{className:"d-flex",children:[n.jsx("div",{className:"ms-2 me-1",children:"•"}),n.jsx($,{appLink:(l=e.getCodeAppLink)==null?void 0:l.call(e,c,!1),children:n.jsx("p",{className:"mb-0",dangerouslySetInnerHTML:{__html:c}})})]})}function se(e){const t={};let c=!1;e.linkSet.areasAndLeaves.forEach(a=>{const s=a[o.Area].map(i=>i.name).join(" - ");if(t[s]){a[o.Leaf].forEach(i=>{t[s].find(m=>m.name===i.name)||(t[s].push(i),i.name&&(c=!0))});return}t[s]=a[o.Leaf]});function r(){const a=e.linkSet[o.Audience].name,s=e.linkSet[o.Subject].name,i=a.match(ee);return i?`${i[1]} • ${i[2]} • ${s}`:`${a} • ${s}`}function l(a){const s="mb-2";return!a.name&&!c?s+" ms-4 "+u.leafDescriptionOnly:s}return n.jsxs(n.Fragment,{children:[n.jsx("h3",{className:`${ne} text-white bg-ultramarine fw-normal me-1 mb-2`,children:r()}),n.jsx("div",{className:`me-2 ${u.curriculumSubject}`,children:Object.keys(t).map((a,s)=>n.jsxs("div",{className:u.areaLeafSet,children:[a&&n.jsx("h4",{className:"mb-1 font-size-normal",children:a}),n.jsx("ul",{className:"list-unstyled",children:t[a].map(i=>n.jsx("li",{className:l(i),children:n.jsx(te,{id:i.id,code:i.name,description:i.description,codeWidth:e.codeWidth,trySetMaxCodeWidth:e.trySetMaxCodeWidth,uiContainsCodes:c,getCodeAppLink:e.getCodeAppLink,locationContext:e.locationContext})},i.id))})]},s))})]})}function ie(e){const[t,c]=h.useState(0),r=!e.curriculumLinks.length&&e.mappedCurriculums.length>0;function l(s){c(i=>i>=s?i:s)}const a=h.useMemo(()=>{var i;const s={};return(i=e.curriculumLinks)==null||i.forEach(m=>{let y=null,j=null;const v=[],g=[];if(m.forEach(f=>{switch(f.type){case o.Subject:y=f;break;case o.Audience:j=f;break;case o.Area:v.push(f);break;case o.Leaf:g.push(f);break}}),!y||!j)return;const S=`${y.id}:${j.id}`;if(s[S]){s[S].areasAndLeaves.push({[o.Area]:v,[o.Leaf]:g});return}s[S]={[o.Subject]:y,[o.Audience]:j,areasAndLeaves:[{[o.Area]:v,[o.Leaf]:g}]}}),s},[e.curriculumLinks]);return!e.hasCompleted||e.isFetching?n.jsx(F,{}):r?n.jsxs("div",{children:[n.jsx("div",{className:"mb-3",children:n.jsx(w,{namespace:k,phrase:"currentEmpty"})}),n.jsx("div",{className:"mb-3",children:n.jsx(w,{namespace:k,phrase:"currentEmptyInfo"})}),n.jsx("ul",{className:"list-unstyled mb-n2 d-flex flex-wrap",children:e.mappedCurriculums.map(s=>n.jsx("li",{className:"mb-2 me-2",children:n.jsx(Z,{data:s,onChangeCurriculum:e.onChangeCurriculum,selected:!1})},s.id))})]}):n.jsx("ul",{className:"list-unstyled m-0",children:Object.keys(a).map((s,i)=>n.jsx("li",{className:u.curriculumSet,children:n.jsx(se,{linkSet:a[s],trySetMaxCodeWidth:l,codeWidth:t,getCodeAppLink:e.getCodeAppLink,locationContext:e.locationContext})},`linkset-${i}`))})}const N=z.CLASSIFICATION_COLLECTION,d={allSubjectPreferences:()=>`{gateway}/v1/users/me/classifications/preferences?query=${N}&type=subject`,mySubjectPreferences:()=>`{gateway}/v1/users/me/classifications/following?query=${N}`,followSubjects:()=>"{gateway}/v1/users/me/classifications/following",unfollowSubjects:e=>p.urlBuilder("{gateway}/v1/users/me/classifications/following",{id:e}),allLevelPreferences:()=>"{gateway}/v1/users/me/audiences?type=subject",myLevelPreferences:()=>"{gateway}/v1/users/me/audiences/following",followLevels:()=>"{gateway}/v1/users/me/audiences/following",unfollowLevels:e=>p.urlBuilder("{gateway}/v1/users/me/audiences/following",{id:e}),getCurrentPresentations:e=>`{gateway}/v1/users/me/presentations${e?`?type=${e}`:""}`,getAvailablePresentations:e=>`{gateway}/v1/users/me/presentations/available${e?`?type=${e}`:""}`,setPresentation:e=>`{gateway}/v1/users/me/presentations/${e}`},ce={availablePresentations(e){return{url:d.getAvailablePresentations(e),key:`available:presentations:${e}`,normalizeOptions:{namespace:"presentation"}}},setPresentation(e,t,c,r){return{url:d.setPresentation(e.id),key:`set:${t}:presentation`,type:x.POST,data:{},normalizeOptions:{namespace:"presentation"},invalidationKeys:[`current:presentation:${t.toLocaleLowerCase()}`,"subject:preference:options","my:subject:preferences","level:preference:options","my:level:preferences","classifications","presentation:audiences","widgets:v3","content:update:videos","content:updates"],success:c,error:r}},allSubjectPreferences(){return{url:d.allSubjectPreferences(),key:"subject:preference:options"}},mySubjectPreferences(e){return{url:d.mySubjectPreferences(),key:"my:subject:preferences",normalize:!1,success:e}},followSubjects(e,t,c,r){return{url:d.followSubjects(),key:"follow:subjects",data:e,type:x.POST,success:t,error:c,always:r,invalidationKeys:[...e.map(l=>`classification:${l}`),"my:subject:preferences","classifications","content:updates"]}},unfollowSubjects(e,t,c,r){return{url:d.unfollowSubjects(e),key:"unfollow:subjects",type:x.DELETE,success:t,error:c,always:r,invalidationKeys:[...e.map(l=>`classification:${l}`),"my:subject:preferences","classifications","content:updates"]}},allLevelPreferences(){return{url:d.allLevelPreferences(),key:"level:preference:options",normalize:!1}},myLevelPreferences(e){return{url:d.myLevelPreferences(),key:"my:level:preferences",normalizeOptions:{idAttribute:"masterId"},success:e}},followLevels(e,t,c,r){return{url:d.followLevels(),key:"follow:levels",data:e.map(l=>l.masterId),normalize:!1,updateState:{keys:"my:level:preferences",updateData:l=>{const a=l["my:level:preferences"]??[];return e.forEach(s=>{a.find(i=>i.masterId===s.masterId)||a.push(s)}),{"my:level:preferences":a}}},type:x.POST,success:t,error:c,always:r}},unfollowLevels(e,t,c,r){return{url:d.unfollowLevels(e.map(l=>l.masterId)),key:"unfollow:levels",normalize:!1,updateState:{keys:"my:level:preferences",updateData:l=>{let a=l["my:level:preferences"]??[];return e.forEach(s=>{if(!a.find(m=>m.masterId===s.masterId))return;const i=a.findIndex(m=>m.masterId===s.masterId);a=[...a.slice(0,i),...a.slice(i+1)]}),{"my:level:preferences":a}}},type:x.DELETE,success:t,error:c,always:r}}};export{te as C,ce as P,o as a,ie as b};
2
- //# sourceMappingURL=Digrmnl9.chunk.js.map