@clickview/lite 0.75.0-rc.8 → 0.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{7103-lite-fef3024f61.chunk.css → 2878-lite-d8e0bf912a.chunk.css} +1 -1
  3. package/dist/css/{1243-lite-13eda8f6a0.chunk.css → 3615-lite-240342ff8e.chunk.css} +1 -1
  4. package/dist/css/{1867-lite-8baa8af02b.chunk.css → 4630-lite-0157b1c437.chunk.css} +1 -1
  5. package/dist/css/{4203-lite-9ffab89741.chunk.css → 8362-lite-10810fdef2.chunk.css} +1 -1
  6. package/dist/languages/en.json +1 -1
  7. package/dist/scripts/{104-7ee25cbbb8-lite.chunk.js → 104-da7394bcfa-lite.chunk.js} +2 -2
  8. package/dist/scripts/104-da7394bcfa-lite.chunk.js.map +1 -0
  9. package/dist/scripts/1192-bb27568f21-lite.chunk.js +2 -0
  10. package/dist/scripts/1192-bb27568f21-lite.chunk.js.map +1 -0
  11. package/dist/scripts/1199-cf2cb206b5-lite.chunk.js +2 -0
  12. package/dist/scripts/1199-cf2cb206b5-lite.chunk.js.map +1 -0
  13. package/dist/scripts/1502-9836df10cd-lite.chunk.js +2 -0
  14. package/dist/scripts/1502-9836df10cd-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{1610-9ccecc428a-lite.chunk.js → 1610-0edaa98d40-lite.chunk.js} +2 -2
  16. package/dist/scripts/{1610-9ccecc428a-lite.chunk.js.map → 1610-0edaa98d40-lite.chunk.js.map} +1 -1
  17. package/dist/scripts/{7103-3b181ec69b-lite.chunk.js → 2878-487c4a8e1a-lite.chunk.js} +2 -2
  18. package/dist/scripts/2878-487c4a8e1a-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js → 3057-a5bc753736-lite.chunk.js} +1 -1
  20. package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js.map → 3057-a5bc753736-lite.chunk.js.map} +1 -1
  21. package/dist/scripts/3268-7be966dc82-lite.chunk.js +3 -0
  22. package/dist/scripts/3268-7be966dc82-lite.chunk.js.map +1 -0
  23. package/dist/scripts/{1243-72f3d31787-lite.chunk.js → 3615-a0da361aa5-lite.chunk.js} +2 -2
  24. package/dist/scripts/3615-a0da361aa5-lite.chunk.js.map +1 -0
  25. package/dist/scripts/{3872-6fe7371d39-lite.chunk.js → 3872-cf9a6bdae8-lite.chunk.js} +1 -1
  26. package/dist/scripts/{3872-6fe7371d39-lite.chunk.js.map → 3872-cf9a6bdae8-lite.chunk.js.map} +1 -1
  27. package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js +2 -0
  28. package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js.map +1 -0
  29. package/dist/scripts/4208-f22ed7a148-lite.chunk.js +2 -0
  30. package/dist/scripts/4208-f22ed7a148-lite.chunk.js.map +1 -0
  31. package/dist/scripts/4598-e25e9e03d6-lite.chunk.js +2 -0
  32. package/dist/scripts/4598-e25e9e03d6-lite.chunk.js.map +1 -0
  33. package/dist/scripts/{1867-0823a787c3-lite.chunk.js → 4630-4a35ecbf2b-lite.chunk.js} +2 -2
  34. package/dist/scripts/4630-4a35ecbf2b-lite.chunk.js.map +1 -0
  35. package/dist/scripts/6475-f019242ec2-lite.chunk.js +2 -0
  36. package/dist/scripts/6475-f019242ec2-lite.chunk.js.map +1 -0
  37. package/dist/scripts/6550-1d60d863e8-lite.chunk.js +2 -0
  38. package/dist/scripts/6550-1d60d863e8-lite.chunk.js.map +1 -0
  39. package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js → 6695-4ae0acad94-lite.chunk.js} +1 -1
  40. package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js.map → 6695-4ae0acad94-lite.chunk.js.map} +1 -1
  41. package/dist/scripts/6756-3c7f911759-lite.chunk.js +3 -0
  42. package/dist/scripts/6756-3c7f911759-lite.chunk.js.map +1 -0
  43. package/dist/scripts/6790-1695fcf576-lite.chunk.js +2 -0
  44. package/dist/scripts/6790-1695fcf576-lite.chunk.js.map +1 -0
  45. package/dist/scripts/{7148-50ccb48a44-lite.chunk.js → 7148-e314dd9a4e-lite.chunk.js} +2 -2
  46. package/dist/scripts/7148-e314dd9a4e-lite.chunk.js.map +1 -0
  47. package/dist/scripts/7438-35b887a48e-lite.chunk.js +2 -0
  48. package/dist/scripts/7438-35b887a48e-lite.chunk.js.map +1 -0
  49. package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js → 8323-5694456903-lite.chunk.js} +2 -2
  50. package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.map → 8323-5694456903-lite.chunk.js.map} +1 -1
  51. package/dist/scripts/{4203-83f90f92f3-lite.chunk.js → 8362-ed5df8f4fc-lite.chunk.js} +3 -3
  52. package/dist/scripts/8362-ed5df8f4fc-lite.chunk.js.LICENSE.txt +1 -0
  53. package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.map → 8362-ed5df8f4fc-lite.chunk.js.map} +1 -1
  54. package/dist/scripts/{8732-3e8332e620-lite.chunk.js → 8732-dc5182fb69-lite.chunk.js} +1 -1
  55. package/dist/scripts/{8732-3e8332e620-lite.chunk.js.map → 8732-dc5182fb69-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/8856-08061bbec5-lite.chunk.js +2 -0
  57. package/dist/scripts/8856-08061bbec5-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{8957-bc83ea1180-lite.chunk.js → 8957-b3f0dbb85d-lite.chunk.js} +1 -1
  59. package/dist/scripts/{8957-bc83ea1180-lite.chunk.js.map → 8957-b3f0dbb85d-lite.chunk.js.map} +1 -1
  60. package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js +2 -0
  61. package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js.map +1 -0
  62. package/dist/scripts/9134-b0ae877597-lite.chunk.js +2 -0
  63. package/dist/scripts/9134-b0ae877597-lite.chunk.js.map +1 -0
  64. package/dist/scripts/{bundle-58c25f6529.min.js → bundle-941a464ef0.min.js} +3 -3
  65. package/dist/scripts/{bundle-58c25f6529.min.js.map → bundle-941a464ef0.min.js.map} +1 -1
  66. package/package.json +1 -1
  67. package/dist/scripts/104-7ee25cbbb8-lite.chunk.js.map +0 -1
  68. package/dist/scripts/1074-6dadbd8187-lite.chunk.js +0 -2
  69. package/dist/scripts/1074-6dadbd8187-lite.chunk.js.map +0 -1
  70. package/dist/scripts/1192-6ac54d734b-lite.chunk.js +0 -2
  71. package/dist/scripts/1192-6ac54d734b-lite.chunk.js.map +0 -1
  72. package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js +0 -2
  73. package/dist/scripts/1199-1cddf4e0e0-lite.chunk.js.map +0 -1
  74. package/dist/scripts/1243-72f3d31787-lite.chunk.js.map +0 -1
  75. package/dist/scripts/1867-0823a787c3-lite.chunk.js.map +0 -1
  76. package/dist/scripts/3268-aa893d0068-lite.chunk.js +0 -2
  77. package/dist/scripts/3268-aa893d0068-lite.chunk.js.map +0 -1
  78. package/dist/scripts/4208-3ba21abb7c-lite.chunk.js +0 -2
  79. package/dist/scripts/4208-3ba21abb7c-lite.chunk.js.map +0 -1
  80. package/dist/scripts/4598-f5120153c2-lite.chunk.js +0 -2
  81. package/dist/scripts/4598-f5120153c2-lite.chunk.js.map +0 -1
  82. package/dist/scripts/6475-502e390010-lite.chunk.js +0 -2
  83. package/dist/scripts/6475-502e390010-lite.chunk.js.map +0 -1
  84. package/dist/scripts/6550-c621babbcb-lite.chunk.js +0 -2
  85. package/dist/scripts/6550-c621babbcb-lite.chunk.js.map +0 -1
  86. package/dist/scripts/6756-20c0ab9591-lite.chunk.js +0 -3
  87. package/dist/scripts/6756-20c0ab9591-lite.chunk.js.map +0 -1
  88. package/dist/scripts/6790-df00506bec-lite.chunk.js +0 -2
  89. package/dist/scripts/6790-df00506bec-lite.chunk.js.map +0 -1
  90. package/dist/scripts/7103-3b181ec69b-lite.chunk.js.map +0 -1
  91. package/dist/scripts/7148-50ccb48a44-lite.chunk.js.map +0 -1
  92. package/dist/scripts/7438-1162aba8b6-lite.chunk.js +0 -2
  93. package/dist/scripts/7438-1162aba8b6-lite.chunk.js.map +0 -1
  94. package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js +0 -2
  95. package/dist/scripts/8856-8ac95bf4e0-lite.chunk.js.map +0 -1
  96. package/dist/scripts/9003-36ab592cc5-lite.chunk.js +0 -2
  97. package/dist/scripts/9003-36ab592cc5-lite.chunk.js.map +0 -1
  98. package/dist/scripts/9042-3092af11d5-lite.chunk.js +0 -2
  99. package/dist/scripts/9042-3092af11d5-lite.chunk.js.map +0 -1
  100. package/dist/scripts/9134-7037c2c47a-lite.chunk.js +0 -2
  101. package/dist/scripts/9134-7037c2c47a-lite.chunk.js.map +0 -1
  102. /package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.LICENSE.txt → 3268-7be966dc82-lite.chunk.js.LICENSE.txt} +0 -0
  103. /package/dist/scripts/{6756-20c0ab9591-lite.chunk.js.LICENSE.txt → 6756-3c7f911759-lite.chunk.js.LICENSE.txt} +0 -0
  104. /package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.LICENSE.txt → 8323-5694456903-lite.chunk.js.LICENSE.txt} +0 -0
  105. /package/dist/scripts/{bundle-58c25f6529.min.js.LICENSE.txt → bundle-941a464ef0.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/3615-a0da361aa5-lite.chunk.js","mappings":"uPAqBM,SAAUA,EACdC,EACAC,EACAC,GAEA,IAAMC,EAAwB,CAC5BC,gBAAiB,GACjBC,SAAU,GACVC,UAAW,GACXC,UAAW,GACXC,aAAc,IAGVC,GAAe,OAAgBT,GAC/BU,EAAiB,IAAIC,IAAIF,EAAaG,IAAI,SAAAC,GAAC,OAAIA,EAAEC,EAAE,IAEzDb,EAAQc,SAASC,QAAQ,SAAAC,GACvB,IAAMC,EAAc,OAAH,wBACZD,GAAC,CACJE,QAASC,EAAyBpB,EAAaiB,KAG7CC,EAAYC,QAAQE,gBACtBlB,EAAOC,gBAAgBkB,KAAKJ,GAIf,SAAiBD,EAAEhB,SACEsB,SAASC,OAAO,SAAAC,GAAI,MAAC,QAAEf,EAAegB,IAAiB,QAAb,EAAAD,aAAC,EAADA,EAAGE,QAAQ,UAAE,eAAEC,WAAW,GAAEC,SAE7EnB,EAAeoB,MAC1C3B,EAAOI,UAAUe,KAAKJ,GAMpBA,EAAYC,QAAQY,kBAAmB7B,aAAc,EAAdA,EAAgB8B,OAAQ,WACjE7B,EAAOG,UAAUgB,KAAKJ,GAEpBA,EAAYC,QAAQY,iBAAkB7B,aAAc,EAAdA,EAAgB+B,WAAY,eACpE9B,EAAOE,SAASiB,KAAKJ,IARrBf,EAAOK,aAAac,KAAKJ,EAS7B,GAEA,IAAMgB,EAAiB,WAAmB/B,EAAOE,SAAU,SAAAY,GAAC,OAAIA,EAAEE,QAAQY,cAAc,GAClFI,EAAkB,WAAmBhC,EAAOG,UAAW,SAAAW,GAAC,OAAKA,EAAEE,QAAQY,cAAc,GAE3F,OAAO,OAAP,wBACK5B,GAAM,CACTE,SAAU6B,EACV5B,UAAW6B,GAEf,CAEM,SAAUC,EAAmBpC,EAA0BqC,GAE3D,OAD8B,QAAoBrC,GACrBsC,KAAK,SAAAzB,GAAC,OAAIA,EAAEC,GAAGyB,aAAeF,EAAcE,UAAU,EACrF,CAOM,SAAUC,EAAkBC,GAChC,MAAO,GAAP,OAAUA,EAAOb,WAAU,YAAIa,EAAOC,SACxC,CAEM,SAAUC,EACdN,EACAO,EACAC,GAEA,IAAMC,GAAS,QAAiBF,GAC1BG,GAAkB,QAAkBV,EAAeS,GAMzD,OAJwBC,aAAe,EAAfA,EAAiBpB,QAAQqB,MAAM,SAAAvB,G,MACrD,OAA0C,QAAnC,EAAAoB,EAAcL,EAAkBf,WAAG,eAAEwB,UAAW,WACzD,IAGS,aAEiBF,aAAe,EAAfA,EAAiBpB,QAAQqB,MAAM,SAAAvB,G,MACvD,OAA0C,QAAnC,EAAAoB,EAAcL,EAAkBf,WAAG,eAAEwB,UAAW,aACzD,IAGS,mBADT,CAEF,CAEM,SAAUC,EACdC,EACAlD,GAEA,IAAMmD,EAAcnD,EAAQc,SAASc,OACjCwB,EAAa,EACbC,EAAW,EACXC,EAAa,EACblC,EAAkB,EAClBE,EAAW,EA8Bf,OA5BAtB,EAAQc,SAASC,QAAQ,SAAAC,GACvB,IAAM6B,GAAS,QAAiB7B,GAEhC,GAAK6B,EAAL,CAGAvB,GAAsBN,EAAEhB,QAAQ4B,OAEhC,IAAM2B,EAAc,yBAAkDL,EAAaL,GAE/EU,IAAgB,aAClBH,IAEEG,IAAgB,gBAClBD,IAEEC,IAAgB,qBAClBnC,IAEEmC,IAAgB,gBAClBF,GAhBM,CAiBV,GAOO,CACLvB,eALqBqB,EAAc,EACjCC,EAAaD,EACb,EAIFK,QAASJ,EACTC,SAAAA,EACAC,WAAAA,EACAlC,gBAAAA,EACAE,SAAAA,EAEJ,CAEM,SAAUH,EAAyBpB,EAA0B4C,GACjE,IAAME,GAAS,QAAiBF,GAE1BnC,GAAe,OAAgBT,GAE/B0D,EAAkBjD,EAAaoB,OAEjCwB,EAAa,EACbhC,EAAkB,EAEtBZ,EAAaO,QAAQ,SAAAH,GACnB,IAAM2C,EAAc,yBAAkD3C,EAAGiC,GAErEU,IAAgB,aAClBH,IAEEG,IAAgB,qBAClBnC,GACJ,GAEA,IAAMU,EAAiB2B,EAAkB,EAAIL,EAAaK,EAAkB,EAQtEhD,EAAiB,IAAIC,IAAIF,EAAaG,IAAI,SAAAC,GAAC,OAAIA,EAAEC,EAAE,IACnD6C,EAAuBb,EAAOvB,SAASC,OAAO,SAAAC,GAAI,MAAC,QAAEf,EAAegB,IAAiB,QAAb,EAAAD,aAAC,EAADA,EAAGE,QAAQ,UAAE,eAAEC,WAAW,GAAEC,OAE1G,MAAO,CACLyB,SAAUK,EACVpC,SAAUqB,EAAe3C,QAAQ4B,OACjC0B,WAAYG,EAAkBC,EAC9B5B,eAAAA,EACA0B,QAASJ,EACThC,gBAAAA,EAEJ,C,wICxMauC,EAAoB,CAAEC,QAAS,MAAOC,OAAQ,Y,4uBC+C3D,SAASC,EAAqBC,G,YAI5B,MAAO,CAAEC,eAHwB,QAAX,EAAAD,EAAIE,eAAO,eAAEC,YAAa,EAGxBC,gBAFW,QAAX,EAAAJ,EAAIE,eAAO,eAAEC,YAAa,GAAgB,QAAX,EAAAH,EAAIE,eAAO,eAAEG,cAAyB,QAAX,EAAAL,EAAIE,eAAO,eAAEI,aAGjG,CCnDA,SAAgB,cAAgB,QAAQ,gBAAkB,QAAQ,eAAiB,S,sbCuDnF,SAASC,EAAoCC,G,QAC3C,OAAKA,EAAMC,OAAOC,QAIhB,wBACEC,UAAS,UACJ,gBAAoB,mBACtBH,EAAMC,OAAOG,SAA8B,GAAnB,iBAAqB,mBACpB,QAA1B,EAAW,QAAX,EAAAJ,EAAMK,aAAK,eAAEC,qBAAa,QAAI,KAGhC,gBAACC,EAAA,EAAY,CACXC,QAAUR,EAAMC,OAAOQ,eAAiBT,EAAMC,OAAOG,SACjD,gBACA,eAEJ9C,KAAMiD,EAAAG,EAAA,SAfH,gCAmBX,CAyEA,SAASC,EAAgCX,G,gBFpHPY,EAC1BC,EEoHAC,EAAgC,CACpCC,QAASf,EAAMe,QACfC,KAAMhB,EAAMgB,KACZC,eAAgBjB,EAAMkB,WACtBC,aAAcnB,EAAMoB,WACpBC,uBAAwBrB,EAAMqB,uBAC9BC,gBAAiBtB,EAAMsB,gBACvBC,aAAc,CACZC,OAAQxB,EAAMyB,eAAiB,KAI/BzB,EAAM0B,wBACRZ,EAAaS,aAAe,CAAEI,gBFlIAf,EEkIkCZ,EAAM0B,sBFjIlEb,EAAkC,CAAC,EAEzCD,EAAIpE,QAAQ,SAAAF,GAAE,OAAIuE,EAAOvE,IAAM,CAAI,GAE5BuE,KE+HHb,EAAM4B,WACRd,EAAac,SAAW5B,EAAM4B,UAEhC,I,EAAA,EAUI,EAAAC,SAAA,WAAQ,GAAIf,GAAY,Q,EFvKxB,SAA2Cd,GAC/C,IAAI8B,EAA2B,CAC7B,EAAAC,UACA,EAAAC,aACiB,SAAjBhC,EAAMiC,OAAoB,EAAAC,cAAgB,EAAAC,gBAe5C,OAZInC,EAAMoC,iBACRN,EAAU,GAAH,SACFA,GAAO,CACV,EAAAO,cAGArC,EAAMsC,uBACRR,EAAU,GAAH,SACFA,GAAO,CACV,EAAAS,mBAGGT,CACT,CEmJmCU,CAAU,iBAASxC,I,smBATlDyC,EAAa,EAAbA,cACAC,EAAiB,EAAjBA,kBACAC,EAAY,EAAZA,aACAC,EAAI,EAAJA,KACAC,EAAU,EAAVA,WACAC,EAAqB,EAArBA,sBACAC,EAAe,EAAfA,gBACAC,EAAgB,EAAhBA,iBACSxB,EAAM,EAAfyB,MAASzB,OAoBX,SAAS0B,IACP,OAAKN,EAAKvF,QAAU2C,EAAMmD,WACjBnD,EAAMmD,WAERP,EAAKxG,IAAI,SAAAgH,GACdP,EAAWO,GAEX,IAAMjD,EAxBV,SAA2BiD,G,cACrBjD,EAAYkD,EAAA,aAAqC,QAAX,EAAArD,EAAMK,aAAK,eAAE+C,KACnDpD,EAAMK,MAAM+C,IAAIA,GACA,QAAhB,EAAW,QAAX,EAAApD,EAAMK,aAAK,eAAE+C,WAAG,QAAI,GAWxB,OATIA,EAAIE,aAAyB,QAAX,EAAAtD,EAAMK,aAAK,eAAEkD,eACjCpD,GAAa,IAAJ,OAAmB,QAAX,EAAAH,EAAMK,aAAK,eAAEkD,cAE5BvD,EAAMwD,cACRrD,GAAa,mBAEXH,EAAMyD,qBACRtD,GAAa,gBAERA,CACT,CASsBuD,CAAkBN,GAC9BO,IAAe3D,EAAM4D,eAAiB5D,EAAM4D,cAAcR,GAEhE,SAASS,IACF7D,EAAMwD,cAGNxD,EAAM8D,yBACThB,GAAsB,GAExB9C,EAAMwD,YAAYJ,GAClBA,EAAIW,mBAAkB,GACxB,CAeA,SAASC,EAAUhE,EAAkER,GACnF,IAAMyE,EAdR,SAA0BjE,EAAkER,GAC1F,MAAI,mBAAoBQ,GAAS,kBAAmBA,EAC3C,OAAP,sCACKA,EAAMkE,gBACNlE,EAAMmE,eAAa,CACtB,uBAAwB,eACxB3E,IAAAA,IAIG,CAAC,CACV,CAGwB4E,CAAiBpE,EAAOR,GAE9C,OAAImE,EAEA,uBACEU,KAAK,MACLC,IAAKlB,EAAI9G,IAET,gBAACiI,EAAA,EAAO,iBACFvE,EACAiE,EAAa,CACjB9D,UAAWA,EACXqE,QAASb,IAERc,EAAYrB,KAOnB,uCACMpD,EACAiE,EAAa,CACjBK,IAAKlB,EAAI9G,GACT+H,KAAK,MACLlE,UAAWA,EACXuE,QAASb,IAERY,EAAYrB,GAGnB,CAEA,IAAMuB,EAAWvB,EAAIwB,cAErB,OAAI5E,EAAMyD,mBAEN,gBAACoB,EAAA,EAAmB,CAClBvI,GAAI8G,EAAI0B,SAASxI,GACjBgI,IAAKlB,EAAI9G,GACTyI,WAAYJ,EACZK,eAAgB,aACd,SAAChF,EAAyBR,GAAoC,OAAMwE,EAAUhE,EAAOR,EAAI,KAM1FwE,EAAUW,EACnB,EACF,CAyCA,SAASF,EAAYrB,GACnB,OAAOA,EAAI6B,MAAM7I,IAAI,SAAA8I,GACnB,IAAMC,EAjBV,SAA0B/B,EAAa8B,G,QACjCC,EAAgB,GAWpB,MATiC,mBAAX,QAAX,EAAAnF,EAAMK,aAAK,eAAE6E,QACtBC,EAAgBnF,EAAMK,MAAM6E,KAAK9B,EAAK8B,IAEP,iBAAX,QAAX,EAAAlF,EAAMK,aAAK,eAAE6E,QACtBC,EAAgBnF,EAAMK,MAAM6E,MAE1BlF,EAAMoF,eACRD,GAAiB,mBAEZA,CACT,CAI0BE,CAAiBjC,EAAK8B,GAM5C,OACE,qCAAKZ,IAAKY,EAAKjF,OAAO3D,IAAQ4I,EAAKI,eAAc,CAAEnF,UAAWgF,EAAeT,QAL/E,WACE1E,EAAMoF,cAAgBpF,EAAMoF,aAAaF,EAC3C,IAIKA,EAAKK,OAAO,QAGnB,EACF,CAuBA,OArBA,YAAgB,WACTvF,EAAMwF,QAGXxF,EAAMwF,OAAOhE,EACf,EAAG,CAACA,IAEJ,YAAgB,WACTxB,EAAMyF,cAGX1C,EAAgB/C,EAAMyF,aACxB,EAAG,CAACzF,EAAMyF,eAEV,YAAgB,WACTzF,EAAM0F,eAGX1C,EAAiBhD,EAAM0F,cACzB,EAAG,CAAC1F,EAAM0F,eAAiB1F,EAAM0F,cAAcrI,SAG7C,uCAASoF,IAAe,CAAEtC,UAA6B,QAAlB,EAAW,QAAX,EAAAH,EAAMK,aAAK,eAAEsF,aAAK,QAAI,KACzD,uBAAKxF,UAA8B,QAAnB,EAAW,QAAX,EAAAH,EAAMK,aAAK,eAAEuF,cAAM,QAAI,IACpCjD,EAAavG,IAAI,SAAAyJ,G,QAAe,OAC/B,uCAASA,EAAYC,sBAAqB,CAAE3F,UAAiC,QAAtB,EAAW,QAAX,EAAAH,EAAMK,aAAK,eAAE0F,iBAAS,QAAI,KAC9EF,EAAYG,QAAQ5J,IAAI,SAAA6D,G,QAAU,OACjC,uCAASA,EAAOgG,eAAehG,EAAOiG,wBAAuB,CAAE/F,UAAkC,QAAvB,EAAW,QAAX,EAAAH,EAAMK,aAAK,eAAE8F,kBAAU,QAAI,KAClGlG,EAAOsF,OAAO,SAAU,CAAEa,oBAAqB,WAAF,OAAQ,gBAACrG,EAAa,CAACE,OAAQA,EAAQI,MAAOL,EAAMK,OAAS,KACxGJ,EAAqBoG,mBACtB,gBAACtG,EAAa,CAACE,OAAQA,EAAQI,MAAOL,EAAMK,Q,OAOxD,uCAASqC,IAAmB,CAAEvC,UAA4B,QAAjB,EAAW,QAAX,EAAAH,EAAMK,aAAK,eAAEiG,YAAI,QAAI,KAC1DtG,EAAMyD,mBACN,gBAAC8C,EAAA,EAAwB,CACvB3F,IAAKgC,EAAKxG,IAAI,SAAAgH,GAAG,OAAIA,EAAI0B,SAASxI,EAAE,GACpCkK,eAvFV,SAAwBlK,GACtB,IAV+B+D,EAC3BF,EASEsG,EAAW7D,EAAK8D,UAAU,SAAAC,GAAI,OAAIA,EAAK7B,SAASxI,KAAOA,CAAE,GACzD8G,EAAMR,EAAK6D,GAEjB,OACE,uCACMzG,EAAK,CACTG,WAhB2BE,EAgBQL,EAAMK,MAfzCF,EAAY,OAEZE,IACFF,GAAaE,EAAM+C,KAEdjD,GAWHyG,MAAOxH,IAENqF,EAAYrB,GAGnB,EA2EUyD,UAAW7G,EAAM8G,kBAEhB5D,KAGHA,KAKV,CAgBM,SAAU6D,EAA4B/G,GAC1C,IAAQgH,EAA6DhH,EAA7DgH,aAAcC,EAA+CjH,EAA/CiH,gBAAiBC,EAA8BlH,EAA9BkH,WAAeC,EAAU,EAAKnH,EAA/D,iDAEN,EFhWI,WACJ,I,IAAMoH,EAAQ,SAA6B,MAC0D,G,EAA7D,WAAiC7H,EAAqB6H,I,EAAO,E,unBAA7FC,EAAW,KAAEC,EAAc,KAU7BC,EAAoBlE,EAAA,WAR1B,WACEiE,EAAe/H,EAAqB6H,GACtC,EAM4D,KAEtD5H,EAAM,cAAkB,SAACgI,G,MACzBJ,EAAM1H,UACK,QAAb,EAAA0H,EAAM1H,eAAO,SAAE+H,oBAAoB,SAAUF,IAG3CC,IACFF,EAAe/H,EAAqB6H,IACpCI,EAAGE,iBAAiB,SAAUH,IAGhCH,EAAM1H,QAAU8H,CAClB,EAAG,IAQH,OANA,YAAgB,YACVJ,aAAK,EAALA,EAAO1H,UACT4H,EAAe/H,EAAqB6H,GAExC,EAAG,CAACA,IAEG,CAAE5H,IAAAA,EAAK6H,YAAAA,EAAaM,OAzB3B,SAAgBC,G,MACD,QAAb,EAAAR,EAAM1H,eAAO,SAAEkI,SAAS,CAAEC,KAAMD,EAAUE,IAAK,EAAGC,SAAU,UAC9D,EAwBF,CE8TuCC,GAA7BxI,EAAG,EAAHA,IAAK6H,EAAW,EAAXA,YAAaM,EAAM,EAANA,OAE1B,GAAIT,EACF,OACE,gBAAC,KAAU,CACTe,sBAAuB,WAAF,OAAQ,uBAAK9H,UAAW,kBAAyB,EACtE+H,cAAe,IACfC,YAAU,GAEV,gBAACxH,EAAS,iBAAKwG,KAKrB,IAAKH,EACH,OAAO,gBAACrG,EAAS,iBAAKwG,IAExB,SAASiB,EAAcC,GACrBV,EAAOV,GAAiC,UAAdoB,EAAwB,GAAK,GACzD,CAEA,OACE,uBAAKlI,UAAU,6CACb,uBAAKA,UAAU,QACb,uBAAKA,UAAU,qBACb,gBAACmI,EAAAC,EAAY,CACXF,UAAWC,EAAA,OACX5D,QAAS,WAAF,OAAQ0D,EAAc,OAAO,EACpCI,MAAOnB,EAAY5H,gBAErB,uBAAKU,UAAS,UAAK,kBAAsB,YAAIH,EAAMyI,0BAA4BjJ,IAAKA,GAClF,gBAACmB,EAAS,iBAAKwG,KAEjB,gBAACmB,EAAAC,EAAY,CACXF,UAAWC,EAAA,QACX5D,QAAS,WAAF,OAAQ0D,EAAc,QAAQ,EACrCI,MAAOnB,EAAYzH,mBAM/B,CAnDAmH,EAAM2B,aAAe,CACnBzB,gBAAiB,IACjBC,YAAY,EACZjF,OAAQ,O,kBCtZV,IAAY0G,E,iBAAZ,SAAYA,GACV,yBACA,6BACA,yCAEA,2BACA,+BACA,oCACD,CARD,CAAYA,IAAAA,EAAsB,I,iBCAlC,IAAYC,E,iBAAZ,SAAYA,GACV,6BACA,yBACA,oCACD,CAJD,CAAYA,IAAAA,EAAuB,I,mCCE5B,IAAMC,EAAuB,CAClCrN,YAAW,WACT,MAAO,CACLsN,IAAK,mCACLxE,IAAK,mBACLyE,WAAW,EAEf,EAEAC,oBAAmB,WACjB,MAAO,CACLF,IAAK,4CACLxE,IAAK,4BACLyE,WAAW,EAEf,EAEAE,mBAAkB,WAChB,MAAO,CACLH,IAAK,2CACLxE,IAAK,2BACLyE,WAAW,EAEf,EAEAG,WAAU,WACR,MAAO,CACLJ,IAAK,mCACLxE,IAAK,mBACLyE,WAAW,EAEf,EAEAI,MAAK,WACH,MAAO,CACLL,IAAK,6BACLxE,IAAK,aACLyE,WAAW,EAEf,EAEAK,kBAAiB,WACf,MAAO,CACLN,IAAK,0CACLxE,IAAK,0BACLyE,WAAW,EAEf,EAEAM,iBAAgB,WACd,MAAO,CACLP,IAAK,yCACLxE,IAAK,yBACLyE,WAAW,EAEf,E,0rBCnDF,SAASO,IACP,OAAO,iBACT,CAMA,SAASC,EACP5K,EACA6K,GAEA,IAAMC,EAAQ9K,EAAY+K,gBAAgB1M,OAAO,SAAAC,GAAC,OAAIA,EACnD0M,SAAS,GAEZ,OAAIF,EAAMjL,MAAM,SAAAvB,GAAC,OAAKuM,EAAiBvM,EAAEX,GAAG,GACnC,eAEOmN,EAAMjL,MAAM,SAAAvB,GAAI,MAAC,OAAAA,EAAE2M,KAAKC,OAAOC,iBAAwC,QAAtB,EAAAN,EAAiBvM,EAAEX,WAAG,eAAEuN,OAAOC,cAAa,GAC5F,YAAiC,aACpD,CAEA,SAASC,EACPpL,EACA6K,GAEA,OAAI7K,EAAY+K,gBAAgBlL,MAAM,SAAAvB,GAAC,OAAKuM,EAAiBvM,EAAEX,GAAG,GACzD,eAEYqC,EAAY+K,gBAAgB1M,OAAO,SAAAC,GAAC,OAAIA,EAAE0M,SAAS,GAE3CnL,MAAM,SAAAvB,G,MAC3B+M,EAAgBR,EAAiBvM,EAAEX,IAOzC,OAAO0N,aAAa,EAAbA,EAAejM,eAAmB,QAAJ,EAAAd,EAAEX,UAAE,eAAEyB,aAAciM,IAAkB/M,EAAE2M,IAC/E,GACiB,YAAiC,aACpD,CAmCA,SAASK,EAAoBtL,EAA0BL,GACrD,OAAO,SAAChC,GACN,IAAM4N,EAAU5L,aAAM,EAANA,EAAQvB,SAASe,KAAK,SAAAb,GAAC,OAAIA,EAAEX,KAAOqC,EAAYrC,EAAE,GAClE,OAAO4N,aAAO,EAAPA,EAAS/M,QAAQW,KAAK,SAAArB,GAAC,OAAIA,EAAEH,KAAOA,CAAE,EAC/C,CACF,CAWA,SAAS6N,EAA4BxL,EAA0BL,GAC7D,IAAMkL,EAAmBS,EAAoBtL,EAAaL,GAE1D,OAAOyL,EAAwBpL,EAAa,SAACrC,GAC3C,IAAM2B,EAASuL,EAAiBlN,GAChC,OAAO2B,aAAM,EAANA,EAAQmM,IACjB,EACF,CAEA,SAASC,EACP1L,EACAL,GAGA,OA/DF,SACEK,EACA6K,GAEA,IAAIxK,EAwBJ,OArBAL,EAAY+K,gBAAgBlN,QAAQ,SAAAmK,GAClC,IAAMqD,EAAgBR,EAAiB7C,EAAKrK,IAiB5C0C,EAfKgL,EAKDA,EAAcvL,SAAW,YAKzBuL,EAAcvL,SAAW,cAKf,oBAJE,cALA,YALA,cAelB,GAEOO,CACT,CAkCSsL,CAA8B3L,EADZsL,EAAoBtL,EAAaL,GAE5D,CAEA,IAAMiM,EAAe,iBAClB,gBAA+BjB,GAC/B,WAA0BA,GAC1B,iBA7BH,SAAkC3K,EAA0BL,GAC1D,IAAMkL,EAAmBS,EAAoBtL,EAAaL,GAE1D,OAAOiL,EAAqB5K,EAAa,SAACrC,GACxC,IAAM2B,EAASuL,EAAiBlN,GAChC,OAAO2B,aAAM,EAANA,EAAQmM,IACjB,EACF,GAuBG,oBAAmCD,GACnC,iBAAgCE,GAChC,iBAAgCF,GAChC,kBAAiCE,GASvBG,EAA+B,CAC1ClB,cAAAA,EACAzM,gBA5HF,WACE,OAAO,mBACT,EA2HE0M,qBAAAA,EACAQ,wBAAAA,EACAU,qBAXF,SAA8B9L,EAA0BL,GAGtD,OAAOoM,EAFaH,EAAgB5L,EAAYgM,SAE7BhM,EAAaL,EAClC,E,mFCzHMsM,EAAYC,EAAA,mBADA,8BAWZ,SAAUC,EAAyB9K,GACvC,MAAqB,kBAAjBA,EAAMhD,OAEN,gBAAC+N,EAAA,EAAU,CAAC5K,UAAU,gCACpB,gBAAC4K,EAAA,QAAgB,CAACC,IAAKhL,EAAMiL,qBAAsB3N,KAAK,UACxD,gBAACyN,EAAA,OAAe,KACbH,EAAU,6BAKE,qBAAjB5K,EAAMhD,OAEN,gBAAC+N,EAAA,EAAU,CAAC5K,UAAU,gCACpB,gBAAC4K,EAAA,QAAgB,CAACC,IAAKhL,EAAMkL,wBAAyB5N,KAAK,UAC3D,gBAACyN,EAAA,OAAe,KACbH,EAAU,gCAME,iBAAjB5K,EAAMhD,OAEN,gBAAC+N,EAAA,EAAU,CAAC5K,UAAU,gCACpB,gBAAC4K,EAAA,QAAgB,CAACC,IAAKhL,EAAMmL,oBAAqB7N,KAAK,UACvD,gBAACyN,EAAA,OAAe,KACbH,EAAU,4BAOjB,gBAACG,EAAA,EAAU,CAAC5K,UAAU,gCACpB,gBAAC4K,EAAA,QAAgB,CAACC,IAAKhL,EAAMoL,mBAAoB9N,KAAK,UACtD,gBAACyN,EAAA,UAAkB,KAChBH,EAAU,sBAEb,gBAACG,EAAA,OAAe,KACbH,EAAU,0BAInB,C,eC1DM,EAAY,6BAOZ,SAAUS,EAAiCrL,GAC/C,SAASsL,EAAaC,GACpB,IAAMC,EAAgBxL,EAAMhD,SAAWuO,EAAiB,KAAOA,EAE/DvL,EAAMyL,UAAUD,EAClB,CAMA,SAASE,EAAa1O,GACpB,MAAO,wBAAP,OALF,SAA0BA,GACxB,OAAOgD,EAAMhD,SAAWA,CAC1B,CAGiC2O,CAAiB3O,GAAU,qBAAuB,GACnF,CAEA,OACE,uBAAKmD,UAAU,kCACb,qBAAGA,UAAU,WAAU,gBAACyL,EAAA,EAAI,CAACC,UAAW,EAAWC,OAAO,aAC1D,uBAAK3L,UAAU,uCACb,0BAAQA,UAAWuL,EAAa,iBAAkBhH,QAAS,WAAF,OAAQ4G,EAAa,gBAAgB,GAC5F,gBAACM,EAAA,EAAI,CAACC,UAAW,EAAWC,OAAO,wBAErC,0BAAQ3L,UAAWuL,EAAa,oBAAqBhH,QAAS,WAAF,OAAQ4G,EAAa,mBAAmB,GAClG,gBAACM,EAAA,EAAI,CAACC,UAAW,EAAWC,OAAO,2BAErC,0BAAQ3L,UAAWuL,EAAa,gBAAiBhH,QAAS,WAAF,OAAQ4G,EAAa,eAAe,GAC1F,gBAACM,EAAA,EAAI,CAACC,UAAW,EAAWC,OAAO,wBAK7C,C,+iCCnBA,IAAMC,EAA8B,CAClCpG,MAAO,GAAF,OAAK,eAAiB,+CAC3BC,OAAQ,GAAF,OAAK,WAAa,kBACxBG,UAAW,QACXI,WAAY,kDACZ/C,IAAK,SAGD4I,EAAgC,CACpCpG,OAAQ,GAAF,OAAK,WAAa,YACxBG,UAAW,QACXI,WAAY,GAAF,OAAK,+BAAiC,2BAChD/C,IAAK,GAAF,OAAK,QAAU,YAAI,gBACtB8B,KAAM,sBA6BF,SAAU+G,EAAoBjM,G,MAGjC,IAF6B,YAC5B,OAAgBA,EAAMwB,OAAQ,UAC/B,GAFOA,EAAM,KAAE0K,EAAS,KAGqD,IAAhD,WAAiClM,EAAMmM,UAAS,GAAtEnP,EAAM,KAAEyO,EAAS,KAEnBjM,EAAM,SAA6B,MAEnC4M,GAAe,QAAmBpM,EAAMvE,QAASuE,EAAMqM,eAA4B,QAAZ,EAAArM,EAAMsM,cAAM,eAAEC,aACrFC,GAAgB,QACpBxM,EAAMxE,YACNwE,EAAMgJ,oBACNhJ,EAAMvE,QAyBR,SAAuBgR,IACrB,QAAiBjN,EAAIE,QAAS+M,EAChC,EAzBEzM,EAAM0M,cAEF1L,GAAO,QACXhB,EAAMxE,YACNwE,EAAMvE,QACNuE,EAAM0M,aACN1M,EAAMqM,eACNM,EAAA,QAAkBnL,GAClBxE,GAmBF,SAAS4P,EAAWH,IAClB,QAAcjN,EAAIE,QAAS+M,EAC7B,CAEA,OACE,6BACKzM,EAAMvE,QAAQc,SAASc,QAAU,gBAACgO,EAAgC,CAACrO,OAAQA,EAAQyO,UAAWA,KAE/FzK,EAAK3D,QACL,gBAACyN,EAAwB,CACvBM,mBAAoBpL,EAAMoL,mBAC1BD,oBAAqBnL,EAAMmL,oBAC3BD,wBAAyBlL,EAAMkL,wBAC/BD,qBAAsBjL,EAAMiL,qBAC5BjO,OAAQA,MAITgE,EAAK3D,QACN,uBAAKmC,IAAKA,EAAKW,UAAS,gBAAWa,EAAK3D,OAAS,IAAH,OAAO,gBAAsB,KACzE,gBAAC0J,EAAA,EAAK,CACJhG,QAASqL,EACTpL,KAAMA,EACNX,MAAO0L,EACPvI,YAxCV,SAAyB,GAA4C,IAA1CsB,EAAQ,EAARA,SACzB9E,EAAM6M,mBAAmB/H,EAASgI,KAAM9M,EAAMgJ,oBAAoB1M,GACpE,EAuCUyQ,eAAgB,SAAA3J,GAAG,OAAIwJ,EAAWxJ,EAAIqJ,MAAM,EAC5CO,gBAAiB,WAAF,OAAQJ,GAAY,EACnC1L,YAAU,EACVE,YAAU,EACVoE,OAAQ0G,EACRzK,cAAeD,IAEjB,gBAACuF,EAAA,EAAK,CACJhG,QAASyL,EACTxL,KAAMA,EACNX,MAAO2L,EACPhF,cAAY,EACZC,gBAAqC,EAApB,KACjB7B,aAlDV,SAAiCF,GAC/BlF,EAAM6M,mBACJ3H,EAAK9B,IAAI0B,SAASgI,KAClB9M,EAAMgJ,oBAAoB1M,GAC1B4I,EAAKjF,OAAO3D,GAEhB,EA6CUmM,yBAAyB,8CAMrC,C,eCvJA,SAAgB,gBAAkB,SCG5B,SAAUwE,IACd,OACE,2BACE,uBAAK9M,UAAU,kCACb,qBAAGA,UAAU,gDAA8C,KAC3D,uBAAKA,UAAU,gBACb,uBAAKA,UAAU,SACb,uBAAKA,UAAU,4CAA0C,MAE3D,uBAAKA,UAAU,SACb,uBAAKA,UAAU,4CAA0C,MAE3D,uBAAKA,UAAU,SACb,uBAAKA,UAAU,4CAA0C,QAI/D,uBAAKA,UAAU,gBACb,uBAAKA,UAAU,UACb,uBAAKA,UAAS,UAAK,kBAAsB,2CAKnD,CCAM,SAAU+M,EAA4BlN,GAC1C,OACE,iCACIA,EAAMmN,eACN,gBAACF,EAAkC,MAGpCjN,EAAMmN,eACL,gBAAClB,EAAmB,CAClBzQ,YAAawE,EAAMxE,YACnBwN,oBAAqBhJ,EAAMgJ,oBAC3BvN,QAASuE,EAAMvE,QACfiR,aAAc1M,EAAMoN,WACpBP,mBAAoB7M,EAAM6M,mBAC1BzB,mBAAoBiC,EAAA,wBACpB7L,OAAQxB,EAAMwB,OACd2K,SAAUnM,EAAMmM,SAChBE,eAAgBrM,EAAMqM,eACtBpB,qBAAsBoC,EAAA,kBACtBnC,wBAAyBmC,EAAA,qBACzBlC,oBAAqBkC,EAAA,+BACrBf,OAAQtM,EAAMsM,SAKxB,C,6ICrCM1B,EAAY,qBADA,yBAKL0C,EAA6B,CACxCC,KAAM,SACNC,QAAS,iBACTC,SAAU,IACVC,aAAc,gBACdC,UAAW,GACXC,YAAa,GACbC,aAAa,IAAIC,MAAOC,cACxBC,WAAY,KACZC,KAAM,CACJC,kBAAmB,GACnBC,aAAc,IAEhBC,QAAS,IACTC,gBAAiB,EACjBC,QAAS,EACTC,WAAY,GACZC,QAAS,CACPC,kBAAkB,EAClBC,mBAAmB,IAIVC,EAAoD,CAC/DC,MAAOtB,EACPuB,aAAc,KACdC,gBAAiB,KACjBC,WAAY,aAAoB,IAAIjB,KA7BR,EA6BuC,QAAQC,eAGvEiB,EAAsC,CAC1CC,YAAa,cACbC,OAAQ,wCAGGC,EAAsC,CACjD3O,QAAS,eACT4O,MAAOxE,EAAU,gBACjBpG,QAASwK,EACTK,MAAO,WACPlP,UAAW,uB,+WCpCb,IACMyK,EAAY,qBADA,wCAQZ,SAAU0E,EAAoCtP,G,cAC3CqM,G,GAAkB,OAAsB,qB,EAAoC,E,o4BAA9D,IAErB,SAEA,IAAMC,EAAS,kBAA6B,cAEtCtD,EAAsB,kBAA0C,2BAEhExN,EAAc,kBAAkC,mBAEhD+T,EAAwB,+BACxBC,EAAyB,gCAEzB/T,EAAU,kBAA2C,0BAErD0R,EAAgB3R,EAAYwF,MAAQgI,EAAoBhI,QAAUvF,EAAQuF,MAEhF,OAAmB,CAAEyO,MAAOzG,EAAoBhI,KAAO4J,EAAU,YAAa,CAAE8E,MAA+B,QAAxB,EAAA1G,EAAoBhI,YAAI,eAAE4I,OAAU,OAmB3H,IAAM+F,EAAS,OAAH,wBACPJ,GACAC,GAGL,OACE,uBAAKrP,UAAU,QACb,gBAAC,IAAc,CACbyP,MAAM,QAAuD,QAAxB,EAAA5G,EAAoBhI,YAAI,eAAE1E,GAAI,UAAWqT,GAC9ED,MAAO1G,EAAoBhI,KAC3BwO,uBAAwBA,EACxBZ,MAAK,+BACA,MAAmB,CACtBnB,SAAkC,QAAxB,EAAAzE,EAAoBhI,YAAI,eAAE1E,KAEtCuT,WAAY,GACZjU,iBAAe,EACfkU,QAAM,IAGR,gBAAC,IAA2B,CAC1B9G,oBAAqBA,EAAoBhI,KACzC6L,mBAvCN,SACEC,EACAiD,EACAlS,GAEA,eAA2B,CACzBoR,YAAa,cACbC,OAAQ,8CACRS,OAAQ,CACNK,UAAWlD,EAAKxQ,GAChByT,sBAAAA,EACAlS,cAAAA,EACAoS,UAAWnD,EAAKmD,YAGtB,EAyBMzU,YAAaA,EAAYwF,KACzBvF,QAASA,EAAQuF,KACjBmL,SAAUnM,EAAMmM,SAChB3K,OAAQxB,EAAMwB,OACd4L,WAAY3R,EAAQ2R,WACpBf,eAAgBA,EAChBc,cAAeA,EACfb,OAAQA,EAAOtL,OAIvB,C","sources":["file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/constants/DragOverlayStyles.ts","file:///app/packages/libs/shared/src/components/table/TableUtils.ts","file:///app/packages/libs/shared/src/components/table/table.scss","file:///app/packages/libs/shared/src/components/table/Table.tsx","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTable.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/partial-interactive-insights-students.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/constants/MySharesDemoInsights.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/students/InteractiveInsightsStudentsDemoView.tsx"],"sourcesContent":["import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","export const DragOverlayStyles = { opacity: '0.8', cursor: 'grabbing' };","import React from 'react';\nimport { PluginHook, useBlockLayout, useFilters, useFlexLayout, useGlobalFilter, useRowSelect, useSortBy } from 'react-table';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface PluginOptions {\n allowFiltering?: boolean;\n allowGlobalFiltering?: boolean;\n layout?: 'flex' | 'block';\n}\n\nexport function getPlugins<T extends HashObject>(props: PluginOptions): PluginHook<T>[] {\n let plugins: PluginHook<T>[] = [\n useSortBy,\n useRowSelect,\n props.layout === 'flex' ? useFlexLayout : useBlockLayout\n ];\n\n if (props.allowFiltering)\n plugins = [\n ...plugins,\n useFilters\n ];\n\n if (props.allowGlobalFiltering)\n plugins = [\n ...plugins,\n useGlobalFilter\n ];\n\n return plugins;\n}\n\nexport function getSelectedRowIds(ids: string[]): Record<string, boolean> {\n const idHash: Record<string, boolean> = {};\n\n ids.forEach(id => idHash[id] = true);\n\n return idHash;\n}\n\ninterface TableScrollState {\n canScrollLeft: boolean;\n canScrollRight: boolean;\n}\n\nfunction calculateScrollState(ref: React.MutableRefObject<HTMLDivElement>): TableScrollState {\n const canScrollLeft = ref.current?.scrollLeft > 0;\n const canScrollRight = (ref.current?.scrollLeft + 1) < ref.current?.scrollWidth - ref.current?.clientWidth;\n\n return { canScrollLeft, canScrollRight };\n}\n\ninterface UseTableScroll {\n ref: (el: HTMLDivElement) => void;\n scrollState: TableScrollState;\n scroll: (scrollBy: number) => void;\n}\n\nexport function useTableScroll(): UseTableScroll {\n const elRef = React.useRef<HTMLDivElement>(null);\n const [ scrollState, setScrollState ] = React.useState<TableScrollState>(calculateScrollState(elRef));\n\n function onScroll(): void {\n setScrollState(calculateScrollState(elRef));\n }\n\n function scroll(scrollBy: number): void {\n elRef.current?.scrollBy({ left: scrollBy, top: 0, behavior: 'smooth' });\n }\n\n const throttledOnScroll = FunctionHelper.throttle(onScroll, 200);\n\n const ref = React.useCallback((el: HTMLDivElement) => {\n if (elRef.current) {\n elRef.current?.removeEventListener('scroll', throttledOnScroll);\n }\n\n if (el) {\n setScrollState(calculateScrollState(elRef));\n el.addEventListener('scroll', throttledOnScroll);\n }\n\n elRef.current = el;\n }, []);\n\n React.useEffect(() => {\n if (elRef?.current) {\n setScrollState(calculateScrollState(elRef));\n }\n }, [elRef]);\n\n return { ref, scrollState, scroll };\n}","// extracted by mini-css-extract-plugin\nexport default {\"sortIndicator\":\"gFhu0\",\"scrollContainer\":\"sWUp9\",\"scrollbarTrack\":\"Vn2qM\"};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport {\n Cell,\n Column as BaseColumn,\n HeaderGroup,\n HeaderProps as BaseHeaderProps,\n IdType,\n Row,\n SortingRule,\n TableOptions,\n TableRowProps,\n useTable } from 'react-table';\nimport { DragEndEvent } from '@dnd-kit/core';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { PropsWithSortableItemProps, SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { DragOverlayStyles } from 'libs/shared/constants/DragOverlayStyles';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getPlugins, getSelectedRowIds, useTableScroll } from './TableUtils';\n\nimport styles from './table.scss';\n\nexport interface TableTheme {\n table?: string;\n header?: string;\n headerRow?: string;\n headerCell?: string;\n body?: string;\n row?: string | ((row: Row<any>) => string);\n selectedRow?: string;\n cell?: string | ((row?: Row<any>, cell?: Cell<any, any>) => string);\n sortIndicator?: string;\n}\n\nexport type HeaderProps<T extends HashObject> = BaseHeaderProps<T> & {\n renderSortIndicator: () => void;\n}\n\nexport type Column<T extends HashObject> = BaseColumn<T> & {\n hideSortIndicator?: boolean;\n}\n\ninterface SortIndicatorProps<T extends HashObject> {\n column: HeaderGroup<T>;\n theme?: TableTheme;\n}\n\nfunction SortIndicator<T extends HashObject>(props: SortIndicatorProps<T>): JSX.Element {\n if (!props.column.canSort)\n return <></>;\n\n return (\n <span\n className={\n `${styles.sortIndicator}\n ${!props.column.isSorted ? 'text-secondary' : ''}\n ${props.theme?.sortIndicator ?? ''}`\n }\n >\n <SvgContainer\n svgName={(props.column.isSortedDesc || !props.column.isSorted)\n ? cvSvgLibrary.ArrowRight\n : cvSvgLibrary.ArrowLeft\n }\n size={SvgContainerSize.Small}\n />\n </span>\n );\n}\n\ninterface BaseTableProps<T extends HashObject> {\n /**\n * Must be memoized.\n */\n data: T[];\n\n /**\n * Must be memoized.\n * \n * For documentation on Column Options, see https://react-table.tanstack.com/docs/api/useTable#column-options\n */\n columns: Column<T>[];\n\n theme?: TableTheme;\n\n onSelectRow?: (row: Row<T>) => void;\n\n onSelectCell?: (cell: Cell<T>) => void;\n\n onRowMouseOver?: (row: Row<T>) => void;\n\n onRowMouseLeave?: (row: Row<T>) => void;\n\n allowSelectMultipleRows?: boolean;\n\n initialSelectedRowIds?: string[];\n\n getRowId?: (row: T) => string;\n\n getRowAppLink?: (row: Row<T>) => Core.AppLink;\n\n enableSort?: boolean;\n\n manualSort?: boolean;\n\n onSort?: (sortingRule: SortingRule<T>[]) => void;\n \n // Opt-in to utilise react-table's useFilter hook.\n allowFiltering?: boolean;\n\n // Opt-in to utilise react-table's useGlobalFilter hook.\n allowGlobalFiltering?: boolean;\n\n // Use either a flex layout or a block layout. Default is flex.\n layout?: 'flex' | 'block';\n\n // Used by useGlobalFilter hook, needs to be enabled by prop above.\n globalFilter?: string;\n\n // Set initial state of hidden columns in react-table.\n hiddenColumns?: IdType<T>[];\n\n // Determine whether hidden columns should be preserved on a table update event.\n autoResetHiddenColumns?: boolean;\n\n // Determine whether sort order state should be preserved on a table update event.\n autoResetSortBy?: boolean;\n\n // Determine whether rows are sortable by drag and drop\n enableSortableRows?: boolean;\n\n onSortingRowsEnd?: (event: DragEndEvent) => void;\n\n // Set initial state of sorting in react-table\n initialSortBy?: SortingRule<T>[];\n\n emptyState?: JSX.Element;\n}\n \ntype SortableRowProps = PropsWithSortableItemProps<TableRowProps>;\n\nfunction BaseTable<T extends HashObject>(props: BaseTableProps<T>): JSX.Element {\n const tableOptions: TableOptions<T> = {\n columns: props.columns,\n data: props.data,\n disableSortBy: !props.enableSort,\n manualSortBy: props.manualSort,\n autoResetHiddenColumns: props.autoResetHiddenColumns,\n autoResetSortBy: props.autoResetSortBy,\n initialState: {\n sortBy: props.initialSortBy || []\n }\n };\n\n if (props.initialSelectedRowIds)\n tableOptions.initialState = { selectedRowIds: getSelectedRowIds(props.initialSelectedRowIds) };\n\n if (props.getRowId)\n tableOptions.getRowId = props.getRowId;\n\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n toggleAllRowsSelected,\n setGlobalFilter,\n setHiddenColumns,\n state: { sortBy }\n } = useTable<T>(tableOptions, ...getPlugins<T>({ ...props }));\n\n function getTableRowsClass(row: Row<T>) {\n let className = FunctionHelper.isFunction(props.theme?.row)\n ? props.theme.row(row)\n : props.theme?.row ?? '';\n\n if (row.isSelected && props.theme?.selectedRow)\n className += ` ${props.theme?.selectedRow}`;\n\n if (props.onSelectRow)\n className += ' cursor-pointer';\n\n if (props.enableSortableRows)\n className += ' cursor-grab';\n\n return className;\n }\n\n function renderTableRows() {\n if (!rows.length && props.emptyState)\n return props.emptyState;\n \n return rows.map(row => {\n prepareRow(row);\n \n const className = getTableRowsClass(row);\n const rowAppLink = !!props.getRowAppLink && props.getRowAppLink(row);\n\n function onClickRow(): void {\n if (!props.onSelectRow)\n return;\n\n if (!props.allowSelectMultipleRows)\n toggleAllRowsSelected(false);\n \n props.onSelectRow(row);\n row.toggleRowSelected(true);\n }\n\n function getSortableProps(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any) {\n if ('dragAttributes' in props && 'dragListeners' in props) {\n return {\n ...props.dragAttributes,\n ...props.dragListeners,\n 'aria-roledescription': 'Sortable row',\n ref\n };\n }\n\n return {};\n }\n\n function renderRow(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any): JSX.Element {\n const sortableProps = getSortableProps(props, ref);\n\n if (rowAppLink) {\n return (\n <div\n role='row'\n key={row.id}\n >\n <AppLink\n {...props}\n {...sortableProps}\n className={className}\n appLink={rowAppLink}\n >\n {renderCells(row)}\n </AppLink>\n </div>\n );\n }\n\n return (\n <div\n {...props}\n {...sortableProps}\n key={row.id}\n role='row'\n className={className}\n onClick={onClickRow}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n const rowProps = row.getRowProps();\n\n if (props.enableSortableRows) {\n return (\n <SortableItemWrapper\n id={row.original.id}\n key={row.id}\n childProps={rowProps}\n childComponent={React.forwardRef(\n (props: SortableRowProps, ref: React.LegacyRef<HTMLDivElement>) => (renderRow(props, ref))\n )}\n />\n );\n }\n\n return renderRow(rowProps);\n });\n }\n\n function getDragOverlayClassName(theme: TableTheme): string {\n let className = 'g-0 ';\n\n if (theme)\n className += theme.row;\n\n return className;\n }\n\n function getDragOverlay(id: string) {\n const rowIndex = rows.findIndex(item => item.original.id === id);\n const row = rows[rowIndex];\n \n return (\n <div\n {...props}\n className={getDragOverlayClassName(props.theme)}\n style={DragOverlayStyles}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n function getCellClassName(row: Row<T>, cell: Cell<T>): string {\n let cellClassName = '';\n\n if (typeof props.theme?.cell === 'function')\n cellClassName = props.theme.cell(row, cell);\n\n if (typeof props.theme?.cell === 'string')\n cellClassName = props.theme.cell;\n\n if (props.onSelectCell)\n cellClassName += ' cursor-pointer';\n\n return cellClassName;\n }\n\n function renderCells(row: Row<T>): JSX.Element[] {\n return row.cells.map(cell => {\n const cellClassName = getCellClassName(row, cell);\n\n function onClickCell(): void {\n props.onSelectCell && props.onSelectCell(cell);\n }\n\n return (\n <div key={cell.column.id} {...cell.getCellProps()} className={cellClassName} onClick={onClickCell} >\n {cell.render('Cell')}\n </div>\n );\n });\n }\n\n React.useEffect(() => {\n if (!props.onSort)\n return;\n\n props.onSort(sortBy);\n }, [sortBy]);\n\n React.useEffect(() => {\n if (!props.globalFilter)\n return;\n\n setGlobalFilter(props.globalFilter);\n }, [props.globalFilter]);\n\n React.useEffect(() => {\n if (!props.hiddenColumns)\n return;\n\n setHiddenColumns(props.hiddenColumns);\n }, [props.hiddenColumns && props.hiddenColumns.length]);\n\n return (\n <div {...getTableProps()} className={props.theme?.table ?? ''}>\n <div className={props.theme?.header ?? ''}>\n {headerGroups.map(headerGroup => (\n <div {...headerGroup.getHeaderGroupProps()} className={props.theme?.headerRow ?? ''}>\n {headerGroup.headers.map(column => (\n <div {...column.getHeaderProps(column.getSortByToggleProps())} className={props.theme?.headerCell ?? ''}>\n {column.render('Header', { renderSortIndicator: () => <SortIndicator column={column} theme={props.theme} /> })}\n {!(column as Column<T>).hideSortIndicator &&\n <SortIndicator column={column} theme={props.theme} />\n }\n </div>\n ))}\n </div>\n ))}\n </div>\n <div {...getTableBodyProps()} className={props.theme?.body ?? ''}>\n { props.enableSortableRows ? (\n <SortableContainerWrapper\n ids={rows.map(row => row.original.id)}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortingRowsEnd}\n >\n {renderTableRows()}\n </SortableContainerWrapper>\n ) : (\n renderTableRows()\n )}\n </div>\n </div>\n );\n}\n\ninterface TableProps<T extends HashObject> extends BaseTableProps<T> {\n enableSlider?: boolean;\n scrollIncrement?: number;\n scrollContainerClassName?: string;\n scrollable?: boolean;\n initialSortBy?: SortingRule<T>[];\n}\n\nTable.defaultProps = {\n scrollIncrement: 250,\n scrollable: false,\n layout: 'flex'\n};\n\nexport function Table<T extends HashObject>(props: TableProps<T>): JSX.Element {\n const { enableSlider, scrollIncrement, scrollable, ...tableProps } = props;\n\n const { ref, scrollState, scroll } = useTableScroll();\n\n if (scrollable) {\n return (\n <Scrollbars\n renderTrackHorizontal={() => <div className={styles.scrollbarTrack} />}\n autoHeightMax={10000}\n autoHeight\n >\n <BaseTable {...tableProps} />\n </Scrollbars>\n );\n }\n\n if (!enableSlider)\n return <BaseTable {...tableProps} />;\n\n function onClickScroll(direction: 'left' | 'right'): void {\n scroll(scrollIncrement * (direction === 'right' ? 1 : -1));\n }\n\n return (\n <div className='mx-n4 overflow-x-hidden overflow-y-hidden'>\n <div className='px-4'>\n <div className='position-relative'>\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => onClickScroll('left')}\n hide={!scrollState.canScrollLeft}\n />\n <div className={`${styles.scrollContainer} ${props.scrollContainerClassName}`} ref={ref}>\n <BaseTable {...tableProps } />\n </div>\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => onClickScroll('right')}\n hide={!scrollState.canScrollRight}\n />\n </div>\n </div>\n </div>\n );\n}","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result?.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResultsEmptyStateProps {\n filter: FilterStudentsBy;\n notCompletedImageUrl: string;\n helpingHandImageUrl: string;\n markingRequiredImageUrl: string;\n emptyStateImageUrl: string;\n}\n\nexport function StudentResultsEmptyState(props: StudentResultsEmptyStateProps) {\n if (props.filter === 'not_completed') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.notCompletedImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('notCompletedDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n if (props.filter === 'marking_required') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.markingRequiredImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('markingRequiredDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n if (props.filter === 'helping_hand') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.helpingHandImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('helpingHandDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.emptyStateImageUrl} size='small' />\n <EmptyState.Heading>\n {getPhrase('emptyStateHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>\n {getPhrase('emptyStateDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.studentResultsTable';\n\ninterface StudentResultsTableFiltersProps {\n filter: FilterStudentsBy;\n setFilter: (filter: FilterStudentsBy) => void;\n}\n\nexport function StudentResultsTableFilterButtons(props: StudentResultsTableFiltersProps) {\n function toggleFilter(selectedFilter: FilterStudentsBy) {\n const updatedFilter = props.filter === selectedFilter ? null : selectedFilter;\n\n props.setFilter(updatedFilter);\n }\n\n function isFilterSelected(filter: FilterStudentsBy) {\n return props.filter === filter;\n }\n\n function getClassName(filter: FilterStudentsBy) {\n return `btn btn-outline-dark ${isFilterSelected(filter) ? 'bg-dark text-white' : ''}`;\n }\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 mb-0'><Text namespace={namespace} phrase='filters' /></p>\n <div className='d-flex border-start ps-3 ms-3 gap-2'>\n <button className={getClassName('not_completed')} onClick={() => toggleFilter('not_completed')}>\n <Text namespace={namespace} phrase='notCompletedFilter' />\n </button>\n <button className={getClassName('marking_required')} onClick={() => toggleFilter('marking_required')}>\n <Text namespace={namespace} phrase='markingRequiredFilter' />\n </button>\n <button className={getClassName('helping_hand')} onClick={() => toggleFilter('helping_hand')}>\n <Text namespace={namespace} phrase='helpingHandFilter' />\n </button>\n </div>\n </div>\n );\n}","import React from 'react';\nimport { Cell, Row, SortingRule } from 'react-table';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { StudentResultsEmptyState } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState';\nimport { StudentResultsTableFilterButtons } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { FilterStudentsBy, getSortStudents, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport {\n highlightColumns,\n highlightRows,\n RESULTS_COL_WIDTH,\n useGetFixedColumns,\n useGetResultColumns,\n useGetResultsTableData\n} from './StudentResultsTableUtils';\n\nimport styles from './student-results-table.scss';\n\nconst fixedTableTheme: TableTheme = {\n table: `${styles.fixedTable} bg-white rounded-start border border-end-0`,\n header: `${styles.header} border-bottom`,\n headerRow: 'h-100',\n headerCell: 'd-flex align-items-center justify-content-start',\n row: styles.row\n};\n\nconst resultsTableTheme: TableTheme = {\n header: `${styles.header} fw-bold`,\n headerRow: 'h-100',\n headerCell: `${styles.interactionHeaderCellOuter} bg-white border-bottom`,\n row: `${styles.row} ${styles.resultsRow}`,\n cell: styles.resultsCellOuter\n};\n\ninterface StudentResultsTableProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\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 config?: Config;\n selectedStudentId?: string;\n emptyStateImageUrl?: string;\n notCompletedImageUrl?: string;\n helpingHandImageUrl?: string;\n markingRequiredImageUrl?: string;\n anonymiseUsers?: boolean;\n sortBy?: SortStudentsBy;\n filterBy?: FilterStudentsBy;\n viewStudentResults: (\n student: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n}\n\nexport function StudentResultsTable(props: StudentResultsTableProps): JSX.Element {\n const [ sortBy, setSortBy ] = React.useState<SortingRule<StudentResultsWithSummary>[]>(\n getSortStudents(props.sortBy, 'score')\n );\n const [ filter, setFilter ] = React.useState<FilterStudentsBy>(props.filterBy);\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n const fixedColumns = useGetFixedColumns(props.results, props.anonymiseUsers, props.config?.imageCdnUrl);\n const resultColumns = useGetResultColumns(\n props.interactive,\n props.interactiveMetadata,\n props.results,\n onColumnHover,\n props.refreshTable\n );\n const data = useGetResultsTableData(\n props.interactive,\n props.results,\n props.refreshTable,\n props.anonymiseUsers,\n ArrayHelper.first(sortBy),\n filter\n );\n\n function onSelectStudent({ original }: Row<StudentResultsWithSummary>): void {\n props.viewStudentResults(original.user, props.interactiveMetadata.id);\n }\n\n function onSelectStudentResponse(cell: Cell<StudentResultsWithSummary>): void {\n props.viewStudentResults(\n cell.row.original.user,\n props.interactiveMetadata.id,\n cell.column.id\n );\n }\n\n function onColumnHover(index?: number): void {\n highlightColumns(ref.current, index);\n }\n\n function onRowHover(index?: number): void {\n highlightRows(ref.current, index);\n }\n\n return (\n <div>\n {!!props.results.students.length && <StudentResultsTableFilterButtons filter={filter} setFilter={setFilter} />}\n\n {!data.length && (\n <StudentResultsEmptyState\n emptyStateImageUrl={props.emptyStateImageUrl}\n helpingHandImageUrl={props.helpingHandImageUrl}\n markingRequiredImageUrl={props.markingRequiredImageUrl}\n notCompletedImageUrl={props.notCompletedImageUrl}\n filter={filter}\n />\n )}\n\n {!!data.length && (\n <div ref={ref} className={`d-flex${data.length ? ` ${styles.hasResults}` : ''}`}>\n <Table\n columns={fixedColumns}\n data={data}\n theme={fixedTableTheme}\n onSelectRow={onSelectStudent}\n onRowMouseOver={row => onRowHover(row.index)}\n onRowMouseLeave={() => onRowHover()}\n enableSort\n manualSort\n onSort={setSortBy}\n initialSortBy={sortBy}\n />\n <Table\n columns={resultColumns}\n data={data}\n theme={resultsTableTheme}\n enableSlider\n scrollIncrement={RESULTS_COL_WIDTH * 8}\n onSelectCell={onSelectStudentResponse}\n scrollContainerClassName='rounded-end border border-start-0 border'\n />\n </div>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"qSeTe\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-students.scss';\n\nexport function PartialInteractiveInsightsStudents() {\n return (\n <div>\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 px-4 mb-0 me-4 partial-loading-background'>&nbsp;</p>\n <div className='row g-2 w-50'>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n </div>\n </div>\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { StudentResultsTable } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTable';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PartialInteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents';\n\ninterface InteractiveInsightsStudentsProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n isFetching: boolean;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n anonymiseUsers: boolean;\n config: Config;\n viewStudentResults: (\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n hasDataLoaded: boolean;\n}\n\nexport function InteractiveInsightsStudents(props: InteractiveInsightsStudentsProps) {\n return (\n <>\n {!props.hasDataLoaded &&\n <PartialInteractiveInsightsStudents />\n }\n\n {props.hasDataLoaded &&\n <StudentResultsTable\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n refreshTable={props.isFetching}\n viewStudentResults={props.viewStudentResults}\n emptyStateImageUrl={ImageUrls.Insights.NO_RESPONSES}\n sortBy={props.sortBy}\n filterBy={props.filterBy}\n anonymiseUsers={props.anonymiseUsers}\n notCompletedImageUrl={ImageUrls.Insights.JIGSAW}\n markingRequiredImageUrl={ImageUrls.Insights.CLIPBOARD}\n helpingHandImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n config={props.config}\n />\n }\n </>\n );\n}","import { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { MySharesTableData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\n\nconst namespace = 'myShares.demoInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEMO_INSIGHT_DAYS_AGO = 7;\n\nexport const DEMO_INSIGHTS_SHARE: Share = {\n type: ShareType.Link,\n privacy: SharePrivacy.JustMySchool,\n objectId: '0',\n objectTypeId: MasterType.Interactive,\n viewCount: 28,\n accessCount: 15,\n dateCreated: new Date().toISOString(),\n expireDate: null,\n link: {\n shortenedEmbedUrl: '',\n shortenedUrl: ''\n },\n shareId: '0',\n ownerCustomerId: 0,\n ownerId: 0,\n recipients: [],\n options: {\n preventScrubbing: false,\n immediateFeedback: false\n }\n};\n\nexport const DEMO_INSIGHTS_SHARE_TABLE_DATA: MySharesTableData = {\n share: DEMO_INSIGHTS_SHARE,\n sharedObject: null,\n shareRecipients: null,\n dateShared: DateHelper.subtract(new Date(), DEMO_INSIGHT_DAYS_AGO, 'days').toISOString()\n};\n\nconst DEMO_INSIGHTS_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n};\n\nexport const DEMO_INSIGHTS_ACTION: ActionOptions = {\n svgName: cvSvgLibrary.Analytics,\n label: getPhrase('demoInsights'),\n appLink: DEMO_INSIGHTS_APPLINK,\n group: 'insights',\n className: 'btn btn-outline-dark'\n};\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents';\nimport { DEMO_INSIGHTS_SHARE } from 'apps/my-shares/constants/MySharesDemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.interactiveInsightsStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsStudentsViewProps {\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n}\n\nexport function InteractiveInsightsStudentsDemoView(props: InteractiveInsightsStudentsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(InsightsDemoRequests.interactiveMetadata());\n\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data;\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n function viewStudentResults(\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENT_RESULTS_DEMO,\n params: {\n studentId: user.id,\n interactiveMetadataId,\n interactionId,\n sessionId: user.sessionId\n }\n });\n }\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n return (\n <div className='px-3'>\n <InsightsHeader\n tabs={getInsightsDemoInteractiveTabs(interactiveMetadata.data?.id, 'results', params)}\n video={interactiveMetadata.data}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n share={{\n ...DEMO_INSIGHTS_SHARE,\n objectId: interactiveMetadata.data?.id\n }}\n yearGroups={[]}\n markingRequired\n isDemo\n />\n\n <InteractiveInsightsStudents\n interactiveMetadata={interactiveMetadata.data}\n viewStudentResults={viewStudentResults}\n interactive={interactive.data}\n results={results.data}\n filterBy={props.filterBy}\n sortBy={props.sortBy}\n isFetching={results.isFetching}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n config={config.data}\n />\n </div>\n );\n}"],"names":["groupStudents","interactive","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","map","i","id","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","filter","a","has","answers","questionId","length","size","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","resultId","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","every","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","numInteractions","answeredInteractions","DragOverlayStyles","opacity","cursor","calculateScrollState","ref","canScrollLeft","current","scrollLeft","canScrollRight","scrollWidth","clientWidth","SortIndicator","props","column","canSort","className","isSorted","theme","sortIndicator","SvgContainer","svgName","isSortedDesc","S","BaseTable","ids","idHash","tableOptions","columns","data","disableSortBy","enableSort","manualSortBy","manualSort","autoResetHiddenColumns","autoResetSortBy","initialState","sortBy","initialSortBy","initialSelectedRowIds","selectedRowIds","getRowId","useTable","plugins","useSortBy","useRowSelect","layout","useFlexLayout","useBlockLayout","allowFiltering","useFilters","allowGlobalFiltering","useGlobalFilter","getPlugins","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","toggleAllRowsSelected","setGlobalFilter","setHiddenColumns","state","renderTableRows","emptyState","row","FunctionHelper","isSelected","selectedRow","onSelectRow","enableSortableRows","getTableRowsClass","rowAppLink","getRowAppLink","onClickRow","allowSelectMultipleRows","toggleRowSelected","renderRow","sortableProps","dragAttributes","dragListeners","getSortableProps","role","key","AppLink","appLink","renderCells","onClick","rowProps","getRowProps","SortableItemWrapper","original","childProps","childComponent","cells","cell","cellClassName","onSelectCell","getCellClassName","getCellProps","render","onSort","globalFilter","hiddenColumns","table","header","headerGroup","getHeaderGroupProps","headerRow","headers","getHeaderProps","getSortByToggleProps","headerCell","renderSortIndicator","hideSortIndicator","body","SortableContainerWrapper","getDragOverlay","rowIndex","findIndex","item","style","onSortEnd","onSortingRowsEnd","Table","enableSlider","scrollIncrement","scrollable","tableProps","elRef","scrollState","setScrollState","throttledOnScroll","el","removeEventListener","addEventListener","scroll","scrollBy","left","top","behavior","useTableScroll","renderTrackHorizontal","autoHeightMax","autoHeight","onClickScroll","direction","WidgetButton","W","hide","scrollContainerClassName","defaultProps","InteractionCorrectness","InteractiveAnswerStatus","InsightsDemoRequests","url","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","name","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","getPhrase","LanguageService","StudentResultsEmptyState","EmptyState","src","notCompletedImageUrl","markingRequiredImageUrl","helpingHandImageUrl","emptyStateImageUrl","StudentResultsTableFilterButtons","toggleFilter","selectedFilter","updatedFilter","setFilter","getClassName","isFilterSelected","Text","namespace","phrase","fixedTableTheme","resultsTableTheme","StudentResultsTable","setSortBy","filterBy","fixedColumns","anonymiseUsers","config","imageCdnUrl","resultColumns","index","refreshTable","ArrayHelper","onRowHover","viewStudentResults","user","onRowMouseOver","onRowMouseLeave","PartialInteractiveInsightsStudents","InteractiveInsightsStudents","hasDataLoaded","isFetching","ImageUrls","DEMO_INSIGHTS_SHARE","type","privacy","objectId","objectTypeId","viewCount","accessCount","dateCreated","Date","toISOString","expireDate","link","shortenedEmbedUrl","shortenedUrl","shareId","ownerCustomerId","ownerId","recipients","options","preventScrubbing","immediateFeedback","DEMO_INSIGHTS_SHARE_TABLE_DATA","share","sharedObject","shareRecipients","dateShared","DEMO_INSIGHTS_APPLINK","application","action","DEMO_INSIGHTS_ACTION","label","group","InteractiveInsightsStudentsDemoView","audienceAppLinkParams","dateRangeAppLinkParams","title","video","params","tabs","yearGroups","isDemo","interactiveMetadataId","studentId","sessionId"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
1
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3872],{27150:(e,t,n)=>{n.d(t,{A:()=>w,$:()=>S});var r=n(32735),a=n(23481),i=n(81886),s=n(15611),l=n(83345),o="userManager.userWizardBackButtons";function c(e){return"status"===e.currentStep?r.createElement(r.Fragment,null):r.createElement(s.F,{className:"btn btn-link me-2",appLink:e.appLinks.userManager},r.createElement(l.x,{namespace:o,phrase:"cancel"}))}var u=n(98269),d=n(24453),m=n(45541),p=n(96728),v="userManager.userWizardHeader";function f(e){var t=(0,m.V)(),n=t.duplicateSets,a=t.hasExistingUsers,i=r.useContext(p.e),o=i.disableNext,c=i.onClickConfirm,f=!!(null==n?void 0:n.length),g=d.O.getCurrentContext().appLink;return g.action===e.appLinks.userUploadStatus.polling.action||g.action===e.appLinks.userUploadStatus.complete.action?r.createElement(r.Fragment,null):function(){switch(g.action){case e.appLinks.userUploadPopup.action:case e.appLinks.userUploadReviewAccounts.action:return!f&&!a;case e.appLinks.userUploadFixDuplicates.action:case e.appLinks.userUploadReviewExistingAccounts.action:return!a;default:return!0}}()?r.createElement(u.Z,{className:o?"disabled":"",variant:"dark",onClick:c,disabled:o},r.createElement(l.x,{namespace:v,phrase:"create"})):r.createElement(s.F,{className:"btn btn-dark ".concat(o?"disabled":""),appLink:function(){switch(g.action){case e.appLinks.userUploadReviewAccounts.action:if(f)return e.appLinks.userUploadFixDuplicates;if(a&&e.canAddExistingUsers)return e.appLinks.userUploadReviewExistingAccounts;case e.appLinks.userUploadFixDuplicates.action:if(a&&e.canAddExistingUsers)return e.appLinks.userUploadReviewExistingAccounts;case e.appLinks.userUploadReviewExistingAccounts.action:if(e.canAddExistingUsers)return e.appLinks.userUploadConfirmation;default:return null}}(),disabled:o},r.createElement(l.x,{namespace:v,phrase:"next"}))}var g=n(19717),h=n(17291),E=n(79352),k=n(76881),b=n(89476);const x={wizardContent:"hHr3C"};var y="userManager.bulkUserUploadWizardLayout",w="bulk:user:upload:nav:lock";function S(e){var t=(0,m.V)(),n=t.users,s=t.setUsers,l=(0,b.f)();return r.useEffect(function(){if(n)return l.lock({id:w,title:a.T.getPhrase(y,"navLockTitle"),text:a.T.getPhrase(y,"navLockBody"),appLinkWhitelist:g.b.getWizardAppLinks(e.appLinks),onConfirmUnlock:function(){s(null)}}),function(){l.unlock(w)};i.Q.C$.trigger(e.appLinks.userManager,{replace:!0})},[]),r.useEffect(function(){(null==n?void 0:n.length)||(l.unlock(w),i.Q.C$.trigger(e.appLinks.userManager,{replace:!0}))},[null==n?void 0:n.length]),n?r.createElement(p.D,null,r.createElement("div",{className:"px-3"},r.createElement(h.C,{title:a.T.getPhrase(y,"bulkUpload"),currentStep:e.currentStep,loaded:!0,continueButton:r.createElement(f,{currentStep:e.currentStep,appLinks:e.appLinks,canAddExistingUsers:e.canAddExistingUsers}),backButton:r.createElement(c,{currentStep:e.currentStep,appLinks:e.appLinks}),breadcrumbs:[{name:a.T.getPhrase(y,"settingsBreadcrumb"),appLink:e.appLinks.settings},{name:a.T.getPhrase(y,e.userType===k.Y.Learner?"studentManager":"staffManager"),appLink:e.appLinks.userManager},{name:a.T.getPhrase(y,"bulkUpload"),active:!0}]}),r.createElement("div",{className:"row g-0"},r.createElement("div",{className:"col-2"},r.createElement(E.a,{steps:g.b.getSteps(e.userType,e.canAddExistingUsers),currentStep:e.currentStep})),r.createElement("div",{className:"col-10 ".concat(x.wizardContent)},e.children)))):r.createElement(r.Fragment,null)}},42949:(e,t,n)=>{n.d(t,{M:()=>U});var r=n(32735),a=n(89965),i=n(83914),s=n(83345),l=n(36532),o=n(61254),c=n(76881),u=n(35223),d=n(23481),m=n(81886),p=n(26055),v=n(43820),f=n(39739),g=n(97958),h=n(45541);const E={center:"_dm7C"};var k="userManager.invalidListingsEmptyState";function b(e){var t=(0,h.V)(),n=t.users,a=t.existingUsersHash,i=r.useContext(p.A),l=f.P.getNewDuplicates(n),o=(null==l?void 0:l.length)||!!Object.keys(a).length;return r.createElement(s.D.Provider,{value:k},r.createElement("div",{className:"position-absolute ".concat(E.center)},r.createElement(g.u,null,r.createElement(g.u.Image,{src:e.imageUrl,size:i===v.a.Primary?"small":"medium"}),r.createElement(g.u.Heading,null,r.createElement(s.x,{phrase:e.userType===c.Y.Learner?"headingStudents":"headingStaff"})),r.createElement(g.u.Info,{className:"w-75"},r.createElement(s.x,{phrase:o?"infoNext":"infoSave"})),r.createElement(g.u.Cta,{text:d.T.getPhrase(k,o?"next":"create"),onClick:function(){if(o)return(null==l?void 0:l.length)?void m.Q.C$.trigger(e.appLinks.userUploadFixDuplicates):void m.Q.C$.trigger(e.appLinks.userUploadReviewExistingAccounts);e.onClickCreate()}}))))}var x=n(70226),y=n(11607);const w={stickyHeader:"GIWSN",staffTable:"VmrTm",checkbox:"a8Xcm",firstName:"BMRCI",surname:"h0EWu",email:"Lymqy",username:"KUiPJ",learnerTable:"isWDb",yearGroup:"lO5gG",password:"vfXfh"};var S=44;function N(e){var t;return r.createElement("div",{className:(t="".concat(e.className," p-2 d-table-cell"),e.error?"".concat(t," text-danger"):e.emptyStateText&&!e.data?"".concat(t," fst-italic"):"".concat(t," text-wrap"))},r.createElement("span",{className:e.yearGroup&&!e.error?"bg-white border border-dark rounded-pill px-2 text-nowrap":"d-flex align-items-center"},e.error?e.error:e.data?e.data:e.emptyStateText?e.emptyStateText:"",e.tooltip&&r.createElement(l.u,{title:e.tooltip,spanHack:!0},r.createElement(i.x,{size:i.S.Small,svgName:u.vn.Info,className:"text-danger ms-1 svg-container"}))))}function C(e){var t,n=e.user,s=e.errorCodes,l=e.onClickEdit,o=e.onClickDelete,m=e.userType===c.Y.Learner?"userManager.studentReviewTable":"userManager.staffReviewTable",p=f.P.getMinimumPasswordLength(e.passwordPolicy,e.userType,e.user.masterRole),v=f.P.getErrorMessages(s,p,!0,e.localErrorMessage),g=!!l||!!o,h=d.T.encloseNamespace(m),E=!!s.find(function(e){return e===x.x.UsernameInvalid}),k=e.userType===c.Y.Learner?w.learnerTable:w.staffTable;return r.createElement("li",{className:"d-table-row ".concat(k),style:{height:"".concat(S,"px")}},r.createElement("div",{className:"p-2 d-flex justify-content-end d-table-cell ".concat(w.checkbox)},r.createElement(a.X,{id:"bulk-remove-".concat(n.lookupId),onChange:function(){return e.onToggleCheckbox(n.lookupId)},checked:e.isChecked})),r.createElement(N,{data:n.firstName,error:v.firstName,className:w.firstName}),r.createElement(N,{data:n.surname,error:v.surname,className:w.surname}),r.createElement(N,{data:n.email,error:v.email,emptyStateText:h("noEmail"),className:w.email}),r.createElement(N,{data:n.username,error:v.username,emptyStateText:h("noUsername"),tooltip:E&&h("invalidUsernameTooltip"),className:w.username}),e.userType===c.Y.Learner&&r.createElement(N,{data:null===(t=n.masterYearGroup)||void 0===t?void 0:t.name,error:v.masterYearGroup,className:w.yearGroup,yearGroup:!0}),e.showPasswordField&&r.createElement(N,{data:n.password,error:v.password,emptyStateText:n.email?h("passwordEmailActivation"):h("noPassword"),className:w.password}),g&&r.createElement("div",{className:"p-2 d-flex justify-content-end d-table-cell"},l&&r.createElement(y.L,{className:"me-2 cursor-pointer",onClick:function(){return l(n)}},r.createElement(i.x,{svgName:u.vn.Edit,title:h("editTooltip"),tooltipSpanHack:!0,tooltipPlacement:"top"})),o&&r.createElement(y.L,{className:"cursor-pointer",onClick:function(){return o([n.lookupId])}},r.createElement(i.x,{svgName:u.vn.Close,title:h("removeTooltip"),tooltipSpanHack:!0,tooltipPlacement:"top"}))))}function U(e){var t,n,d,m=e.userType===c.Y.Learner?"userManager.studentReviewTable":"userManager.staffReviewTable",p=!!e.onClickEdit||!!e.onClickDelete,v=e.userType===c.Y.Learner?w.learnerTable:w.staffTable,f="p-2 text-nowrap bg-white d-table-cell fw-semibold ".concat(w.stickyHeader);return r.createElement(s.D.Provider,{value:m},r.createElement(o.s,{items:e.users,rowHeight:S,getComponent:function(t){var n;return e.showInvalidEmptyState?r.createElement(r.Fragment,{key:t.lookupId}):r.createElement(C,{key:t.lookupId,user:t,userType:e.userType,errorCodes:(null===(n=e.invalidUsers[t.lookupId])||void 0===n?void 0:n.errorCodes)||[],onClickEdit:e.onClickEdit,onClickDelete:e.onClickDelete,showPasswordField:e.showPasswordField,passwordPolicy:e.passwordPolicy,onToggleCheckbox:e.onToggleCheckbox,isChecked:e.isChecked(t.lookupId),localErrorMessage:e.localErrorMessage})},staticComponentAboveRows:r.createElement(r.Fragment,null,r.createElement("div",{className:"border-bottom align-items-center d-table-row ".concat(v)},r.createElement("div",{className:"".concat(f," ").concat(w.checkbox)},r.createElement(a.X,{id:e.checkboxId,name:"users-review-checkbox",checked:e.bulkCheckboxChecked,onChange:e.onToggleBulkCheckbox,indeterminate:e.bulkIndeterminate,className:w.checkbox,disabled:e.disableBulkCheckbox})),r.createElement("div",{className:"".concat(f," ").concat(w.firstName)},r.createElement(s.x,{phrase:"firstName"}),(null===(t=e.tooltips)||void 0===t?void 0:t.firstName)&&r.createElement("span",{className:"d-inline-block"},r.createElement(l.u,{title:e.tooltips.firstName,spanHack:!0},r.createElement(i.x,{size:i.S.Small,svgName:u.vn.Info,className:"ms-1 svg-container"})))),r.createElement("div",{className:"".concat(f," ").concat(w.surname)},r.createElement(s.x,{phrase:"lastName"}),(null===(n=e.tooltips)||void 0===n?void 0:n.lastName)&&r.createElement("span",{className:"d-inline-block"},r.createElement(l.u,{title:e.tooltips.lastName,spanHack:!0},r.createElement(i.x,{size:i.S.Small,svgName:u.vn.Info,className:"ms-1 svg-container"})))),r.createElement("div",{className:"".concat(f," ").concat(w.email)},r.createElement(s.x,{phrase:"email"})),r.createElement("div",{className:"".concat(f," ").concat(w.username)},r.createElement(s.x,{phrase:"username"}),(null===(d=e.tooltips)||void 0===d?void 0:d.username)&&r.createElement("span",{className:"d-inline-block"},r.createElement(l.u,{title:e.tooltips.username,spanHack:!0},r.createElement(i.x,{size:i.S.Small,svgName:u.vn.Info,className:"ms-1 svg-container"})))),e.userType===c.Y.Learner&&r.createElement("div",{className:"".concat(f," ").concat(w.yearGroup)},r.createElement(s.x,{phrase:"yearGroup"})),e.showPasswordField&&r.createElement("div",{className:"".concat(f," ").concat(w.password)},r.createElement(s.x,{phrase:"password"})),p&&r.createElement("div",{className:"".concat(f)}," ")),r.createElement("li",{className:"d-none"}))}),e.showInvalidEmptyState&&r.createElement(b,{onClickCreate:e.onClickCreate,appLinks:e.appLinks,imageUrl:e.emptyStateImageUrl,userType:e.userType}))}},45541:(e,t,n)=>{n.d(t,{V:()=>u});var r=n(2948),a=n(38143),i=n(39739);function s(e){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s(e)}function l(e,t,n){return(t=function(e){var t=function(e){if("object"!=s(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=s(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==s(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t){return Object.keys(e||{}).reduce(function(n,r){return t[r]||(n[r]=e[r]),n},{})}var u=function(){var e,t,n,s=(t=(0,r.D)(a.g.BULK_USER_UPLOAD),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,s,l=[],o=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);o=!0);}catch(e){c=!0,a=e}finally{try{if(!o&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(c)throw a}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=s[0],d=s[1];function m(e){var t=i.P.getNewDuplicates(e);d("duplicateSets",t)}return{users:null==u?void 0:u.users,invalidUsers:null==u?void 0:u.invalidUsers,hasValidatedUsers:!!(null==u?void 0:u.invalidUsers),existingUsersHash:(null==u?void 0:u.existingUsersHash)||{},hasExistingUsers:!!Object.keys((null==u?void 0:u.existingUsersHash)||{}).length,existingUserToAdd:null==u?void 0:u.existingUserToAdd,duplicateSets:null==u?void 0:u.duplicateSets,newUsers:(null===(e=null==u?void 0:u.users)||void 0===e?void 0:e.filter(function(e){var t;return!(null===(t=null==u?void 0:u.existingUsersHash)||void 0===t?void 0:t[e.lookupId])}))||[],setUsers:function(e){d({users:e,invalidUsers:null,existingUsersHash:null}),m(e)},setInvalidUsers:function(e){return d("invalidUsers",e)},setExistingUsers:function(e){return d("existingUsersHash",e)},updateUser:function(e){var t=u.users.map(function(t){return t.lookupId!==e.lookupId?t:e});d({users:t,invalidUsers:c(null==u?void 0:u.invalidUsers,l({},e.lookupId,!0)),existingUsersHash:null==u?void 0:u.existingUsersHash}),m(t)},deleteUsers:function(e){var t,n=e.reduce(function(e,t){return e[t]=!0,e},{}),r=u.users.filter(function(e){return!n[e.lookupId]});d({users:r,invalidUsers:c(null==u?void 0:u.invalidUsers,n),existingUsersHash:c(null==u?void 0:u.existingUsersHash,n),existingUserToAdd:null===(t=null==u?void 0:u.existingUserToAdd)||void 0===t?void 0:t.filter(function(e){return!!(null==u?void 0:u.existingUsersHash[e.lookupId])})}),m(r)}}}},61254:(e,t,n)=>{n.d(t,{s:()=>l});var r=n(32735),a=n(42648);function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,s,l=[],o=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);o=!0);}catch(e){c=!0,a=e}finally{try{if(!o&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(c)throw a}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var l=r.forwardRef(function(e,t){var n=i(r.useState(e.containerHeight||0),2),s=n[0],l=n[1],o=i(r.useState(0),2),c=o[0],u=o[1],d=r.useRef(null);r.useEffect(function(){var t,n;e.containerHeight||l(null!==(n=null===(t=d.current)||void 0===t?void 0:t.clientHeight)&&void 0!==n?n:0)},[d.current]);var m,p,v,f=e.items.length,g=Math.ceil(s/e.rowHeight),h=e.rowHeight*f,E=Math.max(0,Math.floor(c/e.rowHeight)-g),k=Math.min(f,E+3*g);return r.createElement("div",{style:(v=null!==(p=null===(m=d.current)||void 0===m?void 0:m.getBoundingClientRect().top)&&void 0!==p?p:0,{height:e.containerHeight||"calc(100vh - ".concat(window.pageYOffset+v+30,"px)"),minHeight:"".concat(5*e.rowHeight,"px"),overflow:"auto"}),ref:d},r.createElement(a.$B,{onScroll:function(e){u(e.currentTarget.scrollTop)},autoHeightMin:h,autoHeightMax:h,ref:t},r.createElement("div",{style:{height:h,paddingTop:E*e.rowHeight}},r.createElement("ul",{className:"w-100 position-relative d-table striped-list list-unstyled no-full-width"},!!e.staticComponentAboveRows&&e.staticComponentAboveRows,function(){for(var t=[],n=E;n<k;){var r=e.items[n];r&&t.push(e.getComponent(r,n)),n++}return t}(),!!e.staticComponentBelowRows&&e.staticComponentBelowRows))))})},17291:(e,t,n)=>{n.d(t,{C:()=>s});var r=n(32735),a=n(49935),i=n(96728);function s(e){var t=r.useContext(i.e).showButtons;return r.createElement("div",{className:"d-flex justify-content-between"},e.hideHeader?r.createElement("div",null):r.createElement("div",null,r.createElement("h1",{className:"h2"},e.title),e.breadcrumbs&&r.createElement("div",{className:"pb-3"},r.createElement(a.Oo,{breadcrumbs:e.breadcrumbs}))),e.loaded&&t&&r.createElement("div",{className:"d-flex align-items-center"},e.backButton,e.continueButton))}},79352:(e,t,n)=>{n.d(t,{a:()=>o});var r=n(32735),a=n(23481),i=n(15611),s=a.T.encloseNamespace("shared.wizardStepList");function l(e){var t,n,a,s,l,o=r.createElement(r.Fragment,null,r.createElement("div",{className:"d-flex"},!e.hideStepNumber&&r.createElement("div",{className:"flex-shrink-0 flex-grow-0"},"".concat(e.index+1,".")," "),r.createElement("div",null,e.text)),e.subText&&r.createElement("div",{className:"ms-2 ps-1 pt-1"},e.subText)),c="px-2 py-1 mb-1 rounded d-inline-block";return e.isSelected&&(c+=" ".concat((null===(t=e.theme)||void 0===t?void 0:t.isSelectedOverride)||"bg-light-blue fw-semibold")),!e.isSelected&&e.isCompleted&&(c+=" ".concat((null===(n=e.theme)||void 0===n?void 0:n.isCompletedOverride)||"text-info")),r.createElement("li",{className:null===(a=e.theme)||void 0===a?void 0:a.item},e.isCompleted&&e.appLink?r.createElement(i.F,{appLink:e.appLink,className:"".concat(c," ").concat((null===(s=e.theme)||void 0===s?void 0:s.itemContent)||"")},o):r.createElement("div",{className:"".concat(c," ").concat((null===(l=e.theme)||void 0===l?void 0:l.itemContent)||"")},o))}function o(e){var t,n=e.steps.reduce(function(t,n,r){return n.id===e.currentStep&&(t=r+1),t},1);return r.createElement(r.Fragment,null,r.createElement("h2",{className:"h4"},s("stepNumber",{currentStep:n,totalSteps:e.steps.length})),r.createElement("ol",{className:"list-unstyled ".concat((null===(t=e.theme)||void 0===t?void 0:t.itemsContainer)||"")},e.steps.map(function(t,a){var i=t.id===e.currentStep,s=n>a+1;return r.createElement(l,{index:a,key:t.id,text:t.text,subText:t.subText,isSelected:i,isCompleted:s,appLink:!e.disableAppLinks&&t.appLink,disabled:t.disabled,theme:e.theme})})))}},299:(e,t,n)=>{n.d(t,{X:()=>s});var r=n(32735),a=n(69217),i=n(94631),s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.idField,s=void 0===n?"id":n,l=t.persistNamespace,o=t.initialState?t.initialState:new Map,c=r.useRef(o),u=(0,a.N)(),d=(0,i.D)(e),m=(0,i.D)(l);function p(){c.current.clear(),u()}function v(e){return"number"==typeof e?e=e.toString():"string"!=typeof e&&(e=e[s].toString()),c.current.get(e)}function f(){return!!(null==e?void 0:e.length)&&e.every(v)}function g(e){e.forEach(function(e){c.current.set(e,!0)}),u()}return r.useEffect(function(){t.initialState||l&&m===l||(null==d?void 0:d.map(function(e){return e[s]}).join())!==(null==e?void 0:e.map(function(e){return e[s]}).join())&&p()},[d,m,e,t.initialState]),r.useEffect(function(){var e;(null===(e=t.preselectedIds)||void 0===e?void 0:e.length)&&g(t.preselectedIds)},[]),{onToggleBulk:function(){var t=!f();e.forEach(function(e){t?c.current.set(e[s].toString(),!0):c.current.delete(e[s].toString())}),u()},onToggleItem:function(e){var t=!c.current.get(e.toString());t?c.current.set(e.toString(),t):c.current.delete(e.toString()),u()},getSelected:function(){return Array.from(c.current.keys())},isChecked:v,bulkChecked:f(),deselectAll:function(){(null==e?void 0:e.length)&&(e.forEach(function(e){c.current.delete(e[s].toString())}),u())},hasSomeSelections:function(){return!!(null==e?void 0:e.length)&&!!e.find(function(e){return v(e)})},setSelected:g,getSelectedCount:function(){return c.current.size},reset:p,getMap:function(){return c.current}}}}}]);
2
- //# sourceMappingURL=3872-6fe7371d39-lite.chunk.js.map
2
+ //# sourceMappingURL=3872-cf9a6bdae8-lite.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/3872-6fe7371d39-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/bulk-user-upload-wizard-layout.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/empty-state/invalid-listings-empty-state.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/empty-state/InvalidListingsEmptyState.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/user-review-table.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/UserReviewRow.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/UserReviewTable.tsx","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/components/windowed-list/WindowedList.tsx","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/step-list/WizardStepList.tsx","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts"],"sourcesContent":["import React from 'react';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userWizardBackButtons';\n\ninterface BulkUserUploadBackButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n}\n\nexport function BulkUserUploadBackButton(props: BulkUserUploadBackButtonProps): JSX.Element {\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className='btn btn-link me-2'\n appLink={props.appLinks.userManager}\n >\n <Text namespace={namespace} phrase='cancel' />\n </AppLink>\n );\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { ContextService } from 'libs/analytics/services/ContextService';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.userWizardHeader';\n\ninterface BulkUserUploadContinueButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n canAddExistingUsers: boolean;\n}\n\nexport function BulkUserUploadContinueButton(props: BulkUserUploadContinueButtonProps): JSX.Element {\n const { duplicateSets, hasExistingUsers } = useBulkUploadUsers();\n const { disableNext, onClickConfirm } = React.useContext(WizardLayoutContext);\n\n const spreadsheetHasDuplicates = !!duplicateSets?.length;\n\n const currentAppLink = ContextService.getCurrentContext().appLink;\n\n if (currentAppLink.action === props.appLinks.userUploadStatus.polling.action)\n return <></>;\n\n // we hide the button cuz we have one in the success component\n if (currentAppLink.action === props.appLinks.userUploadStatus.complete.action)\n return <></>;\n\n function willUploadOnNext(): boolean {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadPopup.action:\n case props.appLinks.userUploadReviewAccounts.action:\n return !spreadsheetHasDuplicates && !hasExistingUsers;\n\n case props.appLinks.userUploadFixDuplicates.action:\n return !hasExistingUsers;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n return !hasExistingUsers;\n\n default:\n return true;\n }\n }\n\n if (willUploadOnNext()) {\n return (\n <Button\n className={disableNext ? 'disabled' : ''}\n variant='dark'\n onClick={onClickConfirm}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='create'\n />\n </Button>\n );\n }\n\n function getNextAppLink() {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadReviewAccounts.action:\n if (spreadsheetHasDuplicates)\n return props.appLinks.userUploadFixDuplicates;\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadFixDuplicates.action:\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n if (props.canAddExistingUsers)\n return props.appLinks.userUploadConfirmation;\n\n default:\n return null;\n }\n }\n\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={getNextAppLink()}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='next'\n />\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"wizardContent\":\"hHr3C\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { BulkUserUploadBackButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton';\nimport { BulkUserUploadContinueButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { WizardHeader } from 'libs/shared/components/wizard/header/WizardHeader';\nimport { WizardStepList } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { WizardLayoutContextProvider } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\n\nimport styles from './bulk-user-upload-wizard-layout.scss';\n\nexport type BulkUserUploadStepId = 'review-accounts' | 'fix-duplicates' | 'review-existing-accounts' | 'confirmation' |'status';\n\nconst namespace = 'userManager.bulkUserUploadWizardLayout';\nexport const BULK_USER_UPLOAD_NAV_LOCK_ID = 'bulk:user:upload:nav:lock';\n\ntype BulkUserUploadWizardLayoutProps = React.PropsWithChildren<{\n appLinks: UserManagerAppLinks;\n userType: UserGroup;\n currentStep: BulkUserUploadStepId;\n canAddExistingUsers?: boolean;\n}>;\n\nexport function BulkUserUploadWizardLayout(props: BulkUserUploadWizardLayoutProps): JSX.Element {\n const { users, setUsers } = useBulkUploadUsers();\n\n const navLock = useNavLock();\n\n React.useEffect(() => {\n // If there is no view model, redirect away\n if (!users) {\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n return;\n }\n\n navLock.lock({\n id: BULK_USER_UPLOAD_NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody'),\n appLinkWhitelist: BulkUserUploadHelper.getWizardAppLinks(props.appLinks),\n onConfirmUnlock: () => {\n setUsers(null);\n }\n });\n\n return () => {\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n };\n }, []);\n\n React.useEffect(() => {\n if (users?.length)\n return;\n\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n }, [users?.length]);\n\n if (!users)\n return <></>;\n\n return (\n <WizardLayoutContextProvider>\n <div className='px-3'>\n <WizardHeader<BulkUserUploadStepId>\n title={LanguageService.getPhrase(namespace, 'bulkUpload')}\n currentStep={props.currentStep}\n loaded\n continueButton={\n <BulkUserUploadContinueButton\n currentStep={props.currentStep}\n appLinks={props.appLinks}\n canAddExistingUsers={props.canAddExistingUsers}\n />\n }\n backButton={<BulkUserUploadBackButton currentStep={props.currentStep} appLinks={props.appLinks} />}\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: props.appLinks.settings\n },\n {\n name: LanguageService.getPhrase(namespace, props.userType === UserGroup.Learner ? 'studentManager' : 'staffManager'),\n appLink: props.appLinks.userManager\n },\n {\n name: LanguageService.getPhrase(namespace, 'bulkUpload'),\n active: true\n }\n ]}\n />\n\n <div className='row g-0'>\n <div className='col-2'>\n <WizardStepList<BulkUserUploadStepId>\n steps={BulkUserUploadHelper.getSteps(props.userType, props.canAddExistingUsers)}\n currentStep={props.currentStep}\n />\n </div>\n\n <div className={`col-10 ${styles.wizardContent}`}>\n {props.children}\n </div>\n </div>\n </div>\n </WizardLayoutContextProvider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"center\":\"_dm7C\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nimport { useBulkUploadUsers } from '../../../hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from '../../../interfaces';\n\nimport styles from './invalid-listings-empty-state.scss';\n\nconst namespace = 'userManager.invalidListingsEmptyState';\n\ninterface InvalidListingsEmptyStateProps {\n onClickCreate: () => void;\n appLinks: UserManagerAppLinks;\n imageUrl: string;\n userType: UserGroup;\n}\n\nexport function InvalidListingsEmptyState(props: InvalidListingsEmptyStateProps): JSX.Element {\n const { users, existingUsersHash } = useBulkUploadUsers();\n const client = React.useContext<UserManagerClient>(UserManagerClientContext);\n\n const duplicates = UserManagerHelper.getNewDuplicates(users);\n const goNext = duplicates?.length || !!Object.keys(existingUsersHash).length;\n\n function onClickCta(): void {\n if (goNext) {\n if (duplicates?.length) {\n Core.AppLinkHelper.trigger(props.appLinks.userUploadFixDuplicates);\n return;\n }\n Core.AppLinkHelper.trigger(props.appLinks.userUploadReviewExistingAccounts);\n return;\n }\n\n props.onClickCreate();\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className={`position-absolute ${styles.center}`}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} size={client === UserManagerClient.Primary ? 'small' : 'medium'}/>\n\n <EmptyState.Heading>\n <Text phrase={props.userType === UserGroup.Learner ? 'headingStudents' : 'headingStaff'} />\n </EmptyState.Heading>\n <EmptyState.Info className='w-75'>\n <Text phrase={goNext ? 'infoNext' : 'infoSave'} />\n </EmptyState.Info>\n\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, goNext ? 'next' : 'create')}\n onClick={onClickCta}\n />\n </EmptyState>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"stickyHeader\":\"GIWSN\",\"staffTable\":\"VmrTm\",\"checkbox\":\"a8Xcm\",\"firstName\":\"BMRCI\",\"surname\":\"h0EWu\",\"email\":\"Lymqy\",\"username\":\"KUiPJ\",\"learnerTable\":\"isWDb\",\"yearGroup\":\"lO5gG\",\"password\":\"vfXfh\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './user-review-table.scss';\n\nexport const USER_ITEM_ROW_HEIGHT = 44; // px\n\ninterface DataCellProps {\n data: string;\n error?: string;\n yearGroup?: boolean;\n tooltip?: string;\n emptyStateText?: string;\n className?: string;\n}\n\nfunction DataCell(props: DataCellProps): JSX.Element {\n const getClassName = () => {\n const baseClass = `${props.className} p-2 d-table-cell`;\n\n if (props.error)\n return `${baseClass} text-danger`;\n\n if (props.emptyStateText && !props.data)\n return `${baseClass} fst-italic`;\n\n return `${baseClass} text-wrap`;\n };\n\n const getText = () => {\n if (props.error)\n return props.error;\n\n if (props.data)\n return props.data;\n\n if (props.emptyStateText)\n return props.emptyStateText;\n\n return '';\n };\n\n return (\n <div className={getClassName()}>\n <span\n className={(props.yearGroup && !props.error)\n ? 'bg-white border border-dark rounded-pill px-2 text-nowrap'\n : 'd-flex align-items-center'\n }\n >\n {getText()}\n {props.tooltip && (\n <Tooltip title={props.tooltip} spanHack>\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Info} className='text-danger ms-1 svg-container'/>\n </Tooltip>\n )}\n </span>\n </div>\n );\n}\n\ninterface UserReviewRowProps {\n user: EditUserRequest;\n userType: UserGroup;\n errorCodes: UserValidationCode[];\n passwordPolicy: SecuritySettingsResponse;\n\n onToggleCheckbox: (id: string) => void;\n isChecked: boolean;\n\n onClickEdit?: (user: EditUserRequest) => void;\n onClickDelete?: (users: string[]) => void;\n showPasswordField?: boolean;\n localErrorMessage?: HashObject;\n}\n\nexport function UserReviewRow(props: UserReviewRowProps): JSX.Element {\n const { user, errorCodes, onClickEdit, onClickDelete } = props;\n\n const namespace = props.userType === UserGroup.Learner\n ? 'userManager.studentReviewTable'\n : 'userManager.staffReviewTable';\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n props.passwordPolicy,\n props.userType,\n props.user.masterRole\n );\n\n const errorMessages = UserManagerHelper.getErrorMessages(\n errorCodes,\n minPasswordLength,\n true,\n props.localErrorMessage\n );\n\n const showActions = !!onClickEdit || !!onClickDelete;\n const getPhrase = LanguageService.encloseNamespace(namespace);\n\n const usernameIsInvalid = !!errorCodes.find(c => c === UserValidationCode.UsernameInvalid);\n const userTypeClass = props.userType === UserGroup.Learner ? styles.learnerTable : styles.staffTable;\n\n return (\n <li className={`d-table-row ${userTypeClass}`} style={{ height: `${USER_ITEM_ROW_HEIGHT}px` }}>\n <div className={`p-2 d-flex justify-content-end d-table-cell ${styles.checkbox}`}>\n <Checkbox\n id={`bulk-remove-${user.lookupId}`}\n onChange={() => props.onToggleCheckbox(user.lookupId)}\n checked={props.isChecked}\n />\n </div>\n <DataCell data={user.firstName} error={errorMessages.firstName} className={styles.firstName} />\n <DataCell data={user.surname} error={errorMessages.surname} className={styles.surname} />\n <DataCell\n data={user.email}\n error={errorMessages.email}\n emptyStateText={getPhrase('noEmail')}\n className={styles.email}\n />\n <DataCell\n data={user.username}\n error={errorMessages.username}\n emptyStateText={getPhrase('noUsername')}\n tooltip={usernameIsInvalid && getPhrase('invalidUsernameTooltip')}\n className={styles.username}\n />\n {props.userType === UserGroup.Learner && (\n <DataCell\n data={user.masterYearGroup?.name}\n error={errorMessages.masterYearGroup}\n className={styles.yearGroup}\n yearGroup\n />\n )}\n {props.showPasswordField && (\n <DataCell\n data={user.password}\n error={errorMessages.password}\n emptyStateText={user.email ? getPhrase('passwordEmailActivation') : getPhrase('noPassword')}\n className={styles.password}\n />\n )}\n\n {showActions && (\n <div className='p-2 d-flex justify-content-end d-table-cell'>\n {onClickEdit && (\n <DivButton className='me-2 cursor-pointer' onClick={() => onClickEdit(user)}>\n <SvgContainer\n svgName={cvSvgLibrary.Edit}\n title={getPhrase('editTooltip')}\n tooltipSpanHack\n tooltipPlacement='top'\n />\n </DivButton>\n )}\n {onClickDelete && (\n <DivButton className='cursor-pointer' onClick={() => onClickDelete([user.lookupId])}>\n <SvgContainer\n svgName={cvSvgLibrary.Close}\n title={getPhrase('removeTooltip')}\n tooltipSpanHack\n tooltipPlacement='top'\n />\n </DivButton>\n )}\n </div>\n )}\n </li>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EditUserRequest, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserHash } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserUploadViewModel';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { WindowedList } from 'libs/shared/components/windowed-list/WindowedList';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { InvalidListingsEmptyState } from './empty-state/InvalidListingsEmptyState';\nimport { USER_ITEM_ROW_HEIGHT, UserReviewRow } from './UserReviewRow';\n\nimport styles from './user-review-table.scss';\n\ninterface UserReviewTableProps {\n users: EditUserRequest[];\n invalidUsers: UserHash;\n userType: UserGroup;\n emptyStateImageUrl?: string;\n passwordPolicy?: SecuritySettingsResponse;\n onClickCreate?: () => void;\n appLinks: UserManagerAppLinks;\n \n checkboxId: string;\n bulkCheckboxChecked: boolean;\n onToggleBulkCheckbox: (event: React.ChangeEvent<HTMLInputElement>) => void;\n bulkIndeterminate: boolean;\n onToggleCheckbox: (id: string) => void;\n isChecked: (id: string) => boolean;\n disableBulkCheckbox?: boolean;\n\n showInvalidEmptyState?: boolean;\n showPasswordField?: boolean;\n\n onClickEdit?: (user: EditUserRequest) => void;\n onClickDelete?: (users: string[]) => void;\n\n localErrorMessage?: HashObject;\n tooltips?: Record<string, string>;\n}\n\nexport function UserReviewTable(props: UserReviewTableProps): JSX.Element {\n const namespace = props.userType === UserGroup.Learner\n ? 'userManager.studentReviewTable'\n : 'userManager.staffReviewTable';\n\n const showActions = !!props.onClickEdit || !!props.onClickDelete;\n\n const userTypeClass = props.userType === UserGroup.Learner ? styles.learnerTable : styles.staffTable;\n const tableHeaderClass = `p-2 text-nowrap bg-white d-table-cell fw-semibold ${styles.stickyHeader}`;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <WindowedList\n items={props.users}\n rowHeight={USER_ITEM_ROW_HEIGHT}\n getComponent={user => {\n if (props.showInvalidEmptyState)\n return <React.Fragment key={user.lookupId}></React.Fragment>;\n\n return (\n <UserReviewRow\n key={user.lookupId}\n user={user}\n userType={props.userType}\n errorCodes={props.invalidUsers[user.lookupId]?.errorCodes || []}\n onClickEdit={props.onClickEdit}\n onClickDelete={props.onClickDelete}\n showPasswordField={props.showPasswordField}\n passwordPolicy={props.passwordPolicy}\n onToggleCheckbox={props.onToggleCheckbox}\n isChecked={props.isChecked(user.lookupId)}\n localErrorMessage={props.localErrorMessage}\n />\n );\n }}\n staticComponentAboveRows={(\n <>\n <div className={`border-bottom align-items-center d-table-row ${userTypeClass}`}>\n <div className={`${tableHeaderClass} ${styles.checkbox}`}>\n\n <Checkbox\n id={props.checkboxId}\n name='users-review-checkbox'\n checked={props.bulkCheckboxChecked}\n onChange={props.onToggleBulkCheckbox}\n indeterminate={props.bulkIndeterminate}\n className={styles.checkbox}\n disabled={props.disableBulkCheckbox}\n />\n </div>\n\n <div className={`${tableHeaderClass} ${styles.firstName}`}>\n <Text phrase='firstName' />\n {props.tooltips?.firstName && (\n <span className='d-inline-block'>\n <Tooltip title={props.tooltips.firstName} spanHack>\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Info} className='ms-1 svg-container'/>\n </Tooltip>\n </span>\n )}\n </div>\n\n <div className={`${tableHeaderClass} ${styles.surname}`}>\n <Text phrase='lastName' />\n {props.tooltips?.lastName && (\n <span className='d-inline-block'>\n <Tooltip title={props.tooltips.lastName} spanHack>\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Info} className='ms-1 svg-container'/>\n </Tooltip>\n </span>\n )}\n </div>\n\n <div className={`${tableHeaderClass} ${styles.email}`}><Text phrase='email' /></div>\n\n <div className={`${tableHeaderClass} ${styles.username}`}>\n <Text phrase='username' />\n {props.tooltips?.username && (\n <span className='d-inline-block'>\n <Tooltip title={props.tooltips.username} spanHack>\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Info} className='ms-1 svg-container'/>\n </Tooltip>\n </span>\n )}\n </div>\n\n {props.userType === UserGroup.Learner && (\n <div className={`${tableHeaderClass} ${styles.yearGroup}`}><Text phrase='yearGroup' /></div>\n )}\n {props.showPasswordField && (\n <div className={`${tableHeaderClass} ${styles.password}`}><Text phrase='password' /></div>\n )}\n {showActions && <div className={`${tableHeaderClass}`}>&nbsp;</div>}\n </div>\n\n <li className='d-none' />\n </>\n )}\n />\n\n {props.showInvalidEmptyState && (\n <InvalidListingsEmptyState\n onClickCreate={props.onClickCreate}\n appLinks={props.appLinks}\n imageUrl={props.emptyStateImageUrl}\n userType={props.userType}\n />\n )}\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nimport { EditUserRequest } from '../interfaces';\nimport { BulkUserUploadViewModel, UserHash } from '../interfaces/viewmodels/BulkUserUploadViewModel';\nimport { UserManagerHelper } from '../utils/UserManagerHelper';\n\nfunction updateUserHash(userHash: UserHash, updatedUserIdsHash: HashObject<boolean>): UserHash {\n const updatedUsers = Object.keys(userHash || {}).reduce((updatedObj: UserHash, lookupId) => {\n if (!updatedUserIdsHash[lookupId])\n updatedObj[lookupId] = userHash[lookupId];\n return updatedObj;\n }, {});\n\n return updatedUsers;\n}\n\nexport const useBulkUploadUsers = () => {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserUploadViewModel>(SharedViewModelKeys.BULK_USER_UPLOAD);\n\n function initializeUsers(users?: EditUserRequest[]): void {\n setViewModel({\n users,\n invalidUsers: null,\n existingUsersHash: null\n });\n\n updateDuplicates(users);\n }\n\n function updateUser(updatedUser: EditUserRequest): void {\n const updatedUsers = viewModel.users.map(user => {\n if (user.lookupId !== updatedUser.lookupId)\n return user;\n\n return updatedUser;\n });\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, { [updatedUser.lookupId]: true }),\n existingUsersHash: viewModel?.existingUsersHash\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function deleteUsers(deletedUsers: string[]): void {\n const userIdHash = deletedUsers.reduce((prev: HashObject, curr) => {\n prev[curr] = true;\n return prev;\n }, {});\n\n const updatedUsers = viewModel.users.filter(user => !userIdHash[user.lookupId]);\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, userIdHash),\n existingUsersHash: updateUserHash(viewModel?.existingUsersHash, userIdHash),\n existingUserToAdd: viewModel?.existingUserToAdd?.filter(u => !!viewModel?.existingUsersHash[u.lookupId])\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function updateDuplicates(users?: EditUserRequest[]): void {\n const duplicateSets = UserManagerHelper.getNewDuplicates(users);\n setViewModel('duplicateSets', duplicateSets);\n }\n\n return {\n users: viewModel?.users,\n invalidUsers: viewModel?.invalidUsers,\n hasValidatedUsers: !!viewModel?.invalidUsers,\n existingUsersHash: viewModel?.existingUsersHash || {},\n hasExistingUsers: !!Object.keys(viewModel?.existingUsersHash || {}).length,\n existingUserToAdd: viewModel?.existingUserToAdd,\n duplicateSets: viewModel?.duplicateSets,\n newUsers: viewModel?.users?.filter(u => !viewModel?.existingUsersHash?.[u.lookupId]) || [],\n\n setUsers: initializeUsers,\n setInvalidUsers: (invalidUsers: UserHash) => setViewModel('invalidUsers', invalidUsers),\n setExistingUsers: (existingUsers: UserHash) => setViewModel('existingUsersHash', existingUsers),\n updateUser,\n deleteUsers\n };\n};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\ninterface WindowedListProps<TObject> {\n items: TObject[];\n getComponent: (item: TObject, index: number) => JSX.Element;\n rowHeight: number;\n containerHeight?: number;\n\n staticComponentAboveRows?: JSX.Element;\n staticComponentBelowRows?: JSX.Element;\n}\n\nexport const WindowedList = React.forwardRef((\n props: WindowedListProps<any>,\n ref: React.Ref<Scrollbars>\n) => {\n const [ availableHeight, setAvailableHeight ] = React.useState<number>(props.containerHeight || 0);\n const [ scrollTop, setScrollTop ] = React.useState<number>(0);\n\n const tableRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (props.containerHeight)\n return;\n\n setAvailableHeight(tableRef.current?.clientHeight ?? 0);\n }, [tableRef.current]);\n\n const numRows = props.items.length;\n const totalRowsVisible = Math.ceil(availableHeight / props.rowHeight);\n const totalHeight = props.rowHeight * numRows;\n\n const startIndex = Math.max(\n 0,\n Math.floor(scrollTop / props.rowHeight) - totalRowsVisible\n );\n\n const endIndex = Math.min(\n numRows,\n startIndex + (totalRowsVisible * 3)\n );\n\n function onScrollTable(e: React.UIEvent<HTMLDivElement>): void {\n setScrollTop(e.currentTarget.scrollTop);\n }\n\n function getTableStyles(): React.CSSProperties {\n const tablePosFromTop = tableRef.current?.getBoundingClientRect().top ?? 0;\n\n const height = props.containerHeight || `calc(100vh - ${window.pageYOffset + tablePosFromTop + 30}px)`;\n \n return {\n height,\n minHeight: `${props.rowHeight * 5}px`,\n overflow: 'auto'\n };\n }\n\n function getRows(): JSX.Element[] {\n const items = [];\n \n let index = startIndex;\n while (index < endIndex) {\n const item = props.items[index];\n\n if (item)\n items.push(props.getComponent(item, index));\n \n index++;\n }\n\n return items;\n }\n\n return (\n <div style={getTableStyles()} ref={tableRef}>\n <Scrollbars\n onScroll={onScrollTable}\n autoHeightMin={totalHeight}\n autoHeightMax={totalHeight}\n ref={ref}\n >\n <div style={{ height: totalHeight, paddingTop: startIndex * props.rowHeight }}>\n <ul className='w-100 position-relative d-table striped-list list-unstyled no-full-width'>\n {!!props.staticComponentAboveRows && props.staticComponentAboveRows}\n {getRows()}\n {!!props.staticComponentBelowRows && props.staticComponentBelowRows}\n </ul>\n </div>\n </Scrollbars>\n </div>\n );\n});","import React from 'react';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\ninterface WizardHeaderProps<TStepId> {\n currentStep: TStepId;\n title: string;\n continueButton: JSX.Element;\n backButton: JSX.Element;\n breadcrumbs?: Breadcrumb[];\n hideHeader?: boolean;\n loaded: boolean;\n}\n\nexport function WizardHeader<TStepId>(props: WizardHeaderProps<TStepId>): JSX.Element {\n const { showButtons } = React.useContext(WizardLayoutContext);\n\n return (\n <div className='d-flex justify-content-between'>\n {!props.hideHeader ? (\n <div>\n <h1 className='h2'>{props.title}</h1>\n\n {props.breadcrumbs &&\n <div className='pb-3'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n </div>\n ) : <div/>}\n\n {props.loaded && showButtons && (\n <div className='d-flex align-items-center'>\n {props.backButton}\n {props.continueButton}\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nconst namespace = 'shared.wizardStepList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface WizardStep<StepId extends string> {\n id: StepId;\n text: string;\n appLink?: Core.AppLink;\n subText?: string;\n disabled?: boolean;\n}\n\ninterface WizardStepListTheme {\n item?: string;\n itemsContainer?: string;\n itemContent?: string;\n isSelectedOverride?: string;\n isCompletedOverride?: string;\n}\n\ninterface WizardStepListItemProps {\n appLink: Core.AppLink;\n isSelected: boolean;\n isCompleted: boolean;\n text: string;\n subText?: string;\n disabled: boolean;\n index: number;\n hideStepNumber?: boolean;\n theme?: WizardStepListTheme;\n}\n\nfunction WizardStepListItem(props: WizardStepListItemProps): JSX.Element {\n const content = (\n <>\n <div className='d-flex'>\n {!props.hideStepNumber && <div className='flex-shrink-0 flex-grow-0'>{`${props.index + 1}.`}&nbsp;</div>}\n <div>{props.text}</div>\n </div>\n\n {props.subText && (\n <div className='ms-2 ps-1 pt-1'>\n {props.subText}\n </div>\n )}\n </>\n );\n\n \n let className = 'px-2 py-1 mb-1 rounded d-inline-block';\n\n if (props.isSelected) {\n className += ` ${props.theme?.isSelectedOverride || 'bg-light-blue fw-semibold'}`;\n }\n\n if ((!props.isSelected && props.isCompleted))\n className += ` ${props.theme?.isCompletedOverride || 'text-info'}`;\n\n return (\n <li className={props.theme?.item}>\n {(props.isCompleted && props.appLink)\n ? (\n <AppLink appLink={props.appLink} className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </AppLink>\n ) : (\n <div className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </div>\n )\n }\n </li>\n );\n}\n\ninterface WizardStepListProps<StepId extends string> {\n currentStep: StepId;\n steps: WizardStep<StepId>[];\n disableAppLinks?: boolean;\n theme?: WizardStepListTheme;\n}\n\nexport function WizardStepList<StepId extends string>(props: WizardStepListProps<StepId>): JSX.Element {\n const currentStepNumber = props.steps.reduce((acc, step, i) => {\n if (step.id === props.currentStep)\n acc = i + 1;\n\n return acc;\n }, 1);\n\n return (\n <>\n <h2 className='h4'>\n {getPhrase('stepNumber', { currentStep: currentStepNumber, totalSteps: props.steps.length })}\n </h2>\n\n <ol className={`list-unstyled ${props.theme?.itemsContainer || ''}`}>\n {props.steps.map((step, i) => {\n const isSelected = step.id === props.currentStep;\n const isCompleted = currentStepNumber > i + 1;\n\n return (\n <WizardStepListItem\n index={i}\n key={step.id}\n text={step.text}\n subText={step.subText}\n isSelected={isSelected}\n isCompleted={isCompleted}\n appLink={!props.disableAppLinks && step.appLink}\n disabled={step.disabled}\n theme={props.theme}\n />\n );\n })}\n </ol>\n </>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};"],"names":["namespace","BulkUserUploadBackButton","props","currentStep","AppLink","className","appLink","appLinks","userManager","Text","phrase","BulkUserUploadContinueButton","useBulkUploadUsers","duplicateSets","hasExistingUsers","WizardLayoutContext","disableNext","onClickConfirm","spreadsheetHasDuplicates","length","currentAppLink","ContextService","action","userUploadStatus","polling","complete","userUploadPopup","userUploadReviewAccounts","userUploadFixDuplicates","userUploadReviewExistingAccounts","willUploadOnNext","Button","variant","onClick","disabled","canAddExistingUsers","userUploadConfirmation","getNextAppLink","BULK_USER_UPLOAD_NAV_LOCK_ID","BulkUserUploadWizardLayout","users","setUsers","navLock","useNavLock","lock","id","title","LanguageService","text","appLinkWhitelist","BulkUserUploadHelper","onConfirmUnlock","unlock","replace","WizardHeader","loaded","continueButton","backButton","breadcrumbs","name","settings","userType","UserGroup","active","WizardStepList","steps","children","InvalidListingsEmptyState","existingUsersHash","client","UserManagerClientContext","duplicates","UserManagerHelper","goNext","Object","keys","value","EmptyState","src","imageUrl","size","UserManagerClient","onClickCreate","USER_ITEM_ROW_HEIGHT","DataCell","baseClass","error","emptyStateText","data","yearGroup","tooltip","Tooltip","spanHack","SvgContainer","S","svgName","UserReviewRow","user","errorCodes","onClickEdit","onClickDelete","minPasswordLength","passwordPolicy","masterRole","errorMessages","localErrorMessage","showActions","getPhrase","usernameIsInvalid","find","c","UserValidationCode","userTypeClass","style","height","Checkbox","lookupId","onChange","onToggleCheckbox","checked","isChecked","firstName","surname","email","username","masterYearGroup","showPasswordField","password","DivButton","tooltipSpanHack","tooltipPlacement","UserReviewTable","tableHeaderClass","WindowedList","items","rowHeight","getComponent","showInvalidEmptyState","key","invalidUsers","staticComponentAboveRows","checkboxId","bulkCheckboxChecked","onToggleBulkCheckbox","indeterminate","bulkIndeterminate","disableBulkCheckbox","tooltips","lastName","emptyStateImageUrl","updateUserHash","userHash","updatedUserIdsHash","reduce","updatedObj","viewModel","setViewModel","updateDuplicates","hasValidatedUsers","existingUserToAdd","newUsers","filter","u","setInvalidUsers","setExistingUsers","existingUsers","updateUser","updatedUser","updatedUsers","map","deleteUsers","deletedUsers","userIdHash","prev","curr","ref","containerHeight","availableHeight","setAvailableHeight","scrollTop","setScrollTop","tableRef","current","clientHeight","tablePosFromTop","numRows","totalRowsVisible","Math","ceil","totalHeight","startIndex","max","floor","endIndex","min","getBoundingClientRect","top","window","pageYOffset","minHeight","overflow","onScroll","e","currentTarget","autoHeightMin","autoHeightMax","paddingTop","index","item","push","getRows","staticComponentBelowRows","showButtons","hideHeader","WizardStepListItem","content","hideStepNumber","subText","isSelected","theme","isSelectedOverride","isCompleted","isCompletedOverride","itemContent","currentStepNumber","acc","step","i","totalSteps","itemsContainer","disableAppLinks","useBulkCheckboxManager","collection","options","idField","persistNamespace","initial","initialState","Map","forceUpdate","prevCollection","prevNamespace","reset","clear","toString","get","isBulkChecked","every","setSelected","ids","forEach","set","join","preselectedIds","onToggleBulk","setValue","onToggleItem","nextItemState","getSelected","Array","from","bulkChecked","deselectAll","hasSomeSelections","getSelectedCount","getMap"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/3872-cf9a6bdae8-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/bulk-user-upload-wizard-layout.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/empty-state/invalid-listings-empty-state.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/empty-state/InvalidListingsEmptyState.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/user-review-table.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/UserReviewRow.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-review-table/UserReviewTable.tsx","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/components/windowed-list/WindowedList.tsx","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/step-list/WizardStepList.tsx","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts"],"sourcesContent":["import React from 'react';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userWizardBackButtons';\n\ninterface BulkUserUploadBackButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n}\n\nexport function BulkUserUploadBackButton(props: BulkUserUploadBackButtonProps): JSX.Element {\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className='btn btn-link me-2'\n appLink={props.appLinks.userManager}\n >\n <Text namespace={namespace} phrase='cancel' />\n </AppLink>\n );\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { ContextService } from 'libs/analytics/services/ContextService';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.userWizardHeader';\n\ninterface BulkUserUploadContinueButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n canAddExistingUsers: boolean;\n}\n\nexport function BulkUserUploadContinueButton(props: BulkUserUploadContinueButtonProps): JSX.Element {\n const { duplicateSets, hasExistingUsers } = useBulkUploadUsers();\n const { disableNext, onClickConfirm } = React.useContext(WizardLayoutContext);\n\n const spreadsheetHasDuplicates = !!duplicateSets?.length;\n\n const currentAppLink = ContextService.getCurrentContext().appLink;\n\n if (currentAppLink.action === props.appLinks.userUploadStatus.polling.action)\n return <></>;\n\n // we hide the button cuz we have one in the success component\n if (currentAppLink.action === props.appLinks.userUploadStatus.complete.action)\n return <></>;\n\n function willUploadOnNext(): boolean {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadPopup.action:\n case props.appLinks.userUploadReviewAccounts.action:\n return !spreadsheetHasDuplicates && !hasExistingUsers;\n\n case props.appLinks.userUploadFixDuplicates.action:\n return !hasExistingUsers;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n return !hasExistingUsers;\n\n default:\n return true;\n }\n }\n\n if (willUploadOnNext()) {\n return (\n <Button\n className={disableNext ? 'disabled' : ''}\n variant='dark'\n onClick={onClickConfirm}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='create'\n />\n </Button>\n );\n }\n\n function getNextAppLink() {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadReviewAccounts.action:\n if (spreadsheetHasDuplicates)\n return props.appLinks.userUploadFixDuplicates;\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadFixDuplicates.action:\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n if (props.canAddExistingUsers)\n return props.appLinks.userUploadConfirmation;\n\n default:\n return null;\n }\n }\n\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={getNextAppLink()}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='next'\n />\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"wizardContent\":\"hHr3C\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { BulkUserUploadBackButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton';\nimport { BulkUserUploadContinueButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { WizardHeader } from 'libs/shared/components/wizard/header/WizardHeader';\nimport { WizardStepList } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { WizardLayoutContextProvider } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\n\nimport styles from './bulk-user-upload-wizard-layout.scss';\n\nexport type BulkUserUploadStepId = 'review-accounts' | 'fix-duplicates' | 'review-existing-accounts' | 'confirmation' |'status';\n\nconst namespace = 'userManager.bulkUserUploadWizardLayout';\nexport const BULK_USER_UPLOAD_NAV_LOCK_ID = 'bulk:user:upload:nav:lock';\n\ntype BulkUserUploadWizardLayoutProps = React.PropsWithChildren<{\n appLinks: UserManagerAppLinks;\n userType: UserGroup;\n currentStep: BulkUserUploadStepId;\n canAddExistingUsers?: boolean;\n}>;\n\nexport function BulkUserUploadWizardLayout(props: BulkUserUploadWizardLayoutProps): JSX.Element {\n const { users, setUsers } = useBulkUploadUsers();\n\n const navLock = useNavLock();\n\n React.useEffect(() => {\n // If there is no view model, redirect away\n if (!users) {\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n return;\n }\n\n navLock.lock({\n id: BULK_USER_UPLOAD_NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody'),\n appLinkWhitelist: BulkUserUploadHelper.getWizardAppLinks(props.appLinks),\n onConfirmUnlock: () => {\n setUsers(null);\n }\n });\n\n return () => {\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n };\n }, []);\n\n React.useEffect(() => {\n if (users?.length)\n return;\n\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n }, [users?.length]);\n\n if (!users)\n return <></>;\n\n return (\n <WizardLayoutContextProvider>\n <div className='px-3'>\n <WizardHeader<BulkUserUploadStepId>\n title={LanguageService.getPhrase(namespace, 'bulkUpload')}\n currentStep={props.currentStep}\n loaded\n continueButton={\n <BulkUserUploadContinueButton\n currentStep={props.currentStep}\n appLinks={props.appLinks}\n canAddExistingUsers={props.canAddExistingUsers}\n />\n }\n backButton={<BulkUserUploadBackButton currentStep={props.currentStep} appLinks={props.appLinks} />}\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: props.appLinks.settings\n },\n {\n name: LanguageService.getPhrase(namespace, props.userType === UserGroup.Learner ? 'studentManager' : 'staffManager'),\n appLink: props.appLinks.userManager\n },\n {\n name: LanguageService.getPhrase(namespace, 'bulkUpload'),\n active: true\n }\n ]}\n />\n\n <div className='row g-0'>\n <div className='col-2'>\n <WizardStepList<BulkUserUploadStepId>\n steps={BulkUserUploadHelper.getSteps(props.userType, props.canAddExistingUsers)}\n currentStep={props.currentStep}\n />\n </div>\n\n <div className={`col-10 ${styles.wizardContent}`}>\n {props.children}\n </div>\n </div>\n </div>\n </WizardLayoutContextProvider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"center\":\"_dm7C\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nimport { useBulkUploadUsers } from '../../../hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from '../../../interfaces';\n\nimport styles from './invalid-listings-empty-state.scss';\n\nconst namespace = 'userManager.invalidListingsEmptyState';\n\ninterface InvalidListingsEmptyStateProps {\n onClickCreate: () => void;\n appLinks: UserManagerAppLinks;\n imageUrl: string;\n userType: UserGroup;\n}\n\nexport function InvalidListingsEmptyState(props: InvalidListingsEmptyStateProps): JSX.Element {\n const { users, existingUsersHash } = useBulkUploadUsers();\n const client = React.useContext<UserManagerClient>(UserManagerClientContext);\n\n const duplicates = UserManagerHelper.getNewDuplicates(users);\n const goNext = duplicates?.length || !!Object.keys(existingUsersHash).length;\n\n function onClickCta(): void {\n if (goNext) {\n if (duplicates?.length) {\n Core.AppLinkHelper.trigger(props.appLinks.userUploadFixDuplicates);\n return;\n }\n Core.AppLinkHelper.trigger(props.appLinks.userUploadReviewExistingAccounts);\n return;\n }\n\n props.onClickCreate();\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className={`position-absolute ${styles.center}`}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} size={client === UserManagerClient.Primary ? 'small' : 'medium'}/>\n\n <EmptyState.Heading>\n <Text phrase={props.userType === UserGroup.Learner ? 'headingStudents' : 'headingStaff'} />\n </EmptyState.Heading>\n <EmptyState.Info className='w-75'>\n <Text phrase={goNext ? 'infoNext' : 'infoSave'} />\n </EmptyState.Info>\n\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, goNext ? 'next' : 'create')}\n onClick={onClickCta}\n />\n </EmptyState>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"stickyHeader\":\"GIWSN\",\"staffTable\":\"VmrTm\",\"checkbox\":\"a8Xcm\",\"firstName\":\"BMRCI\",\"surname\":\"h0EWu\",\"email\":\"Lymqy\",\"username\":\"KUiPJ\",\"learnerTable\":\"isWDb\",\"yearGroup\":\"lO5gG\",\"password\":\"vfXfh\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './user-review-table.scss';\n\nexport const USER_ITEM_ROW_HEIGHT = 44; // px\n\ninterface DataCellProps {\n data: string;\n error?: string;\n yearGroup?: boolean;\n tooltip?: string;\n emptyStateText?: string;\n className?: string;\n}\n\nfunction DataCell(props: DataCellProps): JSX.Element {\n const getClassName = () => {\n const baseClass = `${props.className} p-2 d-table-cell`;\n\n if (props.error)\n return `${baseClass} text-danger`;\n\n if (props.emptyStateText && !props.data)\n return `${baseClass} fst-italic`;\n\n return `${baseClass} text-wrap`;\n };\n\n const getText = () => {\n if (props.error)\n return props.error;\n\n if (props.data)\n return props.data;\n\n if (props.emptyStateText)\n return props.emptyStateText;\n\n return '';\n };\n\n return (\n <div className={getClassName()}>\n <span\n className={(props.yearGroup && !props.error)\n ? 'bg-white border border-dark rounded-pill px-2 text-nowrap'\n : 'd-flex align-items-center'\n }\n >\n {getText()}\n {props.tooltip && (\n <Tooltip title={props.tooltip} spanHack>\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Info} className='text-danger ms-1 svg-container'/>\n </Tooltip>\n )}\n </span>\n </div>\n );\n}\n\ninterface UserReviewRowProps {\n user: EditUserRequest;\n userType: UserGroup;\n errorCodes: UserValidationCode[];\n passwordPolicy: SecuritySettingsResponse;\n\n onToggleCheckbox: (id: string) => void;\n isChecked: boolean;\n\n onClickEdit?: (user: EditUserRequest) => void;\n onClickDelete?: (users: string[]) => void;\n showPasswordField?: boolean;\n localErrorMessage?: HashObject;\n}\n\nexport function UserReviewRow(props: UserReviewRowProps): JSX.Element {\n const { user, errorCodes, onClickEdit, onClickDelete } = props;\n\n const namespace = props.userType === UserGroup.Learner\n ? 'userManager.studentReviewTable'\n : 'userManager.staffReviewTable';\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n props.passwordPolicy,\n props.userType,\n props.user.masterRole\n );\n\n const errorMessages = UserManagerHelper.getErrorMessages(\n errorCodes,\n minPasswordLength,\n true,\n props.localErrorMessage\n );\n\n const showActions = !!onClickEdit || !!onClickDelete;\n const getPhrase = LanguageService.encloseNamespace(namespace);\n\n const usernameIsInvalid = !!errorCodes.find(c => c === UserValidationCode.UsernameInvalid);\n const userTypeClass = props.userType === UserGroup.Learner ? styles.learnerTable : styles.staffTable;\n\n return (\n <li className={`d-table-row ${userTypeClass}`} style={{ height: `${USER_ITEM_ROW_HEIGHT}px` }}>\n <div className={`p-2 d-flex justify-content-end d-table-cell ${styles.checkbox}`}>\n <Checkbox\n id={`bulk-remove-${user.lookupId}`}\n onChange={() => props.onToggleCheckbox(user.lookupId)}\n checked={props.isChecked}\n />\n </div>\n <DataCell data={user.firstName} error={errorMessages.firstName} className={styles.firstName} />\n <DataCell data={user.surname} error={errorMessages.surname} className={styles.surname} />\n <DataCell\n data={user.email}\n error={errorMessages.email}\n emptyStateText={getPhrase('noEmail')}\n className={styles.email}\n />\n <DataCell\n data={user.username}\n error={errorMessages.username}\n emptyStateText={getPhrase('noUsername')}\n tooltip={usernameIsInvalid && getPhrase('invalidUsernameTooltip')}\n className={styles.username}\n />\n {props.userType === UserGroup.Learner && (\n <DataCell\n data={user.masterYearGroup?.name}\n error={errorMessages.masterYearGroup}\n className={styles.yearGroup}\n yearGroup\n />\n )}\n {props.showPasswordField && (\n <DataCell\n data={user.password}\n error={errorMessages.password}\n emptyStateText={user.email ? getPhrase('passwordEmailActivation') : getPhrase('noPassword')}\n className={styles.password}\n />\n )}\n\n {showActions && (\n <div className='p-2 d-flex justify-content-end d-table-cell'>\n {onClickEdit && (\n <DivButton className='me-2 cursor-pointer' onClick={() => onClickEdit(user)}>\n <SvgContainer\n svgName={cvSvgLibrary.Edit}\n title={getPhrase('editTooltip')}\n tooltipSpanHack\n tooltipPlacement='top'\n />\n </DivButton>\n )}\n {onClickDelete && (\n <DivButton className='cursor-pointer' onClick={() => onClickDelete([user.lookupId])}>\n <SvgContainer\n svgName={cvSvgLibrary.Close}\n title={getPhrase('removeTooltip')}\n tooltipSpanHack\n tooltipPlacement='top'\n />\n </DivButton>\n )}\n </div>\n )}\n </li>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { EditUserRequest, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserHash } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserUploadViewModel';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { WindowedList } from 'libs/shared/components/windowed-list/WindowedList';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { InvalidListingsEmptyState } from './empty-state/InvalidListingsEmptyState';\nimport { USER_ITEM_ROW_HEIGHT, UserReviewRow } from './UserReviewRow';\n\nimport styles from './user-review-table.scss';\n\ninterface UserReviewTableProps {\n users: EditUserRequest[];\n invalidUsers: UserHash;\n userType: UserGroup;\n emptyStateImageUrl?: string;\n passwordPolicy?: SecuritySettingsResponse;\n onClickCreate?: () => void;\n appLinks: UserManagerAppLinks;\n \n checkboxId: string;\n bulkCheckboxChecked: boolean;\n onToggleBulkCheckbox: (event: React.ChangeEvent<HTMLInputElement>) => void;\n bulkIndeterminate: boolean;\n onToggleCheckbox: (id: string) => void;\n isChecked: (id: string) => boolean;\n disableBulkCheckbox?: boolean;\n\n showInvalidEmptyState?: boolean;\n showPasswordField?: boolean;\n\n onClickEdit?: (user: EditUserRequest) => void;\n onClickDelete?: (users: string[]) => void;\n\n localErrorMessage?: HashObject;\n tooltips?: Record<string, string>;\n}\n\nexport function UserReviewTable(props: UserReviewTableProps): JSX.Element {\n const namespace = props.userType === UserGroup.Learner\n ? 'userManager.studentReviewTable'\n : 'userManager.staffReviewTable';\n\n const showActions = !!props.onClickEdit || !!props.onClickDelete;\n\n const userTypeClass = props.userType === UserGroup.Learner ? styles.learnerTable : styles.staffTable;\n const tableHeaderClass = `p-2 text-nowrap bg-white d-table-cell fw-semibold ${styles.stickyHeader}`;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <WindowedList\n items={props.users}\n rowHeight={USER_ITEM_ROW_HEIGHT}\n getComponent={user => {\n if (props.showInvalidEmptyState)\n return <React.Fragment key={user.lookupId}></React.Fragment>;\n\n return (\n <UserReviewRow\n key={user.lookupId}\n user={user}\n userType={props.userType}\n errorCodes={props.invalidUsers[user.lookupId]?.errorCodes || []}\n onClickEdit={props.onClickEdit}\n onClickDelete={props.onClickDelete}\n showPasswordField={props.showPasswordField}\n passwordPolicy={props.passwordPolicy}\n onToggleCheckbox={props.onToggleCheckbox}\n isChecked={props.isChecked(user.lookupId)}\n localErrorMessage={props.localErrorMessage}\n />\n );\n }}\n staticComponentAboveRows={(\n <>\n <div className={`border-bottom align-items-center d-table-row ${userTypeClass}`}>\n <div className={`${tableHeaderClass} ${styles.checkbox}`}>\n\n <Checkbox\n id={props.checkboxId}\n name='users-review-checkbox'\n checked={props.bulkCheckboxChecked}\n onChange={props.onToggleBulkCheckbox}\n indeterminate={props.bulkIndeterminate}\n className={styles.checkbox}\n disabled={props.disableBulkCheckbox}\n />\n </div>\n\n <div className={`${tableHeaderClass} ${styles.firstName}`}>\n <Text phrase='firstName' />\n {props.tooltips?.firstName && (\n <span className='d-inline-block'>\n <Tooltip title={props.tooltips.firstName} spanHack>\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Info} className='ms-1 svg-container'/>\n </Tooltip>\n </span>\n )}\n </div>\n\n <div className={`${tableHeaderClass} ${styles.surname}`}>\n <Text phrase='lastName' />\n {props.tooltips?.lastName && (\n <span className='d-inline-block'>\n <Tooltip title={props.tooltips.lastName} spanHack>\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Info} className='ms-1 svg-container'/>\n </Tooltip>\n </span>\n )}\n </div>\n\n <div className={`${tableHeaderClass} ${styles.email}`}><Text phrase='email' /></div>\n\n <div className={`${tableHeaderClass} ${styles.username}`}>\n <Text phrase='username' />\n {props.tooltips?.username && (\n <span className='d-inline-block'>\n <Tooltip title={props.tooltips.username} spanHack>\n <SvgContainer size={SvgContainerSize.Small} svgName={cvSvgLibrary.Info} className='ms-1 svg-container'/>\n </Tooltip>\n </span>\n )}\n </div>\n\n {props.userType === UserGroup.Learner && (\n <div className={`${tableHeaderClass} ${styles.yearGroup}`}><Text phrase='yearGroup' /></div>\n )}\n {props.showPasswordField && (\n <div className={`${tableHeaderClass} ${styles.password}`}><Text phrase='password' /></div>\n )}\n {showActions && <div className={`${tableHeaderClass}`}>&nbsp;</div>}\n </div>\n\n <li className='d-none' />\n </>\n )}\n />\n\n {props.showInvalidEmptyState && (\n <InvalidListingsEmptyState\n onClickCreate={props.onClickCreate}\n appLinks={props.appLinks}\n imageUrl={props.emptyStateImageUrl}\n userType={props.userType}\n />\n )}\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nimport { EditUserRequest } from '../interfaces';\nimport { BulkUserUploadViewModel, UserHash } from '../interfaces/viewmodels/BulkUserUploadViewModel';\nimport { UserManagerHelper } from '../utils/UserManagerHelper';\n\nfunction updateUserHash(userHash: UserHash, updatedUserIdsHash: HashObject<boolean>): UserHash {\n const updatedUsers = Object.keys(userHash || {}).reduce((updatedObj: UserHash, lookupId) => {\n if (!updatedUserIdsHash[lookupId])\n updatedObj[lookupId] = userHash[lookupId];\n return updatedObj;\n }, {});\n\n return updatedUsers;\n}\n\nexport const useBulkUploadUsers = () => {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserUploadViewModel>(SharedViewModelKeys.BULK_USER_UPLOAD);\n\n function initializeUsers(users?: EditUserRequest[]): void {\n setViewModel({\n users,\n invalidUsers: null,\n existingUsersHash: null\n });\n\n updateDuplicates(users);\n }\n\n function updateUser(updatedUser: EditUserRequest): void {\n const updatedUsers = viewModel.users.map(user => {\n if (user.lookupId !== updatedUser.lookupId)\n return user;\n\n return updatedUser;\n });\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, { [updatedUser.lookupId]: true }),\n existingUsersHash: viewModel?.existingUsersHash\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function deleteUsers(deletedUsers: string[]): void {\n const userIdHash = deletedUsers.reduce((prev: HashObject, curr) => {\n prev[curr] = true;\n return prev;\n }, {});\n\n const updatedUsers = viewModel.users.filter(user => !userIdHash[user.lookupId]);\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, userIdHash),\n existingUsersHash: updateUserHash(viewModel?.existingUsersHash, userIdHash),\n existingUserToAdd: viewModel?.existingUserToAdd?.filter(u => !!viewModel?.existingUsersHash[u.lookupId])\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function updateDuplicates(users?: EditUserRequest[]): void {\n const duplicateSets = UserManagerHelper.getNewDuplicates(users);\n setViewModel('duplicateSets', duplicateSets);\n }\n\n return {\n users: viewModel?.users,\n invalidUsers: viewModel?.invalidUsers,\n hasValidatedUsers: !!viewModel?.invalidUsers,\n existingUsersHash: viewModel?.existingUsersHash || {},\n hasExistingUsers: !!Object.keys(viewModel?.existingUsersHash || {}).length,\n existingUserToAdd: viewModel?.existingUserToAdd,\n duplicateSets: viewModel?.duplicateSets,\n newUsers: viewModel?.users?.filter(u => !viewModel?.existingUsersHash?.[u.lookupId]) || [],\n\n setUsers: initializeUsers,\n setInvalidUsers: (invalidUsers: UserHash) => setViewModel('invalidUsers', invalidUsers),\n setExistingUsers: (existingUsers: UserHash) => setViewModel('existingUsersHash', existingUsers),\n updateUser,\n deleteUsers\n };\n};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\ninterface WindowedListProps<TObject> {\n items: TObject[];\n getComponent: (item: TObject, index: number) => JSX.Element;\n rowHeight: number;\n containerHeight?: number;\n\n staticComponentAboveRows?: JSX.Element;\n staticComponentBelowRows?: JSX.Element;\n}\n\nexport const WindowedList = React.forwardRef((\n props: WindowedListProps<any>,\n ref: React.Ref<Scrollbars>\n) => {\n const [ availableHeight, setAvailableHeight ] = React.useState<number>(props.containerHeight || 0);\n const [ scrollTop, setScrollTop ] = React.useState<number>(0);\n\n const tableRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (props.containerHeight)\n return;\n\n setAvailableHeight(tableRef.current?.clientHeight ?? 0);\n }, [tableRef.current]);\n\n const numRows = props.items.length;\n const totalRowsVisible = Math.ceil(availableHeight / props.rowHeight);\n const totalHeight = props.rowHeight * numRows;\n\n const startIndex = Math.max(\n 0,\n Math.floor(scrollTop / props.rowHeight) - totalRowsVisible\n );\n\n const endIndex = Math.min(\n numRows,\n startIndex + (totalRowsVisible * 3)\n );\n\n function onScrollTable(e: React.UIEvent<HTMLDivElement>): void {\n setScrollTop(e.currentTarget.scrollTop);\n }\n\n function getTableStyles(): React.CSSProperties {\n const tablePosFromTop = tableRef.current?.getBoundingClientRect().top ?? 0;\n\n const height = props.containerHeight || `calc(100vh - ${window.pageYOffset + tablePosFromTop + 30}px)`;\n \n return {\n height,\n minHeight: `${props.rowHeight * 5}px`,\n overflow: 'auto'\n };\n }\n\n function getRows(): JSX.Element[] {\n const items = [];\n \n let index = startIndex;\n while (index < endIndex) {\n const item = props.items[index];\n\n if (item)\n items.push(props.getComponent(item, index));\n \n index++;\n }\n\n return items;\n }\n\n return (\n <div style={getTableStyles()} ref={tableRef}>\n <Scrollbars\n onScroll={onScrollTable}\n autoHeightMin={totalHeight}\n autoHeightMax={totalHeight}\n ref={ref}\n >\n <div style={{ height: totalHeight, paddingTop: startIndex * props.rowHeight }}>\n <ul className='w-100 position-relative d-table striped-list list-unstyled no-full-width'>\n {!!props.staticComponentAboveRows && props.staticComponentAboveRows}\n {getRows()}\n {!!props.staticComponentBelowRows && props.staticComponentBelowRows}\n </ul>\n </div>\n </Scrollbars>\n </div>\n );\n});","import React from 'react';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\ninterface WizardHeaderProps<TStepId> {\n currentStep: TStepId;\n title: string;\n continueButton: JSX.Element;\n backButton: JSX.Element;\n breadcrumbs?: Breadcrumb[];\n hideHeader?: boolean;\n loaded: boolean;\n}\n\nexport function WizardHeader<TStepId>(props: WizardHeaderProps<TStepId>): JSX.Element {\n const { showButtons } = React.useContext(WizardLayoutContext);\n\n return (\n <div className='d-flex justify-content-between'>\n {!props.hideHeader ? (\n <div>\n <h1 className='h2'>{props.title}</h1>\n\n {props.breadcrumbs &&\n <div className='pb-3'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n </div>\n ) : <div/>}\n\n {props.loaded && showButtons && (\n <div className='d-flex align-items-center'>\n {props.backButton}\n {props.continueButton}\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nconst namespace = 'shared.wizardStepList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface WizardStep<StepId extends string> {\n id: StepId;\n text: string;\n appLink?: Core.AppLink;\n subText?: string;\n disabled?: boolean;\n openInNewTab?: boolean;\n}\n\ninterface WizardStepListTheme {\n item?: string;\n itemsContainer?: string;\n itemContent?: string;\n isSelectedOverride?: string;\n isCompletedOverride?: string;\n}\n\ninterface WizardStepListItemProps {\n appLink: Core.AppLink;\n isSelected: boolean;\n isCompleted: boolean;\n text: string;\n subText?: string;\n disabled: boolean;\n index: number;\n hideStepNumber?: boolean;\n theme?: WizardStepListTheme;\n}\n\nfunction WizardStepListItem(props: WizardStepListItemProps): JSX.Element {\n const content = (\n <>\n <div className='d-flex'>\n {!props.hideStepNumber && <div className='flex-shrink-0 flex-grow-0'>{`${props.index + 1}.`}&nbsp;</div>}\n <div>{props.text}</div>\n </div>\n\n {props.subText && (\n <div className='ms-2 ps-1 pt-1'>\n {props.subText}\n </div>\n )}\n </>\n );\n\n \n let className = 'px-2 py-1 mb-1 rounded d-inline-block';\n\n if (props.isSelected) {\n className += ` ${props.theme?.isSelectedOverride || 'bg-light-blue fw-semibold'}`;\n }\n\n if ((!props.isSelected && props.isCompleted))\n className += ` ${props.theme?.isCompletedOverride || 'text-info'}`;\n\n return (\n <li className={props.theme?.item}>\n {(props.isCompleted && props.appLink)\n ? (\n <AppLink appLink={props.appLink} className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </AppLink>\n ) : (\n <div className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </div>\n )\n }\n </li>\n );\n}\n\ninterface WizardStepListProps<StepId extends string> {\n currentStep: StepId;\n steps: WizardStep<StepId>[];\n disableAppLinks?: boolean;\n theme?: WizardStepListTheme;\n}\n\nexport function WizardStepList<StepId extends string>(props: WizardStepListProps<StepId>): JSX.Element {\n const currentStepNumber = props.steps.reduce((acc, step, i) => {\n if (step.id === props.currentStep)\n acc = i + 1;\n\n return acc;\n }, 1);\n\n return (\n <>\n <h2 className='h4'>\n {getPhrase('stepNumber', { currentStep: currentStepNumber, totalSteps: props.steps.length })}\n </h2>\n\n <ol className={`list-unstyled ${props.theme?.itemsContainer || ''}`}>\n {props.steps.map((step, i) => {\n const isSelected = step.id === props.currentStep;\n const isCompleted = currentStepNumber > i + 1;\n\n return (\n <WizardStepListItem\n index={i}\n key={step.id}\n text={step.text}\n subText={step.subText}\n isSelected={isSelected}\n isCompleted={isCompleted}\n appLink={!props.disableAppLinks && step.appLink}\n disabled={step.disabled}\n theme={props.theme}\n />\n );\n })}\n </ol>\n </>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};"],"names":["namespace","BulkUserUploadBackButton","props","currentStep","AppLink","className","appLink","appLinks","userManager","Text","phrase","BulkUserUploadContinueButton","useBulkUploadUsers","duplicateSets","hasExistingUsers","WizardLayoutContext","disableNext","onClickConfirm","spreadsheetHasDuplicates","length","currentAppLink","ContextService","action","userUploadStatus","polling","complete","userUploadPopup","userUploadReviewAccounts","userUploadFixDuplicates","userUploadReviewExistingAccounts","willUploadOnNext","Button","variant","onClick","disabled","canAddExistingUsers","userUploadConfirmation","getNextAppLink","BULK_USER_UPLOAD_NAV_LOCK_ID","BulkUserUploadWizardLayout","users","setUsers","navLock","useNavLock","lock","id","title","LanguageService","text","appLinkWhitelist","BulkUserUploadHelper","onConfirmUnlock","unlock","replace","WizardHeader","loaded","continueButton","backButton","breadcrumbs","name","settings","userType","UserGroup","active","WizardStepList","steps","children","InvalidListingsEmptyState","existingUsersHash","client","UserManagerClientContext","duplicates","UserManagerHelper","goNext","Object","keys","value","EmptyState","src","imageUrl","size","UserManagerClient","onClickCreate","USER_ITEM_ROW_HEIGHT","DataCell","baseClass","error","emptyStateText","data","yearGroup","tooltip","Tooltip","spanHack","SvgContainer","S","svgName","UserReviewRow","user","errorCodes","onClickEdit","onClickDelete","minPasswordLength","passwordPolicy","masterRole","errorMessages","localErrorMessage","showActions","getPhrase","usernameIsInvalid","find","c","UserValidationCode","userTypeClass","style","height","Checkbox","lookupId","onChange","onToggleCheckbox","checked","isChecked","firstName","surname","email","username","masterYearGroup","showPasswordField","password","DivButton","tooltipSpanHack","tooltipPlacement","UserReviewTable","tableHeaderClass","WindowedList","items","rowHeight","getComponent","showInvalidEmptyState","key","invalidUsers","staticComponentAboveRows","checkboxId","bulkCheckboxChecked","onToggleBulkCheckbox","indeterminate","bulkIndeterminate","disableBulkCheckbox","tooltips","lastName","emptyStateImageUrl","updateUserHash","userHash","updatedUserIdsHash","reduce","updatedObj","viewModel","setViewModel","updateDuplicates","hasValidatedUsers","existingUserToAdd","newUsers","filter","u","setInvalidUsers","setExistingUsers","existingUsers","updateUser","updatedUser","updatedUsers","map","deleteUsers","deletedUsers","userIdHash","prev","curr","ref","containerHeight","availableHeight","setAvailableHeight","scrollTop","setScrollTop","tableRef","current","clientHeight","tablePosFromTop","numRows","totalRowsVisible","Math","ceil","totalHeight","startIndex","max","floor","endIndex","min","getBoundingClientRect","top","window","pageYOffset","minHeight","overflow","onScroll","e","currentTarget","autoHeightMin","autoHeightMax","paddingTop","index","item","push","getRows","staticComponentBelowRows","showButtons","hideHeader","WizardStepListItem","content","hideStepNumber","subText","isSelected","theme","isSelectedOverride","isCompleted","isCompletedOverride","itemContent","currentStepNumber","acc","step","i","totalSteps","itemsContainer","disableAppLinks","useBulkCheckboxManager","collection","options","idField","persistNamespace","initial","initialState","Map","forceUpdate","prevCollection","prevNamespace","reset","clear","toString","get","isBulkChecked","every","setSelected","ids","forEach","set","join","preselectedIds","onToggleBulk","setValue","onToggleItem","nextItemState","getSelected","Array","from","bulkChecked","deselectAll","hasSomeSelections","getSelectedCount","getMap"],"sourceRoot":""}