@clickview/lite 0.50.0-rc.8 → 0.50.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 (21) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{lite-app-f2595ac365.css → lite-app-cf9b57ee91.css} +1 -1
  3. package/dist/scripts/{1617-d6c1d47afe-lite.chunk.js → 1617-3cf9199cb1-lite.chunk.js} +2 -2
  4. package/dist/scripts/{1617-d6c1d47afe-lite.chunk.js.map → 1617-3cf9199cb1-lite.chunk.js.map} +1 -1
  5. package/dist/scripts/{3012-1cde12ab3d-lite.chunk.js → 3012-08307aac0e-lite.chunk.js} +2 -2
  6. package/dist/scripts/{3012-1cde12ab3d-lite.chunk.js.map → 3012-08307aac0e-lite.chunk.js.map} +1 -1
  7. package/dist/scripts/{3020-97e3d647ab-lite.chunk.js → 3020-9f647705a0-lite.chunk.js} +2 -2
  8. package/dist/scripts/{3020-97e3d647ab-lite.chunk.js.map → 3020-9f647705a0-lite.chunk.js.map} +1 -1
  9. package/dist/scripts/5974-ec9007f42b-lite.chunk.js +2 -0
  10. package/dist/scripts/5974-ec9007f42b-lite.chunk.js.map +1 -0
  11. package/dist/scripts/7115-18b0e390de-lite.chunk.js +2 -0
  12. package/dist/scripts/7115-18b0e390de-lite.chunk.js.map +1 -0
  13. package/dist/scripts/{bundle-9111dc8132.min.js → bundle-48ad415564.min.js} +3 -3
  14. package/dist/scripts/bundle-48ad415564.min.js.map +1 -0
  15. package/package.json +1 -1
  16. package/dist/scripts/5974-215374f364-lite.chunk.js +0 -2
  17. package/dist/scripts/5974-215374f364-lite.chunk.js.map +0 -1
  18. package/dist/scripts/7115-8510dcd735-lite.chunk.js +0 -2
  19. package/dist/scripts/7115-8510dcd735-lite.chunk.js.map +0 -1
  20. package/dist/scripts/bundle-9111dc8132.min.js.map +0 -1
  21. /package/dist/scripts/{bundle-9111dc8132.min.js.LICENSE.txt → bundle-48ad415564.min.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/3020-97e3d647ab-lite.chunk.js","mappings":"0MA8CM,SAAUA,EAAQC,GACtB,IAAMC,EAAiB,WAAc,kBAAMD,EAAME,QAAQC,MAAK,SAACC,EAAGC,GAAC,OAAKD,EAAEE,MAAQD,EAAEC,KAAK,GAAC,GAAE,CAACN,EAAME,UAE7FK,EAAiC,GACjCC,EAA+B,GAErCP,EAAeQ,SAAQ,SAAAL,GACjBA,EAAEM,OACJH,EAAcI,KAAKP,GAEnBI,EAAYG,KAAKP,EACrB,IAEA,IAAIQ,EAAY,SAKhB,OAHIZ,EAAMY,YACRA,GAAa,IAAJ,OAAQZ,EAAMY,YAEpBL,EAAcM,QAAWL,EAAYK,OAIxC,uBAAKD,UAAWA,GACd,gCACE,wBAAMA,UAAU,6BACbL,EAAcM,OAASN,EAAcO,KAAI,SAACV,EAAGW,GAAG,OAC/C,gBAAC,WAAc,CAACC,IAAKD,GACjB,WACA,GAAIX,EAAEa,MAAO,CACX,IAAMA,EAAQ,eAA0Bb,EAAEa,OACtCb,EAAEa,MACF,kBAAM,gCAAGb,EAAEa,MAAS,EAExB,OACE,gBAAC,IAAY,CACXC,QAASd,EAAEc,QACXC,KAAMf,EAAEe,KACRC,QAAShB,EAAEgB,QACXC,QAASjB,EAAEiB,QACXT,UAAWR,EAAEQ,UACbU,QAASlB,EAAEkB,QACXC,YAAanB,EAAEmB,YACfC,cAAepB,EAAEoB,cACjBC,iBAAkBrB,EAAEqB,iBACpBC,aAActB,EAAEsB,aAChBC,SAAUvB,EAAEuB,UAEXV,IAGN,CAED,IAAMW,EACJ,gBAAC,IAAU,CACTV,QAASd,EAAEc,QACXC,KAAMf,EAAEe,KACRC,QAAShB,EAAEgB,QACXC,QAASjB,EAAEiB,QACXT,UAAWR,EAAEQ,UACbY,cAAepB,EAAEoB,cACjBC,iBAAkBrB,EAAEqB,iBACpBC,aAActB,EAAEsB,aAChBC,SAAUvB,EAAEuB,WAIhB,OAAOvB,EAAEkB,QACL,gBAAC,IAAO,CAACO,MAAOzB,EAAEkB,QAASQ,UAAQ,GAAEF,GACrCA,CACN,CA1CE,GA2Ca,IACd,iCACJ5B,EAAM+B,eAAiB/B,EAAM+B,cAC7BvB,EAAYK,OACX,gBAAC,IAAe,CACdX,QAASM,EACTwB,wBAAyBhC,EAAMiC,yBAC/BC,sBAAuBlC,EAAMkC,sBAC7BC,UAAWnC,EAAMmC,YAEjB,oCA7DH,gCAkEX,C,0IClIA,SAAgB,eAAiB,SCgBjC,SAASC,IACP,OACE,gCACE,uBAAKC,MAAO,CAAEC,QAAS,oBACrB,uBAAK1B,UAAU,6BAA6ByB,MAAO,CAAEE,OAAQ,YAAaC,MAAO,WAEnF,uBAAKH,MAAO,CAAEC,QAAS,oBACrB,uBAAK1B,UAAU,6BAA6ByB,MAAO,CAAEE,OAAQ,YAAaC,MAAO,YAEnF,uBAAKH,MAAO,CAAEC,QAAS,oBACrB,uBAAK1B,UAAU,6BAA6ByB,MAAO,CAAEE,OAAQ,YAAaC,MAAO,YAEnF,uBAAKH,MAAO,CAAEC,QAAS,oBACrB,uBAAK1B,UAAU,6BAA6ByB,MAAO,CAAEE,OAAQ,YAAaC,MAAO,WAIzF,CAEA,SAASC,EAAyBC,GAChC,IAAI9B,EAAY,gBAKhB,OAHI8B,IACF9B,GAAa,IAAJ,OAAQ8B,IAEZ9B,CACT,CAQA,SAAS+B,EAAoB3C,GAC3B,IAAMiB,EAAQ2B,EAAA,aAA0B5C,EAAM6C,OAAO5B,OACjDjB,EAAM6C,OAAO5B,MACb,kBAAM,gCAAGjB,EAAM6C,OAAO5B,MAAS,EAEnC,GAAIjB,EAAM6C,OAAO3B,QACf,OACE,gBAAC4B,EAAA,EAAO,CACN5B,QAASlB,EAAM6C,OAAO3B,QACtBE,QAASpB,EAAM6C,OAAOzB,QACtBR,UAAW6B,EAAyBzC,EAAM6C,OAAOjC,WACjDY,cAAexB,EAAM6C,OAAOrB,cAC5BC,iBAAkBzB,EAAM6C,OAAOpB,iBAC/BC,aAAc1B,EAAM6C,OAAOnB,aAC3BC,SAAU3B,EAAM6C,OAAOlB,UAEtB3B,EAAM6C,OAAOxB,SAAW,gBAAC0B,EAAA,EAAY,CAAC1B,QAASrB,EAAM6C,OAAOxB,QAAST,UAAU,mDAChF,wBAAMA,UAAU,gBAAgBK,MAItC,SAASG,EAAQ4B,GACfA,EAAEC,iBAEEjD,EAAM6C,OAAOrB,eAAiBxB,EAAM6C,OAAOpB,kBAC7CyB,EAAA,gBAA8BlD,EAAM6C,OAAOrB,cAAexB,EAAM6C,OAAOpB,kBAErEmB,EAAA,aAA0B5C,EAAM6C,OAAOzB,UACzCpB,EAAM6C,OAAOzB,UAEXpB,EAAM6C,OAAO1B,MACf,gBAA4BnB,EAAM6C,OAAO1B,KAAMnB,EAAM6C,OAAOnB,aAChE,CAEA,OAAI1B,EAAM6C,OAAO1B,KAEb,qBACEP,UAAW6B,EAAyBzC,EAAM6C,OAAOjC,WACjDQ,QAASA,EACTD,KAAMnB,EAAM6C,OAAO1B,MAElBnB,EAAM6C,OAAOxB,SAAW,gBAAC0B,EAAA,EAAY,CAAC1B,QAASrB,EAAM6C,OAAOxB,QAAST,UAAU,mDAChF,wBAAMA,UAAU,gBAAgBK,MAMpC,wBACEL,UAAS,yBAAoB6B,EAAyBzC,EAAM6C,OAAOjC,YACnEQ,QAASA,EACT+B,KAAK,SACLC,SAAU,EACVC,UAAW,SAACL,GAAsB,MAAe,UAAVA,EAAEhC,KAAmBI,EAAQ4B,EAAE,GAErEhD,EAAM6C,OAAOxB,SAAW,gBAAC0B,EAAA,EAAY,CAAC1B,QAASrB,EAAM6C,OAAOxB,QAAST,UAAU,sCAC/EK,IAGP,CAeM,SAAUqC,EAAgBtD,GAC9B,IAAKA,EAAME,UAAYF,EAAME,QAAQW,OACnC,OAAO,iCAET,IAAM0C,EAASvD,EAAME,QAAQsD,MAAK,SAAApD,GAAC,OAAIA,EAAEqD,eAAe,IAEpD7C,EAAY,WAEZZ,EAAMY,YACRA,GAAa,IAAJ,OAAQZ,EAAMY,YAGzB,IAOI8C,EAPEC,EAAmB,oBAAH,OAAuBC,EAAA,kBAEzC5B,EAA0B,wBAAH,OAA2B,kBAOtD,OALIhC,EAAMgC,0BACRA,GAA2B,IAAJ,OAAQhC,EAAMgC,0BAKrC,uBAAKpB,UAAWA,GACd,0BACEA,UAAWoB,EACX6B,KAAK,SACLC,GAAIH,EAAgB,iBACL,WAAU,cACb,WAAU,gBACR,OAAM,gBACN,QACdvC,QAASmC,EAASvD,EAAMmC,UAAY,MAEpC,gBAACY,EAAA,EAAY,CAAC1B,QAAS,UAAmB0C,KAAM/D,EAAMkC,yBAExD,uBAAKtB,UAAU,sDAAqD,kBAAkB+C,GACnFJ,EACC,gBAACnB,EAAiB,MAClBpC,EAAME,QAAQY,KAAI,SAACV,EAAGW,GACpB,IAAMiD,OAA+BC,IAAjBP,GAA8BA,IAAiBtD,EAAE8D,MAGrE,OAFAR,EAAetD,EAAE8D,MAEb9D,EAAEkB,QAEF,gBAAC,WAAc,CAACN,IAAKD,GAClBiD,GAAe,sBAAIpD,UAAU,mBAAmBuC,KAAK,cACtD,gBAACgB,EAAA,EAAO,CAACtC,MAAOzB,EAAEkB,QAASQ,UAAQ,GACjC,gBAACa,EAAmB,CAACE,OAAQzC,MAQnC,gBAAC,WAAc,CAACY,IAAKD,GAClBiD,GAAe,sBAAIpD,UAAU,mBAAmBuC,KAAK,cACtD,gBAACR,EAAmB,CAACE,OAAQzC,IAGnC,KAKV,CAtEAkD,EAAgBc,aAAe,CAC7BpC,wBAAyB,gBACzBE,sBAAuBa,EAAAsB,EAAA,M,4HCnGZC,EAAiB,SAAH,WAAMC,WAAcC,EAAI,EAAJA,KAAMtD,EAAO,EAAPA,QAASuD,EAAM,EAANA,OAAUC,EAAY,EAAZA,aAAY,OAClF,sBAAI9D,UAAS,yBAAoB6D,EAAS,UAAY,KACnDA,EACG,8BAASD,GACT,gBAAC,IAAO,CAACtD,QAASA,GACjBwD,GAAgB,gBAAC,IAAY,CAACrD,QAAS,iBAA0B0C,KAAM,EAAAM,EAAA,QACxE,wBAAMzD,UAAW8D,EAAe,OAAS,IAAKF,IAG/C,EAOMG,EAAc,SAAH,GAAyC,IAAnCC,EAAW,EAAXA,YACtBC,GAAW,OAAc,QAEzBhE,EAAS+D,aAAW,EAAXA,EAAa/D,OAE5B,OAAKA,GAAWgE,GAAYhE,EAAS,EAC5B,iCAELgE,EAEA,oCAAgB,cACd,sBAAIjE,UAAU,sBACZ,gBAAC0D,EAAc,CAACC,WAAYK,EAAY/D,EAAS,GAAI6D,cAAY,MAMvE,oCAAgB,cACd,sBAAI9D,UAAU,sBACXgE,EAAY9D,KAAI,SAACT,EAAGU,GAAG,OAAK,gBAACuD,EAAc,CAACtD,IAAKD,EAAKwD,WAAYlE,GAAK,KAIhF,EAEayE,EAAqB,QAAW,YAAiD,QAAtCC,SAAAA,OAAQ,IAAG,IAAC,EAGlE,OAFiB,OAAc,QAI3B,uBAAKnE,UAAU,6BAA6ByB,MAAO,CAAEE,OAAQ,YAAaC,MAAO,UAKnF,oCAAgB,cACd,sBAAI5B,UAAU,sBACX,2BAA4C,CAAEmE,SAAAA,IAAYjE,KAAI,WAAYC,GAAG,IAAZyB,EAAK,EAALA,MAAK,OACrE,sBAAIxB,IAAKD,EAAKH,UAAU,mBACtB,wBAAMA,UAAU,4CAA4CyB,MAAO,CAAEG,MAAAA,GAASwC,wBAAyB,CAAEC,OAAQ,WAC9G,KAKf,G,oHCjEA,SAASC,EAAYlF,GACnB,OACE,kCACKA,EAAMmF,IAAI9D,SACX,uBAAKT,UAAWZ,EAAMmF,IAAIX,KAAO,OAAS,IACxC,gBAAC,IAAY,CAACnD,QAASrB,EAAMmF,IAAI9D,WAIpCrB,EAAMmF,IAAIX,KAEmB,iBAArBxE,EAAMmF,IAAIC,OACjB,uBAAKxE,UAAU,QACb,gBAAC,IAAK,CAACiD,KAAM,UAAiBwB,KAAMrF,EAAMmF,IAAIC,SAKxD,CA6BM,SAAUE,EAAgBtF,G,MAW9B,OACE,uBAAKY,UAA0B,QAAf,EAAAZ,EAAMY,iBAAS,QAAI,IACjC,sBAAIA,UAAS,qDACwB,oBAAsB,qBACvDZ,EAAMuF,aAAe,gBAAqB,GAAE,qBAC5CvF,EAAMwF,cAAa,aAEpBxF,EAAMyF,KAAK3E,KAAI,SAACqE,EAAKO,GACpB,OACE,sBACE9E,UAAS,gCACD,QAAU,YAAIuE,EAAIV,OAAS,eAAiB,uBAAsB,6BACtEU,EAAIX,KAAO,aAAkB,GAAE,YAAIW,EAAIvE,UAAS,oBAEpDI,IAAK0E,GAEJP,EAAIjE,QACH,gBAAC,IAAO,CACNA,QAASiE,EAAIjE,QACbM,cAAe2D,EAAI3D,cACnBC,iBAAkB0D,EAAI1D,iBACtBb,UAAS,sKAE4C,YAAc,yBAGnE,gBAACsE,EAAW,CAACC,IAAKA,KAGpB,gBAAC,IAAS,CACRvE,UAAS,qKAE2C,YAAc,wBAElEQ,QAAS,kBA5CzB,SAAqB+D,IACfA,EAAIV,QAAWU,EAAIQ,WAGvBR,EAAIQ,WAEAR,EAAI3D,eAAiB2D,EAAI1D,kBAC3B,kBAA8B0D,EAAI3D,cAAe2D,EAAI1D,kBACzD,CAoC+BmE,CAAYT,EAAI,GAE/B,gBAACD,EAAW,CAACC,IAAKA,KAK5B,KAIR,CA5DAG,EAAgBlB,aAAe,CAC7BmB,aAAc,K,4DC/DhB,SAAgB,YAAc,SCIxB,SAAUM,IACd,OACE,uBAAKjF,UAAS,qCAAgC,oBAAsB,YAAI,gBAE5E,C,yGCiBMkF,EAA8B,CAClCC,SAAU,IACVC,UAAW,CACTC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,QAAS,KAEXC,WAAY,KAGR,SAAUC,EACdC,GAMkC,IALlCC,EAAA,uDAA+B,CAAC,EAKhCC,EAAA,uDAAgC,CAAC,EAEjC,GAAKF,EAAL,CAGA,IAAIG,EAGFA,EADmB,iBAAVH,EACIA,EAEAA,EAAKI,OAGpB,IAAMC,EAAW,OAAH,wBACTd,GACAU,GAGAE,GAGA,yBAAmCA,KAGpCA,IAAe,aAMfA,IAAe,cAUdD,EAAUJ,YACb,aAAuB,IAAIO,EAASP,YAN/BI,EAAUT,WACb,aAAuB,IAAIY,EAASZ,UAAUI,SAX3CK,EAAUV,UACb,aAAuB,IAAIa,EAASb,UAvBhC,CAuCV,C,6DChFA,SAASc,EAAiBC,GACxB,OAAOA,EAAWhG,KAAI,SAAAiG,GAAG,OAAIA,EAAIL,UAAU,IAAEM,KAAK,IACpD,CAGM,SAAUC,EACdC,EACAC,EACAC,GAEA,IAAMN,EAAaO,MAAMC,QAAQJ,GAAeA,EAAc,CAACA,IAE/D,IAAAK,YAAU,WACRT,EAAWrG,SAAQ,SAAAsG,IACjB,OAAgBA,EAAIL,WAAYS,EAAcC,EAChD,GACF,GAAG,CAAEP,EAAiBC,GAAaK,EAAcC,GACnD,C,kDCDaI,EAAqB,CAChCC,kBAAiB,SAACd,GAChB,GAAwB,iBAAZA,EACV,OAAOA,EAET,GAAwB,iBAAZA,EAAsB,CAChC,GAAe,IAAXA,EACF,OAAO,aAET,GAAe,IAAXA,EACF,OAAO,WAET,GAAe,IAAXA,EACF,OAAO,YACV,CAED,OAAO,IACT,EAEAe,kBAAiB,SAACf,GAChB,GAAwB,iBAAZA,EACV,OAAOA,EAET,GAAwB,iBAAZA,EAAsB,CAChC,GAAIA,IAAW,aACb,OAAO,EAET,GAAIA,IAAW,WACb,OAAO,EAET,GAAIA,IAAW,aACb,OAAO,CACV,CAED,OAAO,IACT,E,wICzDF,IAAMgB,EAAyD,CAC7D5C,SAAU,EACV6C,SAAU,GACVC,SAAU,KAaCC,EAAuB,CAClCC,uBAAsB,WAAoC,I,EAAnCC,EAAA,uDAAiC,CAAC,EACjDC,EAAO,OAAH,wBACLN,GACAK,GAKL,O,EAAWX,MAAMY,EAAKlD,U,omBAAWjE,KAAI,iBAAO,CAAE0B,MAAO,GAAF,OAFhB0F,KAAKC,IAAID,KAAKE,MAAMF,KAAKG,SAAWJ,EAAKJ,UAAWI,EAAKL,UAEd,MAAM,GACtF,E,+OCZF,IACMU,EAAY,qBADA,4BAGZC,EAAc,SAACC,GACnB,OAAO,8BAA0CA,EACnD,EAQM,SAAUC,EAAczI,GAE5B,I,IAA8E,G,EAA5C,WAAeuI,EAAYvI,EAAMwI,Y,EAAW,E,o4BAAtEE,EAAQ,KAAEC,EAAW,KAEvBC,GAAS,SAiEf,OA/DA,aAAgB,WACVL,EAAYvI,EAAMwI,aAAeE,GAGrCC,GAAaD,EACf,GAAG,CAACH,EAAYvI,EAAMwI,aA2DpB,gBAAC,IAAS,CAACpH,QAzDb,WACEuH,GAAaD,GAEb1I,EAAM6I,UAAUH,GAAU,kBAG5B,SAAmBA,GACjB,GAAIA,EAcF,OAbA,kBAA8B,CAAE5E,GAAI9D,EAAMwI,UAAU1E,IAAM,CACxDgF,SAAU9I,EAAM+I,gBAChBC,WAAY,eACZC,WAAY,QACZC,OAAQ,eACRC,cAAe,qBAGjBP,EAAOQ,QAAQd,EAAU,aAAc,CACrCe,cAAerJ,EAAMwI,UAAUhE,KAC/B8E,YAAY,KAMhB,kBAA8B,CAAExF,GAAI9D,EAAMwI,UAAU1E,IAAM,CACxDgF,SAAU9I,EAAM+I,gBAChBC,WAAY,eACZC,WAAY,SACZC,OAAQ,eACRC,cAAe,gBAGjBP,EAAOQ,QAAQd,EAAU,eAAgB,CACvCe,cAAerJ,EAAMwI,UAAUhE,KAC/B8E,YAAY,IAEhB,CAjCkCC,EAAWb,EAAS,IAAE,kBAoCtDC,EADea,EAnCqDd,QAsChEc,EACFZ,EAAOa,MAAMnB,EAAU,aAAc,CACnCe,cAAerJ,EAAMwI,UAAUhE,KAC/B8E,YAAY,KAMhBV,EAAOa,MAAMnB,EAAU,WAAY,CACjCe,cAAerJ,EAAMwI,UAAUhE,KAC/B8E,YAAY,MAdhB,IAAiBE,CAnC8D,GAC/E,EAqDgC5I,UAAW8H,EAAW,cAAgB,IAClE,gBAAC,IAAY,CACXrH,QAASqH,EAAW,UAAoB,iBACxC3E,KAAM,EAAAM,EAAA,SAId,C,8FC/FaqF,EAA+B,SAACC,G,MAMrCC,GAAyBC,GALJ,SAAnBA,gBAKsC,yBAExCC,EAAc,kBAAkC,mBAMhDC,EAAW,mBAA8BH,IAA0C,QAAhB,EAAAE,EAAYzE,YAAI,eAAE2E,aACzF,yBAAuCL,EAAaG,EAAYzE,KAAK2E,aACjEC,EAAS,mBAA8BL,GAC3C,uBAAqCD,IAGvC,GAAIC,EACF,MAAO,CACLM,WAAW,EACXC,SAAS,EACTC,WAAW,GAIf,IAAKL,EAASM,eAAiBJ,EAAOI,eAAiBP,EAAYO,aACjE,MAAO,CAAEH,WAAW,GAEtB,IAAMI,EAAgBR,EAAYzE,KAAKvB,GAAGyG,WAEpCC,IAAqBP,EAAO5E,KAAKoF,MAAK,SAAAC,GAAK,OAAIA,EAAM5G,GAAGyG,aAAeD,CAAa,IACpFK,IAAuBZ,EAAS1E,KAAKoF,MAAK,SAAAG,GAAO,OAAIA,EAAQ9G,GAAGyG,aAAeD,CAAa,IAElG,MAAO,CACLJ,WAAW,EACXE,UAAWI,GAAoBG,EAC/BR,QAASK,EAEb,C,6jDC3CA,IAAMK,EAAY,wCAELC,EAA2B,YACtC,oB,4FAAA,mBACQ,2BACR,CAEA,O,qRAAA,M,EAAA,G,EAAA,iBACA,WACE,MAAO,4BACT,GAEA,mBACA,WACE,OAAOC,EAAA,YAA0BF,EAAW,UAC9C,GAEA,uBACA,WACE,OAAOE,EAAA,YAA0BF,EAAW,cAC9C,GAEA,eACA,WACE,MAAO,CACLG,KAAMD,EAAA,YAA0BF,EAAW,OAC3C3J,QAAS,CACP+J,YAAa,eACbpI,OAAQ,qBAGd,M,6EAAC,CA7BqC,CAAQqI,EAAA,G,87CCFhD,IAAM,EAAY,oCAELC,EAAuB,YAClC,oB,4FAAA,mBACQ,2BACR,CAEA,O,qRAAA,M,EAAA,G,EAAA,iBACA,WACE,MAAO,wBACT,GAEA,mBACA,WACE,OAAOJ,EAAA,YAA0B,EAAW,UAC9C,GAEA,uBACA,WACE,OAAOA,EAAA,YAA0B,EAAW,cAC9C,GAEA,eACA,WACE,MAAO,CACLC,KAAMD,EAAA,YAA0B,EAAW,OAC3C7J,QAAS,CACP+J,YAAa,eACbpI,OAAQ,qBAGd,M,6EAAC,CA7BiC,CAAQqI,EAAA,GCE/BE,EAA2B,SAAC5C,GACvC,IAAQqB,GAAmB,EAAAwB,EAAA,KAAnBxB,gBAER,OAAqBrB,EAAW,CAC9BzC,SAAUoF,EACVnF,UAAW,CACTI,QAASyD,EAAeyB,EAAA,kBAAiCR,EAA6BS,EAAA,IAG5F,C,gOCJMV,EAAY,mBAELW,EAAsB,SAAC7B,EAAqBG,EAA0B2B,GACjF,IAAM5G,GAAW,OAAc,YACzB6G,GAAc,OAA6B/B,GAE3CnI,EAAgB,CAAEsC,GAAI6F,GAEtBgC,EAAyC,CAC7CzC,OAAQ,eACRC,cAAe,WACfL,SAAU,gBAGN8C,EAAc,4BAEd1L,EAA2B,GAsFjC,OApFIwL,EAAYvB,SACdjK,EAAQS,KAAK,CACXL,MAAO,EACPW,MAAO8J,EAAA,YAA0BF,EAAW,iBAC5C3J,QAAS,CACP+J,YAAa,eACbpI,OAAQ,8BACRgJ,KAAM,CAAClC,IAEThI,SAAU8J,EACVnK,QAASmK,EAAWV,EAAA,YAA0BF,EAAW,uBAAyB,GAClFrJ,cAAAA,EACAC,iBAAkB,OAAF,wBACXkK,GAAoB,CACvB3C,WAAY,YAEd3H,QAAS,UACTX,QAASmE,EACTjE,UAAW6K,EAAW,YAAH,OAAeG,GAAiB/G,EAAyB,GAAd+G,IAIlE1L,EAAQS,KAAK,CACXL,MAAO,GACPW,MAAO8J,EAAA,YAA0BF,EAAW,oBAC5C3J,QAAS,CACP+J,YAAa,eACbpI,OAAQ,kCACRgJ,KAAM,CAAClC,IAEThI,SAAU8J,EACVnK,QAASmK,EAAWV,EAAA,YAA0BF,EAAW,uBAAyB,GAClFnK,QAAUmE,IAAa6G,EAAYvB,QACnCvJ,UAAW6K,EAAW,WAAe5G,GAAa6G,EAAYvB,QAAyB,GAAdyB,IAGvEF,EAAYvB,SACdjK,EAAQS,KAAK,CACXL,MAAO,GACPW,MAAO8J,EAAA,YAA0BF,EAAW,WAC5CrJ,cAAAA,EACAG,SAAU8J,EACVnK,QAASmK,EAAWV,EAAA,YAA0BF,EAAW,uBAAyB,GAClFpJ,iBAAkB,OAAF,wBACXkK,GAAoB,CACvB3C,WAAY,aACZC,WAAY,UAEd/H,QAAS,CACP+J,YAAa,eACbpI,OAAQ,iCACRgJ,KAAM,CAAClC,IAET/I,UAAW6K,EAAW,WAAa,MAIlCC,EAAYvB,SAAWuB,EAAYtB,YAAcN,EAAY3G,OAAS2I,EAAA,SACzE5L,EAAQS,KAAK,CACXL,MAAO,GACPW,MAAO8J,EAAA,YAA0BF,EAAW,kBAC5ClJ,SAAU8J,EACVnK,QAASmK,EAAWV,EAAA,YAA0BF,EAAW,uBAAyB,GAClFjK,UAAW6K,EAAW,WAAa,cACnCjK,cAAe,OAAF,wBACRA,GAAa,CAChBuK,UAAWjC,EAAYhG,KAEzBrC,iBAAkB,OAAF,wBACXkK,GAAoB,CACvB3C,WAAY,gBACZC,WAAY,YAEd/H,QAAS,CACP+J,YAAa,eACbpI,OAAQ,+BACRgJ,KAAM,CAAClC,GACPqC,OAAQ,CACNC,WAAY,CAACnC,EAAYhG,QAM1B5D,CACT,ECtHA,SAAgB,iBAAmB,SCsBnC,IACMoI,EAAYyC,EAAA,mBADA,8BAWZ,SAAUmB,EAAgBlM,GAC9B,IAAM0L,GAAc,OAA6B1L,EAAMwI,UAAU1E,IAE3D5D,EAAUsL,EAAoBxL,EAAMwI,UAAU1E,GAAI9D,EAAM8J,YAAa9J,EAAMmM,YAE3EC,EAAkB5E,EAAA,oBAAqCxH,EAAMwI,UAAU7B,QAEvElB,EAAkB,CAAC,CACvBjB,KAAM8D,EAAU,YAChBpH,QAAS,CACP+J,YAAa,eACbpI,OAAQ,kCACRgJ,KAAM,CAAC7L,EAAMwI,UAAU1E,KAEzBW,OAA4B,aAApBzE,EAAMqM,WACb,CACD7H,KAAM8D,EAAU,UAChBpH,QAAS,CACP+J,YAAa,eACbpI,OAAQ,gCACRgJ,KAAM,CAAC7L,EAAMwI,UAAU1E,KAEzBW,OAA4B,WAApBzE,EAAMqM,WACb,CACD7H,KAAM8D,EAAU,YAChBpH,QAAS,CACP+J,YAAa,eACbpI,OAAQ,kCACRgJ,KAAM,CAAC7L,EAAMwI,UAAU1E,KAEzBW,OAA4B,aAApBzE,EAAMqM,YAGbC,QAAO,SAAAnH,GAAG,OAAKnF,EAAMmM,YAAchH,EAAIX,OAAS8D,EAAU,SAAS,IAatE,OAVA,aAAgB,WACV8D,IAAoBG,EAAA,UAGxB,eAA2B,CACzBtB,YAAa,eACbpI,OAAQ,qBACP,CAAE2J,SAAS,GAChB,GAAG,CAACxM,EAAMwI,UAAU7B,UAEd+E,EAAYxB,YAAcwB,EAAYtB,WAAcgC,IAAoBG,EAAA,SACrE,iCAGP,uBAAK3L,UAAU,0BACb,uBAAKA,UAAU,UACb,uBAAKA,UAAU,aACb,gBAAC6H,EAAA,EAAa,CACZD,UAAWxI,EAAMwI,UACjBK,SAAU7I,EAAMyM,YAChB1D,gBAAiB,kBAGrB,sBAAInI,UAAU,QAAQZ,EAAMwI,UAAUhE,SAGrCtE,EAAQW,QACT,uBAAKD,UAAW,oBACd,gBAACb,EAAA,EAAgB,CACfG,QAASA,EACT+B,yBAAyB,0BAK/B,uBAAKrB,UAAU,aACb,gBAAC+D,EAAA,GAAW,CACVC,YAAa,CACX,CACEJ,KAAM8D,EAAU,wBAChBpH,QAAS,CACP+J,YAAa,eACbpI,OAAQ,sBAGZ,CAAE2B,KAAMxE,EAAMwI,UAAUhE,KAAMC,QAAQ,OAK5C,uBAAK7D,UAAU,QACb,gBAAC0E,EAAA,EAAe,CAACG,KAAMA,KAGxBzF,EAAM0M,SAGb,C,mCC9HA,SAAgB,gBAAkB,QAAQ,IAAM,QAAQ,SAAW,QAAQ,YAAc,QAAQ,QAAU,Q","sources":["file:///app/packages/libs/shared/src/components/actions/Actions.tsx","file:///app/packages/libs/shared/src/components/actions/actions.scss","file:///app/packages/libs/shared/src/components/actions/ActionsDropdown.tsx","file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/partial-loading/partial-pill-tab-selector.scss","file:///app/packages/libs/shared/src/components/pill-tab-selector/partial-loading/PartialPillTabSelector.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/utils/ObjectStatusHelper.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-star/ClassroomStar.tsx","file:///app/packages/projects/lite/src/apps/classrooms/hooks/useClassroomPermissions.ts","file:///app/packages/projects/lite/src/apps/classrooms/errors/cannot-access-classroom/CannotAccessClassroomError.ts","file:///app/packages/projects/lite/src/apps/classrooms/errors/classroom-not-found/ClassroomNotFoundError.ts","file:///app/packages/projects/lite/src/apps/classrooms/hooks/useHandleClassroomErrors.ts","file:///app/packages/projects/lite/src/apps/classrooms/hooks/useClassroomActions.ts","file:///app/packages/projects/lite/src/apps/classrooms/layouts/classroom-layout.scss","file:///app/packages/projects/lite/src/apps/classrooms/layouts/ClassroomLayout.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { ActionButton } from './ActionButton';\nimport { ActionsDropdown } from './ActionsDropdown';\n\nexport interface ActionOptions {\n order?: number;\n label?: string | (() => JSX.Element);\n appLink?: Core.AppLink;\n href?: string;\n onClick?: () => void;\n svgName?: string;\n className?: string;\n button?: boolean; // If true, a button will be rendered. Otherwise the action will be rendered in the dropdown.\n tooltip?: string;\n showSpinner?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n disabled?: boolean;\n openInNewTab?: boolean; // Only used if appLink or href is provided\n group?: string;\n lazyPlaceholder?: boolean;\n}\n\nexport type ActionGenerator = (obj: BaseObject) => ActionOptions[];\n\ninterface ActionsProps {\n actions: ActionOptions[];\n className?: string;\n actionsDropdownClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n sortComponent?: JSX.Element;\n fetchMore?: () => void;\n}\n\nexport function Actions(props: ActionsProps): JSX.Element {\n const orderedActions = React.useMemo(() => props.actions.sort((a, b) => a.order - b.order), [props.actions]);\n\n const buttonActions: ActionOptions[] = [];\n const moreActions: ActionOptions[] = [];\n\n orderedActions.forEach(a => {\n if (a.button)\n buttonActions.push(a);\n else\n moreActions.push(a);\n });\n\n let className = 'd-flex';\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (!buttonActions.length && !moreActions.length)\n return <></>;\n\n return (\n <div className={className}>\n <>\n <span className='d-flex align-items-center'>\n {buttonActions.length ? buttonActions.map((a, idx) => (\n <React.Fragment key={idx}>\n {(() => {\n if (a.label) {\n const label = FunctionHelper.isFunction(a.label)\n ? a.label\n : () => <>{a.label}</>;\n \n return (\n <ActionButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n tooltip={a.tooltip}\n showSpinner={a.showSpinner}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n >\n {label()}\n </ActionButton>\n );\n }\n\n const iconButton = (\n <IconButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n />\n );\n\n return a.tooltip\n ? <Tooltip title={a.tooltip} spanHack>{iconButton}</Tooltip>\n : iconButton;\n })()}\n </React.Fragment>\n )) : <></>}\n {props.sortComponent && props.sortComponent}\n {moreActions.length ? (\n <ActionsDropdown\n actions={moreActions}\n dropdownToggleClassName={props.actionsDropdownClassName}\n dropdownToggleSvgSize={props.dropdownToggleSvgSize}\n fetchMore={props.fetchMore}\n />\n ) : <></>}\n </span>\n </>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dropdownToggle\":\"UCAnJ\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ActionOptions } from './Actions';\n\nimport styles from './actions.scss';\n\nfunction LazyDropdownItems(): JSX.Element {\n return (\n <>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '8rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '12rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '11rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '9rem' }}></div>\n </div>\n </>\n );\n}\n\nfunction getDropdownItemClassName(actionClassName?: string): string {\n let className = 'dropdown-item';\n\n if (actionClassName)\n className += ` ${actionClassName}`;\n\n return className;\n}\n\nexport type DropdownActionOptions = Omit<ActionOptions, 'button'>;\n\ninterface ActionsDropdownItemProps {\n action: DropdownActionOptions;\n}\n\nfunction ActionsDropdownItem(props: ActionsDropdownItemProps): React.ReactElement {\n const label = FunctionHelper.isFunction(props.action.label)\n ? props.action.label\n : () => <>{props.action.label}</>;\n\n if (props.action.appLink)\n return (\n <AppLink\n appLink={props.action.appLink}\n onClick={props.action.onClick}\n className={getDropdownItemClassName(props.action.className)}\n analyticsData={props.action.analyticsData}\n analyticsOptions={props.action.analyticsOptions}\n openInNewTab={props.action.openInNewTab}\n disabled={props.action.disabled}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </AppLink>\n );\n\n function onClick(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n\n if (props.action.analyticsData && props.action.analyticsOptions)\n AnalyticsHelper.logUserAction(props.action.analyticsData, props.action.analyticsOptions);\n\n if (FunctionHelper.isFunction(props.action.onClick))\n props.action.onClick();\n\n if (props.action.href)\n Core.LocationUtils.PageLoad(props.action.href, props.action.openInNewTab);\n }\n\n if (props.action.href) {\n return (\n <a\n className={getDropdownItemClassName(props.action.className)}\n onClick={onClick}\n href={props.action.href}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </a>\n );\n }\n\n return (\n <span\n className={`cursor-pointer ${getDropdownItemClassName(props.action.className)}`}\n onClick={onClick}\n role='button'\n tabIndex={0}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClick(e)}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2' />}\n {label()}\n </span>\n );\n}\n\ninterface ActionsDropdownProps {\n actions: DropdownActionOptions[];\n className?: string;\n dropdownToggleClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n fetchMore?: () => void;\n}\n\nActionsDropdown.defaultProps = {\n dropdownToggleClassName: 'btn btn-light',\n dropdownToggleSvgSize: SvgContainerSize.Small\n};\n\nexport function ActionsDropdown(props: ActionsDropdownProps): React.ReactElement {\n if (!props.actions || !props.actions.length)\n return <></>;\n\n const isLazy = props.actions.some(a => a.lazyPlaceholder);\n\n let className = 'dropdown';\n\n if (props.className)\n className += ` ${props.className}`;\n\n // Generate unique id to avoid collisions.\n const dropdownToggleId = `actions-dropdown-${RandomHelper.getRandomInt()}`;\n\n let dropdownToggleClassName = `dropdown-toggle px-0 ${styles.dropdownToggle}`;\n\n if (props.dropdownToggleClassName)\n dropdownToggleClassName += ` ${props.dropdownToggleClassName}`;\n\n let currentGroup: string;\n\n return (\n <div className={className}>\n <button\n className={dropdownToggleClassName}\n type='button'\n id={dropdownToggleId}\n data-bs-toggle='dropdown'\n data-toggle='dropdown'\n aria-haspopup='true'\n aria-expanded='false'\n onClick={isLazy ? props.fetchMore : null}\n >\n <SvgContainer svgName={cvSvgLibrary.More} size={props.dropdownToggleSvgSize} />\n </button>\n <div className='dropdown-menu dropdown-menu-end dropdown-menu-right' aria-labelledby={dropdownToggleId}>\n {isLazy ?\n <LazyDropdownItems /> :\n props.actions.map((a, idx) => {\n const showDivider = currentGroup !== undefined && currentGroup !== a.group;\n currentGroup = a.group;\n \n if (a.tooltip) {\n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <Tooltip title={a.tooltip} spanHack>\n <ActionsDropdownItem action={a} />\n </Tooltip>\n \n </React.Fragment>\n );\n }\n \n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <ActionsDropdownItem action={a} />\n </React.Fragment>\n );\n })\n }\n </div>\n </div>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n);\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length;\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset p-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"partialSize\":\"ntGsj\"};","import React from 'react';\n\nimport styles from '../pill-tab-selector.scss';\nimport partialStyles from './partial-pill-tab-selector.scss';\n\nexport function PartialPillTabSelector(): JSX.Element {\n return (\n <div className={`partial-loading-background ${styles.pillTabSelector} ${partialStyles.partialSize}`} />\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\n\n/**\n * Some of our APIs return enum values as a string, and others return enum values as a number.\n * \n * This means if a HTTP request to one API returns an object with it's enum values in string\n * form, and another HTTP request returns that same object with it's enum values in number form,\n * Flight will cache the object with it's enum values in number form.\n * \n * This can cause bugs in our frontend code where we're doing checks like `(obj.status === ObjectStatus.Active)`\n * because TypeScript enums only handle one data type (number or string). Even if the object is active, if the\n * it's cached as a data type that doesn't match what our TypeScript `ObjectStatus` enum's data type is, then\n * that check would return false, introducing bugs.\n * \n * A prime example of this is Classroom objects being returned from User API with string enums, but being returned\n * from Classroom API with number enums.\n * \n * For that reason, we sadly need to check object status with this helper. Hopefully one day this can be deleted\n * when all of our APIs return enum values consistently as 1 data type.\n * \n * Example of a bug introduced by this inconsistency: https://clickview.atlassian.net/browse/INBOX-3024\n */\nexport const ObjectStatusHelper = {\n getStatusAsString(status: ObjectStatus): ObjectStatus {\n if (typeof (status) === 'string')\n return status;\n\n if (typeof (status) === 'number') {\n if (status === 0)\n return ObjectStatus.Disabled;\n\n if (status === 1)\n return ObjectStatus.Active;\n\n if (status === 2)\n return ObjectStatus.Inactive;\n }\n\n return null;\n },\n\n getStatusAsNumber(status: ObjectStatus): 0 | 1 | 2 {\n if (typeof (status) === 'number')\n return status;\n\n if (typeof (status) === 'string') {\n if (status === ObjectStatus.Disabled)\n return 0;\n\n if (status === ObjectStatus.Active)\n return 1;\n\n if (status === ObjectStatus.Inactive)\n return 2;\n }\n\n return null;\n }\n};","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'classrooms.classroomStar';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst getIsPinned = (classroom: Classroom) => {\n return FavouriteHelper.isFavouritedByCurrentUser(classroom);\n};\n\ninterface ClassroomStarProps {\n classroom: Classroom;\n onToggle: (shouldPin: boolean, onSuccess: () => void, onError: () => void) => void;\n locationContext: LocationContext;\n}\n\nexport function ClassroomStar(props: ClassroomStarProps): JSX.Element {\n // Local state is used to provide instant feedback when the user clicks on the star.\n const [ isPinned, setIsPinned ] = React.useState(getIsPinned(props.classroom));\n\n const alerts = useAlerts();\n\n React.useEffect(() => {\n if (getIsPinned(props.classroom) === isPinned)\n return;\n\n setIsPinned(!isPinned);\n }, [getIsPinned(props.classroom)]);\n\n function onToggle(): void {\n setIsPinned(!isPinned);\n\n props.onToggle(!isPinned, () => onSuccess(!isPinned), () => onError(isPinned));\n }\n\n function onSuccess(isPinned: boolean): void {\n if (isPinned) {\n AnalyticsHelper.logUserAction({ id: props.classroom.id }, {\n location: props.locationContext,\n actionType: UserAction.Favourite,\n descriptor: ToggleDescriptor.On,\n entity: EntityType.Classroom,\n workflowPhase: WorkflowPhase.Complete\n });\n \n alerts.success(getPhrase('pinSuccess', {\n classroomName: props.classroom.name,\n escapeText: true\n }));\n \n return;\n }\n\n AnalyticsHelper.logUserAction({ id: props.classroom.id }, {\n location: props.locationContext,\n actionType: UserAction.Favourite,\n descriptor: ToggleDescriptor.Off,\n entity: EntityType.Classroom,\n workflowPhase: WorkflowPhase.Complete\n });\n\n alerts.success(getPhrase('unpinSuccess', {\n classroomName: props.classroom.name,\n escapeText: true\n }));\n }\n\n function onError(prevState: boolean): void {\n setIsPinned(prevState);\n\n if (prevState) {\n alerts.error(getPhrase('unpinError', {\n classroomName: props.classroom.name,\n escapeText: true\n }));\n\n return;\n }\n\n alerts.error(getPhrase('pinError', {\n classroomName: props.classroom.name,\n escapeText: true\n }));\n }\n\n return (\n <DivButton onClick={onToggle} className={isPinned ? 'text-yellow' : ''}>\n <SvgContainer\n svgName={isPinned ? cvSvgLibrary.Star : cvSvgLibrary.StarOutline}\n size={SvgContainerSize.Medium}\n />\n </DivButton>\n );\n}","import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nexport const useCheckClassroomPermissions = (classroomId: string) => {\n const { hasPermissions } = usePermissions();\n\n /**\n * This is the highest-level permission that overrides all other permissions\n */\n const canManageAllClassrooms = hasPermissions(PermissionName.ManageAllClassrooms);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n /**\n * If the user has permission to manage all classrooms, there's no need to check if they're owner/invitee\n * as these permissions no longer matter.\n */\n const invitees = Flight.useBasicFetch<User[]>(!canManageAllClassrooms && currentUser.data?.customerId &&\n ClassroomRequests.getClassroomInvitees(classroomId, currentUser.data.customerId));\n const owners = Flight.useBasicFetch<User[]>(!canManageAllClassrooms &&\n ClassroomRequests.getClassroomOwners(classroomId));\n\n // Has full classroom management power.\n if (canManageAllClassrooms) {\n return {\n isLoading: false,\n isOwner: true,\n isTeacher: true\n };\n }\n\n if (!invitees.hasCompleted || !owners.hasCompleted || !currentUser.hasCompleted)\n return { isLoading: true };\n\n const currentUserId = currentUser.data.id.toString();\n\n const isClassroomOwner = !!owners.data.find(owner => owner.id.toString() === currentUserId);\n const isClassroomTeacher = !!invitees.data.find(invitee => invitee.id.toString() === currentUserId);\n\n return {\n isLoading: false,\n isTeacher: isClassroomOwner || isClassroomTeacher, // All owners are also teachers\n isOwner: isClassroomOwner\n };\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ErrorCta, ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'classrooms.cannotAccessClassroomError';\n\nexport class CannotAccessClassroomError extends ErrorPageError {\n constructor() {\n super('Cannot access classroom');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'CannotAccessClassroomError';\n }\n\n // @ts-ignore\n public get heading(): string {\n return LanguageService.getPhrase(namespace, 'heading');\n }\n\n // @ts-ignore\n public get description(): string {\n return LanguageService.getPhrase(namespace, 'description');\n }\n\n // @ts-ignore\n public get cta(): ErrorCta {\n return {\n text: LanguageService.getPhrase(namespace, 'cta'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n };\n }\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ErrorCta, ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'classrooms.classroomNotFoundError';\n\nexport class ClassroomNotFoundError extends ErrorPageError {\n constructor() {\n super('Classroom doesn\\'t exist');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'ClassroomNotFoundError';\n }\n\n // @ts-ignore\n public get heading(): string {\n return LanguageService.getPhrase(namespace, 'heading');\n }\n\n // @ts-ignore\n public get description(): string {\n return LanguageService.getPhrase(namespace, 'description');\n }\n\n // @ts-ignore\n public get cta(): ErrorCta {\n return {\n text: LanguageService.getPhrase(namespace, 'cta'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n };\n }\n}","import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Classroom } from 'libs/shared/interfaces';\n\nimport { CannotAccessClassroomError } from 'apps/classrooms/errors/cannot-access-classroom/CannotAccessClassroomError';\nimport { ClassroomNotFoundError } from 'apps/classrooms/errors/classroom-not-found/ClassroomNotFoundError';\n\nexport const useHandleClassroomErrors = (classroom: Flight.Response<Classroom>) => {\n const { hasPermissions } = usePermissions();\n\n useHandleObjectError(classroom, {\n notFound: ClassroomNotFoundError,\n forbidden: {\n privacy: hasPermissions(PermissionName.ViewClassrooms) ? CannotAccessClassroomError : NotFoundError\n }\n });\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsOptions, AssocDescriptor, EntityType, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { CurrentUser } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useCheckClassroomPermissions } from 'apps/classrooms/hooks/useClassroomPermissions';\n\nconst namespace = 'classrooms.hooks';\n\nexport const useClassroomActions = (classroomId: string, currentUser: CurrentUser, readOnly?: boolean) => {\n const isMobile = useMediaQuery(MediaQueryStrings.SMDown);\n const accessCheck = useCheckClassroomPermissions(classroomId);\n\n const analyticsData = { id: classroomId };\n\n const baseAnalyticsOptions: AnalyticsOptions = {\n entity: EntityType.Classroom,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.Classroom\n };\n\n const buttonClass = 'btn btn-outline-dark me-2';\n\n const actions: ActionOptions[] = [];\n\n if (accessCheck.isOwner) {\n actions.push({\n order: 0,\n label: LanguageService.getPhrase(namespace, 'editClassroom'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.EDIT_CLASSROOM,\n args: [classroomId]\n },\n disabled: readOnly,\n tooltip: readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : '',\n analyticsData,\n analyticsOptions: {\n ...baseAnalyticsOptions,\n actionType: UserAction.Edit\n },\n svgName: cvSvgLibrary.Edit,\n button: !isMobile,\n className: readOnly ? `disabled ${buttonClass}` : !isMobile ? buttonClass : ''\n });\n }\n\n actions.push({\n order: 10,\n label: LanguageService.getPhrase(namespace, 'generateJoinLink'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.GENERATE_JOIN_LINK,\n args: [classroomId]\n },\n disabled: readOnly,\n tooltip: readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : '',\n button: (!isMobile && !accessCheck.isOwner),\n className: readOnly ? 'disabled' : (!isMobile && !accessCheck.isOwner) ? buttonClass : ''\n });\n\n if (accessCheck.isOwner) {\n actions.push({\n order: 20,\n label: LanguageService.getPhrase(namespace, 'archive'),\n analyticsData,\n disabled: readOnly,\n tooltip: readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : '',\n analyticsOptions: {\n ...baseAnalyticsOptions,\n actionType: UserAction.Archive,\n descriptor: ToggleDescriptor.On\n },\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ARCHIVE_CLASSROOM,\n args: [classroomId]\n },\n className: readOnly ? 'disabled' : ''\n });\n }\n\n if ((accessCheck.isOwner || accessCheck.isTeacher) && currentUser.role !== UserRole.Admin) {\n actions.push({\n order: 30,\n label: LanguageService.getPhrase(namespace, 'leaveClassroom'),\n disabled: readOnly,\n tooltip: readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : '',\n className: readOnly ? 'disabled' : 'text-danger',\n analyticsData: {\n ...analyticsData,\n teacherId: currentUser.id\n },\n analyticsOptions: {\n ...baseAnalyticsOptions,\n actionType: UserAction.Dissociate,\n descriptor: AssocDescriptor.User\n },\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_TEACHERS,\n args: [classroomId],\n params: {\n teacherIds: [currentUser.id]\n }\n }\n });\n }\n\n return actions;\n};","// extracted by mini-css-extract-plugin\nexport default {\"actionsContainer\":\"uYv5Z\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { Classroom, CurrentUser } from 'libs/shared/interfaces';\nimport { ObjectStatusHelper } from 'libs/shared/utils/ObjectStatusHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomStar } from 'apps/classrooms/components/classroom-star/ClassroomStar';\nimport { useClassroomActions } from 'apps/classrooms/hooks/useClassroomActions';\nimport { useCheckClassroomPermissions } from 'apps/classrooms/hooks/useClassroomPermissions';\n\nimport styles from './classroom-layout.scss';\n\nconst namespace = 'classrooms.classroomLayout';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassroomLayoutProps {\n classroom: Classroom;\n currentUser: CurrentUser;\n onTogglePin: (shouldPin: boolean, onSuccess: () => void, onError: () => void) => void;\n activeTab: 'students' | 'groups' | 'teachers';\n isRostered?: boolean;\n}\n\nexport function ClassroomLayout(props: React.PropsWithChildren<ClassroomLayoutProps>): JSX.Element {\n const accessCheck = useCheckClassroomPermissions(props.classroom.id);\n\n const actions = useClassroomActions(props.classroom.id, props.currentUser, props.isRostered);\n\n const classroomStatus = ObjectStatusHelper.getStatusAsString(props.classroom.status);\n\n const tabs: PillTab[] = [{\n name: getPhrase('students'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_STUDENTS,\n args: [props.classroom.id]\n },\n active: props.activeTab === 'students'\n }, {\n name: getPhrase('groups'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_GROUPS,\n args: [props.classroom.id]\n },\n active: props.activeTab === 'groups'\n }, {\n name: getPhrase('teachers'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_TEACHERS,\n args: [props.classroom.id]\n },\n active: props.activeTab === 'teachers'\n }]\n // todo we hide groups for rostered classroom for v1\n .filter(tab => !props.isRostered || tab.name !== getPhrase('groups'));\n\n // Redirect away if classroom isn't published\n React.useEffect(() => {\n if (classroomStatus === ObjectStatus.Active)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }, { replace: true });\n }, [props.classroom.status]);\n\n if ((!accessCheck.isLoading && !accessCheck.isTeacher) || classroomStatus !== ObjectStatus.Active)\n return <></>;\n\n return (\n <div className='px-3 position-relative'>\n <div className='d-flex'>\n <div className='mt-1 me-1'>\n <ClassroomStar\n classroom={props.classroom}\n onToggle={props.onTogglePin}\n locationContext={LocationContext.Classroom}\n />\n </div>\n <h1 className='mb-0'>{props.classroom.name}</h1>\n </div>\n\n {!!actions.length && (\n <div className={styles.actionsContainer}>\n <ActionsComponent\n actions={actions}\n actionsDropdownClassName='btn btn-outline-dark'\n />\n </div>\n )}\n\n <div className='pb-3 pt-1'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: getPhrase('classroomsBreadcrumb'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n },\n { name: props.classroom.name, active: true }\n ]}\n />\n </div>\n\n <div className='pb-2'>\n <PillTabSelector tabs={tabs} />\n </div>\n\n {props.children}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["Actions","props","orderedActions","actions","sort","a","b","order","buttonActions","moreActions","forEach","button","push","className","length","map","idx","key","label","appLink","href","onClick","svgName","tooltip","showSpinner","analyticsData","analyticsOptions","openInNewTab","disabled","iconButton","title","spanHack","sortComponent","dropdownToggleClassName","actionsDropdownClassName","dropdownToggleSvgSize","fetchMore","LazyDropdownItems","style","padding","height","width","getDropdownItemClassName","actionClassName","ActionsDropdownItem","FunctionHelper","action","AppLink","SvgContainer","e","preventDefault","AnalyticsHelper","role","tabIndex","onKeyDown","ActionsDropdown","isLazy","some","lazyPlaceholder","currentGroup","dropdownToggleId","RandomHelper","type","id","size","showDivider","undefined","group","Tooltip","defaultProps","S","BreadcrumbItem","breadcrumb","name","active","withBackIcon","Breadcrumbs","breadcrumbs","isMobile","PartialBreadcrumbs","numItems","dangerouslySetInnerHTML","__html","TabContents","tab","count","data","PillTabSelector","borderRadius","listClassName","tabs","index","onSelect","onSelectTab","PartialPillTabSelector","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","ObjectStatusHelper","getStatusAsString","getStatusAsNumber","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Math","max","floor","random","getPhrase","getIsPinned","classroom","ClassroomStar","isPinned","setIsPinned","alerts","onToggle","location","locationContext","actionType","descriptor","entity","workflowPhase","success","classroomName","escapeText","onSuccess","prevState","error","useCheckClassroomPermissions","classroomId","canManageAllClassrooms","hasPermissions","currentUser","invitees","customerId","owners","isLoading","isOwner","isTeacher","hasCompleted","currentUserId","toString","isClassroomOwner","find","owner","isClassroomTeacher","invitee","namespace","CannotAccessClassroomError","LanguageService","text","application","ErrorPageError","ClassroomNotFoundError","useHandleClassroomErrors","usePermissions","PermissionName","NotFoundError","useClassroomActions","readOnly","accessCheck","baseAnalyticsOptions","buttonClass","args","UserRole","teacherId","params","teacherIds","ClassroomLayout","isRostered","classroomStatus","activeTab","filter","ObjectStatus","replace","onTogglePin","children"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/3020-9f647705a0-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/actions/Actions.tsx","file:///app/packages/libs/shared/src/components/actions/actions.scss","file:///app/packages/libs/shared/src/components/actions/ActionsDropdown.tsx","file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/partial-loading/partial-pill-tab-selector.scss","file:///app/packages/libs/shared/src/components/pill-tab-selector/partial-loading/PartialPillTabSelector.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/utils/ObjectStatusHelper.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-star/ClassroomStar.tsx","file:///app/packages/projects/lite/src/apps/classrooms/hooks/useClassroomPermissions.ts","file:///app/packages/projects/lite/src/apps/classrooms/errors/cannot-access-classroom/CannotAccessClassroomError.ts","file:///app/packages/projects/lite/src/apps/classrooms/errors/classroom-not-found/ClassroomNotFoundError.ts","file:///app/packages/projects/lite/src/apps/classrooms/hooks/useHandleClassroomErrors.ts","file:///app/packages/projects/lite/src/apps/classrooms/hooks/useClassroomActions.ts","file:///app/packages/projects/lite/src/apps/classrooms/layouts/classroom-layout.scss","file:///app/packages/projects/lite/src/apps/classrooms/layouts/ClassroomLayout.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { ActionButton } from './ActionButton';\nimport { ActionsDropdown } from './ActionsDropdown';\n\nexport interface ActionOptions {\n order?: number;\n label?: string | (() => JSX.Element);\n appLink?: Core.AppLink;\n href?: string;\n onClick?: () => void;\n svgName?: string;\n className?: string;\n button?: boolean; // If true, a button will be rendered. Otherwise the action will be rendered in the dropdown.\n tooltip?: string;\n showSpinner?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n disabled?: boolean;\n openInNewTab?: boolean; // Only used if appLink or href is provided\n group?: string;\n lazyPlaceholder?: boolean;\n}\n\nexport type ActionGenerator = (obj: BaseObject) => ActionOptions[];\n\ninterface ActionsProps {\n actions: ActionOptions[];\n className?: string;\n actionsDropdownClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n sortComponent?: JSX.Element;\n fetchMore?: () => void;\n}\n\nexport function Actions(props: ActionsProps): JSX.Element {\n const orderedActions = React.useMemo(() => props.actions.sort((a, b) => a.order - b.order), [props.actions]);\n\n const buttonActions: ActionOptions[] = [];\n const moreActions: ActionOptions[] = [];\n\n orderedActions.forEach(a => {\n if (a.button)\n buttonActions.push(a);\n else\n moreActions.push(a);\n });\n\n let className = 'd-flex';\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (!buttonActions.length && !moreActions.length)\n return <></>;\n\n return (\n <div className={className}>\n <>\n <span className='d-flex align-items-center'>\n {buttonActions.length ? buttonActions.map((a, idx) => (\n <React.Fragment key={idx}>\n {(() => {\n if (a.label) {\n const label = FunctionHelper.isFunction(a.label)\n ? a.label\n : () => <>{a.label}</>;\n \n return (\n <ActionButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n tooltip={a.tooltip}\n showSpinner={a.showSpinner}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n >\n {label()}\n </ActionButton>\n );\n }\n\n const iconButton = (\n <IconButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n />\n );\n\n return a.tooltip\n ? <Tooltip title={a.tooltip} spanHack>{iconButton}</Tooltip>\n : iconButton;\n })()}\n </React.Fragment>\n )) : <></>}\n {props.sortComponent && props.sortComponent}\n {moreActions.length ? (\n <ActionsDropdown\n actions={moreActions}\n dropdownToggleClassName={props.actionsDropdownClassName}\n dropdownToggleSvgSize={props.dropdownToggleSvgSize}\n fetchMore={props.fetchMore}\n />\n ) : <></>}\n </span>\n </>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dropdownToggle\":\"UCAnJ\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ActionOptions } from './Actions';\n\nimport styles from './actions.scss';\n\nfunction LazyDropdownItems(): JSX.Element {\n return (\n <>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '8rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '12rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '11rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '9rem' }}></div>\n </div>\n </>\n );\n}\n\nfunction getDropdownItemClassName(actionClassName?: string): string {\n let className = 'dropdown-item';\n\n if (actionClassName)\n className += ` ${actionClassName}`;\n\n return className;\n}\n\nexport type DropdownActionOptions = Omit<ActionOptions, 'button'>;\n\ninterface ActionsDropdownItemProps {\n action: DropdownActionOptions;\n}\n\nfunction ActionsDropdownItem(props: ActionsDropdownItemProps): React.ReactElement {\n const label = FunctionHelper.isFunction(props.action.label)\n ? props.action.label\n : () => <>{props.action.label}</>;\n\n if (props.action.appLink)\n return (\n <AppLink\n appLink={props.action.appLink}\n onClick={props.action.onClick}\n className={getDropdownItemClassName(props.action.className)}\n analyticsData={props.action.analyticsData}\n analyticsOptions={props.action.analyticsOptions}\n openInNewTab={props.action.openInNewTab}\n disabled={props.action.disabled}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </AppLink>\n );\n\n function onClick(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n\n if (props.action.analyticsData && props.action.analyticsOptions)\n AnalyticsHelper.logUserAction(props.action.analyticsData, props.action.analyticsOptions);\n\n if (FunctionHelper.isFunction(props.action.onClick))\n props.action.onClick();\n\n if (props.action.href)\n Core.LocationUtils.PageLoad(props.action.href, props.action.openInNewTab);\n }\n\n if (props.action.href) {\n return (\n <a\n className={getDropdownItemClassName(props.action.className)}\n onClick={onClick}\n href={props.action.href}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </a>\n );\n }\n\n return (\n <span\n className={`cursor-pointer ${getDropdownItemClassName(props.action.className)}`}\n onClick={onClick}\n role='button'\n tabIndex={0}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClick(e)}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2' />}\n {label()}\n </span>\n );\n}\n\ninterface ActionsDropdownProps {\n actions: DropdownActionOptions[];\n className?: string;\n dropdownToggleClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n fetchMore?: () => void;\n}\n\nActionsDropdown.defaultProps = {\n dropdownToggleClassName: 'btn btn-light',\n dropdownToggleSvgSize: SvgContainerSize.Small\n};\n\nexport function ActionsDropdown(props: ActionsDropdownProps): React.ReactElement {\n if (!props.actions || !props.actions.length)\n return <></>;\n\n const isLazy = props.actions.some(a => a.lazyPlaceholder);\n\n let className = 'dropdown';\n\n if (props.className)\n className += ` ${props.className}`;\n\n // Generate unique id to avoid collisions.\n const dropdownToggleId = `actions-dropdown-${RandomHelper.getRandomInt()}`;\n\n let dropdownToggleClassName = `dropdown-toggle px-0 ${styles.dropdownToggle}`;\n\n if (props.dropdownToggleClassName)\n dropdownToggleClassName += ` ${props.dropdownToggleClassName}`;\n\n let currentGroup: string;\n\n return (\n <div className={className}>\n <button\n className={dropdownToggleClassName}\n type='button'\n id={dropdownToggleId}\n data-bs-toggle='dropdown'\n data-toggle='dropdown'\n aria-haspopup='true'\n aria-expanded='false'\n onClick={isLazy ? props.fetchMore : null}\n >\n <SvgContainer svgName={cvSvgLibrary.More} size={props.dropdownToggleSvgSize} />\n </button>\n <div className='dropdown-menu dropdown-menu-end dropdown-menu-right' aria-labelledby={dropdownToggleId}>\n {isLazy ?\n <LazyDropdownItems /> :\n props.actions.map((a, idx) => {\n const showDivider = currentGroup !== undefined && currentGroup !== a.group;\n currentGroup = a.group;\n \n if (a.tooltip) {\n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <Tooltip title={a.tooltip} spanHack>\n <ActionsDropdownItem action={a} />\n </Tooltip>\n \n </React.Fragment>\n );\n }\n \n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <ActionsDropdownItem action={a} />\n </React.Fragment>\n );\n })\n }\n </div>\n </div>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n);\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length;\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: '&nbsp' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset p-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"partialSize\":\"ntGsj\"};","import React from 'react';\n\nimport styles from '../pill-tab-selector.scss';\nimport partialStyles from './partial-pill-tab-selector.scss';\n\nexport function PartialPillTabSelector(): JSX.Element {\n return (\n <div className={`partial-loading-background ${styles.pillTabSelector} ${partialStyles.partialSize}`} />\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\n\n/**\n * Some of our APIs return enum values as a string, and others return enum values as a number.\n * \n * This means if a HTTP request to one API returns an object with it's enum values in string\n * form, and another HTTP request returns that same object with it's enum values in number form,\n * Flight will cache the object with it's enum values in number form.\n * \n * This can cause bugs in our frontend code where we're doing checks like `(obj.status === ObjectStatus.Active)`\n * because TypeScript enums only handle one data type (number or string). Even if the object is active, if the\n * it's cached as a data type that doesn't match what our TypeScript `ObjectStatus` enum's data type is, then\n * that check would return false, introducing bugs.\n * \n * A prime example of this is Classroom objects being returned from User API with string enums, but being returned\n * from Classroom API with number enums.\n * \n * For that reason, we sadly need to check object status with this helper. Hopefully one day this can be deleted\n * when all of our APIs return enum values consistently as 1 data type.\n * \n * Example of a bug introduced by this inconsistency: https://clickview.atlassian.net/browse/INBOX-3024\n */\nexport const ObjectStatusHelper = {\n getStatusAsString(status: ObjectStatus): ObjectStatus {\n if (typeof (status) === 'string')\n return status;\n\n if (typeof (status) === 'number') {\n if (status === 0)\n return ObjectStatus.Disabled;\n\n if (status === 1)\n return ObjectStatus.Active;\n\n if (status === 2)\n return ObjectStatus.Inactive;\n }\n\n return null;\n },\n\n getStatusAsNumber(status: ObjectStatus): 0 | 1 | 2 {\n if (typeof (status) === 'number')\n return status;\n\n if (typeof (status) === 'string') {\n if (status === ObjectStatus.Disabled)\n return 0;\n\n if (status === ObjectStatus.Active)\n return 1;\n\n if (status === ObjectStatus.Inactive)\n return 2;\n }\n\n return null;\n }\n};","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'classrooms.classroomStar';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst getIsPinned = (classroom: Classroom) => {\n return FavouriteHelper.isFavouritedByCurrentUser(classroom);\n};\n\ninterface ClassroomStarProps {\n classroom: Classroom;\n onToggle: (shouldPin: boolean, onSuccess: () => void, onError: () => void) => void;\n locationContext: LocationContext;\n}\n\nexport function ClassroomStar(props: ClassroomStarProps): JSX.Element {\n // Local state is used to provide instant feedback when the user clicks on the star.\n const [ isPinned, setIsPinned ] = React.useState(getIsPinned(props.classroom));\n\n const alerts = useAlerts();\n\n React.useEffect(() => {\n if (getIsPinned(props.classroom) === isPinned)\n return;\n\n setIsPinned(!isPinned);\n }, [getIsPinned(props.classroom)]);\n\n function onToggle(): void {\n setIsPinned(!isPinned);\n\n props.onToggle(!isPinned, () => onSuccess(!isPinned), () => onError(isPinned));\n }\n\n function onSuccess(isPinned: boolean): void {\n if (isPinned) {\n AnalyticsHelper.logUserAction({ id: props.classroom.id }, {\n location: props.locationContext,\n actionType: UserAction.Favourite,\n descriptor: ToggleDescriptor.On,\n entity: EntityType.Classroom,\n workflowPhase: WorkflowPhase.Complete\n });\n \n alerts.success(getPhrase('pinSuccess', {\n classroomName: props.classroom.name,\n escapeText: true\n }));\n \n return;\n }\n\n AnalyticsHelper.logUserAction({ id: props.classroom.id }, {\n location: props.locationContext,\n actionType: UserAction.Favourite,\n descriptor: ToggleDescriptor.Off,\n entity: EntityType.Classroom,\n workflowPhase: WorkflowPhase.Complete\n });\n\n alerts.success(getPhrase('unpinSuccess', {\n classroomName: props.classroom.name,\n escapeText: true\n }));\n }\n\n function onError(prevState: boolean): void {\n setIsPinned(prevState);\n\n if (prevState) {\n alerts.error(getPhrase('unpinError', {\n classroomName: props.classroom.name,\n escapeText: true\n }));\n\n return;\n }\n\n alerts.error(getPhrase('pinError', {\n classroomName: props.classroom.name,\n escapeText: true\n }));\n }\n\n return (\n <DivButton onClick={onToggle} className={isPinned ? 'text-yellow' : ''}>\n <SvgContainer\n svgName={isPinned ? cvSvgLibrary.Star : cvSvgLibrary.StarOutline}\n size={SvgContainerSize.Medium}\n />\n </DivButton>\n );\n}","import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nexport const useCheckClassroomPermissions = (classroomId: string) => {\n const { hasPermissions } = usePermissions();\n\n /**\n * This is the highest-level permission that overrides all other permissions\n */\n const canManageAllClassrooms = hasPermissions(PermissionName.ManageAllClassrooms);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n /**\n * If the user has permission to manage all classrooms, there's no need to check if they're owner/invitee\n * as these permissions no longer matter.\n */\n const staff = Flight.useBasicFetch<User[]>(!canManageAllClassrooms && currentUser.data?.customerId &&\n ClassroomRequests.getClassroomStaff(classroomId, currentUser.data.customerId));\n const owners = Flight.useBasicFetch<User[]>(!canManageAllClassrooms &&\n ClassroomRequests.getClassroomOwners(classroomId));\n\n // Has full classroom management power.\n if (canManageAllClassrooms) {\n return {\n isLoading: false,\n isOwner: true,\n isTeacher: true\n };\n }\n\n if (!staff.hasCompleted || !owners.hasCompleted || !currentUser.hasCompleted)\n return { isLoading: true };\n\n const currentUserId = currentUser.data.id.toString();\n\n const isClassroomOwner = !!owners.data.find(owner => owner.id.toString() === currentUserId);\n const isClassroomTeacher = !!staff.data.find(staff => staff.id.toString() === currentUserId);\n\n return {\n isLoading: false,\n isTeacher: isClassroomOwner || isClassroomTeacher, // All owners are also teachers\n isOwner: isClassroomOwner\n };\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ErrorCta, ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'classrooms.cannotAccessClassroomError';\n\nexport class CannotAccessClassroomError extends ErrorPageError {\n constructor() {\n super('Cannot access classroom');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'CannotAccessClassroomError';\n }\n\n // @ts-ignore\n public get heading(): string {\n return LanguageService.getPhrase(namespace, 'heading');\n }\n\n // @ts-ignore\n public get description(): string {\n return LanguageService.getPhrase(namespace, 'description');\n }\n\n // @ts-ignore\n public get cta(): ErrorCta {\n return {\n text: LanguageService.getPhrase(namespace, 'cta'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n };\n }\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ErrorCta, ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'classrooms.classroomNotFoundError';\n\nexport class ClassroomNotFoundError extends ErrorPageError {\n constructor() {\n super('Classroom doesn\\'t exist');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'ClassroomNotFoundError';\n }\n\n // @ts-ignore\n public get heading(): string {\n return LanguageService.getPhrase(namespace, 'heading');\n }\n\n // @ts-ignore\n public get description(): string {\n return LanguageService.getPhrase(namespace, 'description');\n }\n\n // @ts-ignore\n public get cta(): ErrorCta {\n return {\n text: LanguageService.getPhrase(namespace, 'cta'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n };\n }\n}","import { Flight } from 'libs/common/flight';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Classroom } from 'libs/shared/interfaces';\n\nimport { CannotAccessClassroomError } from 'apps/classrooms/errors/cannot-access-classroom/CannotAccessClassroomError';\nimport { ClassroomNotFoundError } from 'apps/classrooms/errors/classroom-not-found/ClassroomNotFoundError';\n\nexport const useHandleClassroomErrors = (classroom: Flight.Response<Classroom>) => {\n const { hasPermissions } = usePermissions();\n\n useHandleObjectError(classroom, {\n notFound: ClassroomNotFoundError,\n forbidden: {\n privacy: hasPermissions(PermissionName.ViewClassrooms) ? CannotAccessClassroomError : NotFoundError\n }\n });\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsOptions, AssocDescriptor, EntityType, LocationContext, ToggleDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { CurrentUser } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useCheckClassroomPermissions } from 'apps/classrooms/hooks/useClassroomPermissions';\n\nconst namespace = 'classrooms.hooks';\n\nexport const useClassroomActions = (classroomId: string, currentUser: CurrentUser, readOnly?: boolean) => {\n const isMobile = useMediaQuery(MediaQueryStrings.SMDown);\n const accessCheck = useCheckClassroomPermissions(classroomId);\n\n const analyticsData = { id: classroomId };\n\n const baseAnalyticsOptions: AnalyticsOptions = {\n entity: EntityType.Classroom,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.Classroom\n };\n\n const buttonClass = 'btn btn-outline-dark me-2';\n\n const actions: ActionOptions[] = [];\n\n if (accessCheck.isOwner) {\n actions.push({\n order: 0,\n label: LanguageService.getPhrase(namespace, 'editClassroom'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.EDIT_CLASSROOM,\n args: [classroomId]\n },\n disabled: readOnly,\n tooltip: readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : '',\n analyticsData,\n analyticsOptions: {\n ...baseAnalyticsOptions,\n actionType: UserAction.Edit\n },\n svgName: cvSvgLibrary.Edit,\n button: !isMobile,\n className: readOnly ? `disabled ${buttonClass}` : !isMobile ? buttonClass : ''\n });\n }\n\n actions.push({\n order: 10,\n label: LanguageService.getPhrase(namespace, 'generateJoinLink'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.GENERATE_JOIN_LINK,\n args: [classroomId]\n },\n disabled: readOnly,\n tooltip: readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : '',\n button: (!isMobile && !accessCheck.isOwner),\n className: readOnly ? 'disabled' : (!isMobile && !accessCheck.isOwner) ? buttonClass : ''\n });\n\n if (accessCheck.isOwner) {\n actions.push({\n order: 20,\n label: LanguageService.getPhrase(namespace, 'archive'),\n analyticsData,\n disabled: readOnly,\n tooltip: readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : '',\n analyticsOptions: {\n ...baseAnalyticsOptions,\n actionType: UserAction.Archive,\n descriptor: ToggleDescriptor.On\n },\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ARCHIVE_CLASSROOM,\n args: [classroomId]\n },\n className: readOnly ? 'disabled' : ''\n });\n }\n\n if ((accessCheck.isOwner || accessCheck.isTeacher) && currentUser.role !== UserRole.Admin) {\n actions.push({\n order: 30,\n label: LanguageService.getPhrase(namespace, 'leaveClassroom'),\n disabled: readOnly,\n tooltip: readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : '',\n className: readOnly ? 'disabled' : 'text-danger',\n analyticsData: {\n ...analyticsData,\n teacherId: currentUser.id\n },\n analyticsOptions: {\n ...baseAnalyticsOptions,\n actionType: UserAction.Dissociate,\n descriptor: AssocDescriptor.User\n },\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_TEACHERS,\n args: [classroomId],\n params: {\n teacherIds: [currentUser.id]\n }\n }\n });\n }\n\n return actions;\n};","// extracted by mini-css-extract-plugin\nexport default {\"actionsContainer\":\"uYv5Z\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { Classroom, CurrentUser } from 'libs/shared/interfaces';\nimport { ObjectStatusHelper } from 'libs/shared/utils/ObjectStatusHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomStar } from 'apps/classrooms/components/classroom-star/ClassroomStar';\nimport { useClassroomActions } from 'apps/classrooms/hooks/useClassroomActions';\nimport { useCheckClassroomPermissions } from 'apps/classrooms/hooks/useClassroomPermissions';\n\nimport styles from './classroom-layout.scss';\n\nconst namespace = 'classrooms.classroomLayout';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassroomLayoutProps {\n classroom: Classroom;\n currentUser: CurrentUser;\n onTogglePin: (shouldPin: boolean, onSuccess: () => void, onError: () => void) => void;\n activeTab: 'students' | 'groups' | 'teachers';\n isRostered?: boolean;\n}\n\nexport function ClassroomLayout(props: React.PropsWithChildren<ClassroomLayoutProps>): JSX.Element {\n const accessCheck = useCheckClassroomPermissions(props.classroom.id);\n\n const actions = useClassroomActions(props.classroom.id, props.currentUser, props.isRostered);\n\n const classroomStatus = ObjectStatusHelper.getStatusAsString(props.classroom.status);\n\n const tabs: PillTab[] = [{\n name: getPhrase('students'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_STUDENTS,\n args: [props.classroom.id]\n },\n active: props.activeTab === 'students'\n }, {\n name: getPhrase('groups'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_GROUPS,\n args: [props.classroom.id]\n },\n active: props.activeTab === 'groups'\n }, {\n name: getPhrase('teachers'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_TEACHERS,\n args: [props.classroom.id]\n },\n active: props.activeTab === 'teachers'\n }]\n // todo we hide groups for rostered classroom for v1\n .filter(tab => !props.isRostered || tab.name !== getPhrase('groups'));\n\n // Redirect away if classroom isn't published\n React.useEffect(() => {\n if (classroomStatus === ObjectStatus.Active)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }, { replace: true });\n }, [props.classroom.status]);\n\n if ((!accessCheck.isLoading && !accessCheck.isTeacher) || classroomStatus !== ObjectStatus.Active)\n return <></>;\n\n return (\n <div className='px-3 position-relative'>\n <div className='d-flex'>\n <div className='mt-1 me-1'>\n <ClassroomStar\n classroom={props.classroom}\n onToggle={props.onTogglePin}\n locationContext={LocationContext.Classroom}\n />\n </div>\n <h1 className='mb-0'>{props.classroom.name}</h1>\n </div>\n\n {!!actions.length && (\n <div className={styles.actionsContainer}>\n <ActionsComponent\n actions={actions}\n actionsDropdownClassName='btn btn-outline-dark'\n />\n </div>\n )}\n\n <div className='pb-3 pt-1'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: getPhrase('classroomsBreadcrumb'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.HOME\n }\n },\n { name: props.classroom.name, active: true }\n ]}\n />\n </div>\n\n <div className='pb-2'>\n <PillTabSelector tabs={tabs} />\n </div>\n\n {props.children}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["Actions","props","orderedActions","actions","sort","a","b","order","buttonActions","moreActions","forEach","button","push","className","length","map","idx","key","label","appLink","href","onClick","svgName","tooltip","showSpinner","analyticsData","analyticsOptions","openInNewTab","disabled","iconButton","title","spanHack","sortComponent","dropdownToggleClassName","actionsDropdownClassName","dropdownToggleSvgSize","fetchMore","LazyDropdownItems","style","padding","height","width","getDropdownItemClassName","actionClassName","ActionsDropdownItem","FunctionHelper","action","AppLink","SvgContainer","e","preventDefault","AnalyticsHelper","role","tabIndex","onKeyDown","ActionsDropdown","isLazy","some","lazyPlaceholder","currentGroup","dropdownToggleId","RandomHelper","type","id","size","showDivider","undefined","group","Tooltip","defaultProps","S","BreadcrumbItem","breadcrumb","name","active","withBackIcon","Breadcrumbs","breadcrumbs","isMobile","PartialBreadcrumbs","numItems","dangerouslySetInnerHTML","__html","TabContents","tab","count","data","PillTabSelector","borderRadius","listClassName","tabs","index","onSelect","onSelectTab","PartialPillTabSelector","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","ObjectStatusHelper","getStatusAsString","getStatusAsNumber","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Math","max","floor","random","getPhrase","getIsPinned","classroom","ClassroomStar","isPinned","setIsPinned","alerts","onToggle","location","locationContext","actionType","descriptor","entity","workflowPhase","success","classroomName","escapeText","onSuccess","prevState","error","useCheckClassroomPermissions","classroomId","canManageAllClassrooms","hasPermissions","currentUser","staff","customerId","owners","isLoading","isOwner","isTeacher","hasCompleted","currentUserId","toString","isClassroomOwner","find","owner","isClassroomTeacher","namespace","CannotAccessClassroomError","LanguageService","text","application","ErrorPageError","ClassroomNotFoundError","useHandleClassroomErrors","usePermissions","PermissionName","NotFoundError","useClassroomActions","readOnly","accessCheck","baseAnalyticsOptions","buttonClass","args","UserRole","teacherId","params","teacherIds","ClassroomLayout","isRostered","classroomStatus","activeTab","filter","ObjectStatus","replace","onTogglePin","children"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5974],{72535:(e,t,r)=>{r.d(t,{Z:()=>u});var a=r(70680),n=r(20354),o=r(75896),l=r(31949),s=r(64818),i=r(88630),c=r(47288);function u(e,t){var r,u,m,d,f=(0,a.I0)(),p=n.a.useBasicFetch(l.N.currentUser()),h=n.a.useBasicFetch(p.data&&i.F.getClassroom(e,p.data.id)),v=n.a.useBasicFetch(c.N.getUser(t)),g=n.a.useBasicFetch((null===(r=p.data)||void 0===r?void 0:r.customerId)&&h.data&&i.F.getClassroomStaff(e,p.data.customerId)),y=null===(d=o.m.first(null===(m=null===(u=g.data)||void 0===u?void 0:u.find((function(e){var r;return(null===(r=e.id)||void 0===r?void 0:r.toString())===(null==t?void 0:t.toString())})))||void 0===m?void 0:m.enrolments.data))||void 0===d?void 0:d.id;return{classroom:h.data,hasLoaded:h.hasCompleted&&v.hasCompleted,teacherName:s.l.getFullName(v.data),revoke:function(t,r){if(y){var a=i.F.revokeOwnership(e,y,t,r);n.a.fetch(f,a)}else r()},assign:function(t,r){if(y){var a=i.F.assignAsOwner(e,y,t,r);n.a.fetch(f,a)}else r()}}}},5974:(e,t,r)=>{r.r(t),r.d(t,{AssignAsOwnerView:()=>h});var a=r(32735),n=r(23481),o=r(49985),l=r(65858),s=r(9111),i=r(13876),c=r(83345),u=r(69883),m=r(72535);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r<t;r++)a[r]=e[r];return a}var f="classrooms.assignAsOwner",p=n.T.encloseNamespace(f);function h(e){var t,r,n=(t=a.useState(!1),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var a,n,o,l,s=[],i=!0,c=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;i=!1}else for(;!(i=(a=o.call(r)).done)&&(s.push(a.value),s.length!==t);i=!0);}catch(e){c=!0,n=e}finally{try{if(!i&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(c)throw n}}return s}}(t,r)||function(e,t){if(e){if("string"==typeof e)return d(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?d(e,t):void 0}}(t,r)||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.")}()),h=n[0],v=n[1],g=(0,m.Z)(e.classroomId,e.teacherId),y=g.classroom,w=g.hasLoaded,b=g.teacherName,E=g.assign,k=(0,u.Z)();function C(){k.success(p("success",{escapeText:!0,teacher:b,classroom:y.name})),o.k.logUserAction({id:e.teacherId,classroomId:y.id},{actionType:l.Vw.Promote,entity:l.py.User,descriptor:l.iF.Classroom,workflowPhase:l.eu.Complete,location:l.LZ.Popup}),e.closePopup()}function S(){k.error(p("error",{escapeText:!0,teacher:b,classroom:y.name})),e.closePopup()}return a.createElement(s.G,{closePopup:e.closePopup,title:p("title"),showLoadingSpinner:!w},a.createElement("p",{className:"mb-0"},a.createElement(c.x,{namespace:f,phrase:"info",options:{teacher:b}})),a.createElement("ul",null,a.createElement("li",null,a.createElement(c.x,{namespace:f,phrase:"infoPoint1"})),a.createElement("li",null,a.createElement(c.x,{namespace:f,phrase:"infoPoint2"})),a.createElement("li",null,a.createElement(c.x,{namespace:f,phrase:"infoPoint3"}))),a.createElement(i.u,null,a.createElement(i.u.Cancel,{onClick:e.closePopup}),a.createElement(i.u.Submit,{onClick:function(){v(!0),E(C,S)},variant:"dark",text:p("assignOwner"),showSpinner:h})))}}}]);
2
+ //# sourceMappingURL=5974-ec9007f42b-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/5974-ec9007f42b-lite.chunk.js","mappings":"qNAYM,SAAUA,EAA6BC,EAAqBC,G,YAC1DC,GAAW,UAEXC,EAAc,kBAAkC,mBAChDC,EAAY,kBAAgCD,EAAYE,MAC5D,iBAA+BL,EAAaG,EAAYE,KAAKC,KACzDC,EAAU,kBAA2B,YAA4BN,IAEjEO,EAAQ,mBAA6C,QAAhB,EAAAL,EAAYE,YAAI,eAAEI,aAAcL,EAAUC,MACnF,sBAAoCL,EAAaG,EAAYE,KAAKI,aAE9DC,EAEL,QAF0B,YACwC,QAAjE,EAAU,QAAV,EAAAF,EAAMH,YAAI,eAAEM,MAAK,SAAAC,GAAI,MAAC,OAAI,QAAJ,EAAAA,EAAEN,UAAE,eAAEO,eAAeZ,aAAS,EAATA,EAAWY,WAAU,WAAC,eAAEC,WAAWT,aAC/E,eAAEC,GAwBH,MAAO,CACLF,UAAWA,EAAUC,KACrBU,UAAWX,EAAUY,cAAgBT,EAAQS,aAC7CC,YAAa,gBAAuBV,EAAQF,MAC5Ca,OA1BsB,SAACC,EAAwBC,GAC/C,GAAKV,EAAL,CAKA,IAAMW,EAAU,oBAAkCrB,EAAaU,EAAoBS,EAAWC,GAE9F,UAAalB,EAAUmB,EAJtB,MAFCD,GAOJ,EAkBEE,OAhBsB,SAACH,EAAwBC,GAC/C,GAAKV,EAAL,CAKA,IAAMW,EAAU,kBAAgCrB,EAAaU,EAAoBS,EAAWC,GAE5F,UAAalB,EAAUmB,EAJtB,MAFCD,GAOJ,EASF,C,qQCzCA,IAAMG,EAAY,2BACZC,EAAY,qBAAiCD,GAO7C,SAAUE,EAAkBC,GAChC,I,IAAyE,G,EAArB,YAAe,G,EAAM,E,o4BAAjEC,EAAiB,KAAEC,EAAoB,KAE/C,GAAuE,OACrEF,EAAM1B,YACN0B,EAAMzB,WAFAG,EAAS,EAATA,UAAWW,EAAS,EAATA,UAAWE,EAAW,EAAXA,YAAqBY,EAAe,EAAvBP,OAKrCQ,GAAS,SAQf,SAASX,IACPW,EAAOC,QAAQP,EAAU,UAAW,CAClCQ,YAAY,EACZzB,QAASU,EACTb,UAAWA,EAAU6B,QAGvB,kBAA8B,CAC5B3B,GAAIoB,EAAMzB,UACVD,YAAaI,EAAUE,IACtB,CACD4B,WAAY,aACZC,OAAQ,UACRC,WAAY,eACZC,cAAe,cACfC,SAAU,aAGZZ,EAAMa,YACR,CAEA,SAASnB,IACPU,EAAOU,MAAMhB,EAAU,QAAS,CAC9BQ,YAAY,EACZzB,QAASU,EACTb,UAAWA,EAAU6B,QAGvBP,EAAMa,YACR,CAGA,OACE,gBAAC,IAAK,CAACA,WAAYb,EAAMa,WAAYE,MAAOjB,EAAU,SAAUkB,oBAAqB3B,GACnF,qBAAG4B,UAAU,QACX,gBAAC,IAAI,CAACpB,UAAWA,EAAWqB,OAAO,OAAOC,QAAS,CAAEtC,QAASU,MAGhE,0BACE,0BAAI,gBAAC,IAAI,CAACM,UAAWA,EAAWqB,OAAO,gBACvC,0BAAI,gBAAC,IAAI,CAACrB,UAAWA,EAAWqB,OAAO,gBACvC,0BAAI,gBAAC,IAAI,CAACrB,UAAWA,EAAWqB,OAAO,iBAGzC,gBAAC,IAAY,KACX,gBAAC,WAAmB,CAACE,QAASpB,EAAMa,aACpC,gBAAC,WAAmB,CAClBO,QArDR,WACElB,GAAqB,GAErBC,EAAgBV,EAAWC,EAC7B,EAkDQ2B,QAAQ,OACRC,KAAMxB,EAAU,eAChByB,YAAatB,KAKvB,C","sources":["file:///app/packages/projects/lite/src/apps/classrooms/hooks/useClassroomTeacherEnrolment.ts","file:///app/packages/projects/lite/src/apps/classrooms/views/assign-as-owner/AssignAsOwnerView.tsx"],"sourcesContent":["import { useDispatch } from 'react-redux';\n\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { Classroom, CurrentUser, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\nexport function useClassroomTeacherEnrolment(classroomId: string, teacherId: string) {\n const dispatch = useDispatch();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(classroomId, currentUser.data.id));\n const teacher = Flight.useBasicFetch<User>(UserManagerRequests.getUser(teacherId));\n\n const staff = Flight.useBasicFetch<User[]>(currentUser.data?.customerId && classroom.data &&\n ClassroomRequests.getClassroomStaff(classroomId, currentUser.data.customerId));\n\n const teacherEnrolmentId = ArrayHelper.first(\n staff.data?.find(e => e.id?.toString() === teacherId?.toString())?.enrolments.data\n )?.id;\n \n const revokeOwnership = (onSuccess?: () => void, onError?: () => void) => {\n if (!teacherEnrolmentId) {\n onError();\n return;\n }\n\n const request = ClassroomRequests.revokeOwnership(classroomId, teacherEnrolmentId, onSuccess, onError);\n\n Flight.fetch(dispatch, request);\n };\n\n const assignOwnership = (onSuccess?: () => void, onError?: () => void) => {\n if (!teacherEnrolmentId) {\n onError();\n return;\n }\n\n const request = ClassroomRequests.assignAsOwner(classroomId, teacherEnrolmentId, onSuccess, onError);\n\n Flight.fetch(dispatch, request);\n };\n\n return {\n classroom: classroom.data,\n hasLoaded: classroom.hasCompleted && teacher.hasCompleted,\n teacherName: UserHelper.getFullName(teacher.data),\n revoke: revokeOwnership,\n assign: assignOwnership\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { PropsWithPopupViewProps } from 'libs/shared/interfaces';\n\nimport { useClassroomTeacherEnrolment } from 'apps/classrooms/hooks/useClassroomTeacherEnrolment';\n\nconst namespace = 'classrooms.assignAsOwner';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AssignAsOwnerViewProps {\n classroomId: string;\n teacherId: string;\n}\n\nexport function AssignAsOwnerView(props: PropsWithPopupViewProps<AssignAsOwnerViewProps>): JSX.Element {\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const { classroom, hasLoaded, teacherName, assign: assignOwnership } = useClassroomTeacherEnrolment(\n props.classroomId,\n props.teacherId\n );\n\n const alerts = useAlerts();\n\n function assignOwner(): void {\n setShowButtonSpinner(true);\n\n assignOwnership(onSuccess, onError);\n }\n\n function onSuccess(): void {\n alerts.success(getPhrase('success', {\n escapeText: true,\n teacher: teacherName,\n classroom: classroom.name\n }));\n\n AnalyticsHelper.logUserAction({\n id: props.teacherId,\n classroomId: classroom.id\n }, {\n actionType: UserAction.Promote,\n entity: EntityType.User,\n descriptor: AssocDescriptor.Classroom,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.Popup\n });\n\n props.closePopup();\n }\n\n function onError(): void {\n alerts.error(getPhrase('error', {\n escapeText: true,\n teacher: teacherName,\n classroom: classroom.name\n }));\n\n props.closePopup();\n }\n\n\n return (\n <Popup closePopup={props.closePopup} title={getPhrase('title')} showLoadingSpinner={!hasLoaded}>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' options={{ teacher: teacherName }} />\n </p>\n\n <ul>\n <li><Text namespace={namespace} phrase='infoPoint1' /></li>\n <li><Text namespace={namespace} phrase='infoPoint2' /></li>\n <li><Text namespace={namespace} phrase='infoPoint3' /></li>\n </ul>\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n onClick={assignOwner}\n variant='dark'\n text={getPhrase('assignOwner')}\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </Popup>\n );\n}"],"names":["useClassroomTeacherEnrolment","classroomId","teacherId","dispatch","currentUser","classroom","data","id","teacher","staff","customerId","teacherEnrolmentId","find","e","toString","enrolments","hasLoaded","hasCompleted","teacherName","revoke","onSuccess","onError","request","assign","namespace","getPhrase","AssignAsOwnerView","props","showButtonSpinner","setShowButtonSpinner","assignOwnership","alerts","success","escapeText","name","actionType","entity","descriptor","workflowPhase","location","closePopup","error","title","showLoadingSpinner","className","phrase","options","onClick","variant","text","showSpinner"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7115],{72535:(e,t,r)=>{r.d(t,{Z:()=>u});var a=r(70680),n=r(20354),o=r(75896),l=r(31949),i=r(64818),c=r(88630),s=r(47288);function u(e,t){var r,u,m,d,p=(0,a.I0)(),f=n.a.useBasicFetch(l.N.currentUser()),h=n.a.useBasicFetch(f.data&&c.F.getClassroom(e,f.data.id)),v=n.a.useBasicFetch(s.N.getUser(t)),y=n.a.useBasicFetch((null===(r=f.data)||void 0===r?void 0:r.customerId)&&h.data&&c.F.getClassroomStaff(e,f.data.customerId)),k=null===(d=o.m.first(null===(m=null===(u=y.data)||void 0===u?void 0:u.find((function(e){var r;return(null===(r=e.id)||void 0===r?void 0:r.toString())===(null==t?void 0:t.toString())})))||void 0===m?void 0:m.enrolments.data))||void 0===d?void 0:d.id;return{classroom:h.data,hasLoaded:h.hasCompleted&&v.hasCompleted,teacherName:i.l.getFullName(v.data),revoke:function(t,r){if(k){var a=c.F.revokeOwnership(e,k,t,r);n.a.fetch(p,a)}else r()},assign:function(t,r){if(k){var a=c.F.assignAsOwner(e,k,t,r);n.a.fetch(p,a)}else r()}}}},67115:(e,t,r)=>{r.r(t),r.d(t,{RevokeOwnershipView:()=>h});var a=r(32735),n=r(23481),o=r(49985),l=r(65858),i=r(9111),c=r(13876),s=r(83345),u=r(69883),m=r(72535);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r<t;r++)a[r]=e[r];return a}var p="classrooms.revokeOwnership",f=n.T.encloseNamespace(p);function h(e){var t,r,n=(t=a.useState(!1),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var a,n,o,l,i=[],c=!0,s=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(a=o.call(r)).done)&&(i.push(a.value),i.length!==t);c=!0);}catch(e){s=!0,n=e}finally{try{if(!c&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw n}}return i}}(t,r)||function(e,t){if(e){if("string"==typeof e)return d(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?d(e,t):void 0}}(t,r)||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.")}()),h=n[0],v=n[1],y=(0,m.Z)(e.classroomId,e.teacherId),k=y.classroom,w=y.hasLoaded,g=y.teacherName,b=y.revoke,E=(0,u.Z)();function C(){E.success(f("success",{escapeText:!0,teacher:g,classroom:k.name})),o.k.logUserAction({id:e.teacherId,classroomId:k.id},{actionType:l.Vw.Demote,entity:l.py.User,descriptor:l.iF.Classroom,workflowPhase:l.eu.Complete,location:l.LZ.Popup}),e.closePopup()}function S(){E.error(f("error",{escapeText:!0,teacher:g,classroom:k.name})),e.closePopup()}return a.createElement(i.G,{closePopup:e.closePopup,title:f("title"),showLoadingSpinner:!w},a.createElement("p",{className:"mb-0"},a.createElement(s.x,{namespace:p,phrase:"info",options:{teacher:g}})),a.createElement("ul",null,a.createElement("li",null,a.createElement(s.x,{namespace:p,phrase:"infoPoint1"})),a.createElement("li",null,a.createElement(s.x,{namespace:p,phrase:"infoPoint2"})),a.createElement("li",null,a.createElement(s.x,{namespace:p,phrase:"infoPoint3"}))),a.createElement(c.u,null,a.createElement(c.u.Cancel,{onClick:e.closePopup}),a.createElement(c.u.Submit,{onClick:function(){v(!0),b(C,S)},variant:"dark",text:f("revoke"),showSpinner:h})))}}}]);
2
+ //# sourceMappingURL=7115-18b0e390de-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/7115-18b0e390de-lite.chunk.js","mappings":"qNAYM,SAAUA,EAA6BC,EAAqBC,G,YAC1DC,GAAW,UAEXC,EAAc,kBAAkC,mBAChDC,EAAY,kBAAgCD,EAAYE,MAC5D,iBAA+BL,EAAaG,EAAYE,KAAKC,KACzDC,EAAU,kBAA2B,YAA4BN,IAEjEO,EAAQ,mBAA6C,QAAhB,EAAAL,EAAYE,YAAI,eAAEI,aAAcL,EAAUC,MACnF,sBAAoCL,EAAaG,EAAYE,KAAKI,aAE9DC,EAEL,QAF0B,YACwC,QAAjE,EAAU,QAAV,EAAAF,EAAMH,YAAI,eAAEM,MAAK,SAAAC,GAAI,MAAC,OAAI,QAAJ,EAAAA,EAAEN,UAAE,eAAEO,eAAeZ,aAAS,EAATA,EAAWY,WAAU,WAAC,eAAEC,WAAWT,aAC/E,eAAEC,GAwBH,MAAO,CACLF,UAAWA,EAAUC,KACrBU,UAAWX,EAAUY,cAAgBT,EAAQS,aAC7CC,YAAa,gBAAuBV,EAAQF,MAC5Ca,OA1BsB,SAACC,EAAwBC,GAC/C,GAAKV,EAAL,CAKA,IAAMW,EAAU,oBAAkCrB,EAAaU,EAAoBS,EAAWC,GAE9F,UAAalB,EAAUmB,EAJtB,MAFCD,GAOJ,EAkBEE,OAhBsB,SAACH,EAAwBC,GAC/C,GAAKV,EAAL,CAKA,IAAMW,EAAU,kBAAgCrB,EAAaU,EAAoBS,EAAWC,GAE5F,UAAalB,EAAUmB,EAJtB,MAFCD,GAOJ,EASF,C,wQCzCA,IAAMG,EAAY,6BACZC,EAAY,qBAAiCD,GAO7C,SAAUE,EAAoBC,GAClC,I,IAAyE,G,EAArB,YAAe,G,EAAM,E,o4BAAjEC,EAAiB,KAAEC,EAAoB,KAE/C,GAAsD,OACpDF,EAAM1B,YACN0B,EAAMzB,WAFAG,EAAS,EAATA,UAAWW,EAAS,EAATA,UAAWE,EAAW,EAAXA,YAAaC,EAAM,EAANA,OAKrCW,GAAS,SAOf,SAASV,IACPU,EAAOC,QAAQN,EAAU,UAAW,CAClCO,YAAY,EACZxB,QAASU,EACTb,UAAWA,EAAU4B,QAGvB,kBAA8B,CAC5B1B,GAAIoB,EAAMzB,UACVD,YAAaI,EAAUE,IACtB,CACD2B,WAAY,YACZC,OAAQ,UACRC,WAAY,eACZC,cAAe,cACfC,SAAU,aAGZX,EAAMY,YACR,CAEA,SAASlB,IACPS,EAAOU,MAAMf,EAAU,QAAS,CAC9BO,YAAY,EACZxB,QAASU,EACTb,UAAWA,EAAU4B,QAGvBN,EAAMY,YACR,CAGA,OACE,gBAAC,IAAK,CAACA,WAAYZ,EAAMY,WAAYE,MAAOhB,EAAU,SAAUiB,oBAAqB1B,GACnF,qBAAG2B,UAAU,QACX,gBAAC,IAAI,CAACnB,UAAWA,EAAWoB,OAAO,OAAOC,QAAS,CAAErC,QAASU,MAGhE,0BACE,0BAAI,gBAAC,IAAI,CAACM,UAAWA,EAAWoB,OAAO,gBACvC,0BAAI,gBAAC,IAAI,CAACpB,UAAWA,EAAWoB,OAAO,gBACvC,0BAAI,gBAAC,IAAI,CAACpB,UAAWA,EAAWoB,OAAO,iBAGzC,gBAAC,IAAY,KACX,gBAAC,WAAmB,CAACE,QAASnB,EAAMY,aACpC,gBAAC,WAAmB,CAACO,QAnD3B,WACEjB,GAAqB,GACrBV,EAAOC,EAAWC,EACpB,EAgDqD0B,QAAQ,OAAOC,KAAMvB,EAAU,UAAWwB,YAAarB,KAI9G,C","sources":["file:///app/packages/projects/lite/src/apps/classrooms/hooks/useClassroomTeacherEnrolment.ts","file:///app/packages/projects/lite/src/apps/classrooms/views/revoke-ownership/RevokeOwnershipView.tsx"],"sourcesContent":["import { useDispatch } from 'react-redux';\n\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { Classroom, CurrentUser, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\nexport function useClassroomTeacherEnrolment(classroomId: string, teacherId: string) {\n const dispatch = useDispatch();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(classroomId, currentUser.data.id));\n const teacher = Flight.useBasicFetch<User>(UserManagerRequests.getUser(teacherId));\n\n const staff = Flight.useBasicFetch<User[]>(currentUser.data?.customerId && classroom.data &&\n ClassroomRequests.getClassroomStaff(classroomId, currentUser.data.customerId));\n\n const teacherEnrolmentId = ArrayHelper.first(\n staff.data?.find(e => e.id?.toString() === teacherId?.toString())?.enrolments.data\n )?.id;\n \n const revokeOwnership = (onSuccess?: () => void, onError?: () => void) => {\n if (!teacherEnrolmentId) {\n onError();\n return;\n }\n\n const request = ClassroomRequests.revokeOwnership(classroomId, teacherEnrolmentId, onSuccess, onError);\n\n Flight.fetch(dispatch, request);\n };\n\n const assignOwnership = (onSuccess?: () => void, onError?: () => void) => {\n if (!teacherEnrolmentId) {\n onError();\n return;\n }\n\n const request = ClassroomRequests.assignAsOwner(classroomId, teacherEnrolmentId, onSuccess, onError);\n\n Flight.fetch(dispatch, request);\n };\n\n return {\n classroom: classroom.data,\n hasLoaded: classroom.hasCompleted && teacher.hasCompleted,\n teacherName: UserHelper.getFullName(teacher.data),\n revoke: revokeOwnership,\n assign: assignOwnership\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { PropsWithPopupViewProps } from 'libs/shared/interfaces';\n\nimport { useClassroomTeacherEnrolment } from 'apps/classrooms/hooks/useClassroomTeacherEnrolment';\n\nconst namespace = 'classrooms.revokeOwnership';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RevokeOwnershipViewProps {\n classroomId: string;\n teacherId: string;\n}\n\nexport function RevokeOwnershipView(props: PropsWithPopupViewProps<RevokeOwnershipViewProps>): JSX.Element {\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const { classroom, hasLoaded, teacherName, revoke } = useClassroomTeacherEnrolment(\n props.classroomId,\n props.teacherId\n );\n\n const alerts = useAlerts();\n\n function revokeOwnership(): void {\n setShowButtonSpinner(true);\n revoke(onSuccess, onError);\n }\n\n function onSuccess(): void {\n alerts.success(getPhrase('success', {\n escapeText: true,\n teacher: teacherName,\n classroom: classroom.name\n }));\n\n AnalyticsHelper.logUserAction({\n id: props.teacherId,\n classroomId: classroom.id\n }, {\n actionType: UserAction.Demote,\n entity: EntityType.User,\n descriptor: AssocDescriptor.Classroom,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.Popup\n });\n\n props.closePopup();\n }\n\n function onError(): void {\n alerts.error(getPhrase('error', {\n escapeText: true,\n teacher: teacherName,\n classroom: classroom.name\n }));\n\n props.closePopup();\n }\n\n\n return (\n <Popup closePopup={props.closePopup} title={getPhrase('title')} showLoadingSpinner={!hasLoaded}>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' options={{ teacher: teacherName }} />\n </p>\n\n <ul>\n <li><Text namespace={namespace} phrase='infoPoint1' /></li>\n <li><Text namespace={namespace} phrase='infoPoint2' /></li>\n <li><Text namespace={namespace} phrase='infoPoint3' /></li>\n </ul>\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit onClick={revokeOwnership} variant='dark' text={getPhrase('revoke')} showSpinner={showButtonSpinner} />\n </PopupButtons>\n </Popup>\n );\n}"],"names":["useClassroomTeacherEnrolment","classroomId","teacherId","dispatch","currentUser","classroom","data","id","teacher","staff","customerId","teacherEnrolmentId","find","e","toString","enrolments","hasLoaded","hasCompleted","teacherName","revoke","onSuccess","onError","request","assign","namespace","getPhrase","RevokeOwnershipView","props","showButtonSpinner","setShowButtonSpinner","alerts","success","escapeText","name","actionType","entity","descriptor","workflowPhase","location","closePopup","error","title","showLoadingSpinner","className","phrase","options","onClick","variant","text","showSpinner"],"sourceRoot":""}