@clickview/streamable-learning 0.36.0 → 0.36.1-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/bundles.json +2 -2
- package/dist/css/B-attovs.chunk.css +9 -0
- package/dist/css/B1NucFMn.chunk.css +1 -0
- package/dist/css/BPdg7JW4.chunk.css +1 -0
- package/dist/css/BPrUSCaY.chunk.css +1 -0
- package/dist/css/BR0fUt9D.chunk.css +1 -0
- package/dist/css/BhYm6SRm.chunk.css +1 -0
- package/dist/css/BiRz4h1c.chunk.css +1 -0
- package/dist/css/Bq1ChJn4.chunk.css +1 -0
- package/dist/css/Bt85j9js.chunk.css +1 -0
- package/dist/css/BuYrqi9E.chunk.css +1 -0
- package/dist/css/BugV1Bpa.chunk.css +1 -0
- package/dist/css/BuuVPl7n.chunk.css +1 -0
- package/dist/css/C1NkrNqQ.chunk.css +1 -0
- package/dist/css/C1qv5jz5.chunk.css +1 -0
- package/dist/css/C7XoyEPr.chunk.css +1 -0
- package/dist/css/C7_MDu56.chunk.css +1 -0
- package/dist/css/CC5F5C8O.chunk.css +1 -0
- package/dist/css/CChSC6Ta.chunk.css +1 -0
- package/dist/css/CCsCPLDG.chunk.css +1 -0
- package/dist/css/CD1qrI1T.chunk.css +1 -0
- package/dist/css/CKqvCBj4.chunk.css +1 -0
- package/dist/css/CLZ0Ycds.chunk.css +1 -0
- package/dist/css/CO7M4rZW.chunk.css +1 -0
- package/dist/css/CY0yvCW4.chunk.css +1 -0
- package/dist/css/CYGsw8FT.chunk.css +1 -0
- package/dist/css/Cbi3KYBa.chunk.css +1 -0
- package/dist/css/CgWQu_Ss.chunk.css +1 -0
- package/dist/css/CliS8Q8r.chunk.css +1 -0
- package/dist/css/D-kQKsZN.chunk.css +1 -0
- package/dist/css/D2NwUVrK.chunk.css +1 -0
- package/dist/css/D4g1IoUU.chunk.css +1 -0
- package/dist/css/DBgpcO3T.chunk.css +1 -0
- package/dist/css/DDnpOnVB.chunk.css +1 -0
- package/dist/css/DZJSONGP.chunk.css +1 -0
- package/dist/css/DeAfaPiD.chunk.css +1 -0
- package/dist/css/Dj731zLm.chunk.css +1 -0
- package/dist/css/DjPPxa0A.chunk.css +1 -0
- package/dist/css/DlOtoSz0.chunk.css +1 -0
- package/dist/css/DwduQat7.chunk.css +1 -0
- package/dist/css/Dzuu2GTx.chunk.css +1 -0
- package/dist/css/JAvsJreH.chunk.css +1 -0
- package/dist/css/NKlFYVOc.chunk.css +1 -0
- package/dist/css/VZd8qGtK.chunk.css +1 -0
- package/dist/css/Y7U--2na.chunk.css +1 -0
- package/dist/css/ir3IcK_l.chunk.css +1 -0
- package/dist/css/jbMisi9r.chunk.css +1 -0
- package/dist/css/kS5aDtIJ.chunk.css +1 -0
- package/dist/css/mqCL1o7m.chunk.css +1 -0
- package/dist/css/qZzkUeZk.chunk.css +1 -0
- package/dist/css/sC_H3yXE.chunk.css +1 -0
- package/dist/css/wR_6C_NV.chunk.css +1 -0
- package/dist/en.json +1 -0
- package/dist/scripts/38Gc6FvJ.chunk.js +2 -0
- package/dist/scripts/38Gc6FvJ.chunk.js.map +1 -0
- package/dist/scripts/9vP26Hjl.chunk.js +2 -0
- package/dist/scripts/9vP26Hjl.chunk.js.map +1 -0
- package/dist/scripts/B-YTLo4E.chunk.js +2 -0
- package/dist/scripts/B-YTLo4E.chunk.js.map +1 -0
- package/dist/scripts/B2rqAGbQ.chunk.js +2 -0
- package/dist/scripts/B2rqAGbQ.chunk.js.map +1 -0
- package/dist/scripts/B46nd_gM.chunk.js +2 -0
- package/dist/scripts/B46nd_gM.chunk.js.map +1 -0
- package/dist/scripts/B61dxODs.chunk.js +2 -0
- package/dist/scripts/B61dxODs.chunk.js.map +1 -0
- package/dist/scripts/B928Y1m-.chunk.js +2 -0
- package/dist/scripts/B928Y1m-.chunk.js.map +1 -0
- package/dist/scripts/BBnDr_iy.chunk.js +2 -0
- package/dist/scripts/BBnDr_iy.chunk.js.map +1 -0
- package/dist/scripts/BDwX0xO5.chunk.js +7 -0
- package/dist/scripts/BDwX0xO5.chunk.js.map +1 -0
- package/dist/scripts/BFcg4phV.chunk.js +15 -0
- package/dist/scripts/BFcg4phV.chunk.js.map +1 -0
- package/dist/scripts/BOH3SvVi.chunk.js +2 -0
- package/dist/scripts/BOH3SvVi.chunk.js.map +1 -0
- package/dist/scripts/BPzvNgkA.chunk.js +10 -0
- package/dist/scripts/BPzvNgkA.chunk.js.map +1 -0
- package/dist/scripts/BWkYFXR0.chunk.js +2 -0
- package/dist/scripts/BWkYFXR0.chunk.js.map +1 -0
- package/dist/scripts/BYrL8Bl0.chunk.js +2 -0
- package/dist/scripts/BYrL8Bl0.chunk.js.map +1 -0
- package/dist/scripts/BaMuTXqa.chunk.js +2 -0
- package/dist/scripts/BaMuTXqa.chunk.js.map +1 -0
- package/dist/scripts/Bbj3u3zY.chunk.js +2 -0
- package/dist/scripts/Bbj3u3zY.chunk.js.map +1 -0
- package/dist/scripts/Bd-gJLT1.chunk.js +2 -0
- package/dist/scripts/Bd-gJLT1.chunk.js.map +1 -0
- package/dist/scripts/BdHxGaRy.chunk.js +2 -0
- package/dist/scripts/BdHxGaRy.chunk.js.map +1 -0
- package/dist/scripts/BdPgUz8g.chunk.js +2 -0
- package/dist/scripts/BdPgUz8g.chunk.js.map +1 -0
- package/dist/scripts/Be6BKGLG.chunk.js +356 -0
- package/dist/scripts/Be6BKGLG.chunk.js.map +1 -0
- package/dist/scripts/BfK6q73t.chunk.js +8 -0
- package/dist/scripts/BfK6q73t.chunk.js.map +1 -0
- package/dist/scripts/Bg1w511R.chunk.js +2 -0
- package/dist/scripts/Bg1w511R.chunk.js.map +1 -0
- package/dist/scripts/Bg6K2hsA.chunk.js +3 -0
- package/dist/scripts/Bg6K2hsA.chunk.js.map +1 -0
- package/dist/scripts/BiLpxxSD.chunk.js +2 -0
- package/dist/scripts/BiLpxxSD.chunk.js.map +1 -0
- package/dist/scripts/BmN5JsPi.chunk.js +5 -0
- package/dist/scripts/BmN5JsPi.chunk.js.map +1 -0
- package/dist/scripts/BnSh6tRF.chunk.js +2 -0
- package/dist/scripts/BnSh6tRF.chunk.js.map +1 -0
- package/dist/scripts/Bnt14Hw8.chunk.js +2 -0
- package/dist/scripts/Bnt14Hw8.chunk.js.map +1 -0
- package/dist/scripts/BpRVTpnA.chunk.js +8 -0
- package/dist/scripts/BpRVTpnA.chunk.js.map +1 -0
- package/dist/scripts/BsoISj2P.chunk.js +2 -0
- package/dist/scripts/BsoISj2P.chunk.js.map +1 -0
- package/dist/scripts/BuNZOfIz.chunk.js +2 -0
- package/dist/scripts/BuNZOfIz.chunk.js.map +1 -0
- package/dist/scripts/BvQxdtl3.chunk.js +2 -0
- package/dist/scripts/BvQxdtl3.chunk.js.map +1 -0
- package/dist/scripts/C2zcSUEr.chunk.js +2 -0
- package/dist/scripts/C2zcSUEr.chunk.js.map +1 -0
- package/dist/scripts/C35NlkUr.chunk.js +2 -0
- package/dist/scripts/C35NlkUr.chunk.js.map +1 -0
- package/dist/scripts/C5Fq7Tf-.chunk.js +2 -0
- package/dist/scripts/C5Fq7Tf-.chunk.js.map +1 -0
- package/dist/scripts/CD-ZU1Sa.chunk.js +2 -0
- package/dist/scripts/CD-ZU1Sa.chunk.js.map +1 -0
- package/dist/scripts/CEmtkty-.chunk.js +2 -0
- package/dist/scripts/CEmtkty-.chunk.js.map +1 -0
- package/dist/scripts/CO1Up6zQ.chunk.js +2 -0
- package/dist/scripts/CO1Up6zQ.chunk.js.map +1 -0
- package/dist/scripts/CPNjAJN5.chunk.js +2 -0
- package/dist/scripts/CPNjAJN5.chunk.js.map +1 -0
- package/dist/scripts/CPXlV0fg.chunk.js +2 -0
- package/dist/scripts/CPXlV0fg.chunk.js.map +1 -0
- package/dist/scripts/CQJIB_e-.chunk.js +2 -0
- package/dist/scripts/CQJIB_e-.chunk.js.map +1 -0
- package/dist/scripts/CRusuLqR.chunk.js +2 -0
- package/dist/scripts/CRusuLqR.chunk.js.map +1 -0
- package/dist/scripts/CTWahyAB.chunk.js +2 -0
- package/dist/scripts/CTWahyAB.chunk.js.map +1 -0
- package/dist/scripts/CU5Dd7rS.chunk.js +2 -0
- package/dist/scripts/CU5Dd7rS.chunk.js.map +1 -0
- package/dist/scripts/CW7x8M-z.chunk.js +2 -0
- package/dist/scripts/CW7x8M-z.chunk.js.map +1 -0
- package/dist/scripts/CX-Bc0hf.chunk.js +2 -0
- package/dist/scripts/CX-Bc0hf.chunk.js.map +1 -0
- package/dist/scripts/CY1om5lx.chunk.js +2 -0
- package/dist/scripts/CY1om5lx.chunk.js.map +1 -0
- package/dist/scripts/C_79jeAr.chunk.js +2 -0
- package/dist/scripts/C_79jeAr.chunk.js.map +1 -0
- package/dist/scripts/C_pobyVf.chunk.js +3 -0
- package/dist/scripts/C_pobyVf.chunk.js.map +1 -0
- package/dist/scripts/Cgf5lDwO.chunk.js +2 -0
- package/dist/scripts/Cgf5lDwO.chunk.js.map +1 -0
- package/dist/scripts/Ci9wGu6N.chunk.js +2 -0
- package/dist/scripts/Ci9wGu6N.chunk.js.map +1 -0
- package/dist/scripts/Cmu1J2M7.chunk.js +262 -0
- package/dist/scripts/Cmu1J2M7.chunk.js.map +1 -0
- package/dist/scripts/Cp-yDIHE.chunk.js +2 -0
- package/dist/scripts/Cp-yDIHE.chunk.js.map +1 -0
- package/dist/scripts/CqWRz_Vd.chunk.js +2 -0
- package/dist/scripts/CqWRz_Vd.chunk.js.map +1 -0
- package/dist/scripts/Cs-XAmfP.chunk.js +2 -0
- package/dist/scripts/Cs-XAmfP.chunk.js.map +1 -0
- package/dist/scripts/CsxsnXoH.chunk.js +2 -0
- package/dist/scripts/CsxsnXoH.chunk.js.map +1 -0
- package/dist/scripts/CvuMDF0y.chunk.js +2 -0
- package/dist/scripts/CvuMDF0y.chunk.js.map +1 -0
- package/dist/scripts/CwRpHtAf.chunk.js +2 -0
- package/dist/scripts/CwRpHtAf.chunk.js.map +1 -0
- package/dist/scripts/D4OCofAF.chunk.js +2 -0
- package/dist/scripts/D4OCofAF.chunk.js.map +1 -0
- package/dist/scripts/D4x4hAdA.chunk.js +2 -0
- package/dist/scripts/D4x4hAdA.chunk.js.map +1 -0
- package/dist/scripts/DBaknZA7.chunk.js +2 -0
- package/dist/scripts/DBaknZA7.chunk.js.map +1 -0
- package/dist/scripts/DBdD19pY.chunk.js +53 -0
- package/dist/scripts/DBdD19pY.chunk.js.map +1 -0
- package/dist/scripts/DELBynwO.chunk.js +2 -0
- package/dist/scripts/DELBynwO.chunk.js.map +1 -0
- package/dist/scripts/DEixuHfi.chunk.js +2 -0
- package/dist/scripts/DEixuHfi.chunk.js.map +1 -0
- package/dist/scripts/DFhkO_lZ.chunk.js +2 -0
- package/dist/scripts/DFhkO_lZ.chunk.js.map +1 -0
- package/dist/scripts/DIIFVn0p.chunk.js +2 -0
- package/dist/scripts/DIIFVn0p.chunk.js.map +1 -0
- package/dist/scripts/DIhfGjAK.chunk.js +2 -0
- package/dist/scripts/DIhfGjAK.chunk.js.map +1 -0
- package/dist/scripts/DK1p1ffZ.chunk.js +2 -0
- package/dist/scripts/DK1p1ffZ.chunk.js.map +1 -0
- package/dist/scripts/DK6BRHnl.chunk.js +2 -0
- package/dist/scripts/DK6BRHnl.chunk.js.map +1 -0
- package/dist/scripts/DNbkIXc2.chunk.js +2 -0
- package/dist/scripts/DNbkIXc2.chunk.js.map +1 -0
- package/dist/scripts/DRmZj7Fw.chunk.js +2 -0
- package/dist/scripts/DRmZj7Fw.chunk.js.map +1 -0
- package/dist/scripts/DTcDjqUi.chunk.js +8 -0
- package/dist/scripts/DTcDjqUi.chunk.js.map +1 -0
- package/dist/scripts/DVmtgkhY.chunk.js +2 -0
- package/dist/scripts/DVmtgkhY.chunk.js.map +1 -0
- package/dist/scripts/DWkg1qc2.chunk.js +2 -0
- package/dist/scripts/DWkg1qc2.chunk.js.map +1 -0
- package/dist/scripts/D_nzH8Cw.chunk.js +2 -0
- package/dist/scripts/D_nzH8Cw.chunk.js.map +1 -0
- package/dist/scripts/DaJTPRJr.chunk.js +2 -0
- package/dist/scripts/DaJTPRJr.chunk.js.map +1 -0
- package/dist/scripts/Dal4C0kV.chunk.js +2 -0
- package/dist/scripts/Dal4C0kV.chunk.js.map +1 -0
- package/dist/scripts/DecSY6Xq.chunk.js +2 -0
- package/dist/scripts/DecSY6Xq.chunk.js.map +1 -0
- package/dist/scripts/DgL-ti6b.chunk.js +2 -0
- package/dist/scripts/DgL-ti6b.chunk.js.map +1 -0
- package/dist/scripts/Dhn0D6IV.chunk.js +2 -0
- package/dist/scripts/Dhn0D6IV.chunk.js.map +1 -0
- package/dist/scripts/DuidBpWd.chunk.js +2 -0
- package/dist/scripts/DuidBpWd.chunk.js.map +1 -0
- package/dist/scripts/DvDdiDQN.chunk.js +7 -0
- package/dist/scripts/DvDdiDQN.chunk.js.map +1 -0
- package/dist/scripts/Dx9ncX-C.chunk.js +2 -0
- package/dist/scripts/Dx9ncX-C.chunk.js.map +1 -0
- package/dist/scripts/Dxt3JwJz.chunk.js +2 -0
- package/dist/scripts/Dxt3JwJz.chunk.js.map +1 -0
- package/dist/scripts/Dy57waqb.chunk.js +2 -0
- package/dist/scripts/Dy57waqb.chunk.js.map +1 -0
- package/dist/scripts/DzLh2mnb.chunk.js +2 -0
- package/dist/scripts/DzLh2mnb.chunk.js.map +1 -0
- package/dist/scripts/F-K8Bwdk.chunk.js +2 -0
- package/dist/scripts/F-K8Bwdk.chunk.js.map +1 -0
- package/dist/scripts/G4u5okSS.chunk.js +2 -0
- package/dist/scripts/G4u5okSS.chunk.js.map +1 -0
- package/dist/scripts/KAizYpNf.chunk.js +2 -0
- package/dist/scripts/KAizYpNf.chunk.js.map +1 -0
- package/dist/scripts/LIBRZSqN.chunk.js +8 -0
- package/dist/scripts/LIBRZSqN.chunk.js.map +1 -0
- package/dist/scripts/LgZBXsgq.chunk.js +2 -0
- package/dist/scripts/LgZBXsgq.chunk.js.map +1 -0
- package/dist/scripts/QlJI4d4R.chunk.js +2 -0
- package/dist/scripts/QlJI4d4R.chunk.js.map +1 -0
- package/dist/scripts/ShERxFU5.chunk.js +2 -0
- package/dist/scripts/ShERxFU5.chunk.js.map +1 -0
- package/dist/scripts/Ynb9IAgu.chunk.js +2 -0
- package/dist/scripts/Ynb9IAgu.chunk.js.map +1 -0
- package/dist/scripts/_8CvUiOV.chunk.js +2 -0
- package/dist/scripts/_8CvUiOV.chunk.js.map +1 -0
- package/dist/scripts/aXDrx9_z.chunk.js +6 -0
- package/dist/scripts/aXDrx9_z.chunk.js.map +1 -0
- package/dist/scripts/app-DiXzpOyg.js +220 -0
- package/dist/scripts/app-DiXzpOyg.js.map +1 -0
- package/dist/scripts/bww2eGbI.chunk.js +2 -0
- package/dist/scripts/bww2eGbI.chunk.js.map +1 -0
- package/dist/scripts/cvX-F_mx.chunk.js +2 -0
- package/dist/scripts/cvX-F_mx.chunk.js.map +1 -0
- package/dist/scripts/gtdeja1H.chunk.js +2 -0
- package/dist/scripts/gtdeja1H.chunk.js.map +1 -0
- package/dist/scripts/m9wd_474.chunk.js +2 -0
- package/dist/scripts/m9wd_474.chunk.js.map +1 -0
- package/dist/scripts/nay4aGaa.chunk.js +2 -0
- package/dist/scripts/nay4aGaa.chunk.js.map +1 -0
- package/dist/scripts/pkzD5BEm.chunk.js +2 -0
- package/dist/scripts/pkzD5BEm.chunk.js.map +1 -0
- package/dist/scripts/qO6ZefON.chunk.js +2 -0
- package/dist/scripts/qO6ZefON.chunk.js.map +1 -0
- package/dist/scripts/s4utqqzH.chunk.js +2 -0
- package/dist/scripts/s4utqqzH.chunk.js.map +1 -0
- package/dist/scripts/sxyRyCzh.chunk.js +2 -0
- package/dist/scripts/sxyRyCzh.chunk.js.map +1 -0
- package/dist/scripts/tzNty_oG.chunk.js +2 -0
- package/dist/scripts/tzNty_oG.chunk.js.map +1 -0
- package/dist/scripts/vjyJbQe4.chunk.js +2 -0
- package/dist/scripts/vjyJbQe4.chunk.js.map +1 -0
- package/dist/scripts/vuoBilPQ.chunk.js +2 -0
- package/dist/scripts/vuoBilPQ.chunk.js.map +1 -0
- package/dist/scripts/vwgUbn2Z.chunk.js +2 -0
- package/dist/scripts/vwgUbn2Z.chunk.js.map +1 -0
- package/dist/scripts/wOGv44_K.chunk.js +2 -0
- package/dist/scripts/wOGv44_K.chunk.js.map +1 -0
- package/dist/scripts/xbvkqJGe.chunk.js +2 -0
- package/dist/scripts/xbvkqJGe.chunk.js.map +1 -0
- package/dist/scripts/xywWSa0t.chunk.js +2 -0
- package/dist/scripts/xywWSa0t.chunk.js.map +1 -0
- package/dist/scripts/zUz4ZfV2.chunk.js +2 -0
- package/dist/scripts/zUz4ZfV2.chunk.js.map +1 -0
- package/package.json +5 -3
- package/typings/utils/imports.d.ts +2 -1
- package/vite.config.ts +6 -0
- package/dist/css/103-streamable-learning-5060b6cda5.chunk.css +0 -7
- package/dist/css/1269-streamable-learning-a12c4ebc99.chunk.css +0 -2
- package/dist/css/1457-streamable-learning-c8c8b3b9b1.chunk.css +0 -50
- package/dist/css/2334-streamable-learning-de03ae073a.chunk.css +0 -2
- package/dist/css/3322-streamable-learning-510e1aa3f3.chunk.css +0 -34
- package/dist/css/3838-streamable-learning-da10685fe8.chunk.css +0 -22
- package/dist/css/4254-streamable-learning-e493f4a027.chunk.css +0 -2
- package/dist/css/4607-streamable-learning-2605302fc2.chunk.css +0 -90
- package/dist/css/4772-streamable-learning-f83b838d71.chunk.css +0 -9
- package/dist/css/5565-streamable-learning-0caae3809b.chunk.css +0 -13
- package/dist/css/6017-streamable-learning-098a205d01.chunk.css +0 -6
- package/dist/css/6356-streamable-learning-8c5b220bf6.chunk.css +0 -1
- package/dist/css/6987-streamable-learning-8f682301c6.chunk.css +0 -1
- package/dist/css/7317-streamable-learning-b5d226bbb6.chunk.css +0 -5
- package/dist/css/8058-streamable-learning-539cf7be18.chunk.css +0 -12
- package/dist/css/8294-streamable-learning-c797263ac2.chunk.css +0 -1
- package/dist/css/8496-streamable-learning-ce19f6ca52.chunk.css +0 -13
- package/dist/css/8601-streamable-learning-f525210660.chunk.css +0 -6
- package/dist/css/9514-streamable-learning-251703c6d1.chunk.css +0 -2
- package/dist/css/9766-streamable-learning-31650ffe5d.chunk.css +0 -8
- package/dist/css/9842-streamable-learning-24729103f7.chunk.css +0 -4
- package/dist/css/9899-streamable-learning-0338f8d2dc.chunk.css +0 -4
- package/dist/css/9951-streamable-learning-e9a916b2ef.chunk.css +0 -99
- package/dist/css/streamable-learning-dd0c1095d5.css +0 -23
- package/dist/languages/en.json +0 -1
- package/dist/scripts/103-aceced8961-streamable-learning.chunk.js +0 -1
- package/dist/scripts/1097-680a971192-streamable-learning.chunk.js +0 -2
- package/dist/scripts/1097-680a971192-streamable-learning.chunk.js.LICENSE.txt +0 -105
- package/dist/scripts/1269-2d0b903343-streamable-learning.chunk.js +0 -2
- package/dist/scripts/1269-2d0b903343-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/1457-899f40d09a-streamable-learning.chunk.js +0 -1
- package/dist/scripts/1482-b1dd75897c-streamable-learning.chunk.js +0 -1
- package/dist/scripts/1934-fc017df0da-streamable-learning.chunk.js +0 -2
- package/dist/scripts/1934-fc017df0da-streamable-learning.chunk.js.LICENSE.txt +0 -9
- package/dist/scripts/2042-d51622d63e-streamable-learning.chunk.js +0 -1
- package/dist/scripts/2087-eba9033b1c-streamable-learning.chunk.js +0 -1
- package/dist/scripts/2245-8cd3224e1b-streamable-learning.chunk.js +0 -1
- package/dist/scripts/2334-00b028191d-streamable-learning.chunk.js +0 -1
- package/dist/scripts/2676-c842ec7e8d-streamable-learning.chunk.js +0 -2
- package/dist/scripts/2676-c842ec7e8d-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/2877-5ffc9711f6-streamable-learning.chunk.js +0 -1
- package/dist/scripts/2911-2ec3a6600a-streamable-learning.chunk.js +0 -1
- package/dist/scripts/3057-731a8ca978-streamable-learning.chunk.js +0 -1
- package/dist/scripts/3093-efbcc927ea-streamable-learning.chunk.js +0 -1
- package/dist/scripts/3186-d1a6ccffde-streamable-learning.chunk.js +0 -1
- package/dist/scripts/3322-33c015dec9-streamable-learning.chunk.js +0 -1
- package/dist/scripts/3472-50ca92bde3-streamable-learning.chunk.js +0 -1
- package/dist/scripts/3838-4a38f33dc2-streamable-learning.chunk.js +0 -1
- package/dist/scripts/3941-2ef15ca9ac-streamable-learning.chunk.js +0 -1
- package/dist/scripts/4254-1e95cdfdf2-streamable-learning.chunk.js +0 -1
- package/dist/scripts/4607-2ef017d2ae-streamable-learning.chunk.js +0 -2
- package/dist/scripts/4607-2ef017d2ae-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/4772-3cb280f959-streamable-learning.chunk.js +0 -2
- package/dist/scripts/4772-3cb280f959-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/4951-df701c6a8d-streamable-learning.chunk.js +0 -1
- package/dist/scripts/5088-2e09e1ba6e-streamable-learning.chunk.js +0 -1
- package/dist/scripts/5173-a800a17d0d-streamable-learning.chunk.js +0 -1
- package/dist/scripts/5446-2cbe9f9d1b-streamable-learning.chunk.js +0 -1
- package/dist/scripts/5543-205aaa36a6-streamable-learning.chunk.js +0 -1
- package/dist/scripts/5565-224d86dc1b-streamable-learning.chunk.js +0 -1
- package/dist/scripts/578-2cc99f46f7-streamable-learning.chunk.js +0 -1
- package/dist/scripts/6017-5bd6f9bf7a-streamable-learning.chunk.js +0 -2
- package/dist/scripts/6017-5bd6f9bf7a-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/6356-eefa3ff22e-streamable-learning.chunk.js +0 -1
- package/dist/scripts/6979-ef9a3931a2-streamable-learning.chunk.js +0 -2
- package/dist/scripts/6979-ef9a3931a2-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/6987-e58de31cfe-streamable-learning.chunk.js +0 -1
- package/dist/scripts/7317-6b7186c85d-streamable-learning.chunk.js +0 -1
- package/dist/scripts/7347-772848ba8a-streamable-learning.chunk.js +0 -1
- package/dist/scripts/7570-cd4f70ff52-streamable-learning.chunk.js +0 -2
- package/dist/scripts/7570-cd4f70ff52-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/7904-96574373ca-streamable-learning.chunk.js +0 -1
- package/dist/scripts/7925-1e1cfa2a04-streamable-learning.chunk.js +0 -1
- package/dist/scripts/8058-51c4b442d6-streamable-learning.chunk.js +0 -1
- package/dist/scripts/8126-9d09959b28-streamable-learning.chunk.js +0 -2
- package/dist/scripts/8126-9d09959b28-streamable-learning.chunk.js.LICENSE.txt +0 -60
- package/dist/scripts/8397-39ce77876d-streamable-learning.chunk.js +0 -1
- package/dist/scripts/8496-1b2519f9fd-streamable-learning.chunk.js +0 -2
- package/dist/scripts/8496-1b2519f9fd-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/8599-b74e1ab6e3-streamable-learning.chunk.js +0 -1
- package/dist/scripts/8601-37783cf18b-streamable-learning.chunk.js +0 -1
- package/dist/scripts/8819-2a50dd6a9b-streamable-learning.chunk.js +0 -1
- package/dist/scripts/8937-5103db88d8-streamable-learning.chunk.js +0 -1
- package/dist/scripts/9390-bbaf07ad0f-streamable-learning.chunk.js +0 -1
- package/dist/scripts/9514-a31ca9af06-streamable-learning.chunk.js +0 -1
- package/dist/scripts/9766-855b276f54-streamable-learning.chunk.js +0 -2
- package/dist/scripts/9766-855b276f54-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/9842-ca3b069e5d-streamable-learning.chunk.js +0 -1
- package/dist/scripts/9899-f33e8f1d43-streamable-learning.chunk.js +0 -2
- package/dist/scripts/9899-f33e8f1d43-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/9951-122cbba64f-streamable-learning.chunk.js +0 -2
- package/dist/scripts/9951-122cbba64f-streamable-learning.chunk.js.LICENSE.txt +0 -1
- package/dist/scripts/bundle-d51fd463b2.min.js +0 -2
- package/dist/scripts/bundle-d51fd463b2.min.js.LICENSE.txt +0 -108
- package/dist/scripts/pdf.worker.entry-a2092a6670.min.worker.js +0 -2
- package/dist/scripts/pdf.worker.entry-a2092a6670.min.worker.js.LICENSE.txt +0 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"B-YTLo4E.chunk.js","sources":["../../../../libs/shared/src/apps/subjects/components/classification-dashboard/classification-header-details/ClassificationHeaderDetails.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/empty-state/CuratedClassificationEmptyState.tsx","../../../../libs/shared/src/components/table-of-contents-list/TableOfContentsList.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/table-of-contents/TableOfContents.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/teacher-only/TeacherOnlyEmptyState.tsx","../../../../libs/shared/src/apps/subjects/hooks/useGetTopicsWidgets.ts","../../../../libs/shared/src/hooks/useTableOfContentsActiveHeading.tsx","../../../../libs/shared/src/hooks/usePrevious.ts","../../../../libs/shared/src/hooks/useTableOfContentsScroll.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/classification-coming-soon/ClassificationComingSoon.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/audiences/ClassificationDashboardAudiences.tsx","../../../../libs/shared/src/context/product-tips-context/ProductTipsContext.tsx","../../../../libs/shared/src/images/svg/widgets/WidgetSeriesSvg.tsx","../../../../libs/shared/src/apps/subjects/hooks/useDirectoryTabProductTipSwitcher.ts","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/classification-tabs/ClassificationTabs.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/classification-dashboard-nav/ClassificationDashboardNav.tsx","../../../../libs/shared/src/apps/subjects/components/classification-dashboard/ClassificationDashboard.tsx","../../src/apps/subjects/errors/TopicNotFoundError.ts","../../src/apps/subjects/views/classification/partial-loading/PartialClassification.tsx","../../src/apps/subjects/views/classification/StreamableClassificationViewUtils.ts","../../src/apps/subjects/views/classification/StreamableClassificationView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Classification } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nconst namespace = 'subject.classificationHeaderDetails';\n\nconst Separator = ({ className }: { className: string }) =>\n <span className={className}>•</span>;\n\ninterface ClassificationHeaderDetailsProps {\n classification: Classification;\n}\n\nexport function ClassificationHeaderDetails(props: ClassificationHeaderDetailsProps): React.ReactElement {\n const {\n dashboardVideoCount,\n childDashboardVideoCount,\n dashboardResourceCount,\n childDashboardResourceCount,\n childClassificationCount\n } = TopicsHelper.getCounts(props.classification);\n\n const videoCount = dashboardVideoCount + childDashboardVideoCount;\n const resourceCount = dashboardResourceCount + childDashboardResourceCount;\n\n return (\n <p className='mb-n1 font-size-normal fw-normal mt-1'>\n {!!childClassificationCount && (\n <Text\n namespace={namespace}\n phrase='topics'\n options={{ count: childClassificationCount.toLocaleString(), smartCount: childClassificationCount }}\n />\n )}\n\n {!!videoCount && (\n <>\n {childClassificationCount > 0 && <Separator className='mx-2' />}\n <Text\n namespace={namespace}\n phrase='videos'\n options={{ count: videoCount.toLocaleString(), smartCount: videoCount }}\n />\n </>\n )}\n {!!resourceCount && (\n <>\n <Separator className='mx-2' />\n <Text\n namespace={namespace}\n phrase='resources'\n options={{ count: resourceCount.toLocaleString(), smartCount: resourceCount }}\n />\n </>\n )}\n </p>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { CuratedDashboard, DashboardStatus } from 'libs/shared/interfaces';\n\n\nconst namespace = 'subjects.curatedClassificationEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CuratedClassificationEmptyStateProps {\n dashboard: CuratedDashboard;\n imageUrl: string;\n isReadonly: boolean;\n addWidgetApplink?: () => Core.AppLink;\n}\n\nexport function CuratedClassificationEmptyState(props: CuratedClassificationEmptyStateProps): JSX.Element {\n const isArchived = props.dashboard?.status === DashboardStatus.Archived;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('headingForNP')} />\n {!props.isReadonly ? (\n <EmptyState.Heading>\n <Text phrase='headingForNP' />\n </EmptyState.Heading>\n ) : (\n <>\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='headingForCurator' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='info' />\n </EmptyState.Info>\n <Tooltip title={isArchived ? LanguageService.getPhrase(namespace, 'archivedCtaTooltip') : ''} spanHack>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'add')}\n appLink={props.addWidgetApplink?.()}\n className='btn btn-dark'\n icon={PlusSvg}\n disabled={isArchived}\n />\n </Tooltip>\n </>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\n\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './table-of-contents-list.module.scss';\n\nexport interface TableOfContentsItem<T=string> {\n name: string;\n id: T;\n tocIndentation?: number;\n}\n\ninterface TableOfContentsProps<T> {\n items: TableOfContentsItem<T>[];\n activeId: string;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n // set to true if the TOC is controlled by a local state rather than query params\n localState?: boolean;\n getAppLink?: (args: TableOfContentsItem<T>) => Core.AppLink;\n onItemClick?: (args: TableOfContentsItem<T>) => void;\n}\n\nexport function TableOfContentsList<T extends string>(props: TableOfContentsProps<T>): JSX.Element {\n const analyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Widget,\n location: LocationContext.TableOfContents\n };\n\n function onItemSelect(item: TableOfContentsItem<T>) {\n ScrollHelper.preventScrollTop();\n props.setControlledId(item.id);\n \n props.onItemClick?.(item);\n \n setTimeout(() => document.getElementById(item.id)?.focus());\n }\n\n function getTocIndentClass(item: TableOfContentsItem<T>): string {\n if (item.tocIndentation === 1)\n return styles.tocIndent1;\n \n if (item.tocIndentation === 2)\n return styles.tocIndent2;\n\n return '';\n }\n\n return (\n <div className={`${styles.itemsWrapper}`}>\n {props.items.map((item, idx) => {\n if (props.localState) {\n return (\n <DivButton\n key={item.id}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n onItemSelect(item);\n }}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} `}>\n {item.name}\n </div>\n </DivButton>\n );\n }\n\n return (\n <AppLink\n key={item.id}\n appLink={props.getAppLink(item)}\n appLinkOptions={{ replace: true }}\n className={`${styles.anchorWrapper} ${props.activeId === item.id ? styles.selectedItem : ''}`}\n onClick={() => {\n onItemSelect(item);\n }}\n analyticsData={{\n ...props.analyticsData,\n id: item.id,\n name: item.name\n }}\n analyticsOptions={analyticsOptions}\n >\n <div className={`${!props.activeId && idx === 0 ? styles.default : ''} ${getTocIndentClass(item)}`}>\n {item.name}\n </div>\n </AppLink>\n );\n })}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { TableOfContentsList } from 'libs/shared/components/table-of-contents-list/TableOfContentsList';\nimport { TableOfContentsSvg } from 'libs/shared/images/svg/objects/TableOfContentsSvg';\nimport { CuratedWidget } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport styles from './table-of-contents.module.scss';\n\ninterface TableOfContentsContainerProps {\n widgets: CuratedWidget[];\n title: string;\n activeId: string;\n appLink?: Core.AppLink;\n clickable?: boolean;\n analyticsData?: HashObject;\n setControlledId: (arg: string) => void;\n isSmallScreen?: boolean;\n}\ninterface TableOfContentsProps extends TableOfContentsContainerProps {\n getAppLink: (widget: CuratedWidget) => Core.AppLink\n}\n\nfunction TableOfContentsMobile(props: TableOfContentsProps) {\n const [ isExpanded, setIsExpanded ] = React.useState(false);\n\n function logUserAction() {\n const analyticsOptions = {\n actionType: !isExpanded ? UserAction.Open : UserAction.Hide,\n entity: EntityType.TableOfContents,\n location: LocationContext.Dashboard\n };\n\n AnalyticsHelper.logUserAction(props.analyticsData, analyticsOptions);\n }\n\n function onClickIcon() {\n setIsExpanded(!isExpanded);\n logUserAction();\n }\n\n return (\n <div className={`${styles.mobile} d-inline-flex gap-1`}>\n \n {isExpanded && (\n <div className='bg-white px-3 pt-3 pb-2 border border-dark rounded-1 ps-3'>\n <h2 className='h5'>{props.title}</h2>\n <TableOfContentsList\n items={props.widgets.map(widget => (\n { name: widget.name, id: widget.id, tocIndentation: widget.metadata.tocIndentation }\n ))}\n activeId={props.activeId}\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n setControlledId={props.setControlledId}\n getAppLink={props.getAppLink}\n onItemClick={() => setIsExpanded(false)}\n />\n </div>\n )}\n <div className={styles.container}>\n <IconButton\n className='btn btn-outline-dark'\n svg={TableOfContentsSvg}\n onClick={onClickIcon}\n />\n </div>\n </div>\n );\n}\n\nfunction TableOfContents(props: TableOfContentsProps): JSX.Element {\n return (\n <aside className='col-3 order-1'>\n <div className={`${styles.container} ps-3`}>\n <h2 className='h5'>{props.title}</h2>\n \n <TableOfContentsList\n items={props.widgets.map(widget => (\n { name: widget.name, id: widget.id, tocIndentation: widget.metadata.tocIndentation }\n ))}\n activeId={props.activeId}\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n setControlledId={props.setControlledId}\n getAppLink={props.getAppLink}\n />\n </div>\n </aside>\n );\n}\n\nexport function TableOfContentsContainer(props: TableOfContentsContainerProps): JSX.Element {\n function getAppLink(widget: CuratedWidget): Core.AppLink {\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n \n const params: HashObject = currentAppLink.params\n ? { ...(currentAppLink.params as HashObject) }\n : {};\n\n params.tocId = widget.id;\n\n return {\n ...currentAppLink,\n params\n };\n }\n\n return (\n <>\n {!props.isSmallScreen\n ? <TableOfContents {...props} getAppLink={getAppLink} />\n : <TableOfContentsMobile {...props} getAppLink={getAppLink} />\n }\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'subjects.teacherOnlyEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TeacherOnlyEmptyStateProps {\n imageUrl: string;\n ctaAppLink?: () => Core.AppLink;\n}\n\nexport function TeacherOnlyEmptyState(props: TeacherOnlyEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('heading')} />\n <EmptyState.Heading>\n <Text phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text phrase='info' />\n </EmptyState.Info>\n\n <EmptyState.Cta\n text={getPhrase('cta')}\n appLink={props.ctaAppLink?.()}\n className='btn btn-dark'\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { CuratedDashboard, CuratedMediaWidget, CuratedWidget, PresentationAudience, Video } from 'libs/shared/interfaces';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\n\nexport interface Response {\n widgets: CuratedWidget[];\n\n videoList?: Video[];\n videoListWidgetId?: string;\n}\n\n/**\n * This hook helps us with custom logic for to display system generated dashboards in a slightly\n * different way.\n */\nexport function useGetTopicsWidgets(dashboard: CuratedDashboard, activeAudiences: PresentationAudience[]): Response {\n const {\n isSystemGeneratedDashboard,\n systemGeneratedVideoWidget\n } = React.useMemo(() => {\n if (!dashboard) {\n return {\n isSystemGeneratedDashboard: false,\n systemGeneratedVideoWidget: null\n };\n }\n\n const isSystemGeneratedDashboard = CuratedDashboardHelper.isSystemGeneratedDashboard(dashboard.widgets);\n\n return {\n isSystemGeneratedDashboard,\n systemGeneratedVideoWidget: dashboard.widgets.find(widget => {\n return (\n widget.widgetId === WidgetTypeId.ClassificationPinnedVideos &&\n widget.templateId !== WidgetTemplate.ThumbnailVerticalList\n );\n })\n };\n }, [dashboard?.id]);\n\n const systemGeneratedVideoContent = Flight.useBasicFetch<CuratedMediaWidget<Video[]>>(\n !!systemGeneratedVideoWidget &&\n DashboardRequests.dashboardWidgetContent(\n systemGeneratedVideoWidget?.id,\n CuratedDashboardHelper.getWidgetParams(\n systemGeneratedVideoWidget.widgetId,\n systemGeneratedVideoWidget.templateId,\n CuratedDashboardHelper.getDashboardTargetType(dashboard),\n activeAudiences?.map(a => a.masterId)\n ),\n systemGeneratedVideoWidget?.templateId\n )\n );\n\n // Non system generated dashboards are returned as per usual\n if (!isSystemGeneratedDashboard)\n return { widgets: ArrayHelper.sortBy(dashboard?.widgets, 'index') };\n\n // System generated dashboard have the video widget removed and returned as a separate video list\n return {\n widgets: dashboard?.widgets?.filter(widget => {\n if (widget.widgetId !== WidgetTypeId.ClassificationPinnedVideos)\n return true;\n\n if (widget.templateId === WidgetTemplate.ThumbnailVerticalList)\n return true;\n\n return false;\n }) ?? [],\n videoList: systemGeneratedVideoContent.data?.content ?? [],\n videoListWidgetId: systemGeneratedVideoWidget?.id\n };\n}","import React from 'react';\n\ntype TableOfContentsActiveOption = {\n setActiveId: (id: string) => void;\n headingElements: Element[];\n controlledId?: string;\n setControlledId?: (arg: string) => void;\n}\n\nlet timer: number;\n\nexport const useTableOfContentsActiveHeading = (\n { setActiveId, headingElements, controlledId, setControlledId }: TableOfContentsActiveOption\n) => {\n const scrollPositionRef = React.useRef(0);\n\n React.useEffect(() => {\n const callback = (headings: IntersectionObserverEntry[]) => {\n headings.forEach(heading => {\n if (controlledId) {\n setActiveId(controlledId);\n // can use scrollEnd event when the new event type is supported\n timer = window.setTimeout(() => {\n setControlledId('');\n }, 800);\n return;\n }\n if (heading.isIntersecting) {\n setActiveId(heading.target.id);\n scrollPositionRef.current = window.scrollY;\n } else {\n const scrollDistance = scrollPositionRef.current - window.scrollY;\n const isScrollingUp = scrollDistance > 0;\n const curIndex = headingElements.findIndex(h => h.id === heading.target.id);\n const prevHeading = headingElements[curIndex - 1];\n if (isScrollingUp && prevHeading?.id) {\n setActiveId(prevHeading?.id);\n }\n }\n });\n };\n\n const observer = new IntersectionObserver(callback, {\n // rootMargin top: same as the cv-nav-height\n rootMargin: '-67px 0px -80% 0px'\n });\n\n headingElements.forEach(element => observer.observe(element));\n\n return () => {\n timer && window.clearTimeout(timer);\n observer.disconnect();\n };\n }, [ setActiveId, headingElements.length, controlledId ]);\n};\n\n","import React from 'react';\n\n// https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state\nexport function usePrevious<T>(value: T): T {\n const ref = React.useRef<T>(null);\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}","import React from 'react';\n\nimport { usePrevious } from './usePrevious';\n\nconst HEADER_OFFSET = 80; // Size of header + some extra spacing\n\nexport const useTableOfContentsScroll = (elements: Element[], activeId: string) => {\n const [ hasDoneInitialScroll, setHasDoneInitialScroll ] = React.useState(false);\n\n const previousId = usePrevious(activeId);\n const currentId = activeId;\n\n React.useLayoutEffect(() => {\n if (!hasDoneInitialScroll || previousId !== currentId) {\n const target = elements.find(heading => heading && (heading?.id === currentId));\n\n if (target) {\n const rec = target.getBoundingClientRect();\n\n window.scrollBy({\n top: rec.top - HEADER_OFFSET,\n behavior: 'smooth'\n });\n \n if (!hasDoneInitialScroll)\n setHasDoneInitialScroll(true);\n }\n }\n }, [ elements, previousId, currentId, hasDoneInitialScroll ]);\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionButton } from 'libs/shared/components/actions/ActionButton';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { BellFilledSvg } from 'libs/shared/images/svg/objects/BellFilledSvg';\nimport { BellSvg } from 'libs/shared/images/svg/objects/BellSvg';\nimport { Classification } from 'libs/shared/interfaces';\n\n\nconst namespace = 'subjects.classificationComingSoon';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ComingSoonProps {\n data: Classification;\n onToggleFollow?: () => void;\n canFollowSubjects: boolean;\n imageUrl: string;\n showFollowButtonSpinner: boolean;\n showSignUp: boolean;\n signUpAppLink: Core.AppLink;\n}\n\nexport function ClassificationComingSoon(props: ComingSoonProps): JSX.Element {\n const isFollowing = !!props.data.followers?.data?.length;\n function onClick(): void {\n props.onToggleFollow?.();\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState className='pt-0'>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('comingSoon')} />\n\n <EmptyState.Heading>\n <Text phrase='comingSoon' />\n </EmptyState.Heading>\n\n <EmptyState.Info>\n <Text phrase={props.showSignUp ? 'infoAnon' : 'info'} />\n </EmptyState.Info>\n\n {props.canFollowSubjects && (\n <ActionButton\n svg={isFollowing ? BellFilledSvg : BellSvg}\n onClick={onClick}\n showSpinner={props.showFollowButtonSpinner}\n className={`btn follow-btn me-2 ${isFollowing ? 'btn-outline-dark' : 'btn-dark'}`}\n >\n <Text phrase={isFollowing ? 'following' : 'follow'} />\n </ActionButton>\n )}\n\n {props.showSignUp && !props.canFollowSubjects && (\n <AppLink\n appLink={props.signUpAppLink}\n className='btn btn-dark d-none d-lg-inline-block'\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.ClassificationComingSoon,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n analyticsData={{}}\n tag='button'\n >\n {getPhrase('signUp')}\n </AppLink>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AudienceFilter } from 'libs/shared/apps/subjects/components/audience-filter/AudienceFilter';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\ninterface ClassificationDashboardAudiencesProps {\n audiences: PresentationAudience[];\n activeAudiences: PresentationAudience[];\n appLink: Core.AppLink;\n disabled: boolean;\n disablePersist: boolean;\n tooltip: string;\n}\n\nexport function ClassificationDashboardAudiences(props: ClassificationDashboardAudiencesProps): JSX.Element {\n return (\n <AudienceFilter\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n disabled={props.disabled}\n appLink={props.appLink}\n disablePersist={props.disablePersist}\n tooltip={props.tooltip}\n />\n );\n}","import React from 'react';\n\nimport { ProductTipId } from 'libs/shared/interfaces';\n\ntype RefsHash = Partial<Record<ProductTipId, HTMLElement | null>>;\n\nexport interface ProductTipsContextValues {\n refs?: RefsHash;\n setProductTipRef?: (id: ProductTipId, ref: HTMLElement) => void;\n cleanUpProductTipRef?: (id: ProductTipId) => void;\n}\n\nconst ProductTipsContext = React.createContext<ProductTipsContextValues>({\n setProductTipRef: () => {},\n cleanUpProductTipRef: () => {},\n refs: {}\n});\n\nexport function useProductTipsContext(tipId?: ProductTipId) {\n const { setProductTipRef, cleanUpProductTipRef, refs } = React.useContext(ProductTipsContext);\n\n React.useEffect(() => {\n if (!tipId)\n return;\n\n return () => cleanUpProductTipRef(tipId);\n }, [tipId]);\n\n return {\n setProductTipRef: (ref: HTMLElement) => setProductTipRef(tipId, ref),\n refs\n };\n}\n\n\nexport function ProductTipsContextProvider(props: React.PropsWithChildren) {\n const [ refs, setRefs ] = React.useState<RefsHash>({});\n\n function setProductTipRef(id: ProductTipId, element: HTMLElement) {\n if (refs[id] || !element || !id)\n return;\n \n setRefs({\n ...refs,\n [id]: element\n });\n }\n\n function cleanUpProductTipRef(id: ProductTipId) {\n if (!id)\n return;\n\n setRefs({\n ...refs,\n [id]: null\n });\n }\n\n return (\n <ProductTipsContext.Provider value={{\n refs,\n setProductTipRef,\n cleanUpProductTipRef\n }}>\n {props.children}\n </ProductTipsContext.Provider>\n );\n}","import React from 'react';\n\nexport function WidgetSeriesSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M4.5 4a.5.5 0 0 0 0 1h16a.5.5 0 0 1 .5.5v12a.5.5 0 0 0 1 0v-12A1.5 1.5 0 0 0 20.5 4zM9 10.26a.256.256 0 0 1 .39-.218l4.482 2.74a.256.256 0 0 1 0 .437L9.39 15.958A.256.256 0 0 1 9 15.739zM18.5 6A1.5 1.5 0 0 1 20 7.5v11a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 2 18.5v-11A1.5 1.5 0 0 1 3.5 6zm-15 1a.5.5 0 0 0-.5.5v11a.5.5 0 0 0 .5.5h15a.5.5 0 0 0 .5-.5v-11a.5.5 0 0 0-.5-.5z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ClassificationTab } from '../components/classification-dashboard/classification-tabs/ClassificationTabs';\n\ninterface ViewModel {\n tab: ClassificationTab;\n on: boolean;\n}\n\nexport function useDirectoryTabProductTipSwitcher(initialTab?: ClassificationTab) {\n const initialState: ViewModel = {\n on: false,\n tab: initialTab || 'new-releases'\n };\n\n const [ viewModel, setViewModel ] = useViewModel<ViewModel>('directory:product:tip:switcher', initialState);\n\n React.useEffect(() => {\n if (!initialTab)\n return;\n\n setViewModel('tab', initialTab);\n }, [initialTab]);\n\n React.useEffect(() => {\n let interval: number = null;\n\n if (viewModel.on) {\n interval = window.setInterval(() => {\n if (viewModel.tab === 'new-releases' || viewModel.tab === 'all-topics')\n setViewModel('tab', viewModel.tab === 'new-releases' ? 'all-topics' : 'new-releases');\n else\n setViewModel('tab', viewModel.tab === 'curated-topic' ? 'video-list' : 'curated-topic');\n }, 2000);\n }\n\n return () => {\n window.clearInterval(interval);\n };\n }, [ viewModel.on, viewModel.tab ]);\n\n return {\n tab: viewModel.tab,\n isHighlighting: viewModel.on,\n start: () => setViewModel('on', true),\n stop: () => {\n setViewModel({\n on: false,\n tab: initialTab || viewModel.tab\n });\n }\n };\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PillTab, PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { useProductTipsContext } from 'libs/shared/context/product-tips-context/ProductTipsContext';\nimport { Breakpoints, useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { GridSvg } from 'libs/shared/images/svg/objects/GridSvg';\nimport { RectanglesSvg } from 'libs/shared/images/svg/objects/RectanglesSvg';\nimport { SparkleSvg } from 'libs/shared/images/svg/objects/SparkleSvg';\nimport { WidgetSeriesSvg } from 'libs/shared/images/svg/widgets/WidgetSeriesSvg';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { useDirectoryTabProductTipSwitcher } from '../../../hooks/useDirectoryTabProductTipSwitcher';\n\nimport styles from './classification-tabs.module.scss';\n\nconst namespace = 'shared.classificationDashboard';\n\nexport type ClassificationTab = 'new-releases' | 'all-topics' | 'curated-topic' | 'curriculum';\n\nfunction getTabs(\n props: ClassificationTabsProps,\n breakpoints: Breakpoints,\n activeTab: ClassificationTab,\n isHighlighting: boolean\n): PillTab[] {\n const showText = breakpoints.lg || breakpoints.xl || breakpoints.xxl || breakpoints.xs;\n\n function getTopicTabClassName(): string {\n let className = isHighlighting ? styles.tabTransition : '';\n\n if (breakpoints.xs)\n return className + ' w-100';\n\n if (showText)\n return className = ` ${styles.curatedTopicTab}`;\n\n return className;\n }\n\n if (TopicsHelper.isTopLevelTopic(props.classification)) {\n return [{\n name: showText ? LanguageService.getPhrase(namespace, 'newReleases') : '',\n appLink: props.appLinks?.classification?.(props.classification),\n active: activeTab === 'new-releases',\n svg: SparkleSvg,\n analyticsData: {\n id: 'new-releases',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'newReleases'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classification?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: `${breakpoints.xs ? 'w-100' : ''} ${isHighlighting ? styles.tabTransition : ''}`\n }, {\n name: showText ? LanguageService.getPhrase(namespace, 'allTopics') : '',\n appLink: props.appLinks?.classificationDirectory?.(props.classification),\n active: activeTab === 'all-topics',\n svg: GridSvg,\n analyticsData: {\n id: 'all-topics',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'allTopics'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classificationDirectory?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: `${breakpoints.xs ? 'w-100' : ''} ${isHighlighting ? styles.tabTransition : ''}`\n }];\n }\n\n return [{\n name: showText ? LanguageService.getPhrase(namespace, 'topic') : '',\n appLink: props.appLinks?.classification?.(props.classification),\n active: activeTab === 'curated-topic',\n svg: RectanglesSvg,\n analyticsData: {\n id: 'curated-topic',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'topic'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classification?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: getTopicTabClassName()\n }, {\n name: showText ? LanguageService.getPhrase(namespace, 'curriculum') : '',\n appLink: props.appLinks?.classificationCurriculum?.(props.classification),\n active: activeTab === 'curriculum',\n svg: WidgetSeriesSvg,\n analyticsData: {\n id: 'curriculum',\n classificationId: props.classification.id,\n classificationName: props.classification.name,\n presentationId: props.presentation.id,\n presentationDescription: props.presentation.description,\n name: LanguageService.getPhrase(namespace, 'curriculum'),\n url: Core.AppLinkHelper.getHref(props.appLinks?.classificationCurriculum?.(props.classification))\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n },\n className: `${breakpoints.xs ? 'w-100' : ''} ${isHighlighting ? styles.tabTransition : ''}`\n }];\n}\n\ninterface ClassificationTabsProps {\n classification: Classification;\n presentation: Presentation;\n appLinks: {\n classification: (classification: Classification | null) => Core.AppLink;\n classificationDirectory: (classification: Classification) => Core.AppLink;\n classificationCurriculum: (classification: Classification) => Core.AppLink;\n };\n activeTab: ClassificationTab;\n}\n\nexport function ClassificationTabs(props: ClassificationTabsProps): JSX.Element {\n const breakpoints = useBreakpoints();\n const { tab, isHighlighting } = useDirectoryTabProductTipSwitcher(props.activeTab);\n\n const { setProductTipRef } = useProductTipsContext('topics-directory-tab');\n\n return (\n <PillTabSelector\n borderRadius='sm'\n containerRef={el => setProductTipRef(el)}\n className={breakpoints.xs ? 'w-100' : ''}\n listClassName='d-flex flex-nowrap'\n tabs={getTabs(props, breakpoints, tab, isHighlighting)}\n />\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Classification, CuratedDashboard, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { ClassificationDashboardAudiences } from '../audiences/ClassificationDashboardAudiences';\nimport { ClassificationTab, ClassificationTabs } from '../classification-tabs/ClassificationTabs';\n\nfunction shouldHideAudiences(\n audiences: PresentationAudience[],\n activeAudiences: PresentationAudience[],\n activeTab: ClassificationTab,\n isEmpty: boolean,\n isComingSoon: boolean\n): boolean {\n if (isComingSoon)\n return true;\n\n if (isEmpty && !activeAudiences?.length)\n return true;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return true;\n\n if (activeTab === 'curriculum')\n return true;\n\n return false;\n}\n\ninterface ClassificationDashboardNavProps {\n dashboard: CuratedDashboard;\n classification: Classification;\n presentation: Presentation;\n appLinks: {\n audience: () => Core.AppLink;\n classification: (classification: Classification | null) => Core.AppLink;\n classificationDirectory: (classification: Classification) => Core.AppLink;\n classificationCurriculum: (classification: Classification) => Core.AppLink;\n };\n activeTab: ClassificationTab;\n audiences: PresentationAudience[];\n activeAudiences: PresentationAudience[];\n getBreadcrumbs: () => Breadcrumb[];\n\n hasTopicDirectoryDashboard: boolean;\n hasTopicCurriculumDashboard: boolean;\n isComingSoon: boolean;\n isEmpty: boolean;\n isViewingCurrentPresentation: boolean;\n disableAudiences: boolean;\n audienceTooltip: string;\n}\n\nexport function ClassificationDashboardNav(props: ClassificationDashboardNavProps): JSX.Element {\n const breakpoints = useBreakpoints();\n\n const hideAudiences = shouldHideAudiences(\n props.audiences,\n props.activeAudiences,\n props.activeTab,\n props.isEmpty,\n props.isComingSoon\n );\n\n function canShowTabs(): boolean {\n if (!props.classification || !props.dashboard)\n return false;\n\n if (CuratedDashboardHelper.isSystemGeneratedDashboard(props.dashboard.widgets))\n return false;\n\n /**\n * For our top-level topics, we can show the topic tab if the topic has a directory dashboard.\n */\n if (TopicsHelper.isTopLevelTopic(props.classification))\n return props.hasTopicDirectoryDashboard;\n\n /**\n * For our curated topics, we can show the curriculum tab if the topic has one, which it should\n */\n if (props.classification.externalMetadata?.isCurated && props.hasTopicCurriculumDashboard)\n return true;\n\n return false;\n }\n\n function getContainerClass(): string {\n let className = 'd-flex flex-column py-3 mb-3';\n\n if (!props.isComingSoon)\n className += ' border-bottom';\n\n if ((canShowTabs() || hideAudiences) && !breakpoints.xs)\n return className;\n\n return className + ' row-gap-3';\n }\n\n function getTopRowClass(): string {\n if (hideAudiences) {\n if (breakpoints.xs)\n return 'd-flex flex-column justify-content-between row-gap-3';\n\n return 'd-flex align-items-center justify-content-between';\n }\n\n let className = '';\n\n className += 'd-flex align-items-center justify-content-between mb-1';\n\n if (breakpoints.xs)\n className += ' row-gap-3 mb-0';\n\n return className;\n }\n\n function getBottomRowClass(): string {\n let className = 'd-flex align-items-end justify-content-between';\n\n if (breakpoints.xs)\n className += ' row-gap-3 flex-wrap';\n\n return className;\n }\n\n return (\n <div className={getContainerClass()}>\n <div className={getTopRowClass()}>\n <Breadcrumbs breadcrumbs={props.getBreadcrumbs?.()} />\n\n {canShowTabs() && hideAudiences && (\n <ClassificationTabs\n classification={props.classification}\n activeTab={props.activeTab}\n appLinks={props.appLinks}\n presentation={props.presentation}\n />\n )}\n </div>\n\n <div className={getBottomRowClass()}>\n {!hideAudiences && (\n <ClassificationDashboardAudiences\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n appLink={props.appLinks.audience?.()}\n disabled={props.disableAudiences}\n tooltip={props.audienceTooltip}\n disablePersist={!props.isViewingCurrentPresentation}\n />\n )}\n\n {canShowTabs() && !hideAudiences && (\n <ClassificationTabs\n classification={props.classification}\n activeTab={props.activeTab}\n appLinks={props.appLinks}\n presentation={props.presentation}\n />\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsOptions, HashObject, LocationContext } from 'libs/analytics/interfaces';\n\nimport { ClassificationHeaderDetails } from 'libs/shared/apps/subjects/components/classification-dashboard/classification-header-details/ClassificationHeaderDetails';\nimport { CuratedClassificationEmptyState } from 'libs/shared/apps/subjects/components/classification-dashboard/empty-state/CuratedClassificationEmptyState';\nimport { TableOfContentsContainer } from 'libs/shared/apps/subjects/components/classification-dashboard/table-of-contents/TableOfContents';\nimport { TeacherOnlyEmptyState } from 'libs/shared/apps/subjects/components/classification-dashboard/teacher-only/TeacherOnlyEmptyState';\nimport { useGetTopicsWidgets } from 'libs/shared/apps/subjects/hooks/useGetTopicsWidgets';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { DashboardFeedbackData } from 'libs/shared/components/feedback-form/FeedbackForm';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllClassificationWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { LocalPermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { HasLocalPermissionsFunc, HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { useTableOfContentsActiveHeading } from 'libs/shared/hooks/useTableOfContentsActiveHeading';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CalendarEvent, CalendarEventContentType, Classification, CuratedDashboard, CuratedWidget, CuratedWidgetQueryParams, CurriculumData, DashboardStatus, DashboardTargetType, InteractiveMetadata, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { ClassificationComingSoon } from './classification-coming-soon/ClassificationComingSoon';\nimport { ClassificationDashboardNav } from './classification-dashboard-nav/ClassificationDashboardNav';\nimport { ClassificationTab } from './classification-tabs/ClassificationTabs';\n\nconst namespace = 'shared.classificationDashboard';\n\nfunction isHeadingWidget(widget: CuratedWidget) {\n return widget.widgetId === WidgetTypeId.Blurb && widget.templateId === WidgetTemplate.Heading;\n}\n\nfunction isTopicWidget(widget: CuratedWidget) {\n return widget.widgetId === WidgetTypeId.CuratedClassifications || widget.widgetId === WidgetTypeId.Classifications;\n}\n\nexport interface ClassificationDashboardProps {\n dashboard: CuratedDashboard;\n classification: Classification;\n presentation: Presentation;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n resourceThumbnailFallbackImageUrl: string;\n hasTopicDirectoryDashboard: boolean;\n hasTopicCurriculumDashboard: boolean;\n isTertiaryCustomerWithoutExchange: boolean;\n tab: ClassificationTab;\n specialEvent?: CalendarEvent;\n curriculums: CurriculumData;\n\n audiences: PresentationAudience[];\n activeAudiences?: PresentationAudience[];\n\n getWidgetContentRequest: (\n id: string,\n params: CuratedWidgetQueryParams,\n widgetTemplate: WidgetTemplate\n ) => Flight.Request;\n\n getBannerActions?: () => ActionOptions[];\n getBreadcrumbs?: () => Breadcrumb[];\n onToggleFollow?: (classification: Classification, locationContext: LocationContext) => void;\n canFollowSubjects: boolean;\n onSubmitFeedback?: (feedback: DashboardFeedbackData) => Promise<void>;\n\n appLinks?: AllClassificationWidgetTemplates['appLinks'] & {\n signUp: () => Core.AppLink;\n widgetWizard: () => Core.AppLink;\n previewQuestions: (interactive: InteractiveMetadata) => Core.AppLink\n classificationCurriculum: (classification: Classification) => Core.AppLink;\n audience: () => Core.AppLink;\n };\n\n imageCdnUrl: string\n emptyImageUrl: string;\n comingSoonImageUrl?: string;\n\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n\n scrollToWidgetId?: string;\n tableOfContentsId?: string;\n\n // Means the dashboard contains no linked or working filters\n isReadonly?: boolean;\n\n // Means the dashboard is being previewed by ClickView staff either in product or in curator\n isPreviewing?: boolean;\n\n // Means the parent topic for the dashboard has a status of \"Coming Soon\"\n isComingSoon?: boolean;\n\n showFollowButtonSpinner?: boolean;\n \n isViewCurrentPresentation?: boolean;\n\n // By default widgets will always be lazyloaded. We override this behaviour only in extenuating \n // circumstances, such as dynamic rendering for SEO.\n lazyLoad?: boolean;\n\n moviesAndTv?: boolean;\n\n isTeacherOnly?: boolean;\n \n contentType?: CalendarEventContentType;\n\n isBot?: boolean;\n\n settings?: AllClassificationWidgetTemplates['settings'];\n\n commonVideoProps: CommonVideoProps;\n}\n\nClassificationDashboard.defaultProps = {\n appLinks: {}\n};\n\nexport function ClassificationDashboard(props: ClassificationDashboardProps): JSX.Element {\n const { widgets, videoList, videoListWidgetId } = useGetTopicsWidgets(props.dashboard, props.activeAudiences);\n\n const isSmallScreen = useMediaQuery(MediaQueryStrings.LGDown);\n const headingRef = React.useRef<Set<Element>>(new Set());\n\n const initialEmptyWidgets = React.useMemo(() => {\n return widgets.reduce((acc: HashObject<boolean>, widget) => {\n acc[widget.id] = false;\n return acc;\n }, {});\n }, [widgets?.length]);\n\n const [ emptyWidgets, setEmptyWidgets ] = React.useState(initialEmptyWidgets);\n\n const [ controlledId, setControlledId ] = React.useState(props.tableOfContentsId);\n\n const [ tableOfContentActiveId, setTableOfContentActiveId ] = React.useState<string>('');\n\n const headingElements = Array.from(headingRef.current);\n useTableOfContentsScroll(headingElements, controlledId);\n useTableOfContentsActiveHeading({\n setActiveId: setTableOfContentActiveId,\n headingElements,\n controlledId,\n setControlledId\n });\n\n function shouldShowEmptyState(): boolean {\n if (props.isComingSoon)\n return false;\n\n if (props.isTeacherOnly)\n return false;\n\n if (!props.dashboard)\n return true;\n\n if (props.dashboard.status === DashboardStatus.Archived && !props.isReadonly)\n return true;\n\n if (props.dashboard.status === DashboardStatus.Draft && !props.isPreviewing)\n return true;\n\n if (!widgets?.length)\n return true;\n\n if (videoList && videoList.length)\n return false;\n\n return Object.values(emptyWidgets).every(state => !!state);\n }\n\n function getWidgetContentRequest(id: string, widgetTypeId: WidgetTypeId, template: WidgetTemplate): Flight.Request {\n const params = CuratedDashboardHelper.getWidgetParams(\n widgetTypeId,\n template,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard),\n props.activeAudiences?.map(a => a.masterId),\n props.curriculums.preferredCurriculum?.id\n );\n\n return props.getWidgetContentRequest(id, params, template);\n }\n\n const showEmptyState = shouldShowEmptyState();\n\n React.useEffect(() => {\n /**\n * When we add the first widget of the dashboard, the showEmptyState is `true`, the WidgetContainer is not going to be rendered to lazyload the `content`\n * so we set the emptyWidget to initial make sure the widget container is rendered to lazyload `widget.content`\n * and let the WidgetContainer to re-set the empty state based on the actual `widget.content` from backend\n */\n if (showEmptyState) {\n setEmptyWidgets(initialEmptyWidgets);\n }\n }, [widgets?.length]);\n\n const onSetIsEmpty = React.useCallback((widgetId: string, isEmpty: boolean) => {\n if (emptyWidgets[widgetId] === isEmpty)\n return;\n\n const newEmptyState = {\n ...emptyWidgets,\n [widgetId]: isEmpty\n };\n\n // The logic beneath this if-block doesn't apply to classification directories. This is because\n // classification directories don't support audience filtering, so widgets should never be empty,\n // meaning headings should never be hidden.\n if (CuratedDashboardHelper.isType(props.dashboard, DashboardTargetType.ClassificationDirectory)) {\n setEmptyWidgets(newEmptyState);\n return;\n }\n\n let index = 0;\n\n /**\n * Every time a widget is identified as empty, we check each heading blurb widget\n * to see if it should be hidden. This will be the case when all widgets beneath a heading\n * (up until the next heading) are empty.\n */\n while (index < widgets.length) {\n const currentWidget = widgets[index];\n\n if (!isHeadingWidget(currentWidget)) {\n index++;\n continue;\n }\n\n let isHeadingEmpty = true;\n let subWidgetIndex = index + 1;\n\n while (isHeadingEmpty && subWidgetIndex < widgets.length) {\n const headingSubWidget = widgets[subWidgetIndex];\n\n if (isHeadingWidget(headingSubWidget))\n break;\n\n if (!newEmptyState[headingSubWidget.id] && !isTopicWidget(headingSubWidget))\n isHeadingEmpty = false;\n\n subWidgetIndex++;\n }\n\n index = subWidgetIndex;\n\n newEmptyState[currentWidget.id] = isHeadingEmpty;\n }\n\n setEmptyWidgets(newEmptyState);\n }, [ emptyWidgets, widgets ]);\n\n function hideWidget(widget: CuratedWidget): boolean {\n return isHeadingWidget(widget) && emptyWidgets[widget.id];\n }\n\n function useLargeDashboardSpacing(): boolean {\n const target = CuratedDashboardHelper.getDashboardTargetType(props.dashboard);\n\n if (props.moviesAndTv || target === DashboardTargetType.ClassificationCurriculum)\n return false;\n\n return true;\n }\n\n function getWidgetHeading(widget: CuratedWidget, index: number): string {\n if (widget.widgetId === WidgetTypeId.ClassificationDashboardExternalMedia) {\n const previousWidget = widgets[index - 1];\n\n if (emptyWidgets[previousWidget.id])\n return widget.name.replace('Other videos', 'Videos');\n\n return widget.name;\n }\n\n return widget.name;\n }\n\n const widgetsInTableOfContents = widgets.filter(w => {\n return !hideWidget(w) && !!w.metadata?.showInTableOfContents;\n });\n\n const isTopicOnlyDashboard = widgets.every(isTopicWidget);\n\n const shouldShowTableOfContents = widgetsInTableOfContents.length >= 2;\n const shouldShowSideTableOfContents = shouldShowTableOfContents && !isSmallScreen;\n\n const shouldShowTopicCounts = (\n props.settings?.hasTopicDirectories &&\n TopicsHelper.isTopLevelTopic(props.classification) &&\n !props.isTertiaryCustomerWithoutExchange\n );\n\n /**\n * We don't put the .topic-dashboard class when we're in a movies and tv classification\n * because we don't want the extra padding between widgets.\n */\n return (\n <div className={`bg-white px-4 ${useLargeDashboardSpacing() ? 'dashboard-spacing-lg' : ''}`}>\n <BannerHeader\n heading={props.classification.name}\n banner={props.classification.banner}\n imageCdnUrl={props.imageCdnUrl}\n actions={props.getBannerActions?.()}\n actionsDropdownClassName='btn btn-outline-dark'\n specialEvent={props.specialEvent}\n calendarTheme={{\n background: 'bg-light-blue',\n border: 'border-light-blue'\n }}\n showComingSoon={props.isComingSoon}\n detailsComponent={shouldShowTopicCounts\n ? () => <ClassificationHeaderDetails classification={props.classification} />\n : null\n }\n />\n\n <ClassificationDashboardNav\n dashboard={props.dashboard}\n classification={props.classification}\n presentation={props.presentation}\n appLinks={props.appLinks}\n activeTab={props.tab}\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n getBreadcrumbs={props.getBreadcrumbs}\n hasTopicDirectoryDashboard={props.hasTopicDirectoryDashboard}\n hasTopicCurriculumDashboard={props.hasTopicCurriculumDashboard}\n isComingSoon={props.isComingSoon}\n isEmpty={showEmptyState}\n isViewingCurrentPresentation={props.isViewCurrentPresentation}\n disableAudiences={isTopicOnlyDashboard || props.isReadonly}\n audienceTooltip={isTopicOnlyDashboard ? LanguageService.getPhrase(namespace, 'audienceTooltip') : ''}\n />\n\n {props.isComingSoon && (\n <ClassificationComingSoon\n imageUrl={props.comingSoonImageUrl}\n data={props.classification}\n canFollowSubjects={props.canFollowSubjects}\n showFollowButtonSpinner={props.showFollowButtonSpinner}\n onToggleFollow={() => props.onToggleFollow(props.classification, LocationContext.ClassificationComingSoon)}\n showSignUp={!props.hasLocalPermissions(LocalPermissionName.FollowComingSoonTopics)}\n signUpAppLink={props.appLinks.signUp?.()}\n />\n )}\n\n {!props.isComingSoon && (\n <div className={`${shouldShowSideTableOfContents ? 'row no-wrap' : ''}`}>\n {shouldShowTableOfContents && (\n <TableOfContentsContainer\n widgets={widgetsInTableOfContents}\n title={props.classification.name}\n activeId={tableOfContentActiveId}\n clickable={!props.isReadonly}\n analyticsData={props.analyticsData}\n setControlledId={setControlledId}\n isSmallScreen={isSmallScreen}\n />\n )}\n\n <div className={shouldShowSideTableOfContents ? 'col-9 order-0' : ''}>\n {widgets.map((widget, idx) => {\n if (hideWidget(widget))\n return <React.Fragment key={widget.id}></React.Fragment>;\n\n return (\n <WidgetContainerView\n widgetCollection={DashboardTargetType.Classification}\n headingElementRef={headingRef}\n key={widget.id}\n id={widget.id}\n name={getWidgetHeading(widget, idx)}\n description={widget.description}\n classification={props.classification}\n templateId={widget.templateId}\n widgetTypeId={widget.widgetId}\n audiences={props.audiences}\n getContentRequest={getWidgetContentRequest}\n setIsEmpty={onSetIsEmpty}\n appLinks={props.appLinks}\n presentation={props.presentation}\n analyticsData={props.analyticsData}\n isScrollToTargetWidget={props.scrollToWidgetId === widget.id}\n imageCdnUrl={props.imageCdnUrl}\n onSubmitFeedback={props.onSubmitFeedback}\n metadata={widget.metadata}\n isBot={props.isBot}\n hasTableOfContents={shouldShowSideTableOfContents}\n lazyLoad={props.lazyLoad}\n dashboardTarget={CuratedDashboardHelper.getDashboardTargetType(props.dashboard)}\n widgetIndex={idx}\n hasPermissions={props.hasPermissions}\n hasLocalPermissions={props.hasLocalPermissions}\n isPreviewing={props.isReadonly}\n contentType={props.contentType}\n resourceThumbnailFallbackImageUrl={props.resourceThumbnailFallbackImageUrl}\n onToggleFollowClassification={props.onToggleFollow}\n settings={props.settings}\n isEditing={props.isReadonly}\n isTertiaryCustomerWithoutExchange={props.isTertiaryCustomerWithoutExchange}\n commonVideoProps={props.commonVideoProps}\n curriculums={props.curriculums}\n\n // TODO: Do we actually need this shit if it wasn't even being passed in?\n limitTotalItems={false}\n seeMoreLink={null}\n onClickRemoveItem={null}\n badgeComponent={null}\n />\n );\n })}\n </div>\n\n {!!videoList?.length && (\n <>\n <WidgetHeader name={LanguageService.getPhrase(namespace, 'videos')} />\n <VideoList\n videos={videoList}\n getVideoAppLink={(video, opts) => props.appLinks.videoType(\n video,\n { ...opts, contextId: videoListWidgetId, includeContext: opts.includeContext }\n )}\n hasPermissions={props.hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={props.appLinks.previewQuestions}\n commonVideoProps={props.commonVideoProps}\n />\n </>\n )}\n </div>\n )}\n\n {showEmptyState && (\n <CuratedClassificationEmptyState\n dashboard={props.dashboard}\n isReadonly={props.isReadonly}\n imageUrl={props.emptyImageUrl}\n addWidgetApplink={props.appLinks.widgetWizard}\n />\n )}\n\n {props.isTeacherOnly && (\n <TeacherOnlyEmptyState\n imageUrl={props.emptyImageUrl}\n ctaAppLink={() => props.appLinks.allTopics(props.classification.presentationId)}\n />\n )}\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ErrorCta, ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\n\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\n\nconst namespace = 'subjects.topicNotFoundError';\n\nexport class TopicNotFoundError extends ErrorPageError {\n constructor() {\n super('Topic doesn\\'t exist');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'TopicNotFoundError';\n }\n\n // @ts-ignore\n public get heading(): string {\n return LanguageService.getPhrase(namespace, 'heading');\n }\n\n // @ts-ignore\n public get description(): string {\n return LanguageService.getPhrase(namespace, 'description');\n }\n\n // @ts-ignore\n public get cta(): ErrorCta {\n return {\n text: LanguageService.getPhrase(namespace, 'cta'),\n appLink: {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.CLASSIFICATION_ALL\n }\n };\n }\n}","import React from 'react';\n\nimport { PartialAudienceFilter } from 'libs/shared/apps/subjects/components/audience-filter/AudienceFilter';\nimport { PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\n\nexport function PartialClassification(): JSX.Element {\n return (\n <div className='bg-white px-4'>\n <PartialBannerHeader />\n\n <div className='d-flex flex-column row-gap-3 py-3 mb-3 border-bottom'>\n <PartialBreadcrumbs />\n <PartialAudienceFilter />\n </div>\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { ClassificationDashboardProps } from 'libs/shared/apps/subjects/components/classification-dashboard/ClassificationDashboard';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { StreamableAppLinks } from 'shared/utils/StreamableAppLinks';\n\nconst namespace = 'subjects.classificationView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function getClassificationAppLinks(\n classification: Classification,\n params: HashObject\n): ClassificationDashboardProps['appLinks'] {\n return {\n ...StreamableAppLinks,\n classification: c => StreamableAppLinks.classification(c || classification, params),\n classificationDirectory: () => StreamableAppLinks.classificationDirectory(params),\n audience: () => StreamableAppLinks.classification(classification, params),\n\n // TODO: Find a nice way around having to pass these in\n previewQuestions: () => null,\n series: () => null,\n latestReleases: () => null,\n classificationLatestReleases: () => null,\n playlist: () => null,\n signUp: () => null,\n widgetWizard: () => null,\n classificationCurriculum: () => null,\n searchSettings: () => null,\n searchHome: () => null,\n search: () => null,\n editCurriculum: () => null,\n getPreviewQuestionsAppLink: () => null\n };\n}\n\ninterface GetClassificationBreadcrumbsOptions {\n classification: Classification;\n path: Classification[];\n appLinks: ClassificationDashboardProps['appLinks'];\n}\n\nexport function getClassificationBreadcrumbs(\n options: GetClassificationBreadcrumbsOptions\n): Breadcrumb[] {\n const { classification, path, appLinks } = options;\n\n const breadcrumbs: Breadcrumb[] = [{\n name: getPhrase('discover'),\n appLink: {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }\n }, {\n name: getPhrase('exploreAllTopicsHeading'),\n appLink: {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.CLASSIFICATION_ALL\n }\n }];\n\n path.forEach(item => {\n breadcrumbs.push({\n name: item.name,\n appLink: appLinks.classification(item),\n active: item.name === classification.name\n });\n });\n\n return breadcrumbs;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClassificationDashboard } from 'libs/shared/apps/subjects/components/classification-dashboard/ClassificationDashboard';\nimport { PreviewBanner } from 'libs/shared/apps/subjects/components/preview-banner/PreviewBanner';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { AudienceFilterParams, CalendarEventContentType, Classification, Config, CurrentUser, DashboardTargetType, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useFetchDashboard } from 'shared/hooks/useFetchDashboard';\nimport { useStreamableVideoActions } from 'shared/hooks/useStreamableVideoActions';\nimport { SeoHelper } from 'shared/utils/StreamableSeoHelper';\n\nimport { TopicNotFoundError } from 'apps/subjects/errors/TopicNotFoundError';\nimport { useCurriculums } from 'apps/videos/hooks/useCurriculums';\n\nimport { PartialClassification } from './partial-loading/PartialClassification';\nimport { getClassificationAppLinks, getClassificationBreadcrumbs } from './StreamableClassificationViewUtils';\n\nconst namespace = 'subjects.classificationView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface StreamableClassificationViewQueryParams extends AudienceFilterParams {\n dashboardId?: string;\n tocId?: string;\n}\n\nexport function sanitizeStreamableClassificationParams(\n queryParams: StreamableClassificationViewQueryParams\n): StreamableClassificationViewQueryParams {\n if (!queryParams)\n return {};\n\n return ObjectHelper.pick(queryParams, [ 'a', 'dashboardId', 'tocId' ]);\n}\n\ninterface StreamableClassificationViewProps {\n id: string;\n queryParams: StreamableClassificationViewQueryParams;\n}\n\nexport function StreamableClassificationView(props: StreamableClassificationViewProps): JSX.Element {\n const getVideoActions = useStreamableVideoActions('video-list');\n\n const { commonVideoProps } = useCommonVideoProps();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const curriculumData = useCurriculums();\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const classification = Flight.useBasicFetch<Classification>(\n ClassificationRequests.classification(props.id, currentUser.data?.id)\n );\n\n const { dashboard, isPreviewing } = useFetchDashboard({\n targetType: DashboardTargetType.Classification,\n dashboardId: props.queryParams?.dashboardId,\n classificationId: props.id\n });\n\n const appLinks = getClassificationAppLinks(classification.data, props.queryParams);\n\n useSetPageMetadata(PageMetadataHelper.getClassificationMetadata({\n content: { classification: classification.data },\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({\n customAppLink: appLinks.classification(classification.data)\n }),\n allowIndexing: true,\n product: StreamableConstants.PRODUCT_NAME\n }));\n\n useHandleObjectError(classification, {\n notFound: TopicNotFoundError\n });\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(presentation.data &&\n AudienceRequests.presentationAudiences(presentation.data.id, PresentationType.StreamableLearning));\n\n const path = Flight.useBasicFetch<Classification[]>(\n ClassificationRequests.path(props.id, PresentationType.StreamableLearning)\n );\n\n /**\n * We use the current active audiences to re-fetch content for that specific audience set.\n */\n const activeAudiences = AudienceHelper.getActiveAudiencesFromParams(audiences.data, props.queryParams);\n const activeAudienceIds = activeAudiences?.map(a => a.masterId) ?? [];\n\n /**\n * Additional topics data to be mixed in with lower-level component analytics collection\n */\n const analyticsData = {\n presentationId: presentation.data?.id,\n presentationName: presentation.data?.name,\n currentClassificationId: classification.data?.id,\n currentClassificationName: classification.data?.name,\n followingCurrentClassification: !!classification.data?.followers?.data?.length,\n activeAudienceNames: activeAudiences?.length ? activeAudiences.map(a => a.name) : null,\n activeAudienceIds: activeAudienceIds.length ? activeAudienceIds : null\n };\n\n\n function getBreadcrumbs(): () => Breadcrumb[] {\n return () => getClassificationBreadcrumbs({\n appLinks: appLinks,\n classification: classification.data,\n path: path.data\n });\n }\n\n const dataLoaded = !!config.data\n && dashboard.hasCompleted\n && !!classification.data\n && !!presentation.data\n && !!path.data\n && !!audiences.data;\n\n if (!dataLoaded)\n return <PartialClassification />;\n\n return (\n <VideoActionsContext.Provider value={{ getVideoActions }}>\n <div className='position-relative'>\n {!!(isPreviewing && dashboard.data) && <PreviewBanner status={dashboard.data.status} type='topic' />}\n <ClassificationDashboard\n dashboard={dashboard.data}\n classification={classification.data}\n getWidgetContentRequest={DashboardRequests.dashboardWidgetContent}\n getBreadcrumbs={getBreadcrumbs()}\n hasPermissions={() => false}\n hasLocalPermissions={() => false}\n presentation={presentation.data}\n getBannerActions={() => []}\n audiences={audiences.data}\n activeAudiences={activeAudiences}\n analyticsData={analyticsData}\n imageCdnUrl={config.data.imageCdnUrl}\n resourceThumbnailFallbackImageUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n emptyImageUrl={ImageUrls.EmptyStates.Topics.TOPIC}\n appLinks={appLinks}\n isPreviewing={isPreviewing}\n isViewCurrentPresentation\n canFollowSubjects={false}\n tableOfContentsId={props.queryParams.tocId}\n lazyLoad={!SeoHelper.isBot()}\n isTeacherOnly={false}\n contentType={CalendarEventContentType.Livestream}\n hasTopicDirectoryDashboard={false}\n hasTopicCurriculumDashboard={false}\n isTertiaryCustomerWithoutExchange={false}\n tab='curated-topic'\n curriculums={curriculumData}\n // just... one... more.. prop....\n commonVideoProps={commonVideoProps}\n />\n </div>\n </VideoActionsContext.Provider>\n );\n}"],"names":["namespace","Separator","className","jsx","ClassificationHeaderDetails","props","dashboardVideoCount","childDashboardVideoCount","dashboardResourceCount","childDashboardResourceCount","childClassificationCount","TopicsHelper","videoCount","resourceCount","jsxs","Text","Fragment","getPhrase","LanguageService","CuratedClassificationEmptyState","isArchived","_a","DashboardStatus","LanguageNamespaceContext","EmptyState","Tooltip","_b","PlusSvg","TableOfContentsList","analyticsOptions","UserAction","EntityType","LocationContext","onItemSelect","item","ScrollHelper","getTocIndentClass","styles","idx","DivButton","AppLink","TableOfContentsMobile","isExpanded","setIsExpanded","React","logUserAction","AnalyticsHelper","onClickIcon","widget","IconButton","TableOfContentsSvg","TableOfContents","TableOfContentsContainer","getAppLink","currentAppLink","ContextService","params","TeacherOnlyEmptyState","useGetTopicsWidgets","dashboard","activeAudiences","isSystemGeneratedDashboard","systemGeneratedVideoWidget","CuratedDashboardHelper","WidgetTypeId","WidgetTemplate","systemGeneratedVideoContent","Flight.useBasicFetch","DashboardRequests","a","ArrayHelper","timer","useTableOfContentsActiveHeading","setActiveId","headingElements","controlledId","setControlledId","scrollPositionRef","callback","headings","heading","isScrollingUp","curIndex","h","prevHeading","observer","element","usePrevious","value","ref","HEADER_OFFSET","useTableOfContentsScroll","elements","activeId","hasDoneInitialScroll","setHasDoneInitialScroll","previousId","currentId","target","rec","ClassificationComingSoon","isFollowing","onClick","ActionButton","BellFilledSvg","BellSvg","WorkflowPhase","SignUpDescriptors","ClassificationDashboardAudiences","AudienceFilter","ProductTipsContext","useProductTipsContext","tipId","setProductTipRef","cleanUpProductTipRef","refs","WidgetSeriesSvg","useDirectoryTabProductTipSwitcher","initialTab","initialState","viewModel","setViewModel","useViewModel","interval","getTabs","breakpoints","activeTab","isHighlighting","showText","getTopicTabClassName","SparkleSvg","Core.AppLinkHelper","_d","_c","_f","_e","GridSvg","_h","_g","_j","_i","RectanglesSvg","_l","_k","_n","_m","_p","_o","ClassificationTabs","useBreakpoints","tab","PillTabSelector","el","shouldHideAudiences","audiences","isEmpty","isComingSoon","AudienceHelper","ClassificationDashboardNav","hideAudiences","canShowTabs","getContainerClass","getTopRowClass","getBottomRowClass","Breadcrumbs","isHeadingWidget","isTopicWidget","ClassificationDashboard","widgets","videoList","videoListWidgetId","isSmallScreen","useMediaQuery","MediaQueryStrings","headingRef","initialEmptyWidgets","acc","emptyWidgets","setEmptyWidgets","tableOfContentActiveId","setTableOfContentActiveId","shouldShowEmptyState","state","getWidgetContentRequest","id","widgetTypeId","template","showEmptyState","onSetIsEmpty","widgetId","newEmptyState","DashboardTargetType","index","currentWidget","isHeadingEmpty","subWidgetIndex","headingSubWidget","hideWidget","useLargeDashboardSpacing","getWidgetHeading","previousWidget","widgetsInTableOfContents","w","isTopicOnlyDashboard","shouldShowTableOfContents","shouldShowSideTableOfContents","shouldShowTopicCounts","BannerHeader","LocalPermissionName","WidgetContainerView","WidgetHeader","VideoList","video","opts","TopicNotFoundError","ErrorPageError","AppChannels","Actions","PartialClassification","PartialBannerHeader","PartialBreadcrumbs","PartialAudienceFilter","getClassificationAppLinks","classification","StreamableAppLinks","c","getClassificationBreadcrumbs","options","path","appLinks","breadcrumbs","sanitizeStreamableClassificationParams","queryParams","ObjectHelper","StreamableClassificationView","getVideoActions","useStreamableVideoActions","commonVideoProps","useCommonVideoProps","config","ConfigRequests","currentUser","UserRequests","curriculumData","useCurriculums","presentation","PresentationRequests","ClassificationRequests","isPreviewing","useFetchDashboard","useSetPageMetadata","PageMetadataHelper","SeoHelper","StreamableConstants","useHandleObjectError","AudienceRequests","PresentationType","activeAudienceIds","analyticsData","getBreadcrumbs","VideoActionsContext","PreviewBanner","ImageUrls","CalendarEventContentType"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as r}from"./app-DiXzpOyg.js";function l(o){return r.jsx("svg",{...o,children:r.jsx("path",{d:"M11.267 15.695 5.304 9.79a1.046 1.046 0 0 1 0-1.473l.01-.011a1.034 1.034 0 0 1 1.467 0L12 13.474l5.22-5.17a1.034 1.034 0 0 1 1.465 0l.011.012a1.046 1.046 0 0 1 0 1.473l-5.963 5.906a1.034 1.034 0 0 1-1.466 0",fill:"currentColor"})})}export{l as C};
|
|
2
|
+
//# sourceMappingURL=B2rqAGbQ.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"B2rqAGbQ.chunk.js","sources":["../../../../libs/shared/src/images/svg/arrows/ChevronDownSvg.tsx"],"sourcesContent":["import React from 'react';\n\nexport function ChevronDownSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M11.267 15.695 5.304 9.79a1.046 1.046 0 0 1 0-1.473l.01-.011a1.034 1.034 0 0 1 1.467 0L12 13.474l5.22-5.17a1.034 1.034 0 0 1 1.465 0l.011.012a1.046 1.046 0 0 1 0 1.473l-5.963 5.906a1.034 1.034 0 0 1-1.466 0'\n fill='currentColor'\n />\n </svg>\n );\n}\n"],"names":["ChevronDownSvg","props","jsx"],"mappings":"sCAEO,SAASA,EAAeC,EAAsC,CACnE,OACEC,EAAAA,IAAC,MAAA,CAAK,GAAGD,EACP,SAAAC,EAAAA,IAAC,OAAA,CACC,EAAE,iNACF,KAAK,cAAA,CAAA,EAET,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{o as u,s as j,r as C,P as H,D as o,j as n,G as M,J as I,c as v,z as g,F as L}from"./app-DiXzpOyg.js";import{S as N,C as s,a as y,T}from"./CO1Up6zQ.chunk.js";import{S as _}from"./DzLh2mnb.chunk.js";import{L as k}from"./DK6BRHnl.chunk.js";import"./BmN5JsPi.chunk.js";import"./s4utqqzH.chunk.js";import"./BaMuTXqa.chunk.js";import"./CX-Bc0hf.chunk.js";import"./D4x4hAdA.chunk.js";import"./DgL-ti6b.chunk.js";import"./nay4aGaa.chunk.js";import"./DaJTPRJr.chunk.js";import"./DBaknZA7.chunk.js";import"./CEmtkty-.chunk.js";const w="_modalWidth_t2uj7_1",A={modalWidth:w},P="specialEventCalendar.eventListPopup",z=v.encloseNamespace(P),R=400,U=300;function te(t){var l,m;const i=u(j.streamablePresentation()),{hasPermissions:f}=C(),h=f(H.StudentExperience),S=new Date(t.from),D=new Date(t.to),r=u(((l=i.data)==null?void 0:l.id)&&k.calendarLivestreams({from:o.format(S,"YYYY-MM-DD"),to:o.format(D,"YYYY-MM-DD")})),c=((m=r.data)==null?void 0:m.filter(e=>e.startDate===o.format(new Date(t.date),"YYYY-MM-DD")))||[];function x(e){return h||s.isPastEvent(e)?"pastActionLabel":"actionLabel"}function b(e){var a;return g.createUrl((a=e.company.banner)==null?void 0:a.url,{size:L.Large})}function E(e){var a;return g.createUrl((a=e.company.logo)==null?void 0:a.url,{size:L.Small})}return n.jsxs(M,{title:`Events on ${_.getOrdinalDate(t.date)}`,closePopup:t.closePopup,dialogClassName:A.modalWidth,bodyClassName:"p-0",showLoadingSpinner:!r.data,children:[n.jsx(I.Scrollbars,{autoHeight:!0,autoHeightMin:U,autoHeightMax:R,children:n.jsx("div",{className:"px-3 pt-2",children:c.map((e,a)=>{var p;return n.jsx(N,{getAppLink:y().event,event:e,onClick:t.closePopup,inPopup:!0,presentationId:(p=i.data)==null?void 0:p.id,getActionLabel:()=>z(x(e.content)),getBackgroundColor:Y=>{var d;return(d=Y.company.metadata)==null?void 0:d.colour},getBannerUrl:b,getIconUrl:E,getStartTime:s.isSameTime(c,a)?null:s.getStartTime,isPastEvent:s.isPastEvent},e.content.id)})})}),n.jsxs("div",{className:"d-flex justify-content-between align-items-center p-3 border-top",children:[n.jsx(T,{}),n.jsx("button",{onClick:t.closePopup,className:"btn btn-outline-dark",children:v.getPhrase(P,"close")})]})]})}export{te as SpecialEventListView};
|
|
2
|
+
//# sourceMappingURL=B46nd_gM.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"B46nd_gM.chunk.js","sources":["../../src/apps/calendar/views/special-event-list-view/SpecialEventListView.tsx"],"sourcesContent":["import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SpecialEventListItem } from 'libs/shared/apps/calendar/components/special-event-list-item/SpecialEventListItem';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { TimezoneIndicator } from 'libs/shared/apps/streamable-learning/components/timezone-indicator/TimezoneIndicator';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Livestream, PopupViewProps, Presentation } from 'libs/shared/interfaces';\nimport { CalendarEvent } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport { LivestreamRequests } from 'shared/flight-requests/LivestreamRequests';\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\n\nimport { CalendarUtils } from 'apps/calendar/utils/CalendarUtils';\nimport { getCalendarAppLinks } from 'apps/calendar/views/calendar-view/CalendarViewUtils';\n\nimport styles from './special-event-list-view.module.scss';\n\nconst namespace = 'specialEventCalendar.eventListPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst SCROLL_HEIGHT_MAX = 400;// in px\nconst SCROLL_HEIGHT_MIN = 300;// in px\nexport interface SpecialEventsViewQueryParams extends PopupViewProps {\n from: string;\n to: string;\n date: string;\n}\n\nexport function SpecialEventListView(props: SpecialEventsViewQueryParams): JSX.Element {\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const { hasPermissions } = usePermissions();\n const isStudent = hasPermissions(PermissionName.StudentExperience);\n \n const fromDate = new Date(props.from);\n const toDate = new Date(props.to);\n\n const events = Flight.useBasicFetch<CalendarEvent<Livestream>[]>(presentation.data?.id\n && LivestreamRequests.calendarLivestreams({ from: DateHelper.format(fromDate, 'YYYY-MM-DD'), to: DateHelper.format(toDate, 'YYYY-MM-DD') }));\n const eventsOnDay = events.data?.filter(e => e.startDate === DateHelper.format(new Date(props.date), 'YYYY-MM-DD')) || [];\n\n function getActionLabel(livestream: Livestream): string {\n return isStudent || CalendarUtils.isPastEvent(livestream) ? 'pastActionLabel' : 'actionLabel';\n }\n\n function getBannerUrl(content: Livestream) {\n return ImageHelper.createUrl(content.company.banner?.url, { size: ImageSize.Large });\n }\n\n function getIconUrl(content: Livestream) {\n return ImageHelper.createUrl(content.company.logo?.url, { size: ImageSize.Small });\n }\n\n return (\n <Popup\n title={`Events on ${SpecialEventHelper.getOrdinalDate(props.date)}`}\n closePopup={props.closePopup}\n dialogClassName={styles.modalWidth}\n bodyClassName={'p-0'}\n showLoadingSpinner={!events.data}\n >\n <Scrollbars\n autoHeight\n autoHeightMin={SCROLL_HEIGHT_MIN}\n autoHeightMax={SCROLL_HEIGHT_MAX}\n >\n <div className='px-3 pt-2'>\n {eventsOnDay.map((e, i) => (\n <SpecialEventListItem\n key={e.content.id}\n getAppLink={getCalendarAppLinks().event}\n event={e}\n onClick={props.closePopup}\n inPopup\n presentationId={presentation.data?.id}\n getActionLabel={() => getPhrase(getActionLabel(e.content))}\n getBackgroundColor={(content: Livestream) => content.company.metadata?.colour}\n getBannerUrl={getBannerUrl}\n getIconUrl={getIconUrl}\n getStartTime={!CalendarUtils.isSameTime(eventsOnDay, i) ? CalendarUtils.getStartTime : null}\n isPastEvent={CalendarUtils.isPastEvent}\n />\n ))}\n </div>\n </Scrollbars>\n <div className='d-flex justify-content-between align-items-center p-3 border-top'>\n <TimezoneIndicator />\n <button\n onClick={props.closePopup}\n className='btn btn-outline-dark'\n >\n {LanguageService.getPhrase(namespace, 'close')}\n </button>\n </div>\n </Popup>\n\n );\n}"],"names":["namespace","getPhrase","LanguageService","SCROLL_HEIGHT_MAX","SCROLL_HEIGHT_MIN","SpecialEventListView","props","presentation","Flight.useBasicFetch","PresentationRequests","hasPermissions","usePermissions","isStudent","PermissionName","fromDate","toDate","events","_a","LivestreamRequests","DateHelper","eventsOnDay","_b","getActionLabel","livestream","CalendarUtils","getBannerUrl","content","ImageHelper","ImageSize","getIconUrl","jsxs","Popup","SpecialEventHelper","styles","jsx","Scrollbars","i","SpecialEventListItem","getCalendarAppLinks","TimezoneIndicator"],"mappings":"2jBA0BMA,EAAY,sCACZC,EAAYC,EAAgB,iBAAiBF,CAAS,EAEtDG,EAAoB,IACpBC,EAAoB,IAOnB,SAASC,GAAqBC,EAAkD,SACrF,MAAMC,EAAeC,EACnBC,EAAqB,uBAAA,CAAuB,EAGxC,CAAE,eAAAC,CAAA,EAAmBC,EAAA,EACrBC,EAAYF,EAAeG,EAAe,iBAAiB,EAE3DC,EAAW,IAAI,KAAKR,EAAM,IAAI,EAC9BS,EAAS,IAAI,KAAKT,EAAM,EAAE,EAE1BU,EAASR,IAAkDS,EAAAV,EAAa,OAAb,YAAAU,EAAmB,KAC/EC,EAAmB,oBAAoB,CAAE,KAAMC,EAAW,OAAOL,EAAU,YAAY,EAAG,GAAIK,EAAW,OAAOJ,EAAQ,YAAY,CAAA,CAAG,CAAC,EACvIK,IAAcC,EAAAL,EAAO,OAAP,YAAAK,EAAa,OAAO,GAAK,EAAE,YAAcF,EAAW,OAAO,IAAI,KAAKb,EAAM,IAAI,EAAG,YAAY,KAAM,CAAA,EAEvH,SAASgB,EAAeC,EAAgC,CACtD,OAAOX,GAAaY,EAAc,YAAYD,CAAU,EAAI,kBAAoB,aAClF,CAEA,SAASE,EAAaC,EAAqB,OACzC,OAAOC,EAAY,WAAUV,EAAAS,EAAQ,QAAQ,SAAhB,YAAAT,EAAwB,IAAK,CAAE,KAAMW,EAAU,MAAO,CACrF,CAEA,SAASC,EAAWH,EAAqB,OACvC,OAAOC,EAAY,WAAUV,EAAAS,EAAQ,QAAQ,OAAhB,YAAAT,EAAsB,IAAK,CAAE,KAAMW,EAAU,MAAO,CACnF,CAEA,OACEE,EAAAA,KAACC,EAAA,CACC,MAAO,aAAaC,EAAmB,eAAe1B,EAAM,IAAI,CAAC,GACjE,WAAYA,EAAM,WAClB,gBAAiB2B,EAAO,WACxB,cAAe,MACf,mBAAoB,CAACjB,EAAO,KAE5B,SAAA,CAAAkB,EAAAA,IAACC,EAAAA,WAAA,CACC,WAAU,GACV,cAAe/B,EACf,cAAeD,EAEf,SAAA+B,EAAAA,IAAC,OAAI,UAAU,YACZ,WAAY,IAAI,CAAC,EAAGE,IAAA,OACnBF,OAAAA,EAAAA,IAACG,EAAA,CAEC,WAAYC,IAAsB,MAClC,MAAO,EACP,QAAShC,EAAM,WACf,QAAO,GACP,gBAAgBW,EAAAV,EAAa,OAAb,YAAAU,EAAmB,GACnC,eAAgB,IAAMhB,EAAUqB,EAAe,EAAE,OAAO,CAAC,EACzD,mBAAqBI,GAAA,OAAwB,OAAAT,EAAAS,EAAQ,QAAQ,WAAhB,YAAAT,EAA0B,QACvE,aAAAQ,EACA,WAAAI,EACA,aAAeL,EAAc,WAAWJ,EAAagB,CAAC,EAAiC,KAA7BZ,EAAc,aACxE,YAAaA,EAAc,WAAA,EAXtB,EAAE,QAAQ,EAAA,EAalB,CAAA,CACH,CAAA,CAAA,EAEFM,EAAAA,KAAC,MAAA,CAAI,UAAU,mEACb,SAAA,CAAAI,EAAAA,IAACK,EAAA,EAAkB,EACnBL,EAAAA,IAAC,SAAA,CACC,QAAS5B,EAAM,WACf,UAAU,uBAET,SAAAJ,EAAgB,UAAUF,EAAW,OAAO,CAAA,CAAA,CAC/C,CAAA,CACF,CAAA,CAAA,CAAA,CAIN"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{R as C,D as n,j as t,H as pe,L as se,E as k,c as E,T as j,d as P,e as ke,u as oe,f as xe,g as x,h as _,i as A,k as O,I as F,C as W,l as De,m as Ce,n as H,o as b,p as be,q as we,r as Ye,P as Le,s as Se,t as je,v as Ee,w as Pe,x as Te,O as ce,y as Ie,z as G,F as Q}from"./app-DiXzpOyg.js";import{C as X}from"./xywWSa0t.chunk.js";import{S as V}from"./DzLh2mnb.chunk.js";import{S as Ne,g as J,a as S,T as _e,C as K}from"./CO1Up6zQ.chunk.js";import{C as Ae}from"./DecSY6Xq.chunk.js";import{C as Oe}from"./BWkYFXR0.chunk.js";import{C as He}from"./DIhfGjAK.chunk.js";import{T as Ue}from"./tzNty_oG.chunk.js";import{S as $e}from"./BsoISj2P.chunk.js";import{g as Z,S as Be}from"./xbvkqJGe.chunk.js";import{A as Ve}from"./BnSh6tRF.chunk.js";import{C as qe}from"./qO6ZefON.chunk.js";import{S as ze}from"./CPNjAJN5.chunk.js";import{L as I}from"./DK6BRHnl.chunk.js";import"./s4utqqzH.chunk.js";import"./BaMuTXqa.chunk.js";import"./D4x4hAdA.chunk.js";import"./DgL-ti6b.chunk.js";import"./nay4aGaa.chunk.js";import"./BmN5JsPi.chunk.js";import"./CX-Bc0hf.chunk.js";import"./DaJTPRJr.chunk.js";import"./DBaknZA7.chunk.js";import"./BOH3SvVi.chunk.js";import"./vwgUbn2Z.chunk.js";import"./C2zcSUEr.chunk.js";import"./BdHxGaRy.chunk.js";import"./DuidBpWd.chunk.js";import"./Bg1w511R.chunk.js";import"./DEixuHfi.chunk.js";import"./DNbkIXc2.chunk.js";import"./CPXlV0fg.chunk.js";import"./BFcg4phV.chunk.js";import"./QlJI4d4R.chunk.js";import"./CEmtkty-.chunk.js";import"./vuoBilPQ.chunk.js";import"./Bnt14Hw8.chunk.js";import"./cvX-F_mx.chunk.js";import"./CU5Dd7rS.chunk.js";import"./pkzD5BEm.chunk.js";const Re="_wrapper_gw22e_1",Fe="_weekend_gw22e_4",ee={wrapper:Re,weekend:Fe};function We(e){return n.getWeekday(e)===0||n.getWeekday(e)===6}function Ge(e){var h;const{date:a,notCurrentMonth:r}=e,[i,s]=C.useState(0);let o=`position-relative border ${e.theme.border} ${ee.wrapper}`;We(a)&&(o+=` ${ee.weekend}`),r&&(o+="opacity-50");const c=((h=e.events)==null?void 0:h.filter(u=>n.isSame(e.date,u.startDate)))||[],l={...e,eventsOnDay:c,sliderStep:i,setSliderStep:s};return t.jsx("td",{className:o,children:(c==null?void 0:c.length)>0?t.jsx(pe,{hoverableComponent:X,componentProps:l,hoverScale:1.35}):t.jsx(X,{...l,isHovering:!1})})}const U="specialEvent.eventsEmptyState",te=E.encloseNamespace(U);function Qe(e){return t.jsx(se.Provider,{value:U,children:t.jsxs(k,{children:[t.jsx(k.Image,{src:e.imageUrl,altText:te("info")}),t.jsx(k.Heading,{children:e.heading||t.jsx(j,{phrase:"heading"})}),e.appLink&&t.jsx(k.Info,{children:t.jsxs(t.Fragment,{children:[t.jsx(j,{namespace:U,phrase:"info"}),t.jsx(P,{appLink:e.appLink,children:t.jsx("span",{className:"text-info",children:te("link")})})]})})]})})}const Xe="_date_ez4o2_1",Je="_first_ez4o2_4",ne={date:Xe,first:Je};function Ke(e){const a={};e.events.forEach(i=>{const s=i.startDate;a[s]?a[s].push(i):a[s]=[i]});const r=Object.keys(a);return r.sort((i,s)=>n.isBefore(i,s)?-1:0),t.jsx("div",{className:"py-1",children:r.map((i,s)=>{let o="",c="";return t.jsxs("div",{children:[t.jsx("div",{className:`h4 mt-4 ${ne.date} ${s===0?ne.first:""}`,children:V.getOrdinalDate(i)}),a[i].map(l=>{var h;return o=c,c=(h=e.getStartTime)==null?void 0:h.call(e,l.content),t.jsx(Ne,{getAppLink:(u,m)=>e.appLink(u,ke.slugify(m)),event:l,presentationId:e.presentationId,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:()=>e.getActionLabel(l.content),getStartTime:e.getStartTime&&o!==c?e.getStartTime:null,isPastEvent:e.isPastEvent},l.content.id)})]},i)})})}const Ze="_header_dbicu_1",et="_thead_dbicu_4",ae={header:Ze,thead:et};le.defaultProps={theme:{border:"border-light-blue",background:"bg-light-blue"}};function le(e){var u;const{appLinks:a,imageUrls:r}=e,i=oe(),s=V.getEventsInMonth(e.events||[],e.viewingMonth),[o,c]=C.useState(!1),[l,h]=C.useState(null);return e.eventsLoaded&&!(s!=null&&s.length)?t.jsx(Qe,{imageUrl:r.emptyState,appLink:(u=a.emptyStateRedirect)==null?void 0:u.call(a),heading:e.emptyStateHeading}):e.viewMode==="list"||i.xs||i.sm||i.md?e.eventsLoaded?t.jsx(Ke,{events:s,presentationId:e.presentationId,appLink:e.appLinks.event,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:e.getActionLabel,getStartTime:e.getStartTime,isPastEvent:e.isPastEvent}):t.jsx("div",{className:"d-flex justify-content-center align-items-center mb-4",children:t.jsx(xe,{as:"div",animation:"border",role:"status"})}):t.jsxs("table",{className:"user-select-none w-100 mt-3 overflow-hidden rounded-top-lg",children:[t.jsx("thead",{className:`border ${e.theme.border} ${ae.thead}`,children:t.jsx("tr",{className:`fw-semibold ${e.theme.background} ${ae.header}`,children:e.weekDaysHeader.map(m=>t.jsx("th",{className:"px-2 h4",scope:"col",children:m},m))})}),t.jsx("tbody",{children:e.weekDays.map(m=>t.jsx("tr",{children:m.map(d=>t.jsx(Ge,{date:d,notCurrentMonth:!!d.notCurrentMonth,events:e.events,monthQuery:e.monthQuery,hasInitialized:o,setHasInitialized:c,presentationId:e.presentationId,hoveredEvent:l,theme:e.theme,setHoveredEvent:h,getEventsListAppLink:()=>e.appLinks.eventList(e.monthQuery,d,e.presentationId),getTopicAppLink:(f,v)=>e.appLinks.event(f,v),getIconUrl:e.getIconUrl,getBackgroundColor:e.getBackgroundColor,getCoverUrl:e.getCoverUrl,getHardCodedEvent:e.getHardCodedEvent,fadePastEvents:e.fadePastEvents,timezone:e.timezone},d.toString()))},m[0].toString()))})]})}const $=new Date("2023-01-01"),tt=12;function nt(e){const a=n.daysInMonth(e),r=[];for(let i=1;i<=a;i++){const s=n.set(e,"date",i);r.push(Object.assign(s,{notCurrentMonth:!1}))}return r}function de(e,a){const r=n.startOf(e,"month"),i=n.getWeekday(r),s=[],o=a?i===0?6:i-1:i;for(let c=a?1:0;c<=o;c++){const l=r,h=n.weekday(l,i-c);s.push(Object.assign(h,{notCurrentMonth:!0}))}return s.reverse()}function me(e,a){const r=n.endOf(e,"month"),i=n.getWeekday(r),s=[],o=a?7-(i===0?7:i):7-i;for(let c=1;c<=o;c+=1){const l=n.add(r,c,"days");s.push(Object.assign(l,{notCurrentMonth:!0}))}return s}function at(e){const a=e?[1,2,3,4,5,6,0]:[0,1,2,3,4,5,6],r=new Date;return a.map(i=>n.format(n.weekday(r,i),"ddd"))}function it(e,a){const r=[],i={},s=de(e,a).concat(nt(e)).concat(me(e,a));for(let o=0,c=0;o<s.length;o=o+7){const l=s.slice(o,o+7);l.forEach((h,u)=>{i[n.format(h,"YYYY-MM-DD")]={row:c,col:u}}),r.push(l),c++}return{datePositionMap:i,weeksTable:r}}function rt(e){const a=n.startOf(e,"month");return n.getWeekday(a)===1?a:x.first(de(e,!0))}function st(e){const a=n.endOf(e,"month");return n.getWeekday(a)===0?a:x.last(me(e,!0))}function N(e){return[rt(e),st(e)]}function ue(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ot(e){if(!e)return!0;const a=ue(e);if(!n.formatIsValid(a,"MMMM-YYYY",!0))return!1;const i=n.parseDateString(a,"MMMM-YYYY");return n.isSame(i,$,"month")||n.isAfter(i,$,"month")}const ct=new Date;function lt(e){const a=n.diffBetween(n.startOf(e,"month"),n.startOf(ct,"month"),"months"),r=n.isAfter(e,$,"month"),i=a<tt;return{showPrev:r,showNext:i}}function dt(e){if(!e)return n.parseDateString();const a=ue(e);return n.parseDateString(a,"MMMM-YYYY")}const mt="_chevron_d411m_1",ut="_left_d411m_4",ht="_right_d411m_10",gt="_viewModeContainer_d411m_16",D={chevron:mt,left:ut,right:ht,viewModeContainer:gt},ft="specialEventCalendar.calendarNav";function vt(e){return t.jsxs("div",{className:`${D.viewModeContainer} d-none d-lg-block`,children:[t.jsx(F,{svg:He,className:`${e.viewMode==="calendar"?"bg-dark text-white":""} btn btn-outline-dark rounded-start rounded-end-0 border-end-0 px-3 h-100`,onClick:()=>e.setViewMode("calendar"),analyticsData:{},analyticsOptions:{entity:A.AppLink,actionType:O.Click,descriptor:W.Calendar,location:_.CalendarNav}}),t.jsx(F,{svg:Ue,className:`${e.viewMode==="list"?"bg-dark text-white":""} btn btn-outline-dark rounded-end rounded-start-0 border-start-0 px-3 h-100`,onClick:()=>e.setViewMode("list"),analyticsData:{},analyticsOptions:{entity:A.AppLink,actionType:O.Click,descriptor:W.List,location:_.CalendarNav}})]})}function ie(e){const a=e.action==="previous"?Ae:Oe,r=e.action==="previous"?D.left:D.right;function i(){H.trigger(e.appLink),e.onClick()}return t.jsx(P,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:`${D.chevron} ${r} border border-dark rounded-circle bg-white d-flex align-items-center justify-content-center`,onClick:i,children:t.jsx(De,{svg:a,size:Ce.Medium,className:`svg-container d-inline-block ${D.svg}`})})}const re=new Date;function yt(e){const{appLinks:a}=e,r=oe();function i(d){var M,w;const f=n.format(d,"MMMM").toLocaleLowerCase(),v=a.month(f),y={};if(d){const T=new Date().getFullYear(),L=d.getFullYear();T!==L&&(y.year=L)}return(M=e.queryParams)!=null&&M.classification&&(y.classification=e.queryParams.classification),(w=e.queryParams)!=null&&w.yearGroup&&(y.yearGroup=e.queryParams.yearGroup),v.params=y,v}function s(){const d=n.add(e.monthDate,1,"month");e.setViewingMonthDate(d)}function o(){const d=n.subtract(e.monthDate,1,"month");e.setViewingMonthDate(d)}function c(){n.format(re,"M YY")!==n.format(e.monthDate,"M YY")&&e.setViewingMonthDate()}const{showPrev:l,showNext:h}=lt(e.monthDate),u={actionType:O.Click,entity:A.SpecialEvent,location:_.CalendarNav};function m(d){return n.format(d,"YYYY-MM-DD")}return t.jsxs("div",{className:"d-flex flex-wrap gap-3 justify-content-end align-items-center",children:[t.jsx("h1",{className:"mb-0 h2 me-auto",children:n.format(e.monthDate,r.xs?"MMM YYYY":"MMMM YYYY")}),e.children,e.setViewMode&&t.jsx(vt,{viewMode:e.viewMode,setViewMode:e.setViewMode}),t.jsxs("div",{className:"d-flex gap-3",children:[l&&t.jsx(ie,{appLink:i(n.startOf(n.subtract(e.monthDate,1,"month"),"month")),action:"previous",onClick:o,analyticsOptions:u,analyticsData:{action:"previous",date:m(n.startOf(n.add(e.monthDate,1,"month"),"month"))}}),t.jsx(P,{appLink:i(),className:`${D.todayWrapper} btn btn-outline-dark fw-semibold`,onClick:c,analyticsOptions:u,analyticsData:{action:"today",date:m(n.startOf(re,"month"))},children:E.getPhrase(ft,"today")}),h&&t.jsx(ie,{appLink:i(n.startOf(n.add(e.monthDate,1,"month"),"month")),analyticsOptions:u,analyticsData:{action:"next",date:m(n.startOf(n.add(e.monthDate,1,"month"),"month"))},action:"next",onClick:s})]})]})}const B="specialEvent.eventsErrorState",Mt=E.encloseNamespace(B);function pt(e){return t.jsx(se.Provider,{value:B,children:t.jsxs(k,{children:[t.jsx(k.Image,{src:e.imageUrl}),t.jsx(k.Heading,{children:t.jsx(j,{phrase:"heading"})}),t.jsxs(k.Info,{children:[t.jsx(j,{namespace:B,phrase:"info"}),t.jsx("br",{}),t.jsx(P,{appLink:e.appLink,children:t.jsx("span",{className:"text-info",children:Mt("link")})})]})]})})}const kt=new Date;function xt(e=kt,a,r=!0){const i=at(r),s=C.useRef({}),[o,c]=C.useState([]),l=n.format(e,"YYYY-MM");C.useEffect(()=>{const d=s.current[l];if(d)c(d.weeksTable);else{const{weeksTable:f,datePositionMap:v}=it(e,r);s.current[l]={weeksTable:f,datePositionMap:v},c(f)}},[n.format(e,"YYYY-MM")]);function h(d){if(!d){H.trigger(a.calendar());return}if(l!==n.format(d,"YYYY-MM")){const f=n.format(d,"MMMM").toLocaleLowerCase(),v=new Date().getFullYear(),y=e.getFullYear(),M=a.month(f);v!==y&&(M.params={year:y}),H.trigger(M)}}const u=x.first(x.first(o)),m=x.last(x.last(o));return{weekDaysHeader:i,weekDays:o,monthDate:e,setMonthDate:h,startDate:u,endDate:m}}function Dt(e,a){const[r,i]=N(e),s=n.add(e,1,"month"),[o,c]=N(s),l=n.subtract(e,1,"month"),[h,u]=N(l),m={};a.yearGroup&&(m.audienceId=a.yearGroup),a.classification&&(m.topicId=a.classification,m.includeChildrenTopics=!0);const d=b(r&&i&&I.calendarLivestreams({from:n.format(r,"YYYY-MM-DD"),to:n.format(i,"YYYY-MM-DD"),...m})),f=b(o&&c&&I.calendarLivestreams({from:n.format(o,"YYYY-MM-DD"),to:n.format(c,"YYYY-MM-DD"),...m})),v=b(h&&u&&I.calendarLivestreams({from:n.format(h,"YYYY-MM-DD"),to:n.format(u,"YYYY-MM-DD"),...m}));return{events:x.uniq([...v.data||[],...d.data||[],...f.data||[]],M=>M.id),loaded:d.hasCompleted}}const Ct="livestreamCalendar.calendarView",Y=E.encloseNamespace(Ct);function un(e){return e?ce.pick(e,["year","classification","yearGroup"]):{}}bt.defaultProps={queryParams:{}};function bt(e){var q,z,R;const[{viewMode:a},r]=be("calendar:mode",{viewMode:"calendar"},{storage:we.LocalStorage}),{hasPermissions:i}=Ye(),s=i(Le.StudentExperience),o=b(Se.streamablePresentation()),c=b(o.data&&Ve.presentationAudiences(o.data.id,je.StreamableLearning)),l=b(o.data&&qe.topicsFromAllAvailablePresentations([o.data.id])),h=ot(e.month),u=dt(e.month),{monthDate:m,setMonthDate:d,weekDays:f,weekDaysHeader:v,startDate:y,endDate:M}=xt(u,S()),{events:w,loaded:T}=Dt(u,e.queryParams),L=n.format(m,"MMMM YYYY");if(Ee(Pe.getDefaultMetadata({title:L,phraseContext:{phraseHandler:Y,titlePhrase:"pageTitle",descriptionPhrase:"pageDescription"},canonicalLink:ze.getCanonicalLink({allowedParams:["year"]}),allowIndexing:!0,product:Te.PRODUCT_NAME})),e.month!==null&&!h)return t.jsx(pt,{imageUrl:J().errorState,appLink:Z().calendar});const he=[{id:"classification",name:Y("subjectFilter"),options:(q=l.data)==null?void 0:q.topics.map(g=>({name:g.name,id:g.topicIds.join(":")})),type:"checkbox",compatibleIndices:[]},{id:"yearGroup",name:Y("gradeFilter"),type:"checkbox",options:(z=c.data)==null?void 0:z.map(g=>({name:g.name,id:g.masterId})),compatibleIndices:[]}];function ge(){const g=n.format(m,"MMMM").toLocaleLowerCase();new Date().getFullYear(),m.getFullYear();const p=S().month(g);return e.queryParams.classification&&e.queryParams.classification,e.queryParams.yearGroup&&e.queryParams.yearGroup,p}function fe(g){return s||n.isBefore(g.endDateTime,new Date)?"pastActionLabel":"actionLabel"}function ve(){if(!V.getEventsInMonth(w||[],u).length&&(e.queryParams.yearGroup||e.queryParams.classification))return Y("emptyStateText")}function ye(g){var p;return G.createUrl((p=g.company.logo)==null?void 0:p.url,{size:Q.Small})}function Me(g){var p;return G.createUrl((p=g.company.banner)==null?void 0:p.url,{size:Q.Large})}return t.jsxs("div",{className:"bg-white px-4",children:[t.jsx(Be,{appLinks:Z(),active:"calendar"}),t.jsx(yt,{monthDate:m,setViewingMonthDate:d,appLinks:S(),queryParams:e.queryParams,viewMode:a,setViewMode:g=>r({viewMode:g}),children:t.jsx("div",{className:"mx-n1 order-1 order-sm-0",children:t.jsx($e,{queryParams:ce.omit(e.queryParams,["year"]),mainFilters:he,appLink:ge(),isFetchingOptions:!l.data||!o.data||!c.data,alignResetButtonLeft:!0,hideDivider:!0,hideHeading:!0,hideCaret:!1})})}),t.jsxs("div",{className:`position-relative mt-3 ${a==="list"?"":"mt-lg-0"}`,children:[t.jsx("div",{className:`d-block ${a==="list"?"":"d-lg-none"} position-absolute top-0 end-0 mt-2`,children:t.jsx(_e,{})}),t.jsx(le,{weekDays:f,weekDaysHeader:v,events:w,monthQuery:{from:y==null?void 0:y.toString(),to:M==null?void 0:M.toString()},viewingMonth:u,eventsLoaded:T,presentationId:(R=o.data)==null?void 0:R.id,appLinks:S(),imageUrls:J(),viewMode:a,getActionLabel:g=>Y(fe(g)),getBackgroundColor:g=>{var p;return(p=g.company.metadata)==null?void 0:p.colour},getBannerUrl:Me,getIconUrl:ye,getStartTime:K.getStartTime,theme:{background:"bg-light-green",border:"border-light-green"},emptyStateHeading:ve(),fadePastEvents:!0,timezone:Ie.ET,isPastEvent:K.isPastEvent})]})]})}export{bt as CalendarView,un as sanitizeCalendarViewParams};
|
|
2
|
+
//# sourceMappingURL=B61dxODs.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"B61dxODs.chunk.js","sources":["../../../../libs/shared/src/apps/calendar/components/calendar-cell/CalendarCell.tsx","../../../../libs/shared/src/apps/calendar/components/empty-state/SpecialEventEmptyState.tsx","../../../../libs/shared/src/apps/calendar/components/special-event-list/SpecialEventList.tsx","../../../../libs/shared/src/apps/calendar/components/calendar-body/CalendarBody.tsx","../../../../libs/shared/src/apps/calendar/utils/CalendarHelper.ts","../../../../libs/shared/src/apps/calendar/components/calendar-nav/CalendarNav.tsx","../../../../libs/shared/src/apps/calendar/components/error-state/SpecialEventErrorState.tsx","../../../../libs/shared/src/apps/calendar/hooks/useCalendarWeeksTable.ts","../../src/apps/calendar/hooks/useCalendarEventsData.ts","../../src/apps/calendar/views/calendar-view/CalendarView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarDay } from 'libs/shared/apps/calendar/components/calendar-day/CalendarDay';\nimport { CalendarCellProps } from 'libs/shared/apps/calendar/interfaces/CalendarCellProps';\nimport { HoverToPortalContainer } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\n\nimport styles from './calendar-cell.module.scss';\n\nfunction getIsWeekend(date: Date): boolean {\n return DateHelper.getWeekday(date) === 0 || DateHelper.getWeekday(date) === 6;\n}\n\nexport function CalendarCell(props: CalendarCellProps): JSX.Element {\n const { date, notCurrentMonth } = props;\n const [ sliderStep, setSliderStep ] = React.useState<number>(0);\n\n let wrapperClassname = `position-relative border ${props.theme.border} ${styles.wrapper}`;\n if (getIsWeekend(date)) wrapperClassname += ` ${styles.weekend}`;\n if (notCurrentMonth) wrapperClassname += `opacity-50`;\n\n const eventsOnDay = props.events?.filter(e => DateHelper.isSame(props.date, e.startDate)) || [];\n const updatedProps = { ...props, eventsOnDay, sliderStep, setSliderStep };\n\n return (\n <td className={wrapperClassname}>\n {eventsOnDay?.length > 0 ? (\n <HoverToPortalContainer<CalendarCellProps>\n hoverableComponent={CalendarDay}\n componentProps={updatedProps}\n hoverScale={1.35}\n />\n ) : <CalendarDay {...updatedProps} isHovering={false} />}\n </td>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'specialEvent.eventsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SpecialEventEmptyStateProps {\n appLink: Core.AppLink;\n imageUrl: string;\n heading?: string;\n}\n\nexport function SpecialEventEmptyState(props: SpecialEventEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('info')} />\n <EmptyState.Heading>{props.heading || <Text phrase='heading' />}</EmptyState.Heading>\n {props.appLink &&\n <EmptyState.Info>\n <>\n <Text namespace={namespace} phrase='info' />\n <AppLink appLink={props.appLink}>\n <span className='text-info'>{getPhrase('link')}</span>\n </AppLink>\n </>\n </EmptyState.Info>\n }\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SpecialEventListItem } from 'libs/shared/apps/calendar/components/special-event-list-item/SpecialEventListItem';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nimport styles from './special-event-list.module.scss';\n\ninterface SpecialEventListProps {\n events: CalendarEvent[];\n presentationId: string;\n appLink: (content: CalendarEventContent, slug?: string) => Core.AppLink;\n getIconUrl?: (content: CalendarEventContent) => string;\n getBannerUrl?: (content: CalendarEventContent) => string;\n getBackgroundColor?: (content: CalendarEventContent) => string;\n getActionLabel?: (content?: CalendarEventContent) => string;\n getStartTime?: (content: CalendarEventContent) => string;\n isPastEvent?: (content: CalendarEventContent) => boolean;\n}\n\nexport function SpecialEventList(props: SpecialEventListProps): JSX.Element {\n const eventsInMonth: Record<string, CalendarEvent<CalendarEventContent>[]> = {};\n\n props.events.forEach(e => {\n const startDate = e.startDate;\n if (eventsInMonth[startDate]) {\n eventsInMonth[startDate].push(e);\n } else {\n eventsInMonth[startDate] = [e];\n }\n });\n\n const keys = Object.keys(eventsInMonth);\n keys.sort((a, b) => DateHelper.isBefore(a, b) ? -1 : 0);\n\n return (\n <div className='py-1'>\n {keys.map((k, idx) => {\n let prevTime = '';\n let currentTime = '';\n return (\n <div key={k}>\n <div className={`h4 mt-4 ${styles.date} ${idx === 0 ? styles.first : ''}`}>{SpecialEventHelper.getOrdinalDate(k)}</div>\n {eventsInMonth[k].map(e => {\n prevTime = currentTime;\n currentTime = props.getStartTime?.(e.content);\n\n return (\n <SpecialEventListItem\n key={e.content.id}\n getAppLink={(id, name) => {\n return props.appLink(id, TextHelper.slugify(name));\n }}\n event={e}\n presentationId={props.presentationId}\n getIconUrl={props.getIconUrl}\n getBannerUrl={props.getBannerUrl}\n getBackgroundColor={props.getBackgroundColor}\n getActionLabel={() => props.getActionLabel(e.content)}\n getStartTime={props.getStartTime && prevTime !== currentTime\n ? props.getStartTime\n : null\n }\n isPastEvent={props.isPastEvent}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n );\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { CalendarCell } from 'libs/shared/apps/calendar/components/calendar-cell/CalendarCell';\nimport { CalendarAppLinks } from 'libs/shared/apps/calendar/interfaces/CalendarAppLinks';\nimport { CalendarImageUrls } from 'libs/shared/apps/calendar/interfaces/CalendarImageUrls';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { MonthQuery } from 'libs/shared/apps/calendar/interfaces/MonthQuery';\nimport { PatchedDate } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nimport { SpecialEventEmptyState } from '../empty-state/SpecialEventEmptyState';\nimport { SpecialEventList } from '../special-event-list/SpecialEventList';\n\nimport styles from './calendar-body.module.scss';\n\nCalendarBody.defaultProps = {\n theme: {\n border: 'border-light-blue',\n background: 'bg-light-blue'\n }\n};\n\ninterface CalendarBodyProps {\n weekDays: PatchedDate[][];\n weekDaysHeader: string[];\n events?: CalendarEvent[];\n monthQuery: MonthQuery;\n viewingMonth: Date;\n eventsLoaded: boolean;\n presentationId: string;\n appLinks: CalendarAppLinks;\n imageUrls: CalendarImageUrls;\n viewMode?: string;\n theme?: CalendarTheme;\n emptyStateHeading?: string;\n fadePastEvents?: boolean;\n timezone?: Timezone;\n getIconUrl?: (content: CalendarEventContent) => string;\n getBackgroundColor?: (content: CalendarEventContent) => string;\n getBannerUrl?: (content: CalendarEventContent) => string;\n getCoverUrl?: (content: CalendarEventContent) => string;\n getActionLabel?: (content?: CalendarEventContent) => string;\n getStartTime?: (content: CalendarEventContent) => string;\n getHardCodedEvent?: (content: CalendarEventContent) => HashObject;\n isPastEvent?: (content: CalendarEventContent) => boolean;\n}\n\nexport function CalendarBody(props: CalendarBodyProps): JSX.Element {\n const { appLinks, imageUrls } = props;\n\n const breakpoints = useBreakpoints();\n\n const eventsInMonth = SpecialEventHelper.getEventsInMonth(props.events || [], props.viewingMonth);\n\n const [ hasInitialized, setHasInitialized ] = React.useState(false);\n const [ hoveredEvent, setHoveredEvent ] = React.useState<CalendarEvent<CalendarEventContent>>(null);\n\n if (props.eventsLoaded && !eventsInMonth?.length) {\n return (\n <SpecialEventEmptyState\n imageUrl={imageUrls.emptyState}\n appLink={appLinks.emptyStateRedirect?.()}\n heading={props.emptyStateHeading}\n />\n );\n }\n\n if (props.viewMode === 'list' || breakpoints.xs || breakpoints.sm || breakpoints.md) {\n if (!props.eventsLoaded) {\n return (\n <div className='d-flex justify-content-center align-items-center mb-4'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n );\n }\n\n return (\n <SpecialEventList\n events={eventsInMonth}\n presentationId={props.presentationId}\n appLink={props.appLinks.event}\n getIconUrl={props.getIconUrl}\n getBannerUrl={props.getBannerUrl}\n getBackgroundColor={props.getBackgroundColor}\n getActionLabel={props.getActionLabel}\n getStartTime={props.getStartTime}\n isPastEvent={props.isPastEvent}\n />\n );\n }\n\n return (\n <table className='user-select-none w-100 mt-3 overflow-hidden rounded-top-lg'>\n <thead className={`border ${props.theme.border} ${styles.thead}`}>\n <tr className={`fw-semibold ${props.theme.background} ${styles.header}`}>\n {props.weekDaysHeader.map(w => <th key={w} className='px-2 h4' scope='col'>{w}</th>)}\n </tr>\n </thead>\n\n <tbody>\n {props.weekDays.map(w => (\n <tr key={w[0].toString()}>\n {w.map(d => {\n return (\n <CalendarCell\n key={d.toString()}\n date={d}\n notCurrentMonth={!!d.notCurrentMonth}\n events={props.events}\n monthQuery={props.monthQuery}\n hasInitialized={hasInitialized}\n setHasInitialized={setHasInitialized}\n presentationId={props.presentationId}\n hoveredEvent={hoveredEvent}\n theme={props.theme}\n setHoveredEvent={setHoveredEvent}\n getEventsListAppLink={() => props.appLinks.eventList(props.monthQuery, d, props.presentationId)}\n getTopicAppLink={(calendarEventContent, slug) =>\n props.appLinks.event(calendarEventContent, slug)}\n getIconUrl={props.getIconUrl}\n getBackgroundColor={props.getBackgroundColor}\n getCoverUrl={props.getCoverUrl}\n getHardCodedEvent={props.getHardCodedEvent}\n fadePastEvents={props.fadePastEvents}\n timezone={props.timezone}\n />\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}","/**\n * Inspired by nghilevi/moment-calendar-2\n */\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nexport type PatchedDate = Date & { notCurrentMonth: boolean }\nexport type WeeksTable = PatchedDate[][]\nexport type DatePositionMap = Record<string, {row: number, col: number}>\n\nconst CALENDAR_START_DATE = new Date('2023-01-01');\nconst NEXT_MONTH_LIMIT = 12; // in month\n\nfunction getDaysOfMonth(date: Date): PatchedDate[] {\n const numberOfDays = DateHelper.daysInMonth(date);\n\n const daysArray = [];\n\n for (let i = 1; i <= numberOfDays; i++) {\n const day = DateHelper.set(date, 'date', i);\n daysArray.push(Object.assign(day, { notCurrentMonth: false }));\n }\n\n return daysArray;\n}\n\n// Get days from previous month overlapping current month\nfunction getPreviousMonthOverlappingDays(date: Date, startAtMon: boolean): PatchedDate[] {\n const firstDay = DateHelper.startOf(date, 'month');\n const firstWeekDay = DateHelper.getWeekday(firstDay);\n const prevMonthDays = [];\n const prevMonthDaysCount = startAtMon ? firstWeekDay === 0 ? 6 : firstWeekDay - 1 : firstWeekDay;\n\n for (let i = startAtMon ? 1 : 0; i <= prevMonthDaysCount; i++) {\n const originalDay = firstDay;\n const preDay = DateHelper.weekday(originalDay, firstWeekDay - i);\n prevMonthDays.push(Object.assign(preDay, { notCurrentMonth: true }));\n }\n\n return prevMonthDays.reverse();\n}\n\n// Get days from previous month overlapping current month\nfunction getNextMonthOverlappingDays(date: Date, startAtMon: boolean): PatchedDate[] {\n const lastDay = DateHelper.endOf(date, 'month');\n const lastWeekDay = DateHelper.getWeekday(lastDay);\n const nextMonthDays = [];\n const nextMonthDaysCount = startAtMon ? 7 - (lastWeekDay === 0 ? 7 : lastWeekDay) : 7 - lastWeekDay;\n\n for (let i = 1; i <= nextMonthDaysCount; i += 1) {\n const nextDay = DateHelper.add(lastDay, i, 'days');\n nextMonthDays.push(Object.assign(nextDay, { notCurrentMonth: true }));\n }\n\n return nextMonthDays;\n}\n\nexport function initWeekDays(startAtMon: boolean): string[] {\n const weekdays = startAtMon ? [ 1, 2, 3, 4, 5, 6, 0 ] : [ 0, 1, 2, 3, 4, 5, 6 ];\n const date = new Date();\n return weekdays.map(w => DateHelper.format(DateHelper.weekday(date, w), 'ddd'));\n}\n\nexport function buildWeeksTable(date: Date, startAtMon: boolean) {\n const weeksTable: WeeksTable = [];\n const datePositionMap: DatePositionMap = {};\n\n const monthDays = getPreviousMonthOverlappingDays(date, startAtMon)\n .concat(getDaysOfMonth(date))\n .concat(getNextMonthOverlappingDays(date, startAtMon));\n\n for (let j = 0, rowId = 0; j < monthDays.length; j = j + 7) {\n const week = monthDays.slice(j, j + 7);\n week.forEach((day, colId) => {\n datePositionMap[DateHelper.format(day, 'YYYY-MM-DD')] = { row: rowId, col: colId };\n });\n\n weeksTable.push(week);\n rowId++;\n }\n\n return {\n datePositionMap,\n weeksTable\n };\n}\n\nfunction getFirstDateInCalendar(monthDate: Date) {\n const firstDayOfMonth = DateHelper.startOf(monthDate, 'month');\n if (DateHelper.getWeekday(firstDayOfMonth) === 1) {\n return firstDayOfMonth;\n }\n return ArrayHelper.first(getPreviousMonthOverlappingDays(monthDate, true));\n}\n\nfunction getLastDateInCalendar(monthDate: Date) {\n const lastDayOfMonth = DateHelper.endOf(monthDate, 'month');\n if (DateHelper.getWeekday(lastDayOfMonth) === 0) {\n return lastDayOfMonth;\n }\n return ArrayHelper.last(getNextMonthOverlappingDays(monthDate, true));\n}\n\nexport function getCalendarRange(monthDate: Date) {\n return [ getFirstDateInCalendar(monthDate), getLastDateInCalendar(monthDate) ];\n}\n\nfunction capitalizeMonthString(monthStr: string) {\n return monthStr.charAt(0).toUpperCase() + monthStr.slice(1);\n}\n\nexport function getIsValidMonth(monthDateString: string) {\n if (!monthDateString)\n return true;\n const capitalized = capitalizeMonthString(monthDateString);\n const isValidMonthString = DateHelper.formatIsValid(capitalized, 'MMMM-YYYY', true);\n\n if (!isValidMonthString)\n return false;\n\n const monthDate = DateHelper.parseDateString(capitalized, 'MMMM-YYYY');\n\n return DateHelper.isSame(monthDate, CALENDAR_START_DATE, 'month') || DateHelper.isAfter(monthDate, CALENDAR_START_DATE, 'month');\n}\n\nconst CUR_DATE = new Date();\nexport function canNavToOtherMonths(monthDate: Date) {\n const monthDiff = DateHelper.diffBetween(DateHelper.startOf(monthDate, 'month'), DateHelper.startOf(CUR_DATE, 'month'), 'months');\n const showPrev = DateHelper.isAfter(monthDate, CALENDAR_START_DATE, 'month');\n const showNext = monthDiff < NEXT_MONTH_LIMIT;\n return { showPrev, showNext };\n}\n\nexport function parseMonthString(monthStr: string) {\n if (!monthStr)\n return DateHelper.parseDateString();\n\n const capitalized = capitalizeMonthString(monthStr);\n return DateHelper.parseDateString(capitalized, 'MMMM-YYYY');\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, CalendarDisplayModeDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CalendarAppLinks } from 'libs/shared/apps/calendar/interfaces/CalendarAppLinks';\nimport { CalendarViewMode } from 'libs/shared/apps/calendar/interfaces/CalendarViewMode';\nimport { canNavToOtherMonths } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport { ChevronRightSvg } from 'libs/shared/images/svg/arrows/ChevronRightSvg';\nimport { CalendarSvg } from 'libs/shared/images/svg/objects/CalendarSvg';\nimport { TableOfContentsSvg } from 'libs/shared/images/svg/objects/TableOfContentsSvg';\n\nimport styles from './calendar-nav.module.scss';\n\nconst namespace = 'specialEventCalendar.calendarNav';\n\ninterface CalendarNavProps extends React.PropsWithChildren {\n monthDate: Date;\n appLinks: CalendarAppLinks;\n viewMode?: CalendarViewMode;\n queryParams?: HashObject;\n setViewingMonthDate: (date?: Date) => void;\n setViewMode?: (viewMode: CalendarViewMode) => void;\n}\n\ninterface ViewModeSwitcherProps {\n viewMode: CalendarViewMode;\n setViewMode?: (viewMode: CalendarViewMode) => void;\n}\n\nfunction ViewModeSwitcher(props: ViewModeSwitcherProps): JSX.Element {\n return (\n <div className={`${styles.viewModeContainer} d-none d-lg-block`}>\n <IconButton\n svg={CalendarSvg}\n className={`${props.viewMode === 'calendar' ? 'bg-dark text-white' : ''} btn btn-outline-dark rounded-start rounded-end-0 border-end-0 px-3 h-100`}\n onClick={() => props.setViewMode('calendar')}\n analyticsData={{}}\n analyticsOptions={{\n entity: EntityType.AppLink,\n actionType: UserAction.Click,\n descriptor: CalendarDisplayModeDescriptor.Calendar,\n location: LocationContext.CalendarNav\n }}\n />\n <IconButton\n svg={TableOfContentsSvg}\n className={`${props.viewMode === 'list' ? 'bg-dark text-white' : ''} btn btn-outline-dark rounded-end rounded-start-0 border-start-0 px-3 h-100`}\n onClick={() => props.setViewMode('list')}\n analyticsData={{}}\n analyticsOptions={{\n entity: EntityType.AppLink,\n actionType: UserAction.Click,\n descriptor: CalendarDisplayModeDescriptor.List,\n location: LocationContext.CalendarNav\n }}\n />\n </div>\n );\n}\n\ninterface NavigateButtonProps {\n action: 'next' | 'previous';\n appLink?: Core.AppLink;\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n onClick: () => void;\n}\n\nfunction NavigateButton(props: NavigateButtonProps): JSX.Element {\n const arrowSvg = props.action === 'previous' ? ChevronLeftSvg : ChevronRightSvg;\n const className = props.action === 'previous' ? styles.left : styles.right;\n\n function onClick() {\n Core.AppLinkHelper.trigger(props.appLink);\n\n props.onClick();\n }\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n className={`${styles.chevron} ${className} border border-dark rounded-circle bg-white d-flex align-items-center justify-content-center`}\n onClick={onClick}\n >\n <SvgContainer\n svg={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.svg}`}\n />\n </AppLink>\n );\n}\n\nconst CUR_DATE = new Date();\n\nexport function CalendarNav(props: CalendarNavProps): JSX.Element {\n const { appLinks } = props;\n\n const breakpoints = useBreakpoints();\n \n function getAppLink(monthDate?: Date): Core.AppLink {\n const month = DateHelper.format(monthDate, 'MMMM').toLocaleLowerCase();\n\n const appLink: Core.AppLink = appLinks.month(month);\n\n const params: HashObject = {};\n\n if (monthDate) {\n const currentYear = new Date().getFullYear();\n const year = monthDate.getFullYear();\n \n if (currentYear !== year)\n params.year = year;\n }\n\n if (props.queryParams?.classification)\n params.classification = props.queryParams.classification;\n\n if (props.queryParams?.yearGroup)\n params.yearGroup = props.queryParams.yearGroup;\n\n appLink.params = params;\n\n return appLink;\n }\n\n function onClickNext () {\n const nextMonth = DateHelper.add(props.monthDate, 1, 'month');\n props.setViewingMonthDate(nextMonth);\n }\n\n function onClickPrevious() {\n const prevMonth = DateHelper.subtract(props.monthDate, 1, 'month');\n props.setViewingMonthDate(prevMonth);\n }\n\n function onClickToday() {\n if (DateHelper.format(CUR_DATE, 'M YY') === DateHelper.format(props.monthDate, 'M YY')) return;\n \n props.setViewingMonthDate();\n }\n \n const { showPrev, showNext } = canNavToOtherMonths(props.monthDate);\n\n const analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.SpecialEvent,\n location: LocationContext.CalendarNav\n };\n\n function formatAnalyticDataDate(date: Date) {\n return DateHelper.format(date, 'YYYY-MM-DD');\n }\n return (\n <div className='d-flex flex-wrap gap-3 justify-content-end align-items-center'>\n <h1 className='mb-0 h2 me-auto'>{DateHelper.format(props.monthDate, breakpoints.xs ? 'MMM YYYY' : 'MMMM YYYY')}</h1>\n\n {props.children}\n\n {props.setViewMode && (\n <ViewModeSwitcher viewMode={props.viewMode} setViewMode={props.setViewMode} />\n )}\n <div className='d-flex gap-3'>\n {showPrev && (\n <NavigateButton\n appLink={getAppLink(DateHelper.startOf(DateHelper.subtract(props.monthDate, 1, 'month'), 'month'))}\n action='previous'\n onClick={onClickPrevious}\n analyticsOptions={analyticsOptions}\n analyticsData={{ action: 'previous', date: formatAnalyticDataDate(DateHelper.startOf(DateHelper.add(props.monthDate, 1, 'month'), 'month')) }}\n />\n )}\n <AppLink\n appLink={getAppLink()}className={`${styles.todayWrapper} btn btn-outline-dark fw-semibold`}\n onClick={onClickToday}\n analyticsOptions={analyticsOptions}\n analyticsData={{ action: 'today', date: formatAnalyticDataDate(DateHelper.startOf(CUR_DATE, 'month')) }}\n >\n {LanguageService.getPhrase(namespace, 'today')}\n </AppLink>\n {showNext && (\n <NavigateButton\n appLink={getAppLink(DateHelper.startOf(DateHelper.add(props.monthDate, 1, 'month'), 'month'))}\n analyticsOptions={analyticsOptions}\n analyticsData={{ action: 'next', date: formatAnalyticDataDate(DateHelper.startOf(DateHelper.add(props.monthDate, 1, 'month'), 'month')) }}\n action='next'\n onClick={onClickNext}\n />\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'specialEvent.eventsErrorState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SpecialEventErrorStateProps {\n imageUrl: string;\n appLink: Core.AppLink;\n}\n\nexport function SpecialEventErrorState(props: SpecialEventErrorStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} />\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='info' />\n <br/>\n <AppLink appLink={props.appLink}>\n <span className='text-info'>{getPhrase('link')}</span>\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarAppLinks } from 'libs/shared/apps/calendar/interfaces/CalendarAppLinks';\n\nimport { buildWeeksTable, DatePositionMap, initWeekDays, PatchedDate, WeeksTable } from '../utils/CalendarHelper';\n\ntype Cache = Record<string, {\n datePositionMap: DatePositionMap,\n weeksTable: WeeksTable\n }>\n\nconst TODAY_DATE = new Date();\n\nexport function useCalendarWeeksTable(date: Date = TODAY_DATE, appLinks: CalendarAppLinks, startAtMon: boolean = true) {\n const weekDaysHeader = initWeekDays(startAtMon);\n\n const cacheRef = React.useRef<Cache>({});\n\n const [ weekDays, setWeekDays ] = React.useState<PatchedDate[][]>([]);\n const monthDateString = DateHelper.format(date, 'YYYY-MM');\n React.useEffect(() => {\n const cached = cacheRef.current[monthDateString];\n if (!cached) {\n const { weeksTable, datePositionMap } = buildWeeksTable(date, startAtMon);\n \n cacheRef.current[monthDateString] = { weeksTable, datePositionMap };\n\n setWeekDays(weeksTable);\n } else {\n setWeekDays(cached.weeksTable);\n }\n }, [DateHelper.format(date, 'YYYY-MM')]);\n\n function setViewingMonthDate(nextMonthDate?: Date) {\n if (!nextMonthDate) {\n Core.AppLinkHelper.trigger(appLinks.calendar());\n\n return;\n }\n\n if (monthDateString !== DateHelper.format(nextMonthDate, 'YYYY-MM')) {\n const month = DateHelper.format(nextMonthDate, 'MMMM').toLocaleLowerCase();\n\n const currentYear = new Date().getFullYear();\n const year = date.getFullYear();\n\n const appLink: Core.AppLink = appLinks.month(month);\n\n if (currentYear !== year)\n appLink.params = { year };\n\n Core.AppLinkHelper.trigger(appLink);\n }\n }\n\n const startDate = ArrayHelper.first(ArrayHelper.first(weekDays));\n const endDate = ArrayHelper.last(ArrayHelper.last(weekDays));\n\n return { weekDaysHeader, weekDays, monthDate: date, setMonthDate: setViewingMonthDate, startDate, endDate };\n}","import { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { getCalendarRange } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { CalendarEvent } from 'libs/shared/interfaces';\n\nimport { LivestreamRequests } from 'shared/flight-requests/LivestreamRequests';\n\nexport function useCalendarEventsData(viewMonth: Date, queryParams?: HashObject) {\n const [ startDate, endDate ] = getCalendarRange(viewMonth);\n\n const nextMonth = DateHelper.add(viewMonth, 1, 'month');\n const [ nextStartDate, nextEndDate ] = getCalendarRange(nextMonth);\n\n const prevMonth = DateHelper.subtract(viewMonth, 1, 'month');\n const [ prevStartDate, prevEndDate ] = getCalendarRange(prevMonth);\n\n const filters: HashObject = {};\n\n if (queryParams.yearGroup)\n filters.audienceId = queryParams.yearGroup;\n\n if (queryParams.classification) {\n filters.topicId = queryParams.classification;\n filters.includeChildrenTopics = true;\n }\n\n const events = Flight.useBasicFetch<CalendarEvent[]>((startDate && endDate)\n && LivestreamRequests.calendarLivestreams({\n from: DateHelper.format(startDate, 'YYYY-MM-DD'),\n to: DateHelper.format(endDate, 'YYYY-MM-DD'),\n ...filters\n }));\n \n const nextEvents = Flight.useBasicFetch<CalendarEvent[]>((nextStartDate && nextEndDate)\n && LivestreamRequests.calendarLivestreams({\n from: DateHelper.format(nextStartDate, 'YYYY-MM-DD'),\n to: DateHelper.format(nextEndDate, 'YYYY-MM-DD'),\n ...filters\n }));\n\n const prevEvents = Flight.useBasicFetch<CalendarEvent[]>((prevStartDate && prevEndDate)\n && LivestreamRequests.calendarLivestreams({\n from: DateHelper.format(prevStartDate, 'YYYY-MM-DD'),\n to: DateHelper.format(prevEndDate, 'YYYY-MM-DD'),\n ...filters\n }));\n\n const uniqueEventList = ArrayHelper.uniq(\n [ ...prevEvents.data || [], ...events.data || [], ...nextEvents.data || [] ],\n e => e.id\n );\n\n return { events: uniqueEventList, loaded: events.hasCompleted };\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { CalendarBody } from 'libs/shared/apps/calendar/components/calendar-body/CalendarBody';\nimport { CalendarNav } from 'libs/shared/apps/calendar/components/calendar-nav/CalendarNav';\nimport { SpecialEventErrorState } from 'libs/shared/apps/calendar/components/error-state/SpecialEventErrorState';\nimport { useCalendarWeeksTable } from 'libs/shared/apps/calendar/hooks/useCalendarWeeksTable';\nimport { CalendarQueryParams } from 'libs/shared/apps/calendar/interfaces/CalendarQueryParams';\nimport { CalendarViewMode } from 'libs/shared/apps/calendar/interfaces/CalendarViewMode';\nimport { getIsValidMonth, parseMonthString } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchFilter, TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { StreamableHeader } from 'libs/shared/apps/streamable-learning/components/header/StreamableHeader';\nimport { TimezoneIndicator } from 'libs/shared/apps/streamable-learning/components/timezone-indicator/TimezoneIndicator';\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Livestream, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\nimport { SeoHelper } from 'shared/utils/StreamableSeoHelper';\n\nimport { useCalendarEventsData } from 'apps/calendar/hooks/useCalendarEventsData';\nimport { CalendarUtils } from 'apps/calendar/utils/CalendarUtils';\nimport { getCalendarAppLinks, getCalendarImageUrls } from 'apps/calendar/views/calendar-view/CalendarViewUtils';\nimport { getStreamableHeaderAppLinks } from 'apps/dashboard/views/dashboard/DiscoverViewUtils';\n\nconst namespace = 'livestreamCalendar.calendarView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ViewModelViewModel {\n viewMode: CalendarViewMode;\n}\n\n\n/**\n * NOTE: Ensure any keys added here are also added\n * to sanitizePlayViewParams below.\n */\ninterface StreamableCalendarQueryParams extends CalendarQueryParams {\n classification?: string;\n yearGroup?: string;\n}\n\nexport function sanitizeCalendarViewParams(queryParams: StreamableCalendarQueryParams): StreamableCalendarQueryParams {\n if (!queryParams)\n return {};\n\n return ObjectHelper.pick(queryParams, [\n 'year',\n 'classification',\n 'yearGroup'\n ]);\n}\n\nCalendarView.defaultProps = {\n queryParams: {}\n};\n\nexport interface CalendarViewProps {\n month?: string\n queryParams?: StreamableCalendarQueryParams;\n}\n\nexport function CalendarView(props: CalendarViewProps): JSX.Element {\n const [{ viewMode }, setMode ] = useViewModel<ViewModelViewModel>('calendar:mode', { viewMode: 'calendar' }, {\n storage: StorageType.LocalStorage\n });\n\n const { hasPermissions } = usePermissions();\n const isStudent = hasPermissions(PermissionName.StudentExperience);\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(presentation.data &&\n AudienceRequests.presentationAudiences(presentation.data.id, PresentationType.StreamableLearning));\n\n const availableTopics = Flight.useBasicFetch<TopicResults>(presentation.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations([presentation.data.id]));\n\n const isValidMonth = getIsValidMonth(props.month);\n\n const viewingMonth = parseMonthString(props.month);\n \n const {\n monthDate,\n setMonthDate,\n weekDays,\n weekDaysHeader,\n startDate,\n endDate\n } = useCalendarWeeksTable(viewingMonth, getCalendarAppLinks());\n\n const { events, loaded } = useCalendarEventsData(viewingMonth, props.queryParams);\n const currentMonthYear = DateHelper.format(monthDate, 'MMMM YYYY');\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: currentMonthYear,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink<keyof CalendarQueryParams>({ allowedParams: ['year']}),\n allowIndexing: true,\n product: StreamableConstants.PRODUCT_NAME\n }));\n\n if (props.month !== null && !isValidMonth) {\n return (\n <SpecialEventErrorState\n imageUrl={getCalendarImageUrls().errorState}\n appLink={getStreamableHeaderAppLinks().calendar}\n />\n );\n }\n\n const mainFilters: SearchFilter<string>[] = [\n {\n id: 'classification',\n name: getPhrase('subjectFilter'),\n options: availableTopics.data?.topics.map(t => ({ name: t.name, id: t.topicIds.join(':') })),\n type: 'checkbox',\n compatibleIndices: []\n },\n {\n id: 'yearGroup',\n name: getPhrase('gradeFilter'),\n type: 'checkbox',\n options: audiences.data?.map(a => ({ name: a.name, id: a.masterId })),\n compatibleIndices: []\n }\n ];\n\n function getAppLink(): Core.AppLink {\n const month = DateHelper.format(monthDate, 'MMMM').toLocaleLowerCase();\n\n const currentYear = new Date().getFullYear();\n const year = monthDate.getFullYear();\n\n const appLink: Core.AppLink = getCalendarAppLinks().month(month);\n\n const params: HashObject = {};\n\n if (currentYear !== year)\n params.year = year;\n\n if (props.queryParams.classification)\n params.classification = props.queryParams.classification;\n\n if (props.queryParams.yearGroup)\n params.yearGroup = props.queryParams.yearGroup;\n\n return appLink;\n }\n\n function getActionLabel(livestream: Livestream): string {\n return isStudent || DateHelper.isBefore(livestream.endDateTime, new Date()) ? 'pastActionLabel' : 'actionLabel';\n }\n\n function getEmptyStateHeading(): string {\n const eventsInMonth = SpecialEventHelper.getEventsInMonth(events || [], viewingMonth);\n\n if (!eventsInMonth.length && (props.queryParams.yearGroup || props.queryParams.classification))\n return getPhrase('emptyStateText');\n }\n\n function getIconUrl(content: Livestream) {\n return ImageHelper.createUrl(content.company.logo?.url, { size: ImageSize.Small });\n }\n\n function getBannerUrl(content: Livestream) {\n return ImageHelper.createUrl(content.company.banner?.url, { size: ImageSize.Large });\n }\n\n return (\n <div className='bg-white px-4'>\n <StreamableHeader\n appLinks={getStreamableHeaderAppLinks()}\n active='calendar'\n />\n\n <CalendarNav\n monthDate={monthDate}\n setViewingMonthDate={setMonthDate}\n appLinks={getCalendarAppLinks()}\n queryParams={props.queryParams}\n viewMode={viewMode}\n setViewMode={(viewMode: CalendarViewMode) => setMode({ viewMode })}\n >\n <div className='mx-n1 order-1 order-sm-0'>\n <SearchFilters\n queryParams={ObjectHelper.omit(props.queryParams, ['year'])}\n mainFilters={mainFilters}\n appLink={getAppLink()}\n isFetchingOptions={!availableTopics.data || !presentation.data || !audiences.data}\n alignResetButtonLeft\n hideDivider\n hideHeading\n hideCaret={false}\n />\n </div>\n </CalendarNav>\n <div className={`position-relative mt-3 ${viewMode === 'list' ? '' : 'mt-lg-0'}`}>\n <div className={`d-block ${viewMode === 'list' ? '' : 'd-lg-none'} position-absolute top-0 end-0 mt-2`}>\n <TimezoneIndicator />\n </div>\n <CalendarBody\n weekDays={weekDays}\n weekDaysHeader={weekDaysHeader}\n events={events}\n monthQuery={{ from: startDate?.toString(), to: endDate?.toString() }}\n viewingMonth={viewingMonth}\n eventsLoaded={loaded}\n presentationId={presentation.data?.id}\n appLinks={getCalendarAppLinks()}\n imageUrls={getCalendarImageUrls()}\n viewMode={viewMode}\n getActionLabel={livestream => getPhrase(getActionLabel(livestream as Livestream))}\n getBackgroundColor={(content: Livestream) => content.company.metadata?.colour}\n getBannerUrl={getBannerUrl}\n getIconUrl={getIconUrl}\n getStartTime={CalendarUtils.getStartTime}\n theme={{\n background: 'bg-light-green',\n border: 'border-light-green'\n }}\n emptyStateHeading={getEmptyStateHeading()}\n fadePastEvents\n timezone={Timezone.ET}\n isPastEvent={CalendarUtils.isPastEvent}\n />\n </div>\n </div>\n );\n}"],"names":["getIsWeekend","date","DateHelper","CalendarCell","props","notCurrentMonth","sliderStep","setSliderStep","React","wrapperClassname","styles","eventsOnDay","_a","e","updatedProps","jsx","HoverToPortalContainer","CalendarDay","namespace","getPhrase","LanguageService","SpecialEventEmptyState","LanguageNamespaceContext","EmptyState","Text","jsxs","Fragment","AppLink","SpecialEventList","eventsInMonth","startDate","keys","a","b","k","idx","prevTime","currentTime","SpecialEventHelper","SpecialEventListItem","id","name","TextHelper","CalendarBody","appLinks","imageUrls","breakpoints","useBreakpoints","hasInitialized","setHasInitialized","hoveredEvent","setHoveredEvent","Spinner","w","calendarEventContent","slug","CALENDAR_START_DATE","NEXT_MONTH_LIMIT","getDaysOfMonth","numberOfDays","daysArray","day","getPreviousMonthOverlappingDays","startAtMon","firstDay","firstWeekDay","prevMonthDays","prevMonthDaysCount","i","originalDay","preDay","getNextMonthOverlappingDays","lastDay","lastWeekDay","nextMonthDays","nextMonthDaysCount","nextDay","initWeekDays","weekdays","buildWeeksTable","weeksTable","datePositionMap","monthDays","j","rowId","week","colId","getFirstDateInCalendar","monthDate","firstDayOfMonth","ArrayHelper","getLastDateInCalendar","lastDayOfMonth","getCalendarRange","capitalizeMonthString","monthStr","getIsValidMonth","monthDateString","capitalized","CUR_DATE","canNavToOtherMonths","monthDiff","showPrev","showNext","parseMonthString","ViewModeSwitcher","IconButton","CalendarSvg","EntityType","UserAction","CalendarDisplayModeDescriptor","LocationContext","TableOfContentsSvg","NavigateButton","arrowSvg","ChevronLeftSvg","ChevronRightSvg","className","onClick","Core.AppLinkHelper","SvgContainer","SvgContainerSize","CalendarNav","getAppLink","month","appLink","params","currentYear","year","_b","onClickNext","nextMonth","onClickPrevious","prevMonth","onClickToday","analyticsOptions","formatAnalyticDataDate","SpecialEventErrorState","TODAY_DATE","useCalendarWeeksTable","weekDaysHeader","cacheRef","weekDays","setWeekDays","cached","setViewingMonthDate","nextMonthDate","endDate","useCalendarEventsData","viewMonth","queryParams","nextStartDate","nextEndDate","prevStartDate","prevEndDate","filters","events","Flight.useBasicFetch","LivestreamRequests","nextEvents","prevEvents","sanitizeCalendarViewParams","ObjectHelper","CalendarView","viewMode","setMode","useViewModel","StorageType","hasPermissions","usePermissions","isStudent","PermissionName","presentation","PresentationRequests","audiences","AudienceRequests","PresentationType","availableTopics","ClassificationRequests","isValidMonth","viewingMonth","setMonthDate","getCalendarAppLinks","loaded","currentMonthYear","useSetPageMetadata","PageMetadataHelper","SeoHelper","StreamableConstants","getCalendarImageUrls","getStreamableHeaderAppLinks","mainFilters","t","getActionLabel","livestream","getEmptyStateHeading","getIconUrl","content","ImageHelper","ImageSize","getBannerUrl","StreamableHeader","SearchFilters","TimezoneIndicator","_c","CalendarUtils","Timezone"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{de as v,ai as G,as as c,df as x,dd as S}from"./app-DiXzpOyg.js";S.Ok;function H(u,a,b){function l(e){if(e)return c.isFunction(a)?[...a(e)]:[...e.data]}function d(e){var n,o;if(e)return(o=(n=e.pagination)==null?void 0:n.cursors)==null?void 0:o.next}function g(e){if(e)return e==null?void 0:e.count}return v(G.useMemo(()=>e=>{if(!c.isFunction(u))return;const n=u,o=c.isFunction(u)&&n();let t=o&&x(e,o),i=t&&t.isFetching,f=t&&t.statusCode,r=t&&t.hasCompleted;const I=r,k=t&&t.shouldFetch,h=l(t&&t.data);let s=d(t&&t.data);const m=g(t&&t.data);for(;s&&(t=x(e,n(s)),i=i||t.isFetching,f=t.statusCode,r=t.hasCompleted,!t.shouldFetch);){const F=l(t.data);F&&h.push(...F);const p=d(t.data);p===s?s=null:s=p}const C={shouldInitialFetch:k,items:h,nextCursor:s,isFetching:i,statusCode:f,hasCompleted:r,hasFirstPageCompleted:I};return typeof m=="number"&&(C.totalItems=m),C},[u]))}export{H as u};
|
|
2
|
+
//# sourceMappingURL=B928Y1m-.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"B928Y1m-.chunk.js","sources":["../../../../libs/shared/src/hooks/UseSelectAllPages.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\nimport { ApplicationState } from 'libs/common/react/interfaces';\n\nimport { BasePaginatedCollection } from 'libs/shared/interfaces';\n\nexport interface SelectAllPagesResult<T> {\n items: T[];\n shouldInitialFetch: boolean;\n nextCursor: string;\n isFetching: boolean;\n statusCode: HttpStatus;\n hasCompleted: boolean;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\nexport const EmptySelectAllPagesResult: SelectAllPagesResult<any> = {\n items: [],\n shouldInitialFetch: false,\n nextCursor: null,\n isFetching: false,\n statusCode: HttpStatus.Ok,\n hasCompleted: true,\n totalItems: 0,\n hasFirstPageCompleted: true\n};\n\n/**\n * Hook to select all pages of a collection from the store and flatten them.\n * It will not trigger any fetches.\n * \n * @param getKey - callback function to get the key for each page.\n * Can be false if the key requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useSelectAllPages<TObject, TResponse = BasePaginatedCollection<TObject>>(\n getKey: ((cursor?: string) => string) | false,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string\n): SelectAllPagesResult<TObject> {\n function safeGetItems(responseData: TResponse): TObject[] {\n if (!responseData)\n return undefined;\n\n if (FunctionHelper.isFunction(getItems))\n return [...getItems(responseData)];\n\n return [...(responseData as unknown as BasePaginatedCollection<TObject>).data];\n }\n\n function safeGetCursor(responseData: TResponse): string {\n if (!responseData)\n return undefined;\n\n if (getCursor)\n return getCursor(responseData);\n\n return (responseData as unknown as BasePaginatedCollection<TObject>).pagination?.cursors?.next;\n }\n\n function safeGetTotalItems(responseData: TResponse): number {\n if (!responseData)\n return undefined;\n\n return (responseData as unknown as BasePaginatedCollection<TObject>)?.count;\n }\n\n return useSelector(useMemo(() => (state: ApplicationState) => {\n if (!FunctionHelper.isFunction(getKey))\n return;\n\n const getKeyFn = getKey as (cursor?: string) => string;\n const key = FunctionHelper.isFunction(getKey) && getKeyFn();\n\n let request = key && Flight.getResponse<TResponse>(state, key);\n\n let isFetching = request && request.isFetching;\n let statusCode = request && request.statusCode;\n let hasCompleted = request && request.hasCompleted;\n const hasFirstPageCompleted = hasCompleted;\n\n const shouldInitialFetch = request && request.shouldFetch;\n\n const items = safeGetItems(request && request.data);\n let nextCursor = safeGetCursor(request && request.data);\n const totalItems = safeGetTotalItems(request && request.data);\n\n // Retrieve all pages that are currently in the store.\n while (nextCursor) {\n request = Flight.getResponse<TResponse>(state, getKeyFn(nextCursor));\n\n isFetching = isFetching || request.isFetching;\n statusCode = request.statusCode;\n hasCompleted = request.hasCompleted;\n\n // If next page hasn't been fetched, break.\n if (request.shouldFetch)\n break;\n\n const newItems = safeGetItems(request.data);\n newItems && items.push(...newItems);\n\n const nextNextCursor = safeGetCursor(request.data);\n\n /**\n * This is a check to basically see if the backend has messed up the cursors it's sent back.\n * For some things (e.g. user manager in Lite), the cursors are generated for a paginated collection,\n * but the collection is then filtered afterwards (making the cursors not entirely accurate).\n * This can lead to problems where a request with a cursor might return that same cursor as the `next`\n * cursor. Confusing, but basically when that happens we want this while loop to end, otherwise it'll\n * run infinitely - Josh\n */\n if (nextNextCursor === nextCursor) {\n nextCursor = null;\n } else {\n nextCursor = nextNextCursor;\n }\n }\n\n const response: SelectAllPagesResult<TObject> = {\n shouldInitialFetch,\n items,\n nextCursor,\n isFetching,\n statusCode,\n hasCompleted,\n hasFirstPageCompleted\n };\n\n if (typeof (totalItems) === 'number')\n response.totalItems = totalItems;\n\n return response;\n }, [getKey]));\n}"],"names":["HttpStatus","useSelectAllPages","getKey","getItems","getCursor","safeGetItems","responseData","FunctionHelper","safeGetCursor","_b","_a","safeGetTotalItems","useSelector","useMemo","state","getKeyFn","key","request","Flight.getResponse","isFetching","statusCode","hasCompleted","hasFirstPageCompleted","shouldInitialFetch","items","nextCursor","totalItems","newItems","nextNextCursor","response"],"mappings":"uEA0BcA,EAAW,GAalB,SAASC,EACdC,EACAC,EACAC,EAC+B,CAC/B,SAASC,EAAaC,EAAoC,CACxD,GAAKA,EAGL,OAAIC,EAAe,WAAWJ,CAAQ,EAC7B,CAAC,GAAGA,EAASG,CAAY,CAAC,EAE5B,CAAC,GAAIA,EAA6D,IAAI,CAC/E,CAEA,SAASE,EAAcF,EAAiC,SACtD,GAAKA,EAML,OAAQG,GAAAC,EAAAJ,EAA6D,aAA7D,YAAAI,EAAyE,UAAzE,YAAAD,EAAkF,IAC5F,CAEA,SAASE,EAAkBL,EAAiC,CAC1D,GAAKA,EAGL,OAAQA,GAAA,YAAAA,EAA8D,KACxE,CAEA,OAAOM,EAAYC,EAAAA,QAAQ,IAAOC,GAA4B,CAC5D,GAAI,CAACP,EAAe,WAAWL,CAAM,EACnC,OAEF,MAAMa,EAAWb,EACXc,EAAMT,EAAe,WAAWL,CAAM,GAAKa,EAAA,EAEjD,IAAIE,EAAUD,GAAOE,EAA8BJ,EAAOE,CAAG,EAEzDG,EAAaF,GAAWA,EAAQ,WAChCG,EAAaH,GAAWA,EAAQ,WAChCI,EAAeJ,GAAWA,EAAQ,aACtC,MAAMK,EAAwBD,EAExBE,EAAqBN,GAAWA,EAAQ,YAExCO,EAAQnB,EAAaY,GAAWA,EAAQ,IAAI,EAClD,IAAIQ,EAAajB,EAAcS,GAAWA,EAAQ,IAAI,EACtD,MAAMS,EAAaf,EAAkBM,GAAWA,EAAQ,IAAI,EAG5D,KAAOQ,IACLR,EAAUC,EAA8BJ,EAAOC,EAASU,CAAU,CAAC,EAEnEN,EAAaA,GAAcF,EAAQ,WACnCG,EAAaH,EAAQ,WACrBI,EAAeJ,EAAQ,aAGnB,CAAAA,EAAQ,cARK,CAWjB,MAAMU,EAAWtB,EAAaY,EAAQ,IAAI,EAC1CU,GAAYH,EAAM,KAAK,GAAGG,CAAQ,EAElC,MAAMC,EAAiBpB,EAAcS,EAAQ,IAAI,EAU7CW,IAAmBH,EACrBA,EAAa,KAEbA,EAAaG,CAEjB,CAEA,MAAMC,EAA0C,CAC9C,mBAAAN,EACA,MAAAC,EACA,WAAAC,EACA,WAAAN,EACA,WAAAC,EACA,aAAAC,EACA,sBAAAC,CAAA,EAGF,OAAI,OAAQI,GAAgB,WAC1BG,EAAS,WAAaH,GAEjBG,CACT,EAAG,CAAC3B,CAAM,CAAC,CAAC,CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BBnDr_iy.chunk.js","sources":["../../../../libs/shared/src/constants/ColourClassNames.ts","../../../../libs/shared/src/utils/getBgColorClass.ts"],"sourcesContent":["/**\n * Use this instead of the list below if you need to render the clickview logo\n * on the background you're rendering.\n */\nexport const LOGO_SAFE_BG_CLASS_NAMES = [\n 'bg-green',\n 'bg-cyan',\n 'bg-teal',\n 'bg-blue',\n 'bg-indigo',\n 'bg-purple'\n];\n\nexport const BG_COLOUR_CLASS_NAMES = [\n 'bg-pink',\n 'bg-orange',\n ...LOGO_SAFE_BG_CLASS_NAMES\n];","export function getBgColorClass(name: string, classNames: string[]): string {\n return classNames[name.charCodeAt(0) % classNames.length];\n}\n\nexport function getDeterministicBgColorClass(name: string, classNames: string[]): string {\n const sum = name\n .split('')\n .reduce(\n (acc, char) => acc + char.charCodeAt(0),\n 0\n );\n \n return classNames[sum % classNames.length];\n}"],"names":["LOGO_SAFE_BG_CLASS_NAMES","BG_COLOUR_CLASS_NAMES","getBgColorClass","name","classNames"],"mappings":"AAIO,MAAMA,EAA2B,CACtC,WACA,UACA,UACA,UACA,YACA,WACF,EAEaC,EAAwB,CACnC,UACA,YACA,GAAGD,CACL,ECjBO,SAASE,EAAgBC,EAAcC,EAA8B,CAC1E,OAAOA,EAAWD,EAAK,WAAW,CAAC,EAAIC,EAAW,MAAM,CAC1D"}
|