@clickview/reports 0.69.0 → 0.69.1-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  2. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  3. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  4. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  5. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  6. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  7. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  8. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  9. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  10. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  11. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  12. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  13. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  14. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  15. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  16. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  17. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  18. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  19. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  20. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  21. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  22. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  23. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  24. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  25. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  27. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  28. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  29. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  30. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  31. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  32. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  33. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  34. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  35. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  36. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  37. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  38. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  39. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  43. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  44. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  45. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  46. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  47. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  48. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  49. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  50. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  51. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  52. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  53. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  54. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  55. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  56. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  57. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  58. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  59. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  60. package/dist/bundles.json +2 -3
  61. package/dist/css/1VpVng8x.chunk.css +1 -0
  62. package/dist/css/BBwBgFf_.chunk.css +1 -0
  63. package/dist/css/BDijM1kt.chunk.css +1 -0
  64. package/dist/css/BMPwvOki.chunk.css +1 -0
  65. package/dist/css/BNt45Kgy.chunk.css +1 -0
  66. package/dist/css/BSGhUWzl.chunk.css +1 -0
  67. package/dist/css/BZ3_uhDP.chunk.css +1 -0
  68. package/dist/css/BaadNO4A.chunk.css +1 -0
  69. package/dist/css/BdUNjJqp.chunk.css +1 -0
  70. package/dist/css/BdeI0FAV.chunk.css +1 -0
  71. package/dist/css/BxcMGr8Y.chunk.css +1 -0
  72. package/dist/css/ByuL_xKJ.chunk.css +1 -0
  73. package/dist/css/C-A0Pj_7.chunk.css +1 -0
  74. package/dist/css/C4jMfPWU.chunk.css +1 -0
  75. package/dist/css/C7XoyEPr.chunk.css +1 -0
  76. package/dist/css/C8sxda3R.chunk.css +1 -0
  77. package/dist/css/CD1qrI1T.chunk.css +1 -0
  78. package/dist/css/CFO--d_R.chunk.css +1 -0
  79. package/dist/css/CX9nw8t8.chunk.css +1 -0
  80. package/dist/css/C_qGRdC2.chunk.css +1 -0
  81. package/dist/css/CdC6ugQR.chunk.css +1 -0
  82. package/dist/css/ClRRGXPb.chunk.css +1 -0
  83. package/dist/css/Cr1bwtZG.chunk.css +1 -0
  84. package/dist/css/DBlPz5Fw.chunk.css +1 -0
  85. package/dist/css/DDnpOnVB.chunk.css +1 -0
  86. package/dist/css/DFZQCLLg.chunk.css +1 -0
  87. package/dist/css/DJwAbl6l.chunk.css +1 -0
  88. package/dist/css/DWjg_0sz.chunk.css +1 -0
  89. package/dist/css/DYV9jjVn.chunk.css +1 -0
  90. package/dist/css/Dgeh4AqU.chunk.css +9 -0
  91. package/dist/css/DlOtoSz0.chunk.css +1 -0
  92. package/dist/css/DlxOgKUu.chunk.css +1 -0
  93. package/dist/css/DwgaDUzz.chunk.css +1 -0
  94. package/dist/css/FPQ_LmXH.chunk.css +1 -0
  95. package/dist/css/H09rC9gw.chunk.css +1 -0
  96. package/dist/css/LAFr2dPT.chunk.css +1 -0
  97. package/dist/css/Pg1TlYG6.chunk.css +1 -0
  98. package/dist/css/PsQn3-kb.chunk.css +1 -0
  99. package/dist/css/alkEuPrr.chunk.css +1 -0
  100. package/dist/css/k4DgCj_g.chunk.css +1 -0
  101. package/dist/en.json +1 -0
  102. package/dist/scripts/5JDMPiCK.chunk.js +2 -0
  103. package/dist/scripts/5JDMPiCK.chunk.js.map +1 -0
  104. package/dist/scripts/5O9SdVRZ.chunk.js +2 -0
  105. package/dist/scripts/5O9SdVRZ.chunk.js.map +1 -0
  106. package/dist/scripts/B8i2s45X.chunk.js +2 -0
  107. package/dist/scripts/B8i2s45X.chunk.js.map +1 -0
  108. package/dist/scripts/BBOfq9my.chunk.js +2 -0
  109. package/dist/scripts/BBOfq9my.chunk.js.map +1 -0
  110. package/dist/scripts/BE7zUNFh.chunk.js +3 -0
  111. package/dist/scripts/BE7zUNFh.chunk.js.map +1 -0
  112. package/dist/scripts/BIbP_ulq.chunk.js +380 -0
  113. package/dist/scripts/BIbP_ulq.chunk.js.map +1 -0
  114. package/dist/scripts/BJe4D9vd.chunk.js +2 -0
  115. package/dist/scripts/BJe4D9vd.chunk.js.map +1 -0
  116. package/dist/scripts/BKx5S6xk.chunk.js +2 -0
  117. package/dist/scripts/BKx5S6xk.chunk.js.map +1 -0
  118. package/dist/scripts/BMba67Uf.chunk.js +2 -0
  119. package/dist/scripts/BMba67Uf.chunk.js.map +1 -0
  120. package/dist/scripts/BUM8Ub4p.chunk.js +2 -0
  121. package/dist/scripts/BUM8Ub4p.chunk.js.map +1 -0
  122. package/dist/scripts/BW-tzVdx.chunk.js +2 -0
  123. package/dist/scripts/BW-tzVdx.chunk.js.map +1 -0
  124. package/dist/scripts/B_1LOG5E.chunk.js +2 -0
  125. package/dist/scripts/B_1LOG5E.chunk.js.map +1 -0
  126. package/dist/scripts/BaHk6QZB.chunk.js +2 -0
  127. package/dist/scripts/BaHk6QZB.chunk.js.map +1 -0
  128. package/dist/scripts/Bbpuxobz.chunk.js +2 -0
  129. package/dist/scripts/Bbpuxobz.chunk.js.map +1 -0
  130. package/dist/scripts/BfG3wCTD.chunk.js +2 -0
  131. package/dist/scripts/BfG3wCTD.chunk.js.map +1 -0
  132. package/dist/scripts/BfkzHBdb.chunk.js +2 -0
  133. package/dist/scripts/BfkzHBdb.chunk.js.map +1 -0
  134. package/dist/scripts/BiDX0yuI.chunk.js +2 -0
  135. package/dist/scripts/BiDX0yuI.chunk.js.map +1 -0
  136. package/dist/scripts/BkcNwg7K.chunk.js +2 -0
  137. package/dist/scripts/BkcNwg7K.chunk.js.map +1 -0
  138. package/dist/scripts/BlAGsOOw.chunk.js +2 -0
  139. package/dist/scripts/BlAGsOOw.chunk.js.map +1 -0
  140. package/dist/scripts/BmScDBcl.chunk.js +2 -0
  141. package/dist/scripts/BmScDBcl.chunk.js.map +1 -0
  142. package/dist/scripts/BnqNywwJ.chunk.js +2 -0
  143. package/dist/scripts/BnqNywwJ.chunk.js.map +1 -0
  144. package/dist/scripts/BrLXFCMV.chunk.js +2 -0
  145. package/dist/scripts/BrLXFCMV.chunk.js.map +1 -0
  146. package/dist/scripts/BsFynggy.chunk.js +2 -0
  147. package/dist/scripts/BsFynggy.chunk.js.map +1 -0
  148. package/dist/scripts/Bt3gUzzG.chunk.js +2 -0
  149. package/dist/scripts/Bt3gUzzG.chunk.js.map +1 -0
  150. package/dist/scripts/BuHHZnEg.chunk.js +2 -0
  151. package/dist/scripts/BuHHZnEg.chunk.js.map +1 -0
  152. package/dist/scripts/ByllnMKt.chunk.js +2 -0
  153. package/dist/scripts/ByllnMKt.chunk.js.map +1 -0
  154. package/dist/scripts/BzBFC5UE.chunk.js +2 -0
  155. package/dist/scripts/BzBFC5UE.chunk.js.map +1 -0
  156. package/dist/scripts/C4382UCA.chunk.js +2 -0
  157. package/dist/scripts/C4382UCA.chunk.js.map +1 -0
  158. package/dist/scripts/C6H2bU7H.chunk.js +2 -0
  159. package/dist/scripts/C6H2bU7H.chunk.js.map +1 -0
  160. package/dist/scripts/C6eAAaNL.chunk.js +2 -0
  161. package/dist/scripts/C6eAAaNL.chunk.js.map +1 -0
  162. package/dist/scripts/CAh5UtFh.chunk.js +2 -0
  163. package/dist/scripts/CAh5UtFh.chunk.js.map +1 -0
  164. package/dist/scripts/CFIWZ5KT.chunk.js +2 -0
  165. package/dist/scripts/CFIWZ5KT.chunk.js.map +1 -0
  166. package/dist/scripts/CKLfLzhr.chunk.js +34 -0
  167. package/dist/scripts/CKLfLzhr.chunk.js.map +1 -0
  168. package/dist/scripts/COgPEQMR.chunk.js +2 -0
  169. package/dist/scripts/COgPEQMR.chunk.js.map +1 -0
  170. package/dist/scripts/CRWOsqvB.chunk.js +2 -0
  171. package/dist/scripts/CRWOsqvB.chunk.js.map +1 -0
  172. package/dist/scripts/CU-I5G45.chunk.js +2 -0
  173. package/dist/scripts/CU-I5G45.chunk.js.map +1 -0
  174. package/dist/scripts/CV5ioe9U.chunk.js +2 -0
  175. package/dist/scripts/CV5ioe9U.chunk.js.map +1 -0
  176. package/dist/scripts/CW7x8M-z.chunk.js +2 -0
  177. package/dist/scripts/CW7x8M-z.chunk.js.map +1 -0
  178. package/dist/scripts/CX5q-0jT.chunk.js +2 -0
  179. package/dist/scripts/CX5q-0jT.chunk.js.map +1 -0
  180. package/dist/scripts/CXK1uNgx.chunk.js +2 -0
  181. package/dist/scripts/CXK1uNgx.chunk.js.map +1 -0
  182. package/dist/scripts/CXhesQTd.chunk.js +2 -0
  183. package/dist/scripts/CXhesQTd.chunk.js.map +1 -0
  184. package/dist/scripts/CaiGBx50.chunk.js +2 -0
  185. package/dist/scripts/CaiGBx50.chunk.js.map +1 -0
  186. package/dist/scripts/CbmUUNB4.chunk.js +2 -0
  187. package/dist/scripts/CbmUUNB4.chunk.js.map +1 -0
  188. package/dist/scripts/CdoC9Mtd.chunk.js +2 -0
  189. package/dist/scripts/CdoC9Mtd.chunk.js.map +1 -0
  190. package/dist/scripts/CdzMtbgC.chunk.js +2 -0
  191. package/dist/scripts/CdzMtbgC.chunk.js.map +1 -0
  192. package/dist/scripts/Cl51qIgL.chunk.js +2 -0
  193. package/dist/scripts/Cl51qIgL.chunk.js.map +1 -0
  194. package/dist/scripts/ClLzLF-_.chunk.js +2 -0
  195. package/dist/scripts/ClLzLF-_.chunk.js.map +1 -0
  196. package/dist/scripts/ClcYw2ra.chunk.js +42 -0
  197. package/dist/scripts/ClcYw2ra.chunk.js.map +1 -0
  198. package/dist/scripts/Cmu1J2M7.chunk.js +262 -0
  199. package/dist/scripts/Cmu1J2M7.chunk.js.map +1 -0
  200. package/dist/scripts/CpwEUwsc.chunk.js +2 -0
  201. package/dist/scripts/CpwEUwsc.chunk.js.map +1 -0
  202. package/dist/scripts/CqSaPgvV.chunk.js +2 -0
  203. package/dist/scripts/CqSaPgvV.chunk.js.map +1 -0
  204. package/dist/scripts/CqyCLTzN.chunk.js +2 -0
  205. package/dist/scripts/CqyCLTzN.chunk.js.map +1 -0
  206. package/dist/scripts/CrlegiVC.chunk.js +2 -0
  207. package/dist/scripts/CrlegiVC.chunk.js.map +1 -0
  208. package/dist/scripts/CsD4Xb6n.chunk.js +2 -0
  209. package/dist/scripts/CsD4Xb6n.chunk.js.map +1 -0
  210. package/dist/scripts/Ct187YvN.chunk.js +2 -0
  211. package/dist/scripts/Ct187YvN.chunk.js.map +1 -0
  212. package/dist/scripts/CwyVC768.chunk.js +2 -0
  213. package/dist/scripts/CwyVC768.chunk.js.map +1 -0
  214. package/dist/scripts/Cy4L5XsI.chunk.js +2 -0
  215. package/dist/scripts/Cy4L5XsI.chunk.js.map +1 -0
  216. package/dist/scripts/CzF-hI_x.chunk.js +2 -0
  217. package/dist/scripts/CzF-hI_x.chunk.js.map +1 -0
  218. package/dist/scripts/D1U_fPVs.chunk.js +2 -0
  219. package/dist/scripts/D1U_fPVs.chunk.js.map +1 -0
  220. package/dist/scripts/D9POXla0.chunk.js +2 -0
  221. package/dist/scripts/D9POXla0.chunk.js.map +1 -0
  222. package/dist/scripts/DAocQXXC.chunk.js +2 -0
  223. package/dist/scripts/DAocQXXC.chunk.js.map +1 -0
  224. package/dist/scripts/DD-2boW1.chunk.js +2 -0
  225. package/dist/scripts/DD-2boW1.chunk.js.map +1 -0
  226. package/dist/scripts/DFhb3ZfO.chunk.js +2 -0
  227. package/dist/scripts/DFhb3ZfO.chunk.js.map +1 -0
  228. package/dist/scripts/DFp9UBZB.chunk.js +4 -0
  229. package/dist/scripts/DFp9UBZB.chunk.js.map +1 -0
  230. package/dist/scripts/DHqmPVfK.chunk.js +2 -0
  231. package/dist/scripts/DHqmPVfK.chunk.js.map +1 -0
  232. package/dist/scripts/DJLuyZJi.chunk.js +2 -0
  233. package/dist/scripts/DJLuyZJi.chunk.js.map +1 -0
  234. package/dist/scripts/DK7va7iQ.chunk.js +2 -0
  235. package/dist/scripts/DK7va7iQ.chunk.js.map +1 -0
  236. package/dist/scripts/DMoPMSgN.chunk.js +2 -0
  237. package/dist/scripts/DMoPMSgN.chunk.js.map +1 -0
  238. package/dist/scripts/DNTR3iW5.chunk.js +2 -0
  239. package/dist/scripts/DNTR3iW5.chunk.js.map +1 -0
  240. package/dist/scripts/DNt9Tv5W.chunk.js +2 -0
  241. package/dist/scripts/DNt9Tv5W.chunk.js.map +1 -0
  242. package/dist/scripts/DQtbfeRV.chunk.js +2 -0
  243. package/dist/scripts/DQtbfeRV.chunk.js.map +1 -0
  244. package/dist/scripts/DRQ39FRr.chunk.js +2 -0
  245. package/dist/scripts/DRQ39FRr.chunk.js.map +1 -0
  246. package/dist/scripts/DTFFRoLz.chunk.js +2 -0
  247. package/dist/scripts/DTFFRoLz.chunk.js.map +1 -0
  248. package/dist/scripts/DU5sOcpt.chunk.js +3 -0
  249. package/dist/scripts/DU5sOcpt.chunk.js.map +1 -0
  250. package/dist/scripts/DWv8V3Lc.chunk.js +2 -0
  251. package/dist/scripts/DWv8V3Lc.chunk.js.map +1 -0
  252. package/dist/scripts/DYFT7QHy.chunk.js +2 -0
  253. package/dist/scripts/DYFT7QHy.chunk.js.map +1 -0
  254. package/dist/scripts/DZAYXeaL.chunk.js +2 -0
  255. package/dist/scripts/DZAYXeaL.chunk.js.map +1 -0
  256. package/dist/scripts/D_Erj5Yn.chunk.js +10 -0
  257. package/dist/scripts/D_Erj5Yn.chunk.js.map +1 -0
  258. package/dist/scripts/DeY3SuCM.chunk.js +2 -0
  259. package/dist/scripts/DeY3SuCM.chunk.js.map +1 -0
  260. package/dist/scripts/DecstRlc.chunk.js +8 -0
  261. package/dist/scripts/DecstRlc.chunk.js.map +1 -0
  262. package/dist/scripts/Df8zbYVK.chunk.js +10 -0
  263. package/dist/scripts/Df8zbYVK.chunk.js.map +1 -0
  264. package/dist/scripts/DgHfAOys.chunk.js +2 -0
  265. package/dist/scripts/DgHfAOys.chunk.js.map +1 -0
  266. package/dist/scripts/DgWHvURU.chunk.js +2 -0
  267. package/dist/scripts/DgWHvURU.chunk.js.map +1 -0
  268. package/dist/scripts/DmGrKXgL.chunk.js +2 -0
  269. package/dist/scripts/DmGrKXgL.chunk.js.map +1 -0
  270. package/dist/scripts/Dp_vnjo0.chunk.js +3 -0
  271. package/dist/scripts/Dp_vnjo0.chunk.js.map +1 -0
  272. package/dist/scripts/DuNeLCIS.chunk.js +15 -0
  273. package/dist/scripts/DuNeLCIS.chunk.js.map +1 -0
  274. package/dist/scripts/DxJzyDBL.chunk.js +2 -0
  275. package/dist/scripts/DxJzyDBL.chunk.js.map +1 -0
  276. package/dist/scripts/DxUueJN7.chunk.js +2 -0
  277. package/dist/scripts/DxUueJN7.chunk.js.map +1 -0
  278. package/dist/scripts/DykFRaNZ.chunk.js +4 -0
  279. package/dist/scripts/DykFRaNZ.chunk.js.map +1 -0
  280. package/dist/scripts/Fd0gT6QK.chunk.js +2 -0
  281. package/dist/scripts/Fd0gT6QK.chunk.js.map +1 -0
  282. package/dist/scripts/MaYDtnoS.chunk.js +2 -0
  283. package/dist/scripts/MaYDtnoS.chunk.js.map +1 -0
  284. package/dist/scripts/T4Chmiqz.chunk.js +2 -0
  285. package/dist/scripts/T4Chmiqz.chunk.js.map +1 -0
  286. package/dist/scripts/UWjf2h5X.chunk.js +2 -0
  287. package/dist/scripts/UWjf2h5X.chunk.js.map +1 -0
  288. package/dist/scripts/VSmYRJOj.chunk.js +2 -0
  289. package/dist/scripts/VSmYRJOj.chunk.js.map +1 -0
  290. package/dist/scripts/W5zJjbqu.chunk.js +2 -0
  291. package/dist/scripts/W5zJjbqu.chunk.js.map +1 -0
  292. package/dist/scripts/YDhSgJI6.chunk.js +2 -0
  293. package/dist/scripts/YDhSgJI6.chunk.js.map +1 -0
  294. package/dist/scripts/Yi67NERS.chunk.js +2 -0
  295. package/dist/scripts/Yi67NERS.chunk.js.map +1 -0
  296. package/dist/scripts/app-BqRx5tK8.js +228 -0
  297. package/dist/scripts/app-BqRx5tK8.js.map +1 -0
  298. package/dist/scripts/cRQEJA0-.chunk.js +2 -0
  299. package/dist/scripts/cRQEJA0-.chunk.js.map +1 -0
  300. package/dist/scripts/g3bqr4mt.chunk.js +6 -0
  301. package/dist/scripts/g3bqr4mt.chunk.js.map +1 -0
  302. package/dist/scripts/h4z9gHMh.chunk.js +2 -0
  303. package/dist/scripts/h4z9gHMh.chunk.js.map +1 -0
  304. package/dist/scripts/kGI4LAzn.chunk.js +6 -0
  305. package/dist/scripts/kGI4LAzn.chunk.js.map +1 -0
  306. package/dist/scripts/kt1K5Xlc.chunk.js +2 -0
  307. package/dist/scripts/kt1K5Xlc.chunk.js.map +1 -0
  308. package/dist/scripts/mdJqhxeb.chunk.js +2 -0
  309. package/dist/scripts/mdJqhxeb.chunk.js.map +1 -0
  310. package/dist/scripts/sFV5nxD4.chunk.js +2 -0
  311. package/dist/scripts/sFV5nxD4.chunk.js.map +1 -0
  312. package/dist/scripts/tCFcWStO.chunk.js +2 -0
  313. package/dist/scripts/tCFcWStO.chunk.js.map +1 -0
  314. package/dist/scripts/wND_WD0i.chunk.js +2 -0
  315. package/dist/scripts/wND_WD0i.chunk.js.map +1 -0
  316. package/dist/scripts/xkqdG021.chunk.js +2 -0
  317. package/dist/scripts/xkqdG021.chunk.js.map +1 -0
  318. package/dist/scripts/zaMwD-xl.chunk.js +3 -0
  319. package/dist/scripts/zaMwD-xl.chunk.js.map +1 -0
  320. package/package.json +5 -3
  321. package/typings/utils/imports.d.ts +1 -1
  322. package/dist/css/1103-reports-d3d5cc00db.chunk.css +0 -31
  323. package/dist/css/1456-reports-4a5871a275.chunk.css +0 -9
  324. package/dist/css/1648-reports-012456ba48.chunk.css +0 -2
  325. package/dist/css/209-reports-cdae99d0ee.chunk.css +0 -11
  326. package/dist/css/2150-reports-84ec0e9770.chunk.css +0 -4
  327. package/dist/css/2217-reports-74dec0a3fe.chunk.css +0 -32
  328. package/dist/css/2997-reports-e08318f14b.chunk.css +0 -9
  329. package/dist/css/4582-reports-d3d5cc00db.chunk.css +0 -31
  330. package/dist/css/5304-reports-22c2d8d635.chunk.css +0 -9
  331. package/dist/css/6007-reports-5ba77c55a3.chunk.css +0 -8
  332. package/dist/css/6031-reports-d558076846.chunk.css +0 -6
  333. package/dist/css/6356-reports-8c5b220bf6.chunk.css +0 -1
  334. package/dist/css/6546-reports-f190450b10.chunk.css +0 -60
  335. package/dist/css/6811-reports-baf2e97e71.chunk.css +0 -35
  336. package/dist/css/7723-reports-8c6d3c414b.chunk.css +0 -4
  337. package/dist/css/7747-reports-2d9e191b5a.chunk.css +0 -12
  338. package/dist/css/8087-reports-cfe23ba648.chunk.css +0 -10
  339. package/dist/css/8294-reports-c797263ac2.chunk.css +0 -1
  340. package/dist/css/8418-reports-0ada3f3ce2.chunk.css +0 -29
  341. package/dist/css/8450-reports-06493dfde5.chunk.css +0 -9
  342. package/dist/css/8622-reports-9e8970cc7f.chunk.css +0 -8
  343. package/dist/css/8839-reports-8e46644943.chunk.css +0 -1
  344. package/dist/css/8989-reports-92b4f1dde8.chunk.css +0 -8
  345. package/dist/css/9059-reports-a2ac630ebc.chunk.css +0 -35
  346. package/dist/css/9285-reports-5b9af8380f.chunk.css +0 -13
  347. package/dist/css/9661-reports-7435e94a85.chunk.css +0 -4
  348. package/dist/css/9822-reports-a1db1900c7.chunk.css +0 -8
  349. package/dist/css/9949-reports-f22fa2b407.chunk.css +0 -15
  350. package/dist/css/reports-app-b4c4ec5632.css +0 -32
  351. package/dist/languages/en.json +0 -1
  352. package/dist/scripts/1103-d77d388f5b-reports.chunk.js +0 -1
  353. package/dist/scripts/1177-7cf7817e74-reports.chunk.js +0 -1
  354. package/dist/scripts/1456-019d93e620-reports.chunk.js +0 -1
  355. package/dist/scripts/1648-e892604f5a-reports.chunk.js +0 -1
  356. package/dist/scripts/1934-ca8497c768-reports.chunk.js +0 -2
  357. package/dist/scripts/1934-ca8497c768-reports.chunk.js.LICENSE.txt +0 -9
  358. package/dist/scripts/2087-e0ef668e1f-reports.chunk.js +0 -1
  359. package/dist/scripts/209-d769572af9-reports.chunk.js +0 -1
  360. package/dist/scripts/2150-2cbadacf12-reports.chunk.js +0 -1
  361. package/dist/scripts/2217-eb2f8619c9-reports.chunk.js +0 -1
  362. package/dist/scripts/2476-a700f69dc4-reports.chunk.js +0 -1
  363. package/dist/scripts/2539-04dfb4f4f1-reports.chunk.js +0 -1
  364. package/dist/scripts/2997-62d81c3442-reports.chunk.js +0 -1
  365. package/dist/scripts/312-8b006e92ff-reports.chunk.js +0 -1
  366. package/dist/scripts/4234-e3c04f41eb-reports.chunk.js +0 -1
  367. package/dist/scripts/4372-26474a3318-reports.chunk.js +0 -1
  368. package/dist/scripts/438-b444dfb8c6-reports.chunk.js +0 -1
  369. package/dist/scripts/4582-230f130f41-reports.chunk.js +0 -1
  370. package/dist/scripts/4752-db4247883d-reports.chunk.js +0 -2
  371. package/dist/scripts/4752-db4247883d-reports.chunk.js.LICENSE.txt +0 -118
  372. package/dist/scripts/4979-7e14b09f33-reports.chunk.js +0 -1
  373. package/dist/scripts/5051-72c53737e2-reports.chunk.js +0 -1
  374. package/dist/scripts/5091-ddd6f61b55-reports.chunk.js +0 -1
  375. package/dist/scripts/5173-cce3b37672-reports.chunk.js +0 -1
  376. package/dist/scripts/5177-a7372e7b8d-reports.chunk.js +0 -1
  377. package/dist/scripts/5304-d5674b32b4-reports.chunk.js +0 -1
  378. package/dist/scripts/5802-2125536755-reports.chunk.js +0 -1
  379. package/dist/scripts/6007-346d08e3ae-reports.chunk.js +0 -1
  380. package/dist/scripts/6031-b1c60cc409-reports.chunk.js +0 -1
  381. package/dist/scripts/6081-2bbda6cac3-reports.chunk.js +0 -1
  382. package/dist/scripts/6180-bdb237ffbe-reports.chunk.js +0 -2
  383. package/dist/scripts/6180-bdb237ffbe-reports.chunk.js.LICENSE.txt +0 -1
  384. package/dist/scripts/6198-189ddde870-reports.chunk.js +0 -1
  385. package/dist/scripts/6356-a1b313c73e-reports.chunk.js +0 -1
  386. package/dist/scripts/645-e72b3d845e-reports.chunk.js +0 -1
  387. package/dist/scripts/6545-f07bcd318a-reports.chunk.js +0 -1
  388. package/dist/scripts/6546-b0ed7b3a19-reports.chunk.js +0 -2
  389. package/dist/scripts/6546-b0ed7b3a19-reports.chunk.js.LICENSE.txt +0 -1
  390. package/dist/scripts/6811-add7c7c1a2-reports.chunk.js +0 -1
  391. package/dist/scripts/7238-de5ef0ebfb-reports.chunk.js +0 -1
  392. package/dist/scripts/7562-748e60c3fc-reports.chunk.js +0 -1
  393. package/dist/scripts/7709-82750ee317-reports.chunk.js +0 -1
  394. package/dist/scripts/7723-1799f5aa26-reports.chunk.js +0 -1
  395. package/dist/scripts/7747-d34db3ff10-reports.chunk.js +0 -2
  396. package/dist/scripts/7747-d34db3ff10-reports.chunk.js.LICENSE.txt +0 -1
  397. package/dist/scripts/7925-c6c532c9c4-reports.chunk.js +0 -1
  398. package/dist/scripts/8087-1d9e9701e5-reports.chunk.js +0 -1
  399. package/dist/scripts/8393-686a7866e1-reports.chunk.js +0 -1
  400. package/dist/scripts/8418-9f96caf039-reports.chunk.js +0 -1
  401. package/dist/scripts/8450-f2d5d99614-reports.chunk.js +0 -1
  402. package/dist/scripts/8591-4811082ab0-reports.chunk.js +0 -1
  403. package/dist/scripts/8622-ca384ec4b0-reports.chunk.js +0 -1
  404. package/dist/scripts/8839-711793a97f-reports.chunk.js +0 -1
  405. package/dist/scripts/8989-ca5cab7f45-reports.chunk.js +0 -1
  406. package/dist/scripts/9059-b2dcf3cdb2-reports.chunk.js +0 -1
  407. package/dist/scripts/9162-7ffc692736-reports.chunk.js +0 -1
  408. package/dist/scripts/9285-ecddd01efb-reports.chunk.js +0 -1
  409. package/dist/scripts/9590-41bb23ae71-reports.chunk.js +0 -1
  410. package/dist/scripts/9647-f0c111d3f0-reports.chunk.js +0 -1
  411. package/dist/scripts/9661-2dee4c3417-reports.chunk.js +0 -1
  412. package/dist/scripts/9822-379ea90dd3-reports.chunk.js +0 -1
  413. package/dist/scripts/9895-3b3feb12b9-reports.chunk.js +0 -1
  414. package/dist/scripts/9949-6b1d1f4d32-reports.chunk.js +0 -1
  415. package/dist/scripts/bundle-36f5b2e675.min.js +0 -2
  416. package/dist/scripts/bundle-36f5b2e675.min.js.LICENSE.txt +0 -108
  417. package/dist/scripts/polyfills-3db3f009d4.min.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CzF-hI_x.chunk.js","sources":["../../../../libs/common/src/backbone/utils/ScrollHelper.ts","../../../../libs/shared/src/apps/analytics/components/questions-list/interaction-questions-empty-state/InteractionQuestionsEmptyState.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListFilters.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListHeader.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/submit-marked-answers/SubmitMarkedAnswers.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseList.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableMissingWord.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableMultipleChoice.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableShortAnswer.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableTrueOrFalse.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/question-table/QuestionTableUtils.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/question-table/question-results-summary/QuestionResultsSummaryUtils.ts","../../../../libs/shared/src/images/svg/objects/LightbulbSvg.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/question-table/question-results-summary/QuestionResultsSummary.tsx","../../../../libs/shared/src/apps/analytics/components/questions-list/selected-interaction-empty-state/SelectedInteractionEmptyState.tsx","../../../../libs/shared/src/apps/analytics/utils/StudentTableUtils.ts","../../../../libs/shared/src/apps/analytics/components/questions-list/question-table/QuestionTable.tsx","../../../../libs/shared/src/components/confirmation-popup/ConfirmationPopup.tsx","../../src/apps/interactives/views/interactive-question-list/InteractiveQuestionListView.tsx"],"sourcesContent":["import { Radio } from 'backbone';\n\nimport { CommonChannels } from '../constants/CommonChannels';\n\nexport const ScrollHelper = {\n // Will prevent scrolling to the top of the page when applinks are triggered\n preventScrollTop(): void {\n Radio.channel(CommonChannels.SHELL).trigger('prevent:scroll:top');\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nconst namespace = 'shared.interactionQuestionsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractionQuestionsEmptyStateProps {\n emptyStateImageUrl: string;\n}\n\nexport function InteractionQuestionsEmptyState(props: InteractionQuestionsEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='rounded h-100 bg-white justify-content-center py-4'>\n <EmptyState.Image\n src={props.emptyStateImageUrl}\n size='small'\n />\n <EmptyState.Info className='w-100'>\n {getPhrase('emptyStateText')}\n </EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.interactionResponseList';\n\nexport type InteractionResponseFilterType = 'marking_required' | 'correct' | 'incorrect' | 'skipped';\n\ninterface InteractionResponseListFiltersEmptyStatesProps {\n filter: InteractionResponseFilterType;\n markingRequiredImageUrl: string;\n correctImageUrl: string;\n incorrectImageUrl: string;\n skippedImageUrl: string;\n}\n\nexport function InteractionResponseListFiltersEmptyStates(props: InteractionResponseListFiltersEmptyStatesProps) {\n function getFilterEmptyStateImageUrl() {\n switch (props.filter) {\n case 'correct': return props.correctImageUrl;\n case 'incorrect': return props.incorrectImageUrl;\n case 'marking_required': return props.markingRequiredImageUrl;\n case 'skipped': return props.skippedImageUrl;\n }\n }\n\n function getFilterEmptyStatePhrase() {\n switch (props.filter) {\n case 'correct': return 'correctEmptyState';\n case 'incorrect': return 'incorrectEmptyState';\n case 'marking_required': return 'markingRequiredEmptyState';\n case 'skipped': return 'skippedEmptyState';\n }\n }\n\n return (\n <>\n <EmptyState className='m-4'>\n <EmptyState.Image src={getFilterEmptyStateImageUrl()} className='w-25 h-auto' />\n <EmptyState.Info>\n <Text namespace={namespace} phrase={getFilterEmptyStatePhrase()} />\n </EmptyState.Info>\n </EmptyState>\n </>\n );\n}\n\ninterface InteractionResponseListFiltersProps {\n filter: InteractionResponseFilterType;\n toggleFilter: (filter: InteractionResponseFilterType) => void\n}\n\nexport function InteractionResponseListFilters(props: InteractionResponseListFiltersProps) {\n function isFilterSelected(filterButton: InteractionResponseFilterType) {\n return filterButton === props.filter;\n }\n\n function getFilterClassName(filterButton: InteractionResponseFilterType) {\n return `rounded-pill bg-light ${isFilterSelected(filterButton) ? 'bg-dark text-white' : ''}`;\n }\n\n return (\n\n <div className='d-flex gap-2 m-3'>\n <button className={getFilterClassName('marking_required')} onClick={() => props.toggleFilter('marking_required')}>\n <Text namespace={namespace} phrase='markingRequired' />\n </button>\n <button className={getFilterClassName('correct')} onClick={() => props.toggleFilter('correct')}>\n <Text namespace={namespace} phrase='correct' />\n </button>\n <button className={getFilterClassName('incorrect')} onClick={() => props.toggleFilter('incorrect')}>\n <Text namespace={namespace} phrase='incorrect' />\n </button>\n <button className={getFilterClassName('skipped')} onClick={() => props.toggleFilter('skipped')}>\n <Text namespace={namespace} phrase='skipped' />\n </button>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.interactionResponseListHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractionResponseListHeaderProps {\n interaction: Interaction;\n}\n\nexport function InteractionResponseListHeader(props: InteractionResponseListHeaderProps): JSX.Element {\n const suggestedResponse = props.interaction.data?.suggestedResponse;\n\n return (\n <div className='rounded bg-white'>\n <div className='p-2 position-relative'>\n <div className='d-flex'>\n <InteractionLabel\n interaction={props.interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n {!!suggestedResponse &&\n <div className='mt-2'>\n <strong>{getPhrase('suggestedResponse')}</strong>\n <p className='m-0'>{suggestedResponse}</p>\n </div>\n }\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'shared.submitMarkedAnswers';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SubmitMarkedAnswersProps {\n submit: () => void;\n disabled: boolean\n}\n\nexport function SubmitMarkedAnswers(props: SubmitMarkedAnswersProps): JSX.Element {\n return (\n <div className='d-flex justify-content-end'>\n <button\n className='btn btn-outline-dark'\n onClick={props.submit}\n disabled={props.disabled}\n >\n {getPhrase('submitAnswers')}\n </button>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { InteractionResponseFilterType, InteractionResponseListFilters, InteractionResponseListFiltersEmptyStates } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListFilters';\nimport { InteractionResponseListHeader } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListHeader';\nimport { SubmitMarkedAnswers } from 'libs/shared/apps/analytics/components/questions-list/submit-marked-answers/SubmitMarkedAnswers';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractiveResultSet, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport styles from './interaction-response-list.module.scss';\n\nconst namespace = 'shared.interactionResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getResponsesToMark(\n interaction: Interaction,\n studentResults: StudentResults[]\n): HashObject {\n const responsesToMark = studentResults.filter(s => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n interaction,\n getStudentResult(s)\n );\n return correctness === InteractionCorrectness.AwaitingMarking;\n });\n\n return responsesToMark.reduce((acc, s) => ({\n ...acc,\n [s.user?.id || s.user?.sessionId]: true\n }), {});\n}\n\ninterface InteractionResponseListProps {\n interaction: Interaction\n results: InteractiveResultSet;\n markedAnswers: MarkedAnswerHash;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n imageCdnUrl: string;\n anonymiseUsers: boolean;\n reportsStyling?: boolean;\n emptyStateImageUrl: string;\n markingRequiredImageUrl: string;\n correctImageUrl: string;\n incorrectImageUrl: string;\n skippedImageUrl: string;\n isDemo?: boolean;\n}\n\nexport function InteractionResponseList(props: InteractionResponseListProps): JSX.Element {\n const [ filter, setFilter ] = React.useState<InteractionResponseFilterType>();\n\n const responsesToMark = getResponsesToMark(props.interaction, props.results.students);\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n if (!props.results.students?.length)\n return (\n <div className='d-flex flex-column h-100'>\n <EmptyState className='bg-white rounded mt-2 py-5 flex-grow-1 justify-content-center'>\n <EmptyState.Image src={props.emptyStateImageUrl} size='small' />\n <EmptyState.Heading>\n {getPhrase('emptyStateHeading')}\n </EmptyState.Heading>\n <EmptyState.Info className='w-100'>\n {getPhrase('emptyStateDescription')}\n </EmptyState.Info>\n </EmptyState>\n </div>\n );\n\n\n function toggleFilter(selectedFilter: InteractionResponseFilterType) {\n setFilter(filter === selectedFilter ? null : selectedFilter);\n }\n\n function filterStudentResults() {\n return props.results.students.filter(s => {\n const result = getStudentResult(s);\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(props.interaction, result);\n\n const filterMap = {\n correct: InteractionCorrectness.Correct,\n incorrect: InteractionCorrectness.Incorrect,\n marking_required: InteractionCorrectness.AwaitingMarking,\n skipped: InteractionCorrectness.UnAnswered\n };\n\n return !filter || (filter in filterMap && correctness === filterMap[filter]);\n });\n }\n\n const filteredStudentResults = filterStudentResults();\n\n return (\n <>\n {props.reportsStyling && <InteractionResponseListHeader interaction={props.interaction} />}\n <div className={props.reportsStyling\n ? 'd-flex justify-content-end'\n : 'd-flex align-items-center justify-content-between border-bottom px-3 py-2'\n }>\n {!props.reportsStyling && <p className='fw-semibold mb-0'><Text namespace={namespace} phrase='studentAnswers' /></p>}\n {!!Object.keys(responsesToMark).length &&\n <Tooltip id='submitAnswers' title={getPhrase('demoOnly')} spanHack={props.isDemo}>\n <div className={`${props.isDemo ? 'pointer-events-none' : ''} ${props.reportsStyling ? 'mt-2' : ''}`}>\n <SubmitMarkedAnswers submit={props.submitMarkedAnswers} disabled={!numMarkedAnswers} />\n </div>\n </Tooltip>\n }\n </div>\n <>\n {!props.reportsStyling && <InteractionResponseListFilters filter={filter} toggleFilter={toggleFilter} />}\n\n {!props.reportsStyling && !filteredStudentResults.length && filter && (\n <InteractionResponseListFiltersEmptyStates\n filter={filter}\n markingRequiredImageUrl={props.markingRequiredImageUrl}\n correctImageUrl={props.correctImageUrl}\n incorrectImageUrl={props.incorrectImageUrl}\n skippedImageUrl={props.skippedImageUrl}\n />\n )}\n \n {filteredStudentResults && (\n <ul className='list-unstyled mb-0'>\n {filteredStudentResults.map((s, idx) => {\n const anonymisedUserName = anonymiseUserName(s.user, props.anonymiseUsers);\n const markingRequired = responsesToMark[s.user?.id || s.user?.sessionId];\n\n let className = props.reportsStyling ? 'bg-white p-2' : 'bg-white px-3 pt-3 pb-2';\n\n if (markingRequired)\n className += ` ${styles.awaitingMarking} my-1`;\n\n return (\n <li key={idx} className={props.reportsStyling ? '' : 'border-bottom'}>\n {props.reportsStyling ? (\n <InteractionResponse\n interaction={props.interaction}\n studentResults={s}\n markedStatus={getMarkedStatus(props.interaction.id, s, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n showStudentDetails\n anonymisedUserName={anonymisedUserName}\n className={className}\n showFeedback\n reportsStyling\n responseComponentClass='mx-n2'\n />\n ) : (\n <InteractionResponseItem\n interaction={props.interaction}\n studentResults={s}\n markedStatus={getMarkedStatus(props.interaction.id, s, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n showStudentDetails\n anonymisedUserName={anonymisedUserName}\n className={className}\n showFeedback\n />\n )}\n </li>\n );\n })}\n </ul>\n )}\n {props.reportsStyling && !!responsesToMark.length &&\n <div className='mt-2'>\n <SubmitMarkedAnswers submit={props.submitMarkedAnswers} disabled={!numMarkedAnswers} />\n </div>\n }\n </>\n </>\n );\n}","import React from 'react';\n\nimport { QuestionTableAnswersProps } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\n\nexport function QuestionTableMissingWord(props: QuestionTableAnswersProps) {\n const replacePlaceholders = (str: string) => {\n if (!str) return '';\n\n return str.split(/({\\d+})/).map((part, index) => {\n const match = part.match(/{(\\d+)}/);\n\n if (match) {\n const key = match[1];\n\n const replacement = props.interaction.actionableItems.find(answer => +answer.order === +key);\n\n\n if (replacement) {\n return <span className='bg-white border border-gray-300 rounded p-1 lh-lg' key={index}>{replacement.name}</span>;\n }\n }\n\n return part;\n });\n };\n\n return (\n <div>\n <p className='mb-0'>{replacePlaceholders(props.interaction.data.sentence)}</p>\n </div>\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { QuestionTableAnswersProps } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\nimport { MultipleChoiceInteractionAnswers } from 'libs/shared/components/interaction-answers/multiple-choice/MultipleChoiceInteractionAnswers';\n\nimport styles from './question-table-answers.module.scss';\n\nexport function QuestionTableMultipleChoice(props: QuestionTableAnswersProps) {\n const hasImages = !!ArrayHelper.first(props.interaction?.actionableItems).data?.imageUrl;\n\n if (!hasImages) {\n return (\n <ul className={`${styles.answerWidth} list-unstyled row g-2`}>\n {props.interaction.actionableItems.map(option => {\n return (\n <li key={option.id} className='col-12'>\n <div className={`${option.isCorrect ? 'bg-light-green border-green' : 'bg-light-red border-red'} rounded border py-1 px-2 m-0`}>\n <span className='fw-semibold'>{props.indexToLetter(option.order)}. </span>\n <span>{option.name}</span>\n </div>\n </li>\n );\n })}\n </ul>\n );\n }\n\n return (\n <div className={styles.answerWidth}>\n <MultipleChoiceInteractionAnswers\n interaction={props.interaction}\n size='sm'\n showFeedback={false}\n showCorrectnessIcons\n isDisplayOnly\n />\n </div>\n );\n}","import React from 'react';\n\nimport { QuestionTableAnswersProps } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './question-table-answers.module.scss';\n\nconst namespace = 'shared.questionTable';\n\nexport function QuestionTableShortAnswer(props: QuestionTableAnswersProps) {\n const suggestedResponse = props.interaction.data?.suggestedResponse;\n\n if (!suggestedResponse) return <></>;\n\n return (\n <div className={`${styles.answerWidth} bg-light-blue rounded p-2 mb-2`}>\n <div className='d-flex justify-content-between'>\n <p className='fw-semibold mb-2'>\n <Text namespace={namespace} phrase='suggestedResponse' />\n </p>\n </div>\n\n <p className='mb-0'>{suggestedResponse}</p>\n </div>\n );\n}","import React from 'react';\n\nimport { QuestionTableAnswersProps } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\n\n\nexport function QuestionTableTrueOrFalse(props: QuestionTableAnswersProps) {\n return (\n <ul className='list-unstyled d-flex gap-2'>\n {props.interaction.actionableItems.map(option => {\n return (\n <li\n key={option.id}\n className={`${option.isCorrect ? 'bg-light-green border-green' : 'bg-light-red border-red'} rounded border px-2 py-1 mb-2 w-50`}\n >\n <span className='fw-semibold'>{props.indexToLetter(option.order)}. </span>\n <span>{option.name}</span>\n </li>\n );\n })}\n </ul>\n );\n}","import React from 'react';\n\nimport { QuestionTableMissingWord } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableMissingWord';\nimport { QuestionTableMultipleChoice } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableMultipleChoice';\nimport { QuestionTableShortAnswer } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableShortAnswer';\nimport { QuestionTableTrueOrFalse } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableTrueOrFalse';\nimport { indexToLetter } from 'libs/shared/apps/analytics/components/questions-list/question-table/QuestionTableUtils';\nimport { Interaction, InteractionTypeId } from 'libs/shared/interfaces';\n\nexport interface QuestionTableAnswersProps {\n interaction: Interaction;\n indexToLetter?: (index: number) => string;\n}\n\nexport function QuestionTableAnswers(props: QuestionTableAnswersProps) {\n function getQuestionTableAnswerComponent(): JSX.Element {\n switch (props.interaction.typeId) {\n case InteractionTypeId.MultipleChoice:\n return <QuestionTableMultipleChoice interaction={props.interaction} indexToLetter={indexToLetter} />;\n case InteractionTypeId.TrueOrFalse:\n return <QuestionTableTrueOrFalse interaction={props.interaction} indexToLetter={indexToLetter} />;\n case InteractionTypeId.ShortAnswer:\n return <QuestionTableShortAnswer interaction={props.interaction} />;\n case InteractionTypeId.MissingWord:\n return <QuestionTableMissingWord interaction={props.interaction} />;\n default: return null;\n }\n }\n\n const QuestionTableAnswerComponent = getQuestionTableAnswerComponent();\n\n if (!QuestionTableAnswerComponent) return <></>;\n\n return (\n <div className='w-100 mt-3'>\n {QuestionTableAnswerComponent}\n </div>\n );\n}","import React from 'react';\nimport { Column, ColumnInstance, Row, SortingRule } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { QuestionTableAnswers } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nconst namespace = 'shared.questionTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction sortScore(\n rowA: Row<InteractionWithResultsSummary>,\n rowB: Row<InteractionWithResultsSummary>,\n columnId: string\n): 1 | -1 {\n const cellA = rowA.cells.find(cell => cell.column.id === columnId).value;\n const cellB = rowB.cells.find(cell => cell.column.id === columnId).value;\n\n if (cellA.awaitingMarking)\n return -1;\n\n if (cellB.awaitingMarking)\n return 1;\n\n return cellA.percentCorrect >= cellB.percentCorrect\n ? 1\n : -1;\n}\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`d-flex ${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<InteractionWithResultsSummary>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={props.column.isSorted && 'fw-bold'}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport function getColumns(\n showAnswersInTable: boolean\n): Column<InteractionWithResultsSummary>[] {\n return [\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='#' />,\n accessor: 'questionNumber',\n id: 'index',\n Cell: ({ row: { original: { questionNumber } } }) => {\n return <CellWrapper>{questionNumber + 1}.</CellWrapper>;\n },\n width: 15,\n disableSortBy: true\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='question' />,\n accessor: 'data', // This isn't used but it's needed for the typings on row,\n Cell: ({ row: { original: interaction }, initialState: { selectedRowIds } }) => {\n const selectedRow = selectedRowIds?.[interaction?.id];\n\n return (\n <CellWrapper className='flex-column'>\n <div className={`${!selectedRow ? 'clamp-1' : ''} pe-2`}>\n <InteractionLabel interaction={interaction} containerClassName='d-flex' />\n </div>\n\n {showAnswersInTable && selectedRow && (\n <QuestionTableAnswers interaction={interaction} />\n )}\n </CellWrapper>\n );\n },\n disableSortBy: true\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='score' />,\n accessor: 'resultsSummary',\n id: 'correctlyAnswered',\n Cell: ({ value: { percentCorrect, awaitingMarking } }) => {\n if (awaitingMarking) {\n return (\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n tooltipClassName='d-block'\n showLabel\n />\n );\n }\n\n return (\n <PercentageIndicator\n percentage={percentCorrect}\n layout={PercentageIndicatorLayout.LabelBefore}\n />\n );\n },\n width: 60,\n sortDescFirst: true,\n sortType: sortScore\n }\n ];\n}\n\n/**\n * Returns memoized table data. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetTableData(\n interactive: Interactive,\n results: InteractiveResultSet,\n refreshData: boolean,\n sortBy?: SortingRule<InteractionWithResultsSummary>\n): InteractionWithResultsSummary[] {\n return React.useMemo(() => {\n const flattenedInteractions = getInteractions(interactive);\n const questionNumbers: HashObject = flattenedInteractions.reduce((acc, interaction, index) => ({\n ...acc, [interaction.id]: index\n }), {});\n\n const interactions = flattenedInteractions.map(i => ({\n ...i,\n questionNumber: questionNumbers[i.id],\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n if (sortBy?.id === 'correctlyAnswered') {\n const sorted = ArrayHelper.sortBy(interactions, interaction => {\n if (interaction.resultsSummary.awaitingMarking)\n return -1;\n\n return interaction.resultsSummary.percentCorrect;\n });\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n return interactions;\n }, [ refreshData, sortBy ]);\n}\n\nexport function indexToLetter(index: number) {\n return String.fromCharCode(index + 'A'.charCodeAt(0));\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { indexToLetter } from 'libs/shared/apps/analytics/components/questions-list/question-table/QuestionTableUtils';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResultSet } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.questionTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface QuestionSummary {\n id?: string;\n count: number;\n isCorrect: boolean;\n label?: string | number;\n}\n\nexport function multipleChoiceSummary(\n interaction: Interaction,\n studentResults: InteractiveResultSet\n): QuestionSummary[] {\n const questionsSummary: QuestionSummary[] = interaction.actionableItems.map((item, i) => {\n return {\n id: item.id,\n label: interaction.typeId === InteractionTypeId.MultipleChoice ? indexToLetter(i) : item.name,\n isCorrect: item.isCorrect,\n count: 0\n };\n });\n\n studentResults.students.forEach(student => {\n const latestAttempts = ArrayHelper.last(student.results).attempts;\n const response = ArrayHelper.findWhere(latestAttempts, { id: interaction.id });\n\n if (!response) return;\n\n response.answers.forEach(answer => {\n const questionSummary = ArrayHelper.findWhere(questionsSummary, { id: answer.id });\n\n if (questionSummary)\n questionSummary.count++;\n });\n });\n\n return questionsSummary;\n}\n\nexport function missingWordSummary(interaction: Interaction, studentResults: InteractiveResultSet): QuestionSummary[] {\n const questionsSummary: QuestionSummary[] = interaction.actionableItems.map(item => {\n return {\n id: item.id,\n label: item.name,\n isCorrect: item.isCorrect,\n count: 0\n };\n });\n\n questionsSummary.push({\n label: getPhrase('incorrect'),\n count: 0,\n isCorrect: false\n });\n\n studentResults.students.forEach(student => {\n const latestAttempts = ArrayHelper.last(student.results).attempts;\n const response = ArrayHelper.findWhere(latestAttempts, { id: interaction.id });\n\n if (!response) return;\n\n response.answers.forEach(answer => {\n const questionSummary = ArrayHelper.findWhere(questionsSummary, { id: answer.id });\n\n if (questionSummary && answer.status === InteractiveAnswerStatus.Correct) {\n questionSummary.count++;\n } else {\n const incorrectSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('incorrect') });\n\n incorrectSummary.count++;\n }\n });\n });\n\n return questionsSummary;\n}\n\nexport function markedSummary(interaction: Interaction, studentResults: InteractiveResultSet): QuestionSummary[] {\n const questionsSummary: QuestionSummary[] = [\n {\n label: getPhrase('correct'),\n isCorrect: true,\n count: 0\n },\n {\n label: getPhrase('incorrect'),\n isCorrect: false,\n count: 0\n }\n ];\n\n studentResults.students.forEach(student => {\n const latestAttempts = ArrayHelper.last(student.results).attempts;\n const response = ArrayHelper.findWhere(latestAttempts, { id: interaction.id });\n\n if (!response) return;\n\n response.answers.forEach(answer => {\n if (answer.status === InteractiveAnswerStatus.Correct) {\n const correctSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('correct') });\n correctSummary.count++;\n }\n if (answer.status === InteractiveAnswerStatus.Incorrect) {\n const incorrectSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('incorrect') });\n incorrectSummary.count++;\n }\n if (answer.status === InteractiveAnswerStatus.PendingReview) {\n let pendingSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('pending') });\n\n if (!pendingSummary) {\n questionsSummary.push({\n label: getPhrase('pending'),\n count: 0,\n isCorrect: false\n });\n pendingSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('pending') });\n }\n\n pendingSummary.count++;\n }\n });\n });\n\n return questionsSummary;\n}","import React from 'react';\n\nexport function LightbulbSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M12 4c-3.308 0-6 2.692-6 6 0 1.923.916 3.716 2.462 4.846v3.77c0 .763.62 1.384 1.384 1.384h4.308c.763 0 1.385-.621 1.385-1.385v-3.77A6 6 0 0 0 18 10c0-3.308-2.692-6-6-6m.461 8a2.62 2.62 0 0 1 2.154-2.575v.113a2.62 2.62 0 0 1-2.154 2.575zm-.922.113a2.62 2.62 0 0 1-2.154-2.575v-.113A2.62 2.62 0 0 1 11.539 12zm3.076 4.656v.616h-5.23v-.616zm-.461 2.308H9.846a.46.46 0 0 1-.461-.462v-.307h5.23v.307a.46.46 0 0 1-.461.462m.666-4.855a.46.46 0 0 0-.205.384v1.24h-2.154v-2.8a3.544 3.544 0 0 0 3.078-3.508v-.615a.46.46 0 0 0-.462-.461A3.54 3.54 0 0 0 12 10.254a3.54 3.54 0 0 0-3.077-1.792.46.46 0 0 0-.461.461v.615a3.544 3.544 0 0 0 3.077 3.509v2.8H9.385v-1.241a.46.46 0 0 0-.205-.384A5.07 5.07 0 0 1 6.923 10c0-2.8 2.278-5.077 5.077-5.077S17.077 7.201 17.077 10a5.07 5.07 0 0 1-2.257 4.222'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { markedSummary, missingWordSummary, multipleChoiceSummary, QuestionSummary } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-results-summary/QuestionResultsSummaryUtils';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { LightbulbSvg } from 'libs/shared/images/svg/objects/LightbulbSvg';\nimport { Interaction, InteractionTypeId, InteractiveResultSet } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.questionTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface QuestionResultsSummaryProps {\n interaction: Interaction;\n results: InteractiveResultSet;\n}\n\nexport function QuestionResultsSummary(props: QuestionResultsSummaryProps) {\n const questionSummary = getQuestionSummary();\n const maxResponseCount = getMaxResponseCount();\n\n function getQuestionSummary(): QuestionSummary[] {\n if (!props.interaction || !props.results) return;\n\n let summaryMethod: (\n interaction: Interaction,\n results: InteractiveResultSet,\n interactionTypeId?: InteractionTypeId\n ) => QuestionSummary[];\n\n switch (props.interaction.typeId) {\n case InteractionTypeId.ShortAnswer:\n case InteractionTypeId.Illustration:\n summaryMethod = markedSummary;\n break;\n case InteractionTypeId.MissingWord:\n summaryMethod = missingWordSummary;\n break;\n case InteractionTypeId.MultipleChoice:\n case InteractionTypeId.TrueOrFalse:\n summaryMethod = multipleChoiceSummary;\n break;\n }\n\n return summaryMethod(props.interaction, props.results);\n }\n\n function getMaxResponseCount() {\n return questionSummary?.reduce((acc, summary) => summary.count > acc ? summary.count : acc, 0);\n }\n\n function getBarClassName(summary: QuestionSummary) {\n const className = 'border rounded me-2';\n\n if (!summary.count)\n return `${className} border bg-light px-1`;\n\n if (summary.label === getPhrase('pending'))\n return `${className} border-blue bg-light-blue`;\n\n if (summary.isCorrect)\n return `${className} border-green bg-light-green`;\n\n return `${className} border-red bg-light-red`;\n }\n\n return (\n <div className='border border rounded p-3 mb-3'>\n <div className='d-flex align-items-center gap-2 mb-3'>\n <div className='rounded-circle bg-light-teal text-teal'>\n <SvgContainer svg={LightbulbSvg} size={SvgContainerSize.Large} />\n </div>\n <h2 className='h6 mb-0'>\n <span><Text namespace={namespace} phrase='questionSummary' /></span>\n </h2>\n </div>\n <div className='d-flex gap-2'>\n <div className='max-w-25'>\n {questionSummary?.map(summary => {\n return (\n <p key={summary.label} className='text-truncate mb-2'>{summary.label}</p>\n );\n })}\n </div>\n <div className='flex-grow-1'>\n {questionSummary?.map((summary, i) => {\n return (\n <div key={`${props.interaction.id}${i}`} className='d-flex mb-2'>\n <div\n className={getBarClassName(summary)}\n style={{ width: `${(summary.count / maxResponseCount) * 100}%`, height: 20 }}>\n </div>\n <span>{summary.count}</span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nconst namespace = 'shared.selectedInteractionEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SelectedInteractionEmptyStateProps {\n emptyStateUrl: string;\n}\n\nexport function SelectedInteractionEmptyState(props: SelectedInteractionEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='rounded h-100 bg-white justify-content-center py-4'>\n <EmptyState.Image\n src={props.emptyStateUrl}\n size='small'\n />\n <EmptyState.Info className='w-100'>\n {getPhrase('emptyStateText')}\n </EmptyState.Info>\n </EmptyState>\n );\n}","import { SortingRule } from 'react-table';\n\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\n\nexport type SortStudentsBy = 'score_desc' | 'score_asc';\n\nexport function getSortStudents(sortBy: SortStudentsBy, id: string): SortingRule<any>[] {\n switch (sortBy) {\n case 'score_desc': return [{ id, desc: true }];\n case 'score_asc': return [{ id, desc: false }];\n default: return [];\n }\n}\n\nexport type FilterStudentsBy = 'not_completed' | 'marking_required' | 'helping_hand';\n\nexport function shouldFilterStudent(filter: FilterStudentsBy, summary: ResultsSummary): boolean {\n if (filter === 'marking_required' && !summary.awaitingMarking)\n return true;\n\n if (filter === 'helping_hand' && summary.percentCorrect >= ScoreThresholdInsights.HIGH)\n return true;\n\n if (filter === 'not_completed' && !summary.unanswered)\n return true;\n \n return false;\n}\n\n","import React from 'react';\nimport { Row, SortingRule } from 'react-table';\n\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InteractionQuestionsEmptyState } from 'libs/shared/apps/analytics/components/questions-list/interaction-questions-empty-state/InteractionQuestionsEmptyState';\nimport { InteractionResponseList } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseList';\nimport { QuestionResultsSummary } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-results-summary/QuestionResultsSummary';\nimport { SelectedInteractionEmptyState } from 'libs/shared/apps/analytics/components/questions-list/selected-interaction-empty-state/SelectedInteractionEmptyState';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionById } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { getSortStudents, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interactive, InteractiveResultSet, StudentAnswer } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nimport { getColumns, useGetTableData } from './QuestionTableUtils';\n\ninterface QuestionTableProps {\n interactive: Interactive;\n results: InteractiveResultSet;\n markedAnswers: { [id: string]: StudentAnswer };\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n editSuggestedResponse?: () => void;\n imageCdnUrl: string;\n selectQuestionImageUrl: string;\n anonymiseUsers: boolean;\n sortBy?: SortStudentsBy;\n emptyResponseStateImageUrl: string;\n emptyQuestionsStateImageUrl: string;\n markingRequiredImageUrl?: string;\n correctImageUrl?: string;\n incorrectImageUrl?: string;\n skippedImageUrl?: string;\n\n /**\n * As the table data is memoized, it must be prompted to recalculate.\n * Toggle `refreshTable` to do so.\n */\n refreshTable: boolean;\n selectedInteractionId?: string;\n showAnswersInTable?: boolean;\n theme: TableTheme;\n reportsStyling?: boolean;\n isDemo?: boolean;\n}\n\nexport function QuestionTable(props: QuestionTableProps): JSX.Element {\n const [ sortBy, setSortBy ] = React.useState<SortingRule<InteractionWithResultsSummary>[]>(\n getSortStudents(props.sortBy, 'correctlyAnswered')\n );\n const data = useGetTableData(props.interactive, props.results, props.refreshTable, ArrayHelper.first(sortBy));\n\n const selectedInteraction = props.selectedInteractionId &&\n getInteractionById(props.interactive, props.selectedInteractionId);\n\n function onSelectRow({ original: interaction }: Row<InteractionWithResultsSummary>): void {\n ScrollHelper.preventScrollTop();\n\n AppRouteHelper.updateParams(\n { interactionId: interaction.id },\n { merge: true }\n );\n }\n\n return (\n <div className='row'>\n <div className='col-6 flex-grow-1'>\n <Table\n key={props.selectedInteractionId}\n columns={getColumns(props.showAnswersInTable)}\n data={data}\n theme={props.theme}\n onSelectRow={onSelectRow}\n initialSelectedRowIds={selectedInteraction ? [selectedInteraction.id] : null}\n getRowId={(row: InteractionWithResultsSummary) => row.id}\n enableSort\n manualSort\n onSort={setSortBy}\n initialSortBy={sortBy}\n emptyState={<InteractionQuestionsEmptyState emptyStateImageUrl={props.emptyQuestionsStateImageUrl} />}\n />\n </div>\n <div className='col-6 d-flex flex-column'>\n {!props.reportsStyling && props.selectedInteractionId && !!props.results.students?.length && (\n <QuestionResultsSummary\n interaction={selectedInteraction}\n results={props.results}\n />\n )}\n\n <div className={`rounded flex-grow-1 ${props.reportsStyling ? '' : 'border'}`}>\n {!!selectedInteraction &&\n <InteractionResponseList\n interaction={selectedInteraction}\n results={props.results}\n markedAnswers={props.markedAnswers}\n addMarkedAnswers={props.addMarkedAnswers}\n submitMarkedAnswers={props.submitMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymiseUsers={props.anonymiseUsers}\n emptyStateImageUrl={props.emptyResponseStateImageUrl}\n markingRequiredImageUrl={props.markingRequiredImageUrl}\n correctImageUrl={props.correctImageUrl}\n incorrectImageUrl={props.incorrectImageUrl}\n skippedImageUrl={props.skippedImageUrl}\n reportsStyling={props.reportsStyling}\n isDemo={props.isDemo}\n />\n }\n {!selectedInteraction && <SelectedInteractionEmptyState emptyStateUrl={props.selectQuestionImageUrl} />}\n </div>\n </div>\n </div>\n );\n}","import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.confirmationPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ConfirmationPopupProps {\n title: string;\n onClickConfirm: () => void;\n confirmButtonText?: string;\n cancelButtonText?: string;\n confirmButtonVariant?: ButtonProps['variant'];\n cancelButtonVariant?: ButtonProps['variant'];\n disabledConfirmButton?: boolean;\n}\n\nConfirmationPopup.defaultProps = {\n confirmButtonVariant: 'primary',\n cancelButtonVariant: 'link'\n};\n\ntype PropTypes = React.PropsWithChildren<ConfirmationPopupProps & PopupViewProps>;\n\nexport function ConfirmationPopup(props: PropTypes): React.ReactElement {\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n return (\n <Popup title={props.title} closePopup={props.closePopup}>\n <>\n {props.children}\n <PopupButtons>\n <PopupButtons.Cancel\n onClick={props.closePopup}\n variant={props.cancelButtonVariant}\n text={props.cancelButtonText || getPhrase('cancel')}\n />\n <PopupButtons.Submit\n onClick={() => { setShowButtonSpinner(true); props.onClickConfirm(); }}\n text={props.confirmButtonText || getPhrase('confirm')}\n variant={props.confirmButtonVariant}\n showSpinner={showButtonSpinner}\n disabled={props.disabledConfirmButton}\n />\n </PopupButtons>\n </>\n </Popup>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { QuestionTable } from 'libs/shared/apps/analytics/components/questions-list/question-table/QuestionTable';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ConfirmationPopup } from 'libs/shared/components/confirmation-popup/ConfirmationPopup';\nimport { TableTheme } from 'libs/shared/components/table/Table';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\n\nimport { PartialTable } from 'shared/components/partial-loading/PartialTable';\nimport { ImageUrls } from 'shared/constants/ReportsImageUrls';\nimport { ViewModelKeys } from 'shared/constants/ReportsViewModels';\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\nimport { useHandleVideoError } from 'shared/hooks/UseHandleVideoError';\nimport { useSetHeaderActions } from 'shared/hooks/UseSetHeaderActions';\nimport { useSetHeaderTitle } from 'shared/hooks/UseSetHeaderTitle';\nimport { useGetObjectHeaderActions } from 'shared/utils/HeaderActionUtils';\n\nimport { InteractiveNav } from 'apps/interactives/components/interactive-nav/InteractiveNav';\nimport { useNoResultsPopup } from 'apps/interactives/hooks/UseNoResultsPopup';\nimport { useRefreshInteractiveResults } from 'apps/interactives/hooks/UseRefreshInteractiveResults';\nimport { useSetInteractiveResultsAudienceFilterCount } from 'apps/interactives/hooks/UseSetInteractiveResultsAudienceFilterCount';\nimport { useSetSuggestedInteractiveResultsAudience } from 'apps/interactives/hooks/UseSetSuggestedInteractiveResultsAudience';\n\nimport styles from './interactive-question-list-view.module.scss';\n\nconst theme: TableTheme = {\n table: 'bg-white rounded pb-2',\n header: 'border-bottom px-2',\n headerCell: 'p-2 d-flex align-items-center',\n cell: 'px-2',\n row: `m-2 rounded py-1 ${styles.row}`,\n selectedRow: 'bg-light',\n sortIndicator: 'ms-2'\n};\n\nconst namespace = 'interactives.interactiveQuestionList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveQuestionListViewProps {\n interactiveMetadataId: string;\n interactionId?: string;\n}\n\nexport function InteractiveQuestionListView(props: InteractiveQuestionListViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n\n const [ showMarkConfirmationPopup, setShowMarkConfirmationPopup ] = React.useState(false);\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveMetadataId)\n );\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId ?\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId) : null);\n const requestFilter = useGetRequestFilter();\n const results = useFetchInteractiveResults(props.interactiveMetadataId, requestFilter);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n useSetPageMetadata({ title: getPhrase('pageTitle', { interactive: interactiveMetadata.data?.name }) });\n useSetHeaderTitle(interactiveMetadata.data?.name);\n useSetHeaderActions(useGetObjectHeaderActions(interactiveMetadata.data));\n useSetSuggestedInteractiveResultsAudience(props.interactiveMetadataId);\n useSetInteractiveResultsAudienceFilterCount(results);\n useNoResultsPopup(props.interactiveMetadataId);\n useCannotConsumeError(interactiveMetadata);\n\n useHandleVideoError(interactiveMetadata);\n useHandleObjectError([ interactive, results, config ]);\n\n const refreshTable = useRefreshInteractiveResults(results);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n () => setShowMarkConfirmationPopup(false)\n );\n\n const dataLoaded = !!interactive.data && !!results.data && !!config.data;\n\n return (\n <>\n <div>\n <InteractiveNav interactiveMetadataId={props.interactiveMetadataId} />\n {dataLoaded\n ? <QuestionTable\n emptyResponseStateImageUrl={ImageUrls.EmptyStates.Interactives.NoResponses}\n emptyQuestionsStateImageUrl={ImageUrls.EmptyStates.Interactives.NoQuestions}\n selectQuestionImageUrl={ImageUrls.EmptyStates.Interactives.NoData}\n anonymiseUsers={anonymiseUsers}\n interactive={interactive.data}\n results={results.data}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={() => setShowMarkConfirmationPopup(true)}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n refreshTable={refreshTable}\n theme={theme}\n reportsStyling\n />\n : <div className='row'><div className='col-6'><PartialTable /></div></div>\n }\n </div>\n {showMarkConfirmationPopup &&\n <ConfirmationPopup\n title={getPhrase('markPopupTitle', { smartCount: Object.keys(markedAnswers).length ?? 0 })}\n closePopup={() => setShowMarkConfirmationPopup(false)}\n confirmButtonText={getPhrase('submit')}\n confirmButtonVariant='dark'\n onClickConfirm={submitMarkedAnswers}\n >\n <p>{getPhrase('markPopupBody')}</p>\n </ConfirmationPopup>\n }\n </>\n );\n}"],"names":["ScrollHelper","Radio","CommonChannels","namespace","getPhrase","LanguageService","InteractionQuestionsEmptyState","props","jsxs","EmptyState","jsx","InteractionResponseListFiltersEmptyStates","getFilterEmptyStateImageUrl","getFilterEmptyStatePhrase","Fragment","Text","InteractionResponseListFilters","isFilterSelected","filterButton","getFilterClassName","InteractionResponseListHeader","suggestedResponse","_a","InteractionLabel","SubmitMarkedAnswers","getResponsesToMark","interaction","studentResults","s","InteractiveCorrectnessHelper","getStudentResult","InteractionCorrectness","acc","_b","InteractionResponseList","filter","setFilter","React","responsesToMark","numMarkedAnswers","toggleFilter","selectedFilter","filterStudentResults","result","correctness","filterMap","filteredStudentResults","Tooltip","idx","anonymisedUserName","anonymiseUserName","markingRequired","className","styles","InteractionResponse","getMarkedStatus","InteractionResponseItem","QuestionTableMissingWord","replacePlaceholders","str","part","index","match","key","replacement","answer","QuestionTableMultipleChoice","ArrayHelper","option","MultipleChoiceInteractionAnswers","QuestionTableShortAnswer","QuestionTableTrueOrFalse","QuestionTableAnswers","getQuestionTableAnswerComponent","InteractionTypeId","indexToLetter","QuestionTableAnswerComponent","sortScore","rowA","rowB","columnId","cellA","cell","cellB","CellWrapper","HeaderCell","getColumns","showAnswersInTable","column","questionNumber","selectedRowIds","selectedRow","percentCorrect","awaitingMarking","PendingIndicator","PercentageIndicator","PercentageIndicatorLayout","useGetTableData","interactive","results","refreshData","sortBy","flattenedInteractions","getInteractions","questionNumbers","interactions","i","getInteractionResultsSummary","sorted","multipleChoiceSummary","questionsSummary","item","student","latestAttempts","response","questionSummary","missingWordSummary","InteractiveAnswerStatus","incorrectSummary","markedSummary","correctSummary","pendingSummary","LightbulbSvg","QuestionResultsSummary","getQuestionSummary","maxResponseCount","getMaxResponseCount","summaryMethod","summary","getBarClassName","SvgContainer","SvgContainerSize","SelectedInteractionEmptyState","getSortStudents","id","QuestionTable","setSortBy","data","selectedInteraction","getInteractionById","onSelectRow","AppRouteHelper","Table","row","ConfirmationPopup","showButtonSpinner","setShowButtonSpinner","React.useState","Popup","PopupButtons","theme","InteractiveQuestionListView","anonymiseUsers","useViewModel","ViewModelKeys","showMarkConfirmationPopup","setShowMarkConfirmationPopup","interactiveMetadata","Flight.useBasicFetch","InteractiveRequests","requestFilter","useGetRequestFilter","useFetchInteractiveResults","config","ConfigRequests","useSetPageMetadata","useSetHeaderTitle","_c","useSetHeaderActions","useGetObjectHeaderActions","useSetSuggestedInteractiveResultsAudience","useSetInteractiveResultsAudienceFilterCount","useNoResultsPopup","useCannotConsumeError","useHandleVideoError","useHandleObjectError","refreshTable","useRefreshInteractiveResults","markedAnswers","addMarkedAnswers","submitMarkedAnswers","useMarkAnswers","_d","_e","dataLoaded","InteractiveNav","ImageUrls","PartialTable"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{s as u}from"./app-BqRx5tK8.js";import{g as a}from"./sFV5nxD4.chunk.js";var c=(o=>(o[o.RootTopic=1]="RootTopic",o[o.ChildTopic=2]="ChildTopic",o))(c||{});function i(o,r,t){return{...o,topicAnalyticsType:r,query:"cover",limit:t}}const v={topTopics(o,r,t,e,s){return{url:u.urlBuilder("{gateway}/v1/analytics/topics/top",i(o,r)),key:a(`top:topics:${r}`,o),success:t,error:e,always:s}},topTopicsV2(o,r,t,e,s,p){return{url:u.urlBuilder("{gateway}/v2/analytics/topics/top",i(o,r,t)),key:a(`top:topics:${r}:v2:${t}`,o),success:e,error:s,always:p}},viewsByTopic(o,r,t,e,s){return{url:u.urlBuilder("{gateway}/v1/analytics/topics/count",i(o,r)),key:a(`views:topics:${r}`,o),normalize:!1,success:t,error:e,always:s}}};export{c as T,v as a};
2
+ //# sourceMappingURL=D1U_fPVs.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1U_fPVs.chunk.js","sources":["../../src/shared/enums/TopicAnalyticsType.ts","../../src/shared/flight-requests/TopicRequests.ts"],"sourcesContent":["export enum TopicAnalyticsType {\n RootTopic = 1,\n ChildTopic = 2\n}","import { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsRequestFilter, Classification } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nimport { TopicAnalyticsType } from 'shared/enums/TopicAnalyticsType';\n\nfunction getTopicRequestParams(\n filter: AnalyticsRequestFilter,\n topicAnalyticsType: TopicAnalyticsType,\n limit?: number\n): HashObject {\n return {\n ...filter,\n topicAnalyticsType,\n query: 'cover',\n limit\n };\n}\n\nexport const TopicRequests = {\n topTopics(\n filter: AnalyticsRequestFilter,\n topicAnalyticsType: TopicAnalyticsType,\n success?: (data: Classification[]) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(\n '{gateway}/v1/analytics/topics/top',\n getTopicRequestParams(filter, topicAnalyticsType)\n ),\n key: getAnalyticsRequestKey(`top:topics:${topicAnalyticsType}`, filter),\n success,\n error,\n always\n };\n },\n\n topTopicsV2(\n filter: AnalyticsRequestFilter,\n topicAnalyticsType: TopicAnalyticsType,\n limit: number,\n success?: (data: Classification[]) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(\n '{gateway}/v2/analytics/topics/top',\n getTopicRequestParams(filter, topicAnalyticsType, limit)\n ),\n key: getAnalyticsRequestKey(`top:topics:${topicAnalyticsType}:v2:${limit}`, filter),\n success,\n error,\n always\n };\n },\n\n viewsByTopic(\n filter: AnalyticsRequestFilter,\n topicAnalyticsType: TopicAnalyticsType,\n success?: (data: Classification[]) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(\n '{gateway}/v1/analytics/topics/count',\n getTopicRequestParams(filter, topicAnalyticsType)\n ),\n key: getAnalyticsRequestKey(`views:topics:${topicAnalyticsType}`, filter),\n normalize: false,\n success,\n error,\n always\n };\n }\n};"],"names":["TopicAnalyticsType","getTopicRequestParams","filter","topicAnalyticsType","limit","TopicRequests","success","error","always","UrlHelper","getAnalyticsRequestKey"],"mappings":"8EAAO,IAAKA,GAAAA,IACVA,EAAAA,EAAA,UAAY,CAAA,EAAZ,YACAA,EAAAA,EAAA,WAAa,CAAA,EAAb,aAFUA,IAAAA,GAAA,CAAA,CAAA,ECUZ,SAASC,EACPC,EACAC,EACAC,EACY,CACZ,MAAO,CACL,GAAGF,EACH,mBAAAC,EACA,MAAO,QACP,MAAAC,CAAA,CAEJ,CAEO,MAAMC,EAAgB,CAC3B,UACEH,EACAC,EACAG,EACAC,EACAC,EACgB,CAChB,MAAO,CACL,IAAKC,EAAU,WACb,oCACAR,EAAsBC,EAAQC,CAAkB,CAAA,EAElD,IAAKO,EAAuB,cAAcP,CAAkB,GAAID,CAAM,EACtE,QAAAI,EACA,MAAAC,EACA,OAAAC,CAAA,CAEJ,EAEA,YACEN,EACAC,EACAC,EACAE,EACAC,EACAC,EACgB,CAChB,MAAO,CACL,IAAKC,EAAU,WACb,oCACAR,EAAsBC,EAAQC,EAAoBC,CAAK,CAAA,EAEzD,IAAKM,EAAuB,cAAcP,CAAkB,OAAOC,CAAK,GAAIF,CAAM,EAClF,QAAAI,EACA,MAAAC,EACA,OAAAC,CAAA,CAEJ,EAEA,aACEN,EACAC,EACAG,EACAC,EACAC,EACgB,CAChB,MAAO,CACL,IAAKC,EAAU,WACb,sCACAR,EAAsBC,EAAQC,CAAkB,CAAA,EAElD,IAAKO,EAAuB,gBAAgBP,CAAkB,GAAID,CAAM,EACxE,UAAW,GACX,QAAAI,EACA,MAAAC,EACA,OAAAC,CAAA,CAEJ,CACF"}
@@ -0,0 +1,2 @@
1
+ import{r as b,j as o,ah as k,by as L,i as I,bz as c}from"./app-BqRx5tK8.js";import{u as N}from"./W5zJjbqu.chunk.js";function x(e={}){const{prevent:r,rootMargin:a,triggerOnce:t=!0}=e;let[i,m,g]=N({triggerOnce:t,rootMargin:a});return(r===!0||typeof window.IntersectionObserver>"u")&&(m=!0,i=null),{ref:i,inView:m,initialized:!!g}}const v="_image_pp6me_1",A={image:v},T="500px",$="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",j=b.memo(function(e){const{forceLoad:r,extraClasses:a="",errorFallbackImageSrc:t,preventLoad:i=!1,errorFallbackImageClassName:m,src:g,alt:f,...u}=e,{ref:_,inView:s}=x({rootMargin:T}),[l,C]=b.useState(!1);b.useEffect(()=>{if(!r&&!s||i)return;const d=new Image;return d.onerror=()=>{C(!0),t&&(d.src=t)},d.src=g,()=>d.onerror=null},[s,i]);function y(){return l&&t?t:e.src}if(l&&!t)return o.jsx(o.Fragment,{});if(!_)return o.jsx("img",{className:`${A.image} ${a} ${l&&m||""}`,alt:f,src:y(),...u});const h={alt:f,...u,...(s||r)&&!i?{src:y()}:{src:$}};return r||(h.ref=_),o.jsx("img",{className:`${A.image} ${a} ${l&&m||""}`,...h})}),p="_image_1himm_1",P="_thumbnail_1himm_13",F="_tallPoster_1himm_16",O="_cover_1himm_19",S="_banner_1himm_22",E="_poster_1himm_25",w="_pdf_1himm_28",D="_link_1himm_31",n={image:p,thumbnail:P,tallPoster:F,cover:O,banner:S,poster:E,pdf:w,link:D};function B(e){let r=n.image,a="";return e.imageType===c.Thumbnails&&(a=`thumbnail ${n.thumbnail}`),e.imageType===c.TallPosters&&(a=n.tallPoster),e.imageType===c.Covers&&(a=n.cover),e.imageType===c.Banners&&(a=n.banner),e.imageType===c.Posters&&(a=n.poster),e.imageType===c.Pdf&&(a=n.pdf),e.imageType===c.Link&&(a=n.link),a&&(r+=` ${a}`),e.className&&(r+=` ${e.className}`),r}function H(e){const{data:r,imageOptions:a,appLink:t,preload:i,preventLoad:m,analyticsOptions:g,analyticsData:f,imageClassName:u,alt:_}=e;let s="";typeof r=="string"?s=r:k.isObject(r)&&(s=r.url);const l=s&&a?L.createUrl(s,a):s;return o.jsx("div",{className:B(e),style:e.imageStyle,children:o.jsxs(I,{appLink:t,analyticsData:f,analyticsOptions:g,onClick:e.onClick,preventFocus:e.preventFocus,className:e.appLinkClassName,children:[e.children,l&&o.jsx(j,{src:l,alt:_,forceLoad:i,preventLoad:m,extraClasses:u,errorFallbackImageSrc:e.errorFallbackImageSrc,errorFallbackImageClassName:e.errorFallbackImageClassName,onLoad:e.onLoad})]})})}export{H as B};
2
+ //# sourceMappingURL=D9POXla0.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D9POXla0.chunk.js","sources":["../../../../libs/shared/src/hooks/UseLazyLoad.ts","../../../../libs/shared/src/components/lazy-image/LazyImage.tsx","../../../../libs/shared/src/components/image/BaseImage.tsx"],"sourcesContent":["import { useInView } from 'react-intersection-observer';\n\ninterface LazyUtils {\n ref: (node?: Element) => void | null;\n inView: boolean;\n\n /**\n * Use this if you want to hide something on start\n * and then show it as something else leaves the window\n * e.g. The student feed floating jump to button\n */\n initialized: boolean;\n}\n\ninterface UseLazyLoadOptions {\n prevent?: boolean;\n /**\n * See rootMagin here: https://www.npmjs.com/package/react-intersection-observer#api\n * Thow allows us to have items load ahead of coming into the viewport\n * for example thumbnail images as we scroll\n */\n rootMargin?: string;\n triggerOnce?: boolean;\n}\n\nexport function useLazyLoad(options: UseLazyLoadOptions = {}): LazyUtils {\n const { prevent, rootMargin, triggerOnce = true } = options;\n\n // eslint-disable-next-line\n let [ ref, inView, entry ] = useInView({ triggerOnce, rootMargin: rootMargin });\n\n if (prevent === true || typeof (window as any).IntersectionObserver === 'undefined') {\n inView = true;\n ref = null;\n }\n\n return { ref, inView, initialized: !!entry };\n}","import * as React from 'react';\n\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\n\nimport styles from './lazy-image.module.scss';\n\n/**\n * This value means we will load images 500px above\n * or below the viewport so that they are loaded\n * by the time they come into the viewport\n */\nconst PRELOAD_DISTANCE = '500px';\n/**\n * Atomically small blank GIF as placeholder for image src to prevent w3 validator error\n */\nconst PLACEHOLDER_SRC = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\n\ninterface LazyImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n forceLoad?: boolean;\n preventLoad?: boolean;\n extraClasses?: string;\n errorFallbackImageSrc?: string;\n errorFallbackImageClassName?: string;\n}\n\nexport const LazyImage = React.memo(function(props: LazyImageProps): React.ReactElement {\n const { forceLoad, extraClasses = '', errorFallbackImageSrc, preventLoad = false, errorFallbackImageClassName, src, alt, ...propsWithoutSrc } = props;\n \n const { ref, inView } = useLazyLoad({ rootMargin: PRELOAD_DISTANCE });\n const [ error, setError ] = React.useState(false);\n\n React.useEffect(() => {\n if ((!forceLoad && !inView) || preventLoad)\n return;\n \n // https://stackoverflow.com/questions/2342132/waiting-for-image-to-load-in-javascript\n const img = new Image();\n\n img.onerror = () => {\n setError(true);\n \n if (errorFallbackImageSrc)\n img.src = errorFallbackImageSrc;\n };\n\n img.src = src;\n return () => img.onerror = null;\n }, [ inView, preventLoad ]);\n\n function getSrc(): string {\n if (error && errorFallbackImageSrc)\n return errorFallbackImageSrc;\n\n return props.src;\n }\n\n if (error && !errorFallbackImageSrc)\n return <></>;\n\n if (!ref) {\n return (\n <img\n className={`${styles.image} ${extraClasses} ${error ? errorFallbackImageClassName || '' : ''}`}\n alt={alt}\n src={getSrc()}\n {...propsWithoutSrc}\n />\n );\n }\n\n const imgProps: React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement> = {\n alt,\n ...propsWithoutSrc,\n ...(((inView || forceLoad) && !preventLoad) ? { src: getSrc() } : { src: PLACEHOLDER_SRC })\n };\n\n if (!forceLoad)\n imgProps.ref = ref;\n\n return (\n <img className={`${styles.image} ${extraClasses} ${error ? errorFallbackImageClassName || '' : ''}`} {...imgProps} />\n );\n});","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { Image } from 'libs/shared/interfaces';\nimport { ImageHelper, ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './image.module.scss';\n\nfunction getImageClassName(props: BaseImageProps): string {\n let className = styles.image;\n\n let imageTypeClassName = '';\n\n if (props.imageType === ImageType.Thumbnails)\n imageTypeClassName = `thumbnail ${styles.thumbnail}`;\n\n if (props.imageType === ImageType.TallPosters)\n imageTypeClassName = styles.tallPoster;\n\n if (props.imageType === ImageType.Covers)\n imageTypeClassName = styles.cover;\n\n if (props.imageType === ImageType.Banners)\n imageTypeClassName = styles.banner;\n\n if (props.imageType === ImageType.Posters)\n imageTypeClassName = styles.poster;\n\n if (props.imageType === ImageType.Pdf)\n imageTypeClassName = styles.pdf;\n\n if (props.imageType === ImageType.Link)\n imageTypeClassName = styles.link;\n\n if (imageTypeClassName)\n className += ` ${imageTypeClassName}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n return className;\n}\n\ninterface BaseImageProps {\n data: Image | string;\n imageOptions?: ImageOptions;\n appLink?: Core.AppLink;\n imageType?: ImageType;\n className?: string;\n imageClassName?: string;\n imageStyle?: HashObject;\n preload?: boolean;\n preventLoad?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n errorFallbackImageSrc?: string;\n errorFallbackImageClassName?: string;\n alt?: string;\n preventFocus?: boolean;\n appLinkClassName?: string;\n onClick?: () => void;\n onLoad?: () => void;\n}\n\nexport function BaseImage(props: React.PropsWithChildren<BaseImageProps>): React.ReactElement {\n const {\n data,\n imageOptions,\n appLink,\n preload,\n preventLoad,\n analyticsOptions,\n analyticsData,\n imageClassName,\n alt\n } = props;\n\n let url = '';\n\n if (typeof data === 'string') {\n url = data;\n } else if (ObjectHelper.isObject(data)) {\n url = data.url;\n }\n\n const imageUrl = (url && imageOptions) ? ImageHelper.createUrl(url, imageOptions) : url;\n\n return (\n <div className={getImageClassName(props)} style={props.imageStyle}>\n <AppLink\n appLink={appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n onClick={props.onClick}\n preventFocus={props.preventFocus}\n className={props.appLinkClassName}\n >\n {props.children}\n {imageUrl && (\n <LazyImage\n src={imageUrl}\n alt={alt}\n forceLoad={preload}\n preventLoad={preventLoad}\n extraClasses={imageClassName}\n errorFallbackImageSrc={props.errorFallbackImageSrc}\n errorFallbackImageClassName={props.errorFallbackImageClassName}\n onLoad={props.onLoad}\n />\n )}\n </AppLink>\n </div>\n );\n}\n\n"],"names":["useLazyLoad","options","prevent","rootMargin","triggerOnce","ref","inView","entry","useInView","PRELOAD_DISTANCE","PLACEHOLDER_SRC","LazyImage","React.memo","props","forceLoad","extraClasses","errorFallbackImageSrc","preventLoad","errorFallbackImageClassName","src","alt","propsWithoutSrc","error","setError","React.useState","React.useEffect","img","getSrc","jsx","Fragment","styles","imgProps","getImageClassName","className","imageTypeClassName","ImageType","BaseImage","data","imageOptions","appLink","preload","analyticsOptions","analyticsData","imageClassName","url","ObjectHelper","imageUrl","ImageHelper","jsxs","AppLink"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as c,bD as s,v as y,e as T}from"./app-BqRx5tK8.js";import{a as D,H as Y,b as C}from"./Dp_vnjo0.chunk.js";import{m as _,u as x}from"./BMba67Uf.chunk.js";const A="_chartContainer_aj1wj_1",j="_heading_aj1wj_4",H="_partialHeading_aj1wj_9",u={chartContainer:A,heading:j,partialHeading:H};function v(){return c.jsx("div",{className:`partial-loading-background mb-2 ${u.partialHeading}`})}const p=45,m={MONTH:35,YEAR:365},g={day:"YYYY-MM-DD",month:"YYYY-MM",year:"YYYY"},O={day:"D MMM",month:"MMM",year:"YYYY"},M={enabled:!0,align:"right",verticalAlign:"top",floating:!0,y:-p},b={title:{text:null},credits:{enabled:!1},yAxis:{title:{text:null},min:0,minRange:10,minPadding:0,maxPadding:.02,endOnTick:!1},chart:{backgroundColor:"transparent",spacing:[p,0,0,4]},plotOptions:{series:{stacking:"normal"}}};function N(a){const t=s.diffBetween(a.end,a.start,"day");return t>m.YEAR?"year":t>m.MONTH?"month":"day"}function R(a,t){const r=[];let n=s.format(a.start,g[t]);do r.push(n),n=s.format(s.add(n,1,t),g[t]);while(!s.isAfter(n,a.end,t));return r}function P(a,t,r){const n=N(r),l=R(r,n),i={};a.forEach(e=>{if(!e.userType)return;const o=s.format(s.convertUTCToLocal(t(e)),g[n]);i[e.userType]=i[e.userType]??{},i[e.userType][o]=i[e.userType][o]??0,i[e.userType][o]+=e.count});const d=Object.keys(i),f=d.length?y.sortBy(d.map(e=>({name:D(e),type:"column",data:l.map(o=>i[e][o]??0)})),"name"):[{type:"column",data:l.map(()=>0)}],h={...M};return d.length||(h.enabled=!1),{categories:l.map(e=>s.format(e,O[n])),legendOptions:h,seriesData:_(f)}}function E(a,t,r){const n=P(a,t,r);return{...b,xAxis:{categories:n.categories},legend:n.legendOptions,series:n.seriesData}}function G(a){const t=T();return x(),c.jsxs("div",{className:"position-relative h-100",children:[c.jsx("h3",{className:`h6 ${u.heading}`,children:a.title}),!!t&&c.jsx(Y,{highcharts:C,options:E(a.events,a.getEventDate,t),containerProps:{className:`${u.chartContainer} position-absolute w-100 h-100`}})]})}export{v as P,G as U};
2
+ //# sourceMappingURL=DAocQXXC.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DAocQXXC.chunk.js","sources":["../../src/shared/components/user-activity-bar-chart/PartialUserActivityBarChart.tsx","../../src/shared/components/user-activity-bar-chart/UserActivityBarChartConstants.ts","../../src/shared/components/user-activity-bar-chart/UserActivityBarChartUtils.ts","../../src/shared/components/user-activity-bar-chart/UserActivityBarChart.tsx"],"sourcesContent":["import React from 'react';\n\nimport styles from './user-activity-bar-chart.module.scss';\n\nexport function PartialUserActivityBarChart(): JSX.Element {\n return (\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n );\n}","import Highcharts from 'highcharts';\n\nconst CHART_PADDING_TOP = 45;\n\nexport const GroupByThresholds = {\n MONTH: 35,\n YEAR: 365\n};\n\nexport const DateFormats = {\n day: 'YYYY-MM-DD',\n month: 'YYYY-MM',\n year: 'YYYY'\n};\n\nexport const DisplayFormats = {\n day: 'D MMM',\n month: 'MMM',\n year: 'YYYY'\n};\n\nexport const DEFAULT_LEGEND_OPTIONS: Highcharts.LegendOptions = {\n enabled: true,\n align: 'right',\n verticalAlign: 'top',\n floating: true,\n y: -CHART_PADDING_TOP\n};\n\nexport const STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n yAxis: {\n title: {\n text: null\n },\n min: 0,\n minRange: 10,\n minPadding: 0,\n maxPadding: 0.02,\n endOnTick: false\n },\n chart: {\n backgroundColor: 'transparent',\n spacing: [ CHART_PADDING_TOP, 0, 0, 4 ]\n },\n plotOptions: {\n series: {\n stacking: 'normal'\n }\n }\n};","import Highcharts from 'highcharts';\n\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { BaseAnalyticsEvent } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { mixinSeriesColours } from 'libs/shared/apps/analytics/utils/ChartColourUtils';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nimport { mapUserTypeToChartLabel } from 'shared/utils/UserUtils';\n\nimport { DateFormats, DEFAULT_LEGEND_OPTIONS, DisplayFormats, GroupByThresholds, STATIC_CHART_OPTIONS } from './UserActivityBarChartConstants';\n\ntype GroupBy = 'day' | 'month' | 'year';\n\ninterface ChartData {\n categories: string[];\n legendOptions: Highcharts.LegendOptions;\n seriesData: Highcharts.SeriesColumnOptions[];\n}\n\nfunction getGroupBy(requestFilter: AnalyticsRequestFilter): GroupBy {\n const range = DateHelper.diffBetween(requestFilter.end, requestFilter.start, 'day');\n\n if (range > GroupByThresholds.YEAR)\n return 'year';\n\n if (range > GroupByThresholds.MONTH)\n return 'month';\n\n return 'day';\n}\n\nfunction getFullDateRange(requestFilter: AnalyticsRequestFilter, groupBy: GroupBy): string[] {\n const range: string[] = [];\n\n let currentDate = DateHelper.format(requestFilter.start, DateFormats[groupBy]);\n\n do {\n range.push(currentDate);\n currentDate = DateHelper.format(DateHelper.add(currentDate, 1, groupBy), DateFormats[groupBy]);\n } while (!DateHelper.isAfter(currentDate, requestFilter.end, groupBy));\n\n return range;\n}\n\nfunction getChartData<T extends BaseAnalyticsEvent>(\n events: T[],\n getEventDate: (ev: T) => string,\n requestFilter: AnalyticsRequestFilter\n): ChartData {\n const groupBy = getGroupBy(requestFilter);\n const fullDateRange = getFullDateRange(requestFilter, groupBy);\n\n /**\n * e.g. { 'staff': { '2021-01-01': 2, '2021-01-02': 4 }, 'learner': { '2021-01-01': 10, '2021-01-04': 40 }}\n */\n const grouped: HashObject<HashObject<number>> = {};\n\n events.forEach(ev => {\n if (!ev.userType)\n return;\n\n const eventDate = DateHelper.format(DateHelper.convertUTCToLocal(getEventDate(ev)), DateFormats[groupBy]);\n\n grouped[ev.userType] = grouped[ev.userType] ?? {};\n grouped[ev.userType][eventDate] = grouped[ev.userType][eventDate] ?? 0;\n grouped[ev.userType][eventDate] += ev.count;\n });\n\n const roles = Object.keys(grouped) as UserGroup[];\n\n const seriesData: Highcharts.SeriesColumnOptions[] = roles.length\n ? ArrayHelper.sortBy(roles.map(r => ({\n name: mapUserTypeToChartLabel(r),\n type: 'column',\n data: fullDateRange.map(d => grouped[r][d] ?? 0)\n })), 'name')\n : [{\n type: 'column',\n data: fullDateRange.map(() => 0)\n }];\n\n const legendOptions = { ...DEFAULT_LEGEND_OPTIONS };\n\n if (!roles.length)\n legendOptions.enabled = false;\n\n return {\n categories: fullDateRange.map(d => DateHelper.format(d, DisplayFormats[groupBy])),\n legendOptions,\n seriesData: mixinSeriesColours(seriesData)\n };\n}\n\nexport function getChartOptions<T extends BaseAnalyticsEvent>(\n events: T[],\n getEventDate: (ev: T) => string,\n requestFilter: AnalyticsRequestFilter\n): Highcharts.Options {\n const data = getChartData(events, getEventDate, requestFilter);\n\n return {\n ...STATIC_CHART_OPTIONS,\n xAxis: {\n categories: data.categories\n },\n legend: data.legendOptions,\n series: data.seriesData\n };\n}","import React from 'react';\nimport Highcharts from 'highcharts';\nimport HighchartsReact from 'highcharts-react-official';\n\nimport { BaseAnalyticsEvent } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\n\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\nimport { useListenToNavState } from 'shared/hooks/UseListenToNavState';\n\nimport { getChartOptions } from './UserActivityBarChartUtils';\n\nimport styles from './user-activity-bar-chart.module.scss';\n\ninterface UserActivityBarChartProps<T extends BaseAnalyticsEvent> {\n events: T[];\n getEventDate: (ev: T) => string;\n title: string;\n}\n\nexport function UserActivityBarChart<T extends BaseAnalyticsEvent>(props: UserActivityBarChartProps<T>): JSX.Element {\n const requestFilter = useGetRequestFilter();\n useListenToNavState();\n\n return (\n <div className='position-relative h-100'>\n <h3 className={`h6 ${styles.heading}`}>{props.title}</h3>\n {!!requestFilter &&\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions(props.events, props.getEventDate, requestFilter)}\n containerProps={{\n className: `${styles.chartContainer} position-absolute w-100 h-100`\n }}\n />\n }\n </div>\n );\n}"],"names":["PartialUserActivityBarChart","styles","CHART_PADDING_TOP","GroupByThresholds","DateFormats","DisplayFormats","DEFAULT_LEGEND_OPTIONS","STATIC_CHART_OPTIONS","getGroupBy","requestFilter","range","DateHelper","getFullDateRange","groupBy","currentDate","getChartData","events","getEventDate","fullDateRange","grouped","ev","eventDate","roles","seriesData","ArrayHelper","r","mapUserTypeToChartLabel","d","legendOptions","mixinSeriesColours","getChartOptions","data","UserActivityBarChart","props","useGetRequestFilter","useListenToNavState","jsxs","jsx","HighchartsReact","Highcharts"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{v as c,j as n,w as i,x as a,F as l}from"./app-BqRx5tK8.js";function x(t){let s=t.buttons.map(e=>{const o=()=>{e.success?l.isFunction(t.onDone)&&t.onDone():l.isFunction(t.onFail)&&t.onFail(),t.closePopup()};return{buttonText:e.text,className:e.className,onClick:o,type:e.type,close:e.close}});return s=c.sortBy(s,"close"),n.jsxs(i,{title:t.title,closePopup:t.closePopup,children:[n.jsx("p",{dangerouslySetInnerHTML:{__html:a.sanitize(t.text)}}),n.jsx("div",{className:"d-flex justify-content-end border-top pt-3 px-3 mx-n3",children:s.map((e,o)=>n.jsx("button",{className:e.className,onClick:e.onClick,type:e.type,children:e.buttonText},o))})]})}export{x as DialogView};
2
+ //# sourceMappingURL=DD-2boW1.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DD-2boW1.chunk.js","sources":["../../../../libs/shared/src/views/dialog/DialogView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { DialogOptions, PopupViewProps } from 'libs/shared/interfaces';\n\ninterface DialogViewProps extends DialogOptions {\n onDone?: () => void;\n onFail?: () => void;\n}\n\ntype PropTypes = React.PropsWithChildren<DialogViewProps & PopupViewProps>;\n\nexport function DialogView(props: PropTypes): React.ReactElement {\n let buttons = props.buttons.map(b => {\n const onClick = () => {\n if (b.success)\n FunctionHelper.isFunction(props.onDone) && props.onDone();\n else\n FunctionHelper.isFunction(props.onFail) && props.onFail();\n\n props.closePopup();\n };\n\n return {\n buttonText: b.text,\n className: b.className,\n onClick,\n type: b.type,\n close: b.close\n };\n });\n\n /**\n * The dismiss action should always be on the left side of the popup\n */\n buttons = ArrayHelper.sortBy(buttons, 'close');\n\n return (\n <Popup title={props.title} closePopup={props.closePopup}>\n <p dangerouslySetInnerHTML={{ __html: TextHelper.sanitize(props.text) }} />\n <div className='d-flex justify-content-end border-top pt-3 px-3 mx-n3'>\n {buttons.map((b, idx) => (\n <button key={idx} className={b.className} onClick={b.onClick} type={b.type}>\n {b.buttonText}\n </button>\n ))}\n </div>\n </Popup>\n );\n}"],"names":["DialogView","props","buttons","b","onClick","FunctionHelper","ArrayHelper","Popup","jsx","TextHelper","idx"],"mappings":"kEAgBO,SAASA,EAAWC,EAAsC,CAC/D,IAAIC,EAAUD,EAAM,QAAQ,IAAIE,GAAK,CACnC,MAAMC,EAAU,IAAM,CAChBD,EAAE,QACJE,EAAe,WAAWJ,EAAM,MAAM,GAAKA,EAAM,OAAA,EAEjDI,EAAe,WAAWJ,EAAM,MAAM,GAAKA,EAAM,OAAA,EAEnDA,EAAM,WAAA,CACR,EAEA,MAAO,CACL,WAAYE,EAAE,KACd,UAAWA,EAAE,UACb,QAAAC,EACA,KAAMD,EAAE,KACR,MAAOA,EAAE,KAAA,CAEb,CAAC,EAKD,OAAAD,EAAUI,EAAY,OAAOJ,EAAS,OAAO,SAG1CK,EAAA,CAAM,MAAON,EAAM,MAAO,WAAYA,EAAM,WAC3C,SAAA,CAAAO,EAAAA,IAAC,IAAA,CAAE,wBAAyB,CAAE,OAAQC,EAAW,SAASR,EAAM,IAAI,CAAA,EAAK,EACzEO,EAAAA,IAAC,MAAA,CAAI,UAAU,wDACZ,SAAAN,EAAQ,IAAI,CAACC,EAAGO,IACfF,EAAAA,IAAC,SAAA,CAAiB,UAAWL,EAAE,UAAW,QAASA,EAAE,QAAS,KAAMA,EAAE,KACnE,SAAAA,EAAE,UAAA,EADQO,CAEb,CACD,CAAA,CACH,CAAA,EACF,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as c,p as _}from"./app-BqRx5tK8.js";import{S as u}from"./5O9SdVRZ.chunk.js";const d="_circleContainer_1g8w5_1",f="_backgroundCircle_1g8w5_17",m="_circleSuccess_1g8w5_20",x="_circleWarning_1g8w5_23",b="_circleDanger_1g8w5_26",h="_lgCircleContainer_1g8w5_29",T="_xsCircleContainer_1g8w5_40",y="_pendingCircle_1g8w5_48",S="_centredPercentageText_1g8w5_58",t={circleContainer:d,backgroundCircle:f,circleSuccess:m,circleWarning:x,circleDanger:b,lgCircleContainer:h,xsCircleContainer:T,pendingCircle:y,centredPercentageText:S},o=2,D=5.8,j=.2,w=.36;var s=(e=>(e.Small="small",e.Large="large",e.ExtraSmall="extraSmall",e))(s||{});const E={extraSmall:{size:o},small:{size:o},large:{size:D}};function g(e){const n=E[e].size,r=e==="large"?w:j;return`${n/2-r*2}rem`}function N(e,n=u){return e>=n.HIGH?t.circleSuccess:e>=n.MODERATE?t.circleWarning:t.circleDanger}function R(e,n=u){return e>=n.HIGH?"text-success":e>=n.MODERATE?"text-warning":"text-danger"}function I(e,n){let r=`d-inline-block ${t.circleContainer}`;return e==="large"&&(r+=` ${t.lgCircleContainer}`),e==="extraSmall"&&(r+=` ${t.xsCircleContainer}`),i(n)&&(r+=` ${t.pendingCircle}`),r}function L(e){if(!i(e))return+e.toFixed(2)}function k(e){return i(e)?"--%":`${Math.round(e*100)}%`}function i(e){return typeof e!="number"}function W(e){const n=_.useCallback(r=>{if(!r)return;const l=r.r.baseVal.value,a=2*Math.PI*l,C=a-e.percentage*a;r.style.strokeDasharray=`${a} ${a}`,r.style.strokeDashoffset=C.toString()},[e.percentage]);return c.jsxs("svg",{children:[c.jsx("circle",{r:g(e.size),className:t.backgroundCircle}),!i(e.percentage)&&c.jsx("circle",{ref:n,r:g(e.size),className:N(e.percentage,e.scoreThresholds)})]})}var $=(e=>(e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside",e))($||{});H.defaultProps={layout:"circle_only"};function H(e){const n=L(e.percentage),r=e.size||(e.layout==="label_inside"?s.Large:s.Small),l=e.customLabel||k(n);return e.layout==="label_only"?c.jsx("span",{className:R(n),children:l}):c.jsxs("div",{className:`d-flex align-items-center justify-content-between ${e.className??""}`,children:[e.layout==="label_before"&&c.jsx("span",{className:"me-2",children:l}),c.jsxs("div",{className:I(r,n),children:[c.jsx(W,{percentage:n,size:r,scoreThresholds:e.scoreThresholds}),e.layout==="label_inside"&&c.jsx("span",{className:t.centredPercentageText,children:l})]})]})}export{H as P,$ as a,L as b,k as g};
2
+ //# sourceMappingURL=DFhb3ZfO.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DFhb3ZfO.chunk.js","sources":["../../../../libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","../../../../libs/shared/src/components/percentage-indicator/PercentageIndicator.tsx"],"sourcesContent":["import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.module.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.module.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n\n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}"],"names":["CIRCLE_WIDTH","CIRCLE_WIDTH_LG","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSize","ProgressCircleSizeMap","getCircleRadius","size","width","strokeWidth","getCircleClassName","percentage","scoreThresholds","ScoreThresholdDefaults","styles","getColouredLabelClassName","getCircleContainerClassName","className","isPending","getPercentageToFixed","getFormattedPercentage","ProgressCircle","props","ref","React","circle","radius","circumference","offset","jsx","PercentageIndicatorLayout","PercentageIndicator","percentageToFixed","label"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import{j as t,p as m,c0 as j,L as C,c1 as S,h as p,a4 as M,aa as $,c as b,V as v,v as g}from"./app-BqRx5tK8.js";import{P as x}from"./YDhSgJI6.chunk.js";import{a as R}from"./DU5sOcpt.chunk.js";import{b as H,I as L,e as k,f as u,g as T,a as A}from"./cRQEJA0-.chunk.js";import{P as N,a as y}from"./DFhb3ZfO.chunk.js";import{D as E}from"./BrLXFCMV.chunk.js";import{b as O,I as D}from"./ClcYw2ra.chunk.js";const P="_container_18up8_1",U="_interaction_18up8_6",w={container:P,interaction:U};function F(e,n){return e.interactions.find(i=>i.id===n.id)||e.interactions[0]}function K(e){return e.duration?t.jsx(t.Fragment,{children:e.interactive.timepoints.map((n,i)=>{if(!n.interactions.length)return t.jsx(t.Fragment,{});const r=F(n,e.selectedInteraction),c=r.id===e.selectedInteraction.id,s=c?O.getTypeInfo(r.typeId).bgClassName:"bg-gray-500",a=n.visibleAt/1e3/e.duration*100;return t.jsxs("div",{className:`${w.container} text-center`,style:{left:`${a}%`},children:[t.jsx("div",{className:`${w.interaction} ${s}`}),!!c&&t.jsx("div",{children:E.ToDisplayDuration(n.visibleAt)})]},i)})}):t.jsx(t.Fragment,{})}const V="_bar_1r368_1",q={bar:V},G="shared.interactionResultsSummary",f=C.encloseNamespace(G);function W(e){return e._parentClip?e._parentClip.endTime-e._parentClip.startTime:e._parentVideo.duration?e._parentVideo.duration/1e3:0}function Y(e){const n=m.useMemo(()=>H(e.interaction,e.results),[e.interaction,e.results]);return t.jsxs("div",{className:"px-1 pt-1",children:[t.jsx("div",{className:"d-flex",children:t.jsx(D,{interaction:e.interaction,iconClassName:"flex-shrink-0"})}),t.jsx("div",{className:`my-4 ${q.bar}`,children:t.jsx(K,{interactive:e.interactive,duration:W(e.interactiveMetadata),selectedInteraction:e.interaction})}),t.jsxs("div",{className:"row pt-1 pb-2",children:[t.jsx("div",{className:"col-6 pe-1",children:t.jsxs("div",{className:"bg-light rounded p-2 h-100",children:[!n.awaitingMarking&&t.jsxs("div",{className:"d-flex align-items-center justify-content-between",children:[t.jsx("strong",{children:f("correctlyAnswered")}),t.jsx(N,{percentage:n.percentCorrect,layout:y.LabelOnly})]}),!!n.awaitingMarking&&t.jsx("div",{className:"d-flex align-items-center justify-content-center",children:t.jsx("strong",{children:t.jsx("em",{children:f("pending")})})})]})}),t.jsx("div",{className:"col-6 ps-1",children:t.jsxs("div",{className:"bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between",children:[t.jsx("strong",{children:f("unanswered")}),t.jsx("span",{children:n.unanswered})]})})]})]})}const z=m.forwardRef(({interaction:e,interactive:n,interactiveMetadata:i,results:r,...c},s)=>t.jsx("div",{className:"popover-lg",children:t.jsx(j,{id:`interaction-results-summary-${e.id}`,ref:s,...c,children:t.jsx(j.Body,{children:t.jsx(Y,{interaction:e,interactive:n,interactiveMetadata:i,results:r})})})})),J="_header_2be6f_1",Q="_row_2be6f_4",X="_fixedTable_2be6f_7",Z="_interactionHeaderCellOuter_2be6f_26",B="_hasResults_2be6f_29",ee="_interactionHeaderCellInner_2be6f_36",te="_resultsCellOuter_2be6f_40",ne="_correct_2be6f_56",re="_incorrect_2be6f_70",se="_awaitingMarking_2be6f_80",ie="_unanswered_2be6f_90",ae="_highlightColumn_2be6f_100",ce="_resultsCellInner_2be6f_110",le="_highlightResultsRow_2be6f_121",oe="_resultsRow_2be6f_137",l={header:J,row:Q,fixedTable:X,interactionHeaderCellOuter:Z,hasResults:B,interactionHeaderCellInner:ee,resultsCellOuter:te,correct:ne,incorrect:re,awaitingMarking:se,unanswered:ie,highlightColumn:ae,resultsCellInner:ce,highlightResultsRow:le,resultsRow:oe};function ue(e){var n;return t.jsx(S,{trigger:(n=e.results.students)!=null&&n.length?"click":null,placement:"bottom",overlay:t.jsx(z,{interaction:e.interaction,interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results}),rootClose:!0,children:t.jsx("div",{className:`text-center h-100
2
+ d-flex align-items-center justify-content-center
3
+ ${l.interactionHeaderCellInner}`,onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,children:t.jsx("div",{className:"p-1 position-relative",children:e.interactionNumber})})})}function de(e){return t.jsx("svg",{...e,children:t.jsx("path",{fillRule:"evenodd",d:"M7 11h10c.554 0 1 .446 1 1s-.446 1-1 1H7c-.554 0-1-.446-1-1s.446-1 1-1",fill:"currentColor"})})}function me(e){if(e===u.Correct)return M;if(e===u.Incorrect)return $;if(e===u.UnAnswered)return de}function he(e){let n=`${l.resultsCellInner} h-100 position-relative`;return e===u.Correct&&(n+=` ${l.correct} text-success`),e===u.Incorrect&&(n+=` ${l.incorrect} text-danger`),e===u.AwaitingMarking&&(n+=` ${l.awaitingMarking}`),e===u.UnAnswered&&(n+=` ${l.unanswered} text-warning`),n}function ge(e){const n=L.isInteractionCorrect(e.interaction,k(e.studentResults)),i=me(n);return t.jsxs("div",{className:he(n),children:[!!i&&t.jsx(p,{svg:i}),n===u.AwaitingMarking&&t.jsx(x,{})]})}const fe="interactives.studentResultsTable",_=C.encloseNamespace(fe),xe=60;function d(e){return t.jsx("div",{className:`d-flex align-items-center p-2 h-100 ${e.className??""}`,children:e.children})}function h(e){return t.jsx(d,{className:e.column.isSorted&&"fw-bold",children:_(e.phraseKey)})}function ye(e){var r;const[n]=b(v.ANONYMISE_USERS),i=!!((r=e.students)!=null&&r.length);return m.useMemo(()=>[{Header:({column:s})=>t.jsx(h,{column:s,phraseKey:"name"}),accessor:"user",Cell:({value:s})=>t.jsx(d,{children:t.jsx("span",{className:"text-truncate",children:R(s,n)})}),disableSortBy:!i},{Header:({column:s})=>t.jsx(h,{column:s,phraseKey:"unanswered"}),accessor:"summary.unanswered",sortType:"basic",sortDescFirst:!0,disableSortBy:!i,Cell:({value:s})=>t.jsx(d,{children:s})},{Header:({column:s})=>t.jsx(h,{column:s,phraseKey:"score"}),accessor:"summary",id:"score",Cell:({value:s})=>s.awaitingMarking?t.jsx(d,{children:t.jsx(x,{title:_("markingRequired"),className:"flex-grow-1",showLabel:!0})}):t.jsx(d,{children:`${s.correct}/${s.answered+s.unanswered}`}),width:125,sortDescFirst:!0,disableSortBy:!i},{Header:({column:s})=>t.jsx(h,{column:s,phraseKey:"percentage"}),accessor:"summary",id:"percentage",Cell:({value:s})=>s.awaitingMarking?t.jsx(d,{children:t.jsx(x,{title:_("markingRequired"),className:"flex-grow-1",showLabel:!0})}):t.jsx(d,{children:t.jsx(N,{percentage:s.percentCorrect,layout:y.LabelBefore,className:"flex-grow-1"})}),width:125,sortDescFirst:!0,disableSortBy:!i}],[n,i])}function Ie(e,n,i,r,c){return m.useMemo(()=>A(e).map((a,o)=>({Header:()=>t.jsx(ue,{interaction:a,results:i,interactive:e,interactiveMetadata:n,interactionNumber:o+1,onMouseEnter:()=>r(o),onMouseLeave:()=>r(null)}),accessor:"results",id:a.id,disableSortBy:!0,width:xe,Cell:({row:{original:I}})=>t.jsx(ge,{interaction:a,studentResults:I})})),[c])}function Se(e,n,i,r){const[c]=b(v.ANONYMISE_USERS);return m.useMemo(()=>{const s=[];if(n.students.forEach(a=>{s.push({...a,summary:T(e,a)})}),(r==null?void 0:r.id)==="user"){const a=g.sortBy(s,o=>R(o.user,c));return r.desc?a.reverse():a}if((r==null?void 0:r.id)==="summary.unanswered"){const a=g.sortBy(s,o=>o.summary.unanswered);return r.desc?a.reverse():a}if((r==null?void 0:r.id)==="score"||(r==null?void 0:r.id)==="percentage"){const a=g.sortBy(s,o=>o.summary.awaitingMarking?-1:o.summary.percentCorrect);return r.desc?a.reverse():a}return s},[i,r,c])}function pe(e,n){if(!e)return;const i=e.querySelectorAll(`.${l.resultsRow}`);i==null||i.forEach(r=>{r.childNodes.forEach((c,s)=>{c.classList.remove(l.highlightColumn),s===n&&c.classList.add(l.highlightColumn)})})}function Me(e,n){if(!e)return;const i=e.querySelectorAll(`.${l.resultsRow}`);i==null||i.forEach((r,c)=>{r.classList.remove(l.highlightResultsRow),c===n&&r.classList.add(l.highlightResultsRow)})}export{xe as R,Ie as a,Se as b,Me as c,pe as h,l as s,ye as u};
4
+ //# sourceMappingURL=DFp9UBZB.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DFp9UBZB.chunk.js","sources":["../../../../libs/shared/src/apps/analytics/components/student-results/interactions-bar/InteractionsBar.tsx","../../../../libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary.tsx","../../src/apps/interactives/views/interactive-student-results-list/components/student-results-table/InteractionHeaderCell.tsx","../../../../libs/shared/src/images/svg/actions/MinusSvg.tsx","../../src/apps/interactives/views/interactive-student-results-list/components/student-results-table/StudentResultCell.tsx","../../src/apps/interactives/views/interactive-student-results-list/components/student-results-table/StudentResultsTableUtils.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Interaction, Interactive, Timepoint } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { InteractionTypeHelper } from 'libs/shared/utils/interaction-type-helper/InteractionTypeHelper';\n\nimport styles from './interactions-bar.module.scss';\n\nfunction getInteraction(timepoint: Timepoint, selectedInteraction: Interaction): Interaction {\n return timepoint.interactions.find(i => i.id === selectedInteraction.id) || timepoint.interactions[0];\n}\n\ninterface InteractionBarProps {\n interactive: Interactive;\n duration: number;\n selectedInteraction: Interaction;\n}\n\nexport function InteractionsBar(props: InteractionBarProps): React.ReactElement {\n if (!props.duration)\n return <></>;\n\n return (\n <>\n {props.interactive.timepoints.map((t, i) => {\n if (!t.interactions.length)\n return <></>;\n\n const interaction = getInteraction(t, props.selectedInteraction);\n const isSelected = interaction.id === props.selectedInteraction.id;\n\n const bgClassName = isSelected ? (InteractionTypeHelper.getTypeInfo(interaction.typeId)).bgClassName : 'bg-gray-500';\n\n const left = ((t.visibleAt / 1000) / props.duration) * 100;\n\n return (\n <div\n key={i}\n className={`${styles.container} text-center`}\n style={{ left: `${left}%` }}\n >\n <div className={`${styles.interaction} ${bgClassName}`} />\n {!!isSelected &&\n <div>\n {DurationHelper.ToDisplayDuration(t.visibleAt)}\n </div>\n }\n </div>\n );\n })}\n </>\n );\n}","import React from 'react';\nimport { Popover } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionsBar } from 'libs/shared/apps/analytics/components/student-results/interactions-bar/InteractionsBar';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './interaction-results-summary.module.scss';\n\nconst namespace = 'shared.interactionResultsSummary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDuration(interactiveMetadata: InteractiveMetadata): number {\n if (interactiveMetadata._parentClip)\n return interactiveMetadata._parentClip.endTime - interactiveMetadata._parentClip.startTime;\n\n if (!interactiveMetadata._parentVideo.duration)\n return 0;\n\n return interactiveMetadata._parentVideo.duration / 1000;\n}\n\ninterface InteractionResultsSummaryProps {\n interaction: Interaction;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n}\n\nfunction InteractionResultsSummary(props: InteractionResultsSummaryProps): JSX.Element {\n const summary = React.useMemo(\n () => getInteractionResultsSummary(props.interaction, props.results),\n [ props.interaction, props.results ]\n );\n\n return (\n <div className='px-1 pt-1'>\n <div className='d-flex'>\n <InteractionLabel\n interaction={props.interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n <div className={`my-4 ${styles.bar}`}>\n <InteractionsBar\n interactive={props.interactive}\n duration={getDuration(props.interactiveMetadata)}\n selectedInteraction={props.interaction}\n />\n </div>\n <div className='row pt-1 pb-2'>\n <div className='col-6 pe-1'>\n <div className='bg-light rounded p-2 h-100'>\n {!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('correctlyAnswered')}</strong>\n <PercentageIndicator\n percentage={summary.percentCorrect}\n layout={PercentageIndicatorLayout.LabelOnly}\n />\n </div>\n }\n {!!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-center'>\n <strong>\n <em>{getPhrase('pending')}</em>\n </strong>\n </div>\n }\n </div>\n </div>\n <div className='col-6 ps-1'>\n <div className='bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('unanswered')}</strong>\n <span>{summary.unanswered}</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nconst InteractionResultsSummaryPopover = React.forwardRef((\n { interaction, interactive, interactiveMetadata, results, ...popoverProps }: InteractionResultsSummaryProps,\n ref: React.MutableRefObject<HTMLElement>\n) => {\n return (\n <div className='popover-lg'>\n <Popover\n id={`interaction-results-summary-${interaction.id}`}\n ref={ref as any}\n {...popoverProps}\n >\n <Popover.Body>\n <InteractionResultsSummary\n interaction={interaction}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n results={results}\n />\n </Popover.Body>\n </Popover>\n </div>\n );\n});\n\nexport { InteractionResultsSummaryPopover as InteractionResultsSummary };","import React from 'react';\nimport { OverlayTrigger } from 'react-bootstrap';\n\nimport {\n InteractionResultsSummary\n} from 'libs/shared/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './student-results-table.module.scss';\n\ninterface InteractionHeaderCellProps {\n interaction: Interaction;\n results: InteractiveResultSet;\n interactionNumber: number;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nexport function InteractionHeaderCell(props: InteractionHeaderCellProps): JSX.Element {\n return (\n <OverlayTrigger\n trigger={props.results.students?.length ? 'click' : null}\n placement='bottom'\n overlay={\n <InteractionResultsSummary\n interaction={props.interaction}\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n />\n }\n rootClose\n >\n <div\n className={\n `text-center h-100\n d-flex align-items-center justify-content-center\n ${styles.interactionHeaderCellInner}`\n }\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n >\n <div className='p-1 position-relative'>\n {props.interactionNumber}\n </div>\n </div>\n </OverlayTrigger>\n );\n}","import React from 'react';\n\nexport function MinusSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M7 11h10c.554 0 1 .446 1 1s-.446 1-1 1H7c-.554 0-1-.446-1-1s.446-1 1-1'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\nimport { MinusSvg } from 'libs/shared/images/svg/actions/MinusSvg';\nimport { CheckSvg } from 'libs/shared/images/svg/status/CheckSvg';\nimport { Interaction, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport styles from './student-results-table.module.scss';\n\nfunction getSvg(correctness: InteractionCorrectness) {\n if (correctness === InteractionCorrectness.Correct)\n return CheckSvg;\n\n if (correctness === InteractionCorrectness.Incorrect)\n return CloseSvg;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n return MinusSvg;\n}\n\nfunction getClassName(correctness: InteractionCorrectness): string {\n let className = `${styles.resultsCellInner} h-100 position-relative`;\n\n if (correctness === InteractionCorrectness.Correct)\n className += ` ${styles.correct} text-success`;\n\n if (correctness === InteractionCorrectness.Incorrect)\n className += ` ${styles.incorrect} text-danger`;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n className += ` ${styles.awaitingMarking}`;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n className += ` ${styles.unanswered} text-warning`;\n\n return className;\n}\n\ninterface StudentResultCellProps {\n interaction: Interaction;\n studentResults: StudentResults;\n}\n\nexport function StudentResultCell(props: StudentResultCellProps): JSX.Element {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n props.interaction,\n getStudentResult(props.studentResults)\n );\n\n const svg = getSvg(correctness);\n\n return (\n <div className={getClassName(correctness)}>\n {!!svg && <SvgContainer svg={svg} />}\n {correctness === InteractionCorrectness.AwaitingMarking &&\n <PendingIndicator />\n }\n </div>\n );\n}","import React from 'react';\nimport { CellProps, Column, ColumnInstance, SortingRule } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nimport { ViewModelKeys } from 'shared/constants/ReportsViewModels';\n\nimport { InteractionHeaderCell } from './InteractionHeaderCell';\nimport { StudentResultCell } from './StudentResultCell';\n\nimport styles from './student-results-table.module.scss';\n\nconst namespace = 'interactives.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const RESULTS_COL_WIDTH = 60;\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`d-flex align-items-center p-2 h-100 ${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<StudentResultsWithSummary>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={props.column.isSorted && 'fw-bold'}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport function useGetFixedColumns(results: InteractiveResultSet): Column<StudentResultsWithSummary>[] {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n const hasResults = !!results.students?.length;\n\n return React.useMemo(() => {\n const cols: Column<StudentResultsWithSummary>[] = [\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: 'user',\n Cell: ({ value }) => (\n <CellWrapper>\n <span className='text-truncate'>{anonymiseUserName(value, anonymiseUsers)}</span>\n </CellWrapper>\n ),\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='unanswered' />,\n accessor: 'summary.unanswered' as keyof StudentResultsWithSummary,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\n sortDescFirst: true,\n disableSortBy: !hasResults,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, any>) => <CellWrapper>{value}</CellWrapper>\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='score' />,\n accessor: 'summary',\n id: 'score',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n {`${value.correct}/${value.answered + value.unanswered}`}\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='percentage' />,\n accessor: 'summary',\n id: 'percentage',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n <PercentageIndicator\n percentage={value.percentCorrect}\n layout={PercentageIndicatorLayout.LabelBefore}\n className='flex-grow-1'\n />\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n }\n ];\n\n return cols;\n }, [ anonymiseUsers, hasResults ]);\n}\n\n/**\n * Returns memoized table columns. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultColumns(\n interactive: Interactive,\n interactiveMetadata: InteractiveMetadata,\n results: InteractiveResultSet,\n onColumnHover: (index?: number) => void,\n refreshData: boolean\n): Column<StudentResultsWithSummary>[] {\n return React.useMemo(() => {\n const interactions = getInteractions(interactive);\n\n return interactions.map((interaction, index) => {\n const col: Column<StudentResultsWithSummary> = {\n Header: () => {\n return (\n <InteractionHeaderCell\n interaction={interaction}\n results={results}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n interactionNumber={index + 1}\n onMouseEnter={() => onColumnHover(index)}\n onMouseLeave={() => onColumnHover(null)}\n />\n );\n },\n accessor: 'results',\n /**\n * `onSelectStudentResponse` in `StudentResultsTable` expects the column id to the interaction id\n */\n id: interaction.id,\n disableSortBy: true,\n width: RESULTS_COL_WIDTH,\n Cell: ({ row: { original: studentResults } }) => (\n <StudentResultCell interaction={interaction} studentResults={studentResults} />\n )\n };\n return col;\n });\n }, [refreshData]);\n}\n\n/**\n * Returns memoized table data. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultsTableData(\n interactive: Interactive,\n results: InteractiveResultSet,\n refreshData: boolean,\n sortBy?: SortingRule<StudentResultsWithSummary>\n): StudentResultsWithSummary[] {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n\n return React.useMemo(() => {\n const students: StudentResultsWithSummary[] = [];\n\n results.students.forEach(s => {\n students.push(({ ...s, summary: getStudentResultsSummary(interactive, s) }));\n });\n\n if (sortBy?.id === 'user') {\n const sorted = ArrayHelper.sortBy(students, student => anonymiseUserName(student.user, anonymiseUsers));\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'summary.unanswered') {\n const sorted = ArrayHelper.sortBy(students, student => student.summary.unanswered);\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'score' || sortBy?.id === 'percentage') {\n const sorted = ArrayHelper.sortBy(students, student => {\n if (student.summary.awaitingMarking)\n return -1;\n\n return student.summary.percentCorrect;\n });\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n return students;\n }, [ refreshData, sortBy, anonymiseUsers ]);\n}\n\nexport function highlightColumns(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach(row => {\n row.childNodes.forEach((col: HTMLElement, colIdx: number) => {\n col.classList.remove(styles.highlightColumn);\n\n if (colIdx === highlightIndex)\n col.classList.add(styles.highlightColumn);\n });\n });\n}\n\nexport function highlightRows(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach((row, rowIdx) => {\n row.classList.remove(styles.highlightResultsRow);\n\n if (rowIdx === highlightIndex)\n row.classList.add(styles.highlightResultsRow);\n });\n}"],"names":["getInteraction","timepoint","selectedInteraction","InteractionsBar","props","t","jsx","Fragment","interaction","isSelected","bgClassName","InteractionTypeHelper","left","jsxs","styles","DurationHelper","namespace","getPhrase","LanguageService","getDuration","interactiveMetadata","InteractionResultsSummary","summary","React","getInteractionResultsSummary","InteractionLabel","PercentageIndicator","PercentageIndicatorLayout","InteractionResultsSummaryPopover","interactive","results","popoverProps","ref","Popover","InteractionHeaderCell","OverlayTrigger","_a","MinusSvg","getSvg","correctness","InteractionCorrectness","CheckSvg","CloseSvg","getClassName","className","StudentResultCell","InteractiveCorrectnessHelper","getStudentResult","svg","SvgContainer","PendingIndicator","RESULTS_COL_WIDTH","CellWrapper","HeaderCell","useGetFixedColumns","anonymiseUsers","useViewModel","ViewModelKeys","hasResults","column","value","anonymiseUserName","useGetResultColumns","onColumnHover","refreshData","getInteractions","index","studentResults","useGetResultsTableData","sortBy","students","s","getStudentResultsSummary","sorted","ArrayHelper","student","highlightColumns","tableEl","highlightIndex","rows","row","col","colIdx","highlightRows","rowIdx"],"mappings":"qeAQA,SAASA,EAAeC,EAAsBC,EAA+C,CAC3F,OAAOD,EAAU,aAAa,KAAK,GAAK,EAAE,KAAOC,EAAoB,EAAE,GAAKD,EAAU,aAAa,CAAC,CACtG,CAQO,SAASE,EAAgBC,EAAgD,CAC9E,OAAKA,EAAM,2BAKN,SAAAA,EAAM,YAAY,WAAW,IAAI,CAACC,EAAG,IAAM,CAC1C,GAAI,CAACA,EAAE,aAAa,OAClB,OAAOC,EAAAA,IAAAC,EAAAA,SAAA,EAAE,EAEX,MAAMC,EAAcR,EAAeK,EAAGD,EAAM,mBAAmB,EACzDK,EAAaD,EAAY,KAAOJ,EAAM,oBAAoB,GAE1DM,EAAcD,EAAcE,EAAsB,YAAYH,EAAY,MAAM,EAAG,YAAc,cAEjGI,EAASP,EAAE,UAAY,IAAQD,EAAM,SAAY,IAEvD,OACES,EAAAA,KAAC,MAAA,CAEC,UAAW,GAAGC,EAAO,SAAS,eAC9B,MAAO,CAAE,KAAM,GAAGF,CAAI,GAAA,EAEtB,SAAA,CAAAN,MAAC,OAAI,UAAW,GAAGQ,EAAO,WAAW,IAAIJ,CAAW,GAAI,EACvD,CAAC,CAACD,GACDH,EAAAA,IAAC,OACE,SAAAS,EAAe,kBAAkBV,EAAE,SAAS,CAAA,CAC/C,CAAA,CAAA,EARG,CAAA,CAYX,CAAC,CAAA,CACH,EA9BOC,EAAAA,IAAAC,EAAAA,SAAA,EAAE,CAgCb,kCCvCMS,EAAY,mCACZC,EAAYC,EAAgB,iBAAiBF,CAAS,EAE5D,SAASG,EAAYC,EAAkD,CACrE,OAAIA,EAAoB,YACfA,EAAoB,YAAY,QAAUA,EAAoB,YAAY,UAE9EA,EAAoB,aAAa,SAG/BA,EAAoB,aAAa,SAAW,IAF1C,CAGX,CASA,SAASC,EAA0BjB,EAAoD,CACrF,MAAMkB,EAAUC,EAAM,QACpB,IAAMC,EAA6BpB,EAAM,YAAaA,EAAM,OAAO,EACnE,CAAEA,EAAM,YAAaA,EAAM,OAAQ,CAAA,EAGrC,OACES,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAP,EAAAA,IAAC,MAAA,CAAI,UAAU,SACb,SAAAA,EAAAA,IAACmB,EAAA,CACC,YAAarB,EAAM,YACnB,cAAc,eAAA,CAAA,EAElB,QACC,MAAA,CAAI,UAAW,QAAQU,EAAO,GAAG,GAChC,SAAAR,EAAAA,IAACH,EAAA,CACC,YAAaC,EAAM,YACnB,SAAUe,EAAYf,EAAM,mBAAmB,EAC/C,oBAAqBA,EAAM,WAAA,CAAA,EAE/B,EACAS,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAP,EAAAA,IAAC,OAAI,UAAU,aACb,SAAAO,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACZ,SAAA,CAAA,CAACS,EAAQ,iBACRT,EAAAA,KAAC,MAAA,CAAI,UAAU,oDACb,SAAA,CAAAP,EAAAA,IAAC,SAAA,CAAQ,SAAAW,EAAU,mBAAmB,CAAA,CAAE,EACxCX,EAAAA,IAACoB,EAAA,CACC,WAAYJ,EAAQ,eACpB,OAAQK,EAA0B,SAAA,CAAA,CACpC,EACF,EAED,CAAC,CAACL,EAAQ,iBACThB,EAAAA,IAAC,OAAI,UAAU,mDACb,SAAAA,EAAAA,IAAC,SAAA,CACC,eAAC,KAAA,CAAI,SAAAW,EAAU,SAAS,EAAE,EAC5B,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CACF,QACC,MAAA,CAAI,UAAU,aACb,SAAAJ,EAAAA,KAAC,MAAA,CAAI,UAAU,+EACb,SAAA,CAAAP,EAAAA,IAAC,SAAA,CAAQ,SAAAW,EAAU,YAAY,CAAA,CAAE,EACjCX,EAAAA,IAAC,OAAA,CAAM,SAAAgB,EAAQ,UAAA,CAAW,CAAA,CAAA,CAC5B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAEA,MAAMM,EAAmCL,EAAM,WAAW,CACxD,CAAE,YAAAf,EAAa,YAAAqB,EAAa,oBAAAT,EAAqB,QAAAU,EAAS,GAAGC,CAAA,EAC7DC,IAGE1B,EAAAA,IAAC,MAAA,CAAI,UAAU,aACb,SAAAA,EAAAA,IAAC2B,EAAA,CACC,GAAI,+BAA+BzB,EAAY,EAAE,GACjD,IAAAwB,EACC,GAAGD,EAEJ,SAAAzB,EAAAA,IAAC2B,EAAQ,KAAR,CACC,SAAA3B,EAAAA,IAACe,EAAA,CACC,YAAAb,EACA,YAAAqB,EACA,oBAAAT,EACA,QAAAU,CAAA,CAAA,CACF,CACF,CAAA,CAAA,EAEJ,CAEH,qrBCxFM,SAASI,GAAsB9B,EAAgD,OACpF,OACEE,EAAAA,IAAC6B,EAAA,CACC,SAASC,EAAAhC,EAAM,QAAQ,WAAd,MAAAgC,EAAwB,OAAS,QAAU,KACpD,UAAU,SACV,QACE9B,EAAAA,IAACe,EAAA,CACC,YAAajB,EAAM,YACnB,YAAaA,EAAM,YACnB,oBAAqBA,EAAM,oBAC3B,QAASA,EAAM,OAAA,CAAA,EAGnB,UAAS,GAET,SAAAE,EAAAA,IAAC,MAAA,CACC,UACE;AAAA;AAAA,YAEEQ,EAAO,0BAA0B,GAErC,aAAcV,EAAM,aACpB,aAAcA,EAAM,aAEpB,SAAAE,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACZ,WAAM,iBAAA,CACT,CAAA,CAAA,CACF,CAAA,CAGN,CChDO,SAAS+B,GAASjC,EAAsC,CAC7D,OACEE,EAAAA,IAAC,MAAA,CAAK,GAAGF,EACP,SAAAE,EAAAA,IAAC,OAAA,CACC,SAAS,UACT,EAAE,yEACF,KAAK,cAAA,CAAA,EAET,CAEJ,CCEA,SAASgC,GAAOC,EAAqC,CACnD,GAAIA,IAAgBC,EAAuB,QACzC,OAAOC,EAET,GAAIF,IAAgBC,EAAuB,UACzC,OAAOE,EAET,GAAIH,IAAgBC,EAAuB,WACzC,OAAOH,EACX,CAEA,SAASM,GAAaJ,EAA6C,CACjE,IAAIK,EAAY,GAAG9B,EAAO,gBAAgB,2BAE1C,OAAIyB,IAAgBC,EAAuB,UACzCI,GAAa,IAAI9B,EAAO,OAAO,iBAE7ByB,IAAgBC,EAAuB,YACzCI,GAAa,IAAI9B,EAAO,SAAS,gBAE/ByB,IAAgBC,EAAuB,kBACzCI,GAAa,IAAI9B,EAAO,eAAe,IAErCyB,IAAgBC,EAAuB,aACzCI,GAAa,IAAI9B,EAAO,UAAU,iBAE7B8B,CACT,CAOO,SAASC,GAAkBzC,EAA4C,CAC5E,MAAMmC,EAAcO,EAA6B,qBAC/C1C,EAAM,YACN2C,EAAiB3C,EAAM,cAAc,CAAA,EAGjC4C,EAAMV,GAAOC,CAAW,EAE9B,OACE1B,EAAAA,KAAC,MAAA,CAAI,UAAW8B,GAAaJ,CAAW,EACrC,SAAA,CAAA,CAAC,CAACS,GAAO1C,EAAAA,IAAC2C,EAAA,CAAa,IAAAD,CAAA,CAAU,EACjCT,IAAgBC,EAAuB,iBACtClC,EAAAA,IAAC4C,EAAA,CAAA,CAAiB,CAAA,EAEtB,CAEJ,CC1CA,MAAMlC,GAAY,mCACZC,EAAYC,EAAgB,iBAAiBF,EAAS,EAE/CmC,GAAoB,GAMjC,SAASC,EAAYhD,EAA+D,CAClF,OACEE,EAAAA,IAAC,OAAI,UAAW,uCAAuCF,EAAM,WAAa,EAAE,GACzE,SAAAA,EAAM,QAAA,CACT,CAEJ,CAOA,SAASiD,EAAWjD,EAAqC,CACvD,OACEE,EAAAA,IAAC8C,EAAA,CAAY,UAAWhD,EAAM,OAAO,UAAY,UAC9C,SAAAa,EAAUb,EAAM,SAAS,CAAA,CAC5B,CAEJ,CAEO,SAASkD,GAAmBxB,EAAoE,OACrG,KAAM,CAACyB,CAAc,EAAIC,EAAsBC,EAAc,eAAe,EACtEC,EAAa,CAAC,GAACtB,EAAAN,EAAQ,WAAR,MAAAM,EAAkB,QAEvC,OAAOb,EAAM,QAAQ,IAC+B,CAChD,CACE,OAAQ,CAAC,CAAE,OAAAoC,CAAA,IAAarD,EAAAA,IAAC+C,EAAA,CAAW,OAAAM,EAAgB,UAAU,OAAO,EACrE,SAAU,OACV,KAAM,CAAC,CAAE,MAAAC,CAAA,IACPtD,EAAAA,IAAC8C,EAAA,CACC,SAAA9C,MAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAuD,EAAkBD,EAAOL,CAAc,EAAE,EAC5E,EAEF,cAAe,CAACG,CAAA,EAElB,CACE,OAAQ,CAAC,CAAE,OAAAC,CAAA,IAAarD,EAAAA,IAAC+C,EAAA,CAAW,OAAAM,EAAgB,UAAU,aAAa,EAC3E,SAAU,qBACV,SAAU,QACV,cAAe,GACf,cAAe,CAACD,EAChB,KAAM,CAAC,CAAE,MAAAE,KAAuDtD,EAAAA,IAAC8C,GAAa,SAAAQ,CAAA,CAAM,CAAA,EAEtF,CACE,OAAQ,CAAC,CAAE,OAAAD,CAAA,IAAarD,EAAAA,IAAC+C,EAAA,CAAW,OAAAM,EAAgB,UAAU,QAAQ,EACtE,SAAU,UACV,GAAI,QACJ,KAAM,CAAC,CAAE,MAAAC,KACHA,EAAM,sBAELR,EAAA,CACC,SAAA9C,EAAAA,IAAC4C,EAAA,CACC,MAAOjC,EAAU,iBAAiB,EAClC,UAAU,cACV,UAAS,EAAA,CAAA,EAEb,EAKFX,EAAAA,IAAC8C,EAAA,CACE,SAAA,GAAGQ,EAAM,OAAO,IAAIA,EAAM,SAAWA,EAAM,UAAU,EAAA,CACxD,EAGJ,MAAO,IACP,cAAe,GACf,cAAe,CAACF,CAAA,EAElB,CACE,OAAQ,CAAC,CAAE,OAAAC,CAAA,IAAarD,EAAAA,IAAC+C,EAAA,CAAW,OAAAM,EAAgB,UAAU,aAAa,EAC3E,SAAU,UACV,GAAI,aACJ,KAAM,CAAC,CAAE,MAAAC,KACHA,EAAM,sBAELR,EAAA,CACC,SAAA9C,EAAAA,IAAC4C,EAAA,CACC,MAAOjC,EAAU,iBAAiB,EAClC,UAAU,cACV,UAAS,EAAA,CAAA,EAEb,QAKDmC,EAAA,CACC,SAAA9C,EAAAA,IAACoB,EAAA,CACC,WAAYkC,EAAM,eAClB,OAAQjC,EAA0B,YAClC,UAAU,aAAA,CAAA,EAEd,EAGJ,MAAO,IACP,cAAe,GACf,cAAe,CAAC+B,CAAA,CAClB,EAID,CAAEH,EAAgBG,CAAW,CAAC,CACnC,CAKO,SAASI,GACdjC,EACAT,EACAU,EACAiC,EACAC,EACqC,CACrC,OAAOzC,EAAM,QAAQ,IACE0C,EAAgBpC,CAAW,EAE5B,IAAI,CAACrB,EAAa0D,KACW,CAC7C,OAAQ,IAEJ5D,EAAAA,IAAC4B,GAAA,CACC,YAAA1B,EACA,QAAAsB,EACA,YAAAD,EACA,oBAAAT,EACA,kBAAmB8C,EAAQ,EAC3B,aAAc,IAAMH,EAAcG,CAAK,EACvC,aAAc,IAAMH,EAAc,IAAI,CAAA,CAAA,EAI5C,SAAU,UAIV,GAAIvD,EAAY,GAChB,cAAe,GACf,MAAO2C,GACP,KAAM,CAAC,CAAE,IAAK,CAAE,SAAUgB,EAAe,IACvC7D,MAACuC,GAAA,CAAkB,YAAArC,EAA0B,eAAA2D,CAAA,CAAgC,CAAA,EAIlF,EACA,CAACH,CAAW,CAAC,CAClB,CAKO,SAASI,GACdvC,EACAC,EACAkC,EACAK,EAC6B,CAC7B,KAAM,CAACd,CAAc,EAAIC,EAAsBC,EAAc,eAAe,EAE5E,OAAOlC,EAAM,QAAQ,IAAM,CACzB,MAAM+C,EAAwC,CAAA,EAM9C,GAJAxC,EAAQ,SAAS,QAAQyC,GAAK,CAC5BD,EAAS,KAAM,CAAE,GAAGC,EAAG,QAASC,EAAyB3C,EAAa0C,CAAC,EAAI,CAC7E,CAAC,GAEGF,GAAA,YAAAA,EAAQ,MAAO,OAAQ,CACzB,MAAMI,EAASC,EAAY,OAAOJ,KAAqBT,EAAkBc,EAAQ,KAAMpB,CAAc,CAAC,EAEtG,OAAOc,EAAO,KAAOI,EAAO,QAAA,EAAYA,CAC1C,CAEA,IAAIJ,GAAA,YAAAA,EAAQ,MAAO,qBAAsB,CACvC,MAAMI,EAASC,EAAY,OAAOJ,EAAUK,GAAWA,EAAQ,QAAQ,UAAU,EAEjF,OAAON,EAAO,KAAOI,EAAO,QAAA,EAAYA,CAC1C,CAEA,IAAIJ,GAAA,YAAAA,EAAQ,MAAO,UAAWA,GAAA,YAAAA,EAAQ,MAAO,aAAc,CACzD,MAAMI,EAASC,EAAY,OAAOJ,EAAUK,GACtCA,EAAQ,QAAQ,gBACX,GAEFA,EAAQ,QAAQ,cACxB,EAED,OAAON,EAAO,KAAOI,EAAO,QAAA,EAAYA,CAC1C,CAEA,OAAOH,CACT,EAAG,CAAEN,EAAaK,EAAQd,CAAe,CAAC,CAC5C,CAEO,SAASqB,GAAiBC,EAAsBC,EAA+B,CACpF,GAAI,CAACD,EACH,OAEF,MAAME,EAAOF,EAAQ,iBAAiB,IAAI/D,EAAO,UAAU,EAAE,EAE7DiE,GAAA,MAAAA,EAAM,QAAQC,GAAO,CACnBA,EAAI,WAAW,QAAQ,CAACC,EAAkBC,IAAmB,CAC3DD,EAAI,UAAU,OAAOnE,EAAO,eAAe,EAEvCoE,IAAWJ,GACbG,EAAI,UAAU,IAAInE,EAAO,eAAe,CAC5C,CAAC,CACH,EACF,CAEO,SAASqE,GAAcN,EAAsBC,EAA+B,CACjF,GAAI,CAACD,EACH,OAEF,MAAME,EAAOF,EAAQ,iBAAiB,IAAI/D,EAAO,UAAU,EAAE,EAE7DiE,GAAA,MAAAA,EAAM,QAAQ,CAACC,EAAKI,IAAW,CAC7BJ,EAAI,UAAU,OAAOlE,EAAO,mBAAmB,EAE3CsE,IAAWN,GACbE,EAAI,UAAU,IAAIlE,EAAO,mBAAmB,CAChD,EACF"}
@@ -0,0 +1,2 @@
1
+ import{cU as n,r as a,ap as s,aq as c,cV as o}from"./app-BqRx5tK8.js";function i(r){const e=n.getInstance(r);return a.useEffect(()=>()=>{n.releaseInstance(r)}),e}function u(r){return i(r)}function g(){const r=u(o.ALERT);return{success(e){r.success(e)()},error(e){r.error(e)()},warning(e){r.createAlert({type:s.Warning,heading:c.Warning,message:e})},info(e,t){r.createAlert({heading:e,message:t,type:s.Info})}}}export{u as a,g as u};
2
+ //# sourceMappingURL=DHqmPVfK.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DHqmPVfK.chunk.js","sources":["../../../../libs/common/src/react/hooks/UseInstance.ts","../../../../libs/common/src/react/hooks/UseService.ts","../../../../libs/shared/src/hooks/UseAlerts.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { InstanceManager } from 'libs/common/backbone/services/InstanceManager';\n\n/**\n * Hook to retrieve an instance from InstanceManager.\n * It handles releasing the instance in the cleanup function.\n * @param instanceName \n */\nexport function useInstance<T>(instanceName: string): T {\n const instance = InstanceManager.getInstance<T>(instanceName);\n\n React.useEffect(() => {\n return () => { InstanceManager.releaseInstance(instanceName); };\n }), [];\n\n return instance;\n}\n\n/**\n * Can be used to conditionally get an instance safely. Passing in a falsey value\n * will not return an instance, and will also not error\n */\nexport function useInstanceSafe<T>(instanceName: string): T {\n let instance: T = null;\n\n if (instanceName)\n instance = InstanceManager.getInstance<T>(instanceName);\n\n React.useEffect(() => {\n return () => { InstanceManager.releaseInstance(instanceName); };\n }), [];\n\n return instance;\n}","import { BaseService } from 'libs/common/backbone/core/BaseService';\n\nimport { useInstance } from './UseInstance';\n\nexport function useService<T extends BaseService>(serviceName: string): T {\n const service = useInstance<T>(serviceName);\n\n return service;\n}","import { CommonServices } from 'libs/common/backbone/constants/CommonServices';\nimport { AlertType, BaseAlert, BaseAlertOptions, BaseAlertService, DefaultAlertHeading } from 'libs/common/backbone/services/BaseAlertService';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nexport interface Alerts {\n success(alertContent: string | BaseAlert | BaseAlertOptions): void,\n error(alertContent: string | BaseAlert | BaseAlertOptions): void,\n warning(alertContent: string): void\n info(heading: string, message: string): void\n}\n\nexport function useAlerts(): Alerts {\n const alertService = useService<BaseAlertService>(CommonServices.ALERT);\n\n return {\n success(alertContent: string | BaseAlert | BaseAlertOptions): void {\n alertService.success(alertContent)();\n },\n error(alertContent: string | BaseAlert | BaseAlertOptions): void {\n alertService.error(alertContent)();\n },\n warning(alertContent: string): void {\n alertService.createAlert({\n type: AlertType.Warning,\n heading: DefaultAlertHeading.Warning,\n message: alertContent\n });\n },\n info(heading: string, message: string): void {\n alertService.createAlert({\n heading,\n message,\n type: AlertType.Info\n });\n }\n };\n}"],"names":["useInstance","instanceName","instance","InstanceManager","React.useEffect","useService","serviceName","useAlerts","alertService","CommonServices","alertContent","AlertType","DefaultAlertHeading","heading","message"],"mappings":"sEASO,SAASA,EAAeC,EAAyB,CACtD,MAAMC,EAAWC,EAAgB,YAAeF,CAAY,EAE5DG,OAAAA,EAAAA,UAAgB,IACP,IAAM,CAAED,EAAgB,gBAAgBF,CAAY,CAAG,CAC/D,EAEMC,CACT,CCbO,SAASG,EAAkCC,EAAwB,CAGxE,OAFgBN,EAAeM,CAAW,CAG5C,CCGO,SAASC,GAAoB,CAClC,MAAMC,EAAeH,EAA6BI,EAAe,KAAK,EAEtE,MAAO,CACL,QAAQC,EAA2D,CACjEF,EAAa,QAAQE,CAAY,EAAA,CACnC,EACA,MAAMA,EAA2D,CAC/DF,EAAa,MAAME,CAAY,EAAA,CACjC,EACA,QAAQA,EAA4B,CAClCF,EAAa,YAAY,CACvB,KAAMG,EAAU,QAChB,QAASC,EAAoB,QAC7B,QAASF,CAAA,CACV,CACH,EACA,KAAKG,EAAiBC,EAAuB,CAC3CN,EAAa,YAAY,CACvB,QAAAK,EACA,QAAAC,EACA,KAAMH,EAAU,IAAA,CACjB,CACH,CAAA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as a}from"./app-BqRx5tK8.js";function h(l){return a.jsx("svg",{...l,children:a.jsx("path",{d:"M5 6v12h14V6zm0-1h14a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1m2.4 10.3a.5.5 0 0 1-.8-.6l3-4a.5.5 0 0 1 .754-.054l.579.58 1.765-2.513a.5.5 0 0 1 .83.015l3.891 6a.5.5 0 0 1-.838.544l-3.49-5.379-1.682 2.394a.5.5 0 0 1-.763.067l-.592-.593zm.6-4.8a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3m0-1a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1",fill:"currentColor"})})}function t(l){return a.jsx("svg",{...l,children:a.jsx("path",{fill:"currentColor",d:"M4.007 5.007A1.73 1.73 0 0 1 5.23 4.5h3.077a1.73 1.73 0 0 1 1.384.692l1.327 1.77h7.75a1.73 1.73 0 0 1 1.731 1.73v8.616a1.73 1.73 0 0 1-1.73 1.73H5.23a1.73 1.73 0 0 1-1.73-1.73V6.23c0-.46.182-.9.507-1.224M5.23 5.5a.73.73 0 0 0-.731.73V9.5h15v-.808a.73.73 0 0 0-.73-.73h-8a.5.5 0 0 1-.4-.2l-1.478-1.97a.73.73 0 0 0-.584-.292zm14.269 5h-15v6.808a.73.73 0 0 0 .73.73h13.54a.73.73 0 0 0 .73-.73z"})})}export{t as F,h as a};
2
+ //# sourceMappingURL=DJLuyZJi.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DJLuyZJi.chunk.js","sources":["../../../../libs/shared/src/images/svg/objects/FileImgSvg.tsx","../../../../libs/shared/src/images/svg/objects/FolderSvg.tsx"],"sourcesContent":["import React from 'react';\n\nexport function FileImgSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M5 6v12h14V6zm0-1h14a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1m2.4 10.3a.5.5 0 0 1-.8-.6l3-4a.5.5 0 0 1 .754-.054l.579.58 1.765-2.513a.5.5 0 0 1 .83.015l3.891 6a.5.5 0 0 1-.838.544l-3.49-5.379-1.682 2.394a.5.5 0 0 1-.763.067l-.592-.593zm.6-4.8a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3m0-1a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function FolderSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M4.007 5.007A1.73 1.73 0 0 1 5.23 4.5h3.077a1.73 1.73 0 0 1 1.384.692l1.327 1.77h7.75a1.73 1.73 0 0 1 1.731 1.73v8.616a1.73 1.73 0 0 1-1.73 1.73H5.23a1.73 1.73 0 0 1-1.73-1.73V6.23c0-.46.182-.9.507-1.224M5.23 5.5a.73.73 0 0 0-.731.73V9.5h15v-.808a.73.73 0 0 0-.73-.73h-8a.5.5 0 0 1-.4-.2l-1.478-1.97a.73.73 0 0 0-.584-.292zm14.269 5h-15v6.808a.73.73 0 0 0 .73.73h13.54a.73.73 0 0 0 .73-.73z'\n />\n </svg>\n );\n}\n"],"names":["FileImgSvg","props","jsx","FolderSvg"],"mappings":"sCAEO,SAASA,EAAWC,EAAsC,CAC/D,OACEC,EAAAA,IAAC,MAAA,CAAK,GAAGD,EACP,SAAAC,EAAAA,IAAC,OAAA,CACC,EAAE,iVACF,KAAK,cAAA,CAAA,EAET,CAEJ,CCTO,SAASC,EAAUF,EAAsC,CAC9D,OACEC,EAAAA,IAAC,MAAA,CAAK,GAAGD,EACP,SAAAC,EAAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,wYAAA,CAAA,EAEN,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as a,c6 as s}from"./app-BqRx5tK8.js";import{R as t,s as e}from"./CqSaPgvV.chunk.js";function r(){return a.jsxs(t,{className:`py-1 ${e.videoItemContainer}`,children:[a.jsx(s,{xs:1,className:"d-flex align-items-center justify-content-center",children:a.jsx("div",{className:`partial-loading-background ${e.partialNumber}`})}),a.jsx(s,{xs:2,className:"d-flex align-items-center",children:a.jsx("div",{className:"d-block",children:a.jsx("div",{className:`partial-loading-background rounded ${e.partialThumbnail}`})})}),a.jsx(s,{xs:3,className:"d-flex align-items-center",children:a.jsx("div",{className:`partial-loading-background ms-n2 ${e.partialLongText}`})}),a.jsx(s,{xs:2,className:"d-flex align-items-center",children:a.jsx("div",{className:`d-block partial-loading-background mx-4 ${e.partialShortText}`})}),a.jsx(s,{xs:4,className:"d-flex align-items-center",children:a.jsx("div",{className:`d-block partial-loading-background mx-4 ${e.partialNumber}`})})]})}function c(){return a.jsxs(t,{className:`py-1 ${e.interactiveItemContainer}`,children:[a.jsx(s,{xs:1,className:"d-flex align-items-center justify-content-center",children:a.jsx("div",{className:`partial-loading-background ${e.partialNumber}`})}),a.jsx(s,{xs:2,className:"d-flex align-items-center",children:a.jsx("div",{className:"d-block",children:a.jsx("div",{className:`partial-loading-background rounded ${e.partialThumbnail}`})})}),a.jsx(s,{xs:2,className:"d-flex align-items-center",children:a.jsx("div",{className:`partial-loading-background ms-n2 ${e.partialMediumText}`})}),a.jsx(s,{xs:2,className:"d-flex align-items-center",children:a.jsx("div",{className:`d-block partial-loading-background mx-4 ${e.partialAvatar}`})}),a.jsx(s,{xs:2,className:"d-flex align-items-center",children:a.jsx("div",{className:`d-block partial-loading-background mx-4 ${e.partialMediumText}`})}),a.jsx(s,{xs:3,className:"d-flex align-items-center",children:a.jsx("div",{className:`d-block partial-loading-background mx-4 ${e.partialNumber}`})})]})}function d(){return a.jsxs(t,{className:`my-2 ${e.userItemContainer}`,children:[a.jsxs(s,{xs:2,className:"d-flex align-items-center ",children:[a.jsx("div",{className:`partial-loading-background ms-3 ${e.partialAvatar}`}),a.jsx("div",{className:`partial-loading-background mx-2 ${e.partialShortText}`})]}),a.jsx(s,{xs:2,className:"d-flex justify-content-center align-items-center",children:a.jsx("div",{className:`d-block partial-loading-background ${e.partialShortText}`})}),a.jsx(s,{xs:2,className:"d-flex justify-content-center align-items-center",children:a.jsx("div",{className:`partial-loading-background ${e.partialShortText}`})}),a.jsx(s,{xs:6,className:"d-flex justify-content-between align-items-center",children:a.jsx("div",{className:`partial-loading-background ${e.heatMapItemContainer} ${e.partialHeatMap}`})})]})}function m(l,i){switch(l){case"video-views":return a.jsx(r,{},i);case"interactives":return a.jsx(c,{},i);case"engagement-users":return a.jsx(d,{},i);default:return a.jsx(a.Fragment,{})}}x.defaultProps={itemCount:7};function x(l){return a.jsx("div",{className:"my-1",children:Array(l.itemCount).fill(null).map((i,n)=>m(l.variant,n))})}export{x as P};
2
+ //# sourceMappingURL=DK7va7iQ.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DK7va7iQ.chunk.js","sources":["../../src/shared/components/partial-loading/PartialTableContent.tsx"],"sourcesContent":["import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { TableVariant } from 'shared/components/partial-loading/PartialTable';\n\nimport styles from './partial-loading.module.scss';\n\nfunction VideoItem(): JSX.Element {\n return (\n <Row className={`py-1 ${styles.videoItemContainer}`}>\n <Col xs={1} className='d-flex align-items-center justify-content-center'>\n <div className={`partial-loading-background ${styles.partialNumber}`} />\n </Col>\n <Col xs={2} className='d-flex align-items-center'>\n <div className='d-block'>\n <div className={`partial-loading-background rounded ${styles.partialThumbnail}`} />\n </div>\n </Col>\n <Col xs={3} className='d-flex align-items-center'>\n <div className={`partial-loading-background ms-n2 ${styles.partialLongText}`} />\n </Col>\n <Col xs={2} className='d-flex align-items-center'>\n <div className={`d-block partial-loading-background mx-4 ${styles.partialShortText}`} />\n </Col>\n <Col xs={4} className='d-flex align-items-center'>\n <div className={`d-block partial-loading-background mx-4 ${styles.partialNumber}`} />\n </Col>\n </Row>\n );\n}\n\nfunction InteractiveItem(): JSX.Element {\n return (\n <Row className={`py-1 ${styles.interactiveItemContainer}`}>\n <Col xs={1} className='d-flex align-items-center justify-content-center'>\n <div className={`partial-loading-background ${styles.partialNumber}`} />\n </Col>\n <Col xs={2} className='d-flex align-items-center'>\n <div className='d-block'>\n <div className={`partial-loading-background rounded ${styles.partialThumbnail}`} />\n </div>\n </Col>\n <Col xs={2} className='d-flex align-items-center'>\n <div className={`partial-loading-background ms-n2 ${styles.partialMediumText}`} />\n </Col>\n <Col xs={2} className='d-flex align-items-center'>\n <div className={`d-block partial-loading-background mx-4 ${styles.partialAvatar}`} />\n </Col>\n <Col xs={2} className='d-flex align-items-center'>\n <div className={`d-block partial-loading-background mx-4 ${styles.partialMediumText}`} />\n </Col>\n <Col xs={3} className='d-flex align-items-center'>\n <div className={`d-block partial-loading-background mx-4 ${styles.partialNumber}`} />\n </Col>\n </Row>\n );\n}\n\nfunction EngagementUserItem(): JSX.Element {\n return (\n <Row className={`my-2 ${styles.userItemContainer}`}>\n <Col xs={2} className='d-flex align-items-center '>\n <div className={`partial-loading-background ms-3 ${styles.partialAvatar}`} />\n <div className={`partial-loading-background mx-2 ${styles.partialShortText}`} />\n </Col>\n <Col xs={2} className='d-flex justify-content-center align-items-center'>\n <div className={`d-block partial-loading-background ${styles.partialShortText}`} />\n </Col>\n <Col xs={2} className='d-flex justify-content-center align-items-center'>\n <div className={`partial-loading-background ${styles.partialShortText}`} />\n </Col>\n <Col xs={6} className='d-flex justify-content-between align-items-center'>\n <div className={`partial-loading-background ${styles.heatMapItemContainer} ${styles.partialHeatMap}`} />\n </Col>\n </Row>\n );\n}\n\nfunction getPartialItem(type: TableVariant, key: number): JSX.Element {\n switch (type) {\n case 'video-views':\n return <VideoItem key={key} />;\n\n case 'interactives':\n return <InteractiveItem key={key} />;\n\n case 'engagement-users':\n return <EngagementUserItem key={key} />;\n\n default:\n return <></>;\n }\n}\n\ninterface PartialTableContentProps {\n variant: TableVariant;\n itemCount?: number;\n}\n\nPartialTableContent.defaultProps = {\n itemCount: 7\n};\n\nexport function PartialTableContent(props: PartialTableContentProps): JSX.Element {\n return (\n <div className='my-1'>\n {Array(props.itemCount).fill(null).map((_, i) => getPartialItem(props.variant, i))}\n </div>\n );\n}"],"names":["VideoItem","Row","styles","jsx","Col","InteractiveItem","EngagementUserItem","jsxs","getPartialItem","type","key","Fragment","PartialTableContent","props","_","i"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e,h as v,a3 as c}from"./app-BqRx5tK8.js";import{a as C}from"./DJLuyZJi.chunk.js";const _=["bg-green","bg-cyan","bg-teal","bg-blue","bg-indigo","bg-purple"],j=["bg-pink","bg-orange",..._];function k(a){return e.jsx("svg",{...a,children:e.jsx("path",{fill:"currentColor",fillRule:"evenodd",d:"M7.76 6.078a.5.5 0 0 0-.76.427v11a.5.5 0 0 0 .76.426l9.003-5.5a.5.5 0 0 0 0-.853z",clipRule:"evenodd"})})}function d(a){return e.jsx("svg",{...a,viewBox:"0 0 24 21",children:e.jsx("path",{d:"M22.5 1A1.5 1.5 0 0 1 24 2.5v18a1.5 1.5 0 0 1-1.5 1.5h-21A1.5 1.5 0 0 1 0 20.5v-18A1.5 1.5 0 0 1 1.5 1zm0 1.5h-21v18h21zm-8.21 4.092 5.84 9a.75.75 0 0 1-1.26.816L13.638 8.34l-2.523 3.591a.75.75 0 0 1-1.144.1l-.889-.89L5.1 16.45a.75.75 0 0 1-1.2-.9l4.5-6a.75.75 0 0 1 1.13-.08l.87.869 2.648-3.77a.75.75 0 0 1 1.243.023M6 4.75a2.25 2.25 0 1 1 0 4.5 2.25 2.25 0 0 1 0-4.5m0 1.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5",fill:"currentColor"})})}function f(a){return e.jsx("svg",{...a,children:e.jsx("path",{fill:"currentColor",d:"M20.283 4C21.229 4 22 4.745 22 5.66v8.74c0 .726-.478 1.338-1.151 1.565l.088-10.22a.657.657 0 0 0-.664-.66H6.351A1.71 1.71 0 0 1 7.951 4zm-2.059 1.933c.947 0 1.718.745 1.718 1.65v8.74c.01.726-.479 1.339-1.142 1.565l.088-10.24a.647.647 0 0 0-.664-.64H4.293a1.7 1.7 0 0 1 1.6-1.075zM16.05 7.95c.946 0 1.707.744 1.707 1.659v8.74c0 .915-.77 1.65-1.707 1.65H3.707C2.761 20 2 19.255 2 18.35V9.61c0-.915.77-1.66 1.707-1.66zm-.01 1.084H3.717a.647.647 0 0 0-.663.64v8.609c0 .358.292.641.663.641H16.03c.371 0 .664-.283.664-.641V9.676c.01-.358-.283-.641-.654-.641M8.546 12.39v3.178c0 .17.205.264.342.17l2.254-1.594c.117-.085.117-.255 0-.33l-2.264-1.593c-.137-.095-.332 0-.332.17"})})}function F(a,t){return t[a.charCodeAt(0)%t.length]}const g="_baseFallbackContainer_14tjv_1",m="_svgFallbackContainer_14tjv_1",S="_subjectFallbackContainer_14tjv_9",h="_subjectFallbackContainerSmall_14tjv_18",x="_subjectFallbackContainerLarge_14tjv_21",$="_seriesItemFallback_14tjv_24",z="_playlistItemFallback_14tjv_24",L="_playlistFallback_14tjv_28",A="_posterFallback_14tjv_29",M="_subjectFallback_14tjv_9",N="_fallbackThumbnailImage_14tjv_47",P="_videoFallback_14tjv_55",B="_folderFallback_14tjv_56",l={baseFallbackContainer:g,svgFallbackContainer:m,subjectFallbackContainer:S,subjectFallbackContainerSmall:h,subjectFallbackContainerLarge:x,seriesItemFallback:$,playlistItemFallback:z,playlistFallback:L,posterFallback:A,subjectFallback:M,fallbackThumbnailImage:N,videoFallback:P,folderFallback:B};var E=(a=>(a[a.Playlist=0]="Playlist",a[a.PlaylistThumbnail=1]="PlaylistThumbnail",a[a.Series=2]="Series",a[a.SeriesThumbnail=3]="SeriesThumbnail",a[a.Subject=4]="Subject",a[a.TallSubject=5]="TallSubject",a[a.Video=6]="Video",a[a.Folder=7]="Folder",a))(E||{});function H(a,t,n){if(t===4){const s=n===0?l.subjectFallbackContainerLarge:l.subjectFallbackContainerSmall;return`${l.subjectFallbackContainer} ${s}`}return a===0?t===3||t===1?`${l.svgFallbackContainer} rounded-3`:l.svgFallbackContainer:l.baseFallbackContainer}function O(a){return a===3?l.seriesItemFallback:a===1?l.playlistItemFallback:a===0?l.playlistFallback:a===2||a===5?l.posterFallback:a===4?`${l.subjectFallback} svg-container d-inline-block`:""}function R(a){return a===3||a===1?k:a===0?d:a===2?f:a===4||a===5?C:null}function V(a){return a===4?c.ExtraLarge:c.Standard}G.defaultProps={mediaType:0,containerClassSize:0};function G(a){const{type:t,mediaType:n,extraClasses:s,containerClassSize:o}=a;if(t===6)return e.jsx("div",{className:`${l.videoFallback} ${a.extraClasses} bg-light-blue`});if(t===7)return e.jsx("div",{className:`${l.folderFallback} ${a.extraClasses} ${F(a.name,j)}`});const b=O(t),r=R(t),u=V(t);let i=`${H(n,t,o)}`;return s&&(i+=` ${a.extraClasses}`),e.jsx("div",{className:i,children:n===0?e.jsx(v,{svg:r,className:`${b} ${a.svgContainerClassName??""}`,tagName:"div",size:u}):e.jsx("div",{className:l.fallbackThumbnailImage,style:{backgroundImage:`url('${r}')`}})})}export{j as B,G as I,k as P,f as S,E as a,F as g};
2
+ //# sourceMappingURL=DMoPMSgN.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DMoPMSgN.chunk.js","sources":["../../../../libs/shared/src/constants/ColourClassNames.ts","../../../../libs/shared/src/images/svg/actions/PlaySvg.tsx","../../../../libs/shared/src/images/svg/objects/ImageSvg.tsx","../../../../libs/shared/src/images/svg/objects/SeriesSvg.tsx","../../../../libs/shared/src/utils/getBgColorClass.ts","../../../../libs/shared/src/components/image/ImageFallback.tsx"],"sourcesContent":["/**\n * Use this instead of the list below if you need to render the clickview logo\n * on the background you're rendering.\n */\nexport const LOGO_SAFE_BG_CLASS_NAMES = [\n 'bg-green',\n 'bg-cyan',\n 'bg-teal',\n 'bg-blue',\n 'bg-indigo',\n 'bg-purple'\n];\n\nexport const BG_COLOUR_CLASS_NAMES = [\n 'bg-pink',\n 'bg-orange',\n ...LOGO_SAFE_BG_CLASS_NAMES\n];","import React from 'react';\n\nexport function PlaySvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M7.76 6.078a.5.5 0 0 0-.76.427v11a.5.5 0 0 0 .76.426l9.003-5.5a.5.5 0 0 0 0-.853z'\n clipRule='evenodd'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function ImageSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props} viewBox='0 0 24 21'>\n <path\n d='M22.5 1A1.5 1.5 0 0 1 24 2.5v18a1.5 1.5 0 0 1-1.5 1.5h-21A1.5 1.5 0 0 1 0 20.5v-18A1.5 1.5 0 0 1 1.5 1zm0 1.5h-21v18h21zm-8.21 4.092 5.84 9a.75.75 0 0 1-1.26.816L13.638 8.34l-2.523 3.591a.75.75 0 0 1-1.144.1l-.889-.89L5.1 16.45a.75.75 0 0 1-1.2-.9l4.5-6a.75.75 0 0 1 1.13-.08l.87.869 2.648-3.77a.75.75 0 0 1 1.243.023M6 4.75a2.25 2.25 0 1 1 0 4.5 2.25 2.25 0 0 1 0-4.5m0 1.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function SeriesSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M20.283 4C21.229 4 22 4.745 22 5.66v8.74c0 .726-.478 1.338-1.151 1.565l.088-10.22a.657.657 0 0 0-.664-.66H6.351A1.71 1.71 0 0 1 7.951 4zm-2.059 1.933c.947 0 1.718.745 1.718 1.65v8.74c.01.726-.479 1.339-1.142 1.565l.088-10.24a.647.647 0 0 0-.664-.64H4.293a1.7 1.7 0 0 1 1.6-1.075zM16.05 7.95c.946 0 1.707.744 1.707 1.659v8.74c0 .915-.77 1.65-1.707 1.65H3.707C2.761 20 2 19.255 2 18.35V9.61c0-.915.77-1.66 1.707-1.66zm-.01 1.084H3.717a.647.647 0 0 0-.663.64v8.609c0 .358.292.641.663.641H16.03c.371 0 .664-.283.664-.641V9.676c.01-.358-.283-.641-.654-.641M8.546 12.39v3.178c0 .17.205.264.342.17l2.254-1.594c.117-.085.117-.255 0-.33l-2.264-1.593c-.137-.095-.332 0-.332.17'\n />\n </svg>\n );\n}\n","export function getBgColorClass(name: string, classNames: string[]): string {\n return classNames[name.charCodeAt(0) % classNames.length];\n}\n\nexport function getDeterministicBgColorClass(name: string, classNames: string[]): string {\n const sum = name\n .split('')\n .reduce(\n (acc, char) => acc + char.charCodeAt(0),\n 0\n );\n \n return classNames[sum % classNames.length];\n}","import * as React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { PlaySvg } from 'libs/shared/images/svg/actions/PlaySvg';\nimport { FileImgSvg } from 'libs/shared/images/svg/objects/FileImgSvg';\nimport { ImageSvg } from 'libs/shared/images/svg/objects/ImageSvg';\nimport { SeriesSvg } from 'libs/shared/images/svg/objects/SeriesSvg';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\n\nimport styles from './image-fallback.module.scss';\n\nexport enum ImageFallbackType {\n Playlist,\n PlaylistThumbnail,\n Series,\n SeriesThumbnail,\n Subject,\n TallSubject,\n Video,\n Folder\n}\n\nexport enum ImageFallbackMediaType {\n Svg,\n Image\n}\n\nexport enum ContainerClassSize {\n Large,\n Small\n}\n\nfunction getContainerClass(\n type: ImageFallbackMediaType,\n objectType: ImageFallbackType,\n containerClassSize: ContainerClassSize\n): string {\n if (objectType === ImageFallbackType.Subject) {\n const containerSizeClass = containerClassSize === ContainerClassSize.Large\n ? styles.subjectFallbackContainerLarge\n : styles.subjectFallbackContainerSmall;\n\n return `${styles.subjectFallbackContainer} ${containerSizeClass}`;\n }\n\n if (type === ImageFallbackMediaType.Svg) {\n if (objectType === ImageFallbackType.SeriesThumbnail || objectType === ImageFallbackType.PlaylistThumbnail)\n return `${styles.svgFallbackContainer} rounded-3`;\n \n return styles.svgFallbackContainer;\n }\n\n return styles.baseFallbackContainer;\n}\n\nfunction getClassByType(type: ImageFallbackType): string {\n if (type === ImageFallbackType.SeriesThumbnail)\n return styles.seriesItemFallback;\n\n if (type === ImageFallbackType.PlaylistThumbnail)\n return styles.playlistItemFallback;\n\n if (type === ImageFallbackType.Playlist)\n return styles.playlistFallback;\n\n if (type === ImageFallbackType.Series || type === ImageFallbackType.TallSubject)\n return styles.posterFallback;\n\n if (type === ImageFallbackType.Subject)\n return `${styles.subjectFallback} svg-container d-inline-block`;\n\n return '';\n}\n\nfunction getMedia(type: ImageFallbackType) {\n if (type === ImageFallbackType.SeriesThumbnail || type === ImageFallbackType.PlaylistThumbnail)\n return PlaySvg;\n\n if (type === ImageFallbackType.Playlist)\n return ImageSvg;\n\n if (type === ImageFallbackType.Series)\n return SeriesSvg;\n\n if (type === ImageFallbackType.Subject || type === ImageFallbackType.TallSubject)\n return FileImgSvg;\n\n return null;\n}\n\nfunction getSize(type: ImageFallbackType): SvgContainerSize {\n if (type === ImageFallbackType.Subject)\n return SvgContainerSize.ExtraLarge;\n\n return SvgContainerSize.Standard;\n}\n\ninterface ImageFallbackProps {\n type: ImageFallbackType;\n mediaType?: ImageFallbackMediaType;\n extraClasses?: string;\n svgContainerClassName?: string;\n name?: string;\n containerClassSize?: ContainerClassSize\n}\n\nImageFallback.defaultProps = {\n mediaType: ImageFallbackMediaType.Svg,\n containerClassSize: ContainerClassSize.Large\n};\n\nexport function ImageFallback(props: ImageFallbackProps): JSX.Element {\n const { type, mediaType, extraClasses, containerClassSize } = props;\n\n if (type === ImageFallbackType.Video)\n return <div className={`${styles.videoFallback} ${props.extraClasses} bg-light-blue`} />;\n\n if (type === ImageFallbackType.Folder)\n return <div className={`${styles.folderFallback} ${props.extraClasses} ${getBgColorClass(props.name, BG_COLOUR_CLASS_NAMES)}`} />;\n\n const typeClass = getClassByType(type);\n const media = getMedia(type);\n const size = getSize(type);\n\n let className = `${getContainerClass(mediaType, type, containerClassSize)}`;\n\n if (extraClasses)\n className += ` ${props.extraClasses}`;\n\n return (\n <div className={className}>\n {mediaType === ImageFallbackMediaType.Svg\n ? (\n <SvgContainer\n svg={media}\n className={`${typeClass} ${props.svgContainerClassName ?? ''}`}\n tagName='div'\n size={size}\n />\n ) : (\n <div className={styles.fallbackThumbnailImage} style={{ backgroundImage: `url('${media}')` }} />\n )\n }\n </div>\n );\n}"],"names":["LOGO_SAFE_BG_CLASS_NAMES","BG_COLOUR_CLASS_NAMES","PlaySvg","props","jsx","ImageSvg","SeriesSvg","getBgColorClass","name","classNames","ImageFallbackType","getContainerClass","type","objectType","containerClassSize","containerSizeClass","styles","getClassByType","getMedia","FileImgSvg","getSize","SvgContainerSize","ImageFallback","mediaType","extraClasses","typeClass","media","size","className","SvgContainer"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{u as d,a as n,L as c,b as u,P as l,j as e}from"./app-BqRx5tK8.js";import{V as p,a as h}from"./Bbpuxobz.chunk.js";import{u as v}from"./C6eAAaNL.chunk.js";import{u as j,a as V}from"./BlAGsOOw.chunk.js";import{u as x}from"./C6H2bU7H.chunk.js";import{E as C}from"./zaMwD-xl.chunk.js";import{V as f}from"./CXK1uNgx.chunk.js";import{V as w}from"./BmScDBcl.chunk.js";import"./DuNeLCIS.chunk.js";import"./DeY3SuCM.chunk.js";import"./BrLXFCMV.chunk.js";import"./DJLuyZJi.chunk.js";import"./Fd0gT6QK.chunk.js";import"./DxUueJN7.chunk.js";import"./CqyCLTzN.chunk.js";import"./BkcNwg7K.chunk.js";import"./DHqmPVfK.chunk.js";import"./DFhb3ZfO.chunk.js";import"./5O9SdVRZ.chunk.js";import"./BE7zUNFh.chunk.js";import"./sFV5nxD4.chunk.js";import"./DMoPMSgN.chunk.js";import"./ByllnMKt.chunk.js";import"./DAocQXXC.chunk.js";import"./Dp_vnjo0.chunk.js";import"./BMba67Uf.chunk.js";import"./CaiGBx50.chunk.js";import"./CV5ioe9U.chunk.js";import"./D1U_fPVs.chunk.js";const b="_column1_1i69v_1",N="_column2_1i69v_4",_="_barChart_1i69v_7",s={column1:b,column2:N,barChart:_},S="reportsVideos.videoOverview",g=c.encloseNamespace(S);function ae(i){var t,o;const a=d(p.video(i.id));n({title:a.data?g("pageTitle",{video:(t=a.data)==null?void 0:t.name}):null}),x((o=a.data)==null?void 0:o.name),j(V(a.data)),v(a);const{hasPermissions:m}=u(),r=!m(l.ViewCustomerAnalytics);return e.jsxs("div",{children:[e.jsx(h,{id:i.id}),e.jsxs("div",{className:"d-flex",children:[e.jsx("div",{className:`pe-2 ${s.column1}`,children:e.jsx(w,{objectId:i.id,useSharerId:r,className:"h-100"})}),e.jsxs("div",{className:`ps-2 ${s.column2}`,children:[e.jsx(f,{objectId:i.id,useSharerId:r,className:s.barChart}),e.jsx("div",{className:"mt-3",children:e.jsx(C,{objectId:i.id,useSharerId:r,layout:"horizontal"})})]})]})]})}export{ae as VideoOverviewView};
2
+ //# sourceMappingURL=DNTR3iW5.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DNTR3iW5.chunk.js","sources":["../../src/apps/videos/views/video-overview/VideoOverviewView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Video } from 'libs/shared/interfaces';\n\nimport { VideoRequests } from 'shared/flight-requests/VideoRequests';\nimport { useHandleVideoError } from 'shared/hooks/UseHandleVideoError';\nimport { useSetHeaderActions } from 'shared/hooks/UseSetHeaderActions';\nimport { useSetHeaderTitle } from 'shared/hooks/UseSetHeaderTitle';\nimport { useGetObjectHeaderActions } from 'shared/utils/HeaderActionUtils';\nimport { EngagementOverviewCardView } from 'shared/views/overview-cards/engagement-overview-card/EngagementOverviewCardView';\nimport { ViewCountBarChartCardView } from 'shared/views/overview-cards/view-count-bar-chart-card/ViewCountBarChartCardView';\nimport { ViewCountPieChartCardView } from 'shared/views/overview-cards/view-count-pie-chart-card/ViewCountPieChartCardView';\n\nimport { VideoNav } from 'apps/videos/components/video-nav/VideoNav';\n\nimport styles from './video-overview.module.scss';\n\nconst namespace = 'reportsVideos.videoOverview';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoOverviewViewProps {\n id: string;\n}\n\nexport function VideoOverviewView(props: VideoOverviewViewProps): JSX.Element {\n const video = Flight.useBasicFetch<Video>(VideoRequests.video(props.id));\n \n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n useSetHeaderTitle(video.data?.name);\n useSetHeaderActions(useGetObjectHeaderActions(video.data));\n useHandleVideoError(video);\n\n const { hasPermissions } = usePermissions();\n\n const scopeBySharerId = !hasPermissions(PermissionName.ViewCustomerAnalytics);\n\n return (\n <div>\n <VideoNav id={props.id} />\n <div className='d-flex'>\n <div className={`pe-2 ${styles.column1}`}>\n <ViewCountPieChartCardView\n objectId={props.id}\n useSharerId={scopeBySharerId}\n className='h-100'\n />\n </div>\n <div className={`ps-2 ${styles.column2}`}>\n <ViewCountBarChartCardView\n objectId={props.id}\n useSharerId={scopeBySharerId}\n className={styles.barChart}\n />\n <div className='mt-3'>\n <EngagementOverviewCardView\n objectId={props.id}\n useSharerId={scopeBySharerId}\n layout='horizontal'\n />\n </div>\n </div>\n </div>\n </div>\n );\n}"],"names":["namespace","getPhrase","LanguageService","VideoOverviewView","props","video","Flight.useBasicFetch","VideoRequests","useSetPageMetadata","_a","useSetHeaderTitle","_b","useSetHeaderActions","useGetObjectHeaderActions","useHandleVideoError","hasPermissions","usePermissions","scopeBySharerId","PermissionName","jsx","VideoNav","jsxs","styles","ViewCountPieChartCardView","ViewCountBarChartCardView","EngagementOverviewCardView"],"mappings":"oiCAuBMA,EAAY,8BACZC,EAAYC,EAAgB,iBAAiBF,CAAS,EAMrD,SAASG,GAAkBC,EAA4C,SAC5E,MAAMC,EAAQC,EAA4BC,EAAc,MAAMH,EAAM,EAAE,CAAC,EAEvEI,EAAmB,CAAE,MAAOH,EAAM,KAAOJ,EAAU,YAAa,CAAE,OAAOQ,EAAAJ,EAAM,OAAN,YAAAI,EAAY,IAAA,CAAM,EAAI,KAAM,EACrGC,GAAkBC,EAAAN,EAAM,OAAN,YAAAM,EAAY,IAAI,EAClCC,EAAoBC,EAA0BR,EAAM,IAAI,CAAC,EACzDS,EAAoBT,CAAK,EAEzB,KAAM,CAAE,eAAAU,CAAA,EAAmBC,EAAA,EAErBC,EAAkB,CAACF,EAAeG,EAAe,qBAAqB,EAE5E,cACG,MAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAS,GAAIhB,EAAM,EAAA,CAAI,EACxBiB,EAAAA,KAAC,MAAA,CAAI,UAAU,SACb,SAAA,CAAAF,MAAC,MAAA,CAAI,UAAW,QAAQG,EAAO,OAAO,GACpC,SAAAH,EAAAA,IAACI,EAAA,CACC,SAAUnB,EAAM,GAChB,YAAaa,EACb,UAAU,OAAA,CAAA,EAEd,SACC,MAAA,CAAI,UAAW,QAAQK,EAAO,OAAO,GACpC,SAAA,CAAAH,EAAAA,IAACK,EAAA,CACC,SAAUpB,EAAM,GAChB,YAAaa,EACb,UAAWK,EAAO,QAAA,CAAA,EAEpBH,EAAAA,IAAC,MAAA,CAAI,UAAU,OACb,SAAAA,EAAAA,IAACM,EAAA,CACC,SAAUrB,EAAM,GAChB,YAAaa,EACb,OAAO,YAAA,CAAA,CACT,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ"}