@clickview/curator 1.100.0-rc.1 → 1.100.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/.vite/manifest.json +1779 -1779
- package/dist/Assets/js/dist/scripts/{CYhNyVj0.chunk.js → -6zuD8lo.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CYhNyVj0.chunk.js.map → -6zuD8lo.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{D28bEsam.chunk.js → 0A42jU2r.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{D28bEsam.chunk.js.map → 0A42jU2r.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{oYHUjbwb2.chunk.js → 0ogjGD4J2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{oYHUjbwb2.chunk.js.map → 0ogjGD4J2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{PeuFojmJ2.chunk.js → 2aCj1HHJ2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{PeuFojmJ2.chunk.js.map → 2aCj1HHJ2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{q7pjZoNd.chunk.js → 2zbtFQka.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{q7pjZoNd.chunk.js.map → 2zbtFQka.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{0S5J0xX22.chunk.js → 3IQ_8AZP2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{0S5J0xX22.chunk.js.map → 3IQ_8AZP2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DvP7S5Uq.chunk.js → 3eMwLZ5D.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DvP7S5Uq.chunk.js.map → 3eMwLZ5D.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{y1L3G7XA2.chunk.js → 4Tx2JSvk2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{y1L3G7XA2.chunk.js.map → 4Tx2JSvk2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BbR7yW4A2.chunk.js → 5uVJfyDx2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BbR7yW4A2.chunk.js.map → 5uVJfyDx2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B52yjTo5.chunk.js → 6l2s6d3Q.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B52yjTo5.chunk.js.map → 6l2s6d3Q.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DezIbRcB2.chunk.js → 8RAh0VA72.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DezIbRcB2.chunk.js.map → 8RAh0VA72.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CixcMUHF.chunk.js → 9nk_zFtT.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CixcMUHF.chunk.js.map → 9nk_zFtT.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Bk9vy70e2.chunk.js → Ae4rMqFm2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Bk9vy70e2.chunk.js.map → Ae4rMqFm2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Bzh_AwaG.chunk.js → B0mCquXn.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Bzh_AwaG.chunk.js.map → B0mCquXn.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/B1pBJzjh.chunk.js +1 -0
- package/dist/Assets/js/dist/scripts/{BswFY0mR2.chunk.js → B6IinlWw2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BswFY0mR2.chunk.js.map → B6IinlWw2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{ClpIRgLR.chunk.js → B6NMAAhW.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{ClpIRgLR.chunk.js.map → B6NMAAhW.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BCMXlwdC2.chunk.js → B8RZKQTs2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BCMXlwdC2.chunk.js.map → B8RZKQTs2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CymdouaN.chunk.js → B9R92bqj.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CymdouaN.chunk.js.map → B9R92bqj.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CtVYDK7g.chunk.js → BAFYJZ4c.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CtVYDK7g.chunk.js.map → BAFYJZ4c.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{_wZpe632.chunk.js → BFPSIGJg.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{_wZpe632.chunk.js.map → BFPSIGJg.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BNHULwJy2.chunk.js → BGiLDtc92.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BNHULwJy2.chunk.js.map → BGiLDtc92.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DA9R8atp2.chunk.js → BH6LIpwu2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DA9R8atp2.chunk.js.map → BH6LIpwu2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DbrVjVdn.chunk.js → BMj3pXcm.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DbrVjVdn.chunk.js.map → BMj3pXcm.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CDvLjxwS.chunk.js → BQTfNBFU.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CDvLjxwS.chunk.js.map → BQTfNBFU.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{mStmtFRo.chunk.js → BT-jeT7C.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{mStmtFRo.chunk.js.map → BT-jeT7C.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{FlF2O19P2.chunk.js → BUD4osIg2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{FlF2O19P2.chunk.js.map → BUD4osIg2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DWS9yr24.chunk.js → BVoG71Kc.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DWS9yr24.chunk.js.map → BVoG71Kc.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B9tf3oT62.chunk.js → BW5iVK1B2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B9tf3oT62.chunk.js.map → BW5iVK1B2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{C2mEE4FT.chunk.js → BW9r-3iO.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{C2mEE4FT.chunk.js.map → BW9r-3iO.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Dpgqkqbp.chunk.js → BX1tMzoa.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Dpgqkqbp.chunk.js.map → BX1tMzoa.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DVRzbAn6.chunk.js → BXaC-l33.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DVRzbAn6.chunk.js.map → BXaC-l33.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BaR7D4NT2.chunk.js → BY-c3M2b2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BaR7D4NT2.chunk.js.map → BY-c3M2b2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CJpVJtZk.chunk.js → BYMuPFbe.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CJpVJtZk.chunk.js.map → BYMuPFbe.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{C5INFWaM2.chunk.js → BaOAOuSc2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{C5INFWaM2.chunk.js.map → BaOAOuSc2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{wAWlO6hc.chunk.js → Bb_f3Lku.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{wAWlO6hc.chunk.js.map → Bb_f3Lku.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BLJO44vl.chunk.js → BdJYoUIO.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BLJO44vl.chunk.js.map → BdJYoUIO.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CW2k5Ut-2.chunk.js → Bf-6iyfX2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CW2k5Ut-2.chunk.js.map → Bf-6iyfX2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DxL0ZEcN2.chunk.js → BiPUuGEE2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DxL0ZEcN2.chunk.js.map → BiPUuGEE2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{2XS-c0Xo.chunk.js → Bj4-NRWf.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{2XS-c0Xo.chunk.js.map → Bj4-NRWf.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{D13ViJt82.chunk.js → BkVcraos2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{D13ViJt82.chunk.js.map → BkVcraos2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{U1L4Dfoc.chunk.js → BkZ7WS_H.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{U1L4Dfoc.chunk.js.map → BkZ7WS_H.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DoQiTqRX2.chunk.js → BoMt5mMW2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DoQiTqRX2.chunk.js.map → BoMt5mMW2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Da_9BBKD2.chunk.js → Bo_WsHZq2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Da_9BBKD2.chunk.js.map → Bo_WsHZq2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CnyrKBG0.chunk.js → BpV5ErII.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CnyrKBG0.chunk.js.map → BpV5ErII.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Dfhl7nI62.chunk.js → BrBPGjLi2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Dfhl7nI62.chunk.js.map → BrBPGjLi2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DcxGcCkR.chunk.js → BrHyZG_m.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DcxGcCkR.chunk.js.map → BrHyZG_m.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{FXPxauLF.chunk.js → Bu4F3uuX.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{FXPxauLF.chunk.js.map → Bu4F3uuX.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DZdJx-7j.chunk.js → BvW9SXzy.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DZdJx-7j.chunk.js.map → BvW9SXzy.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CAU0Lbgd.chunk.js → BwKHls91.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CAU0Lbgd.chunk.js.map → BwKHls91.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BiTzUyxj2.chunk.js → BxZNJjbX2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BiTzUyxj2.chunk.js.map → BxZNJjbX2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{cymXuIcM.chunk.js → BygVW5WL.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{cymXuIcM.chunk.js.map → BygVW5WL.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Dx07A6Ct.chunk.js → ByzsHBuo.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Dx07A6Ct.chunk.js.map → ByzsHBuo.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/C-M2om56.chunk.js +3 -0
- package/dist/Assets/js/dist/scripts/C-M2om56.chunk.js.map +1 -0
- package/dist/Assets/js/dist/scripts/{B6dlmRQL.chunk.js → C0UYMHUe.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B6dlmRQL.chunk.js.map → C0UYMHUe.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{V0N7tCBl.chunk.js → C0_pEFCD.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{V0N7tCBl.chunk.js.map → C0_pEFCD.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Cpr1J8Rk2.chunk.js → C2jRLu4_2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Cpr1J8Rk2.chunk.js.map → C2jRLu4_2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CY56FWb9.chunk.js → C2tBl3l9.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CY56FWb9.chunk.js.map → C2tBl3l9.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{C3Lx9PwR.chunk.js → C4eazpDh.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{C3Lx9PwR.chunk.js.map → C4eazpDh.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{puobgAYi.chunk.js → CBq4vrjT.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{puobgAYi.chunk.js.map → CBq4vrjT.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Bcx1C8ae.chunk.js → CBzqRw-k.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Bcx1C8ae.chunk.js.map → CBzqRw-k.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BD6DIPGL2.chunk.js → CDAdfAL02.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BD6DIPGL2.chunk.js.map → CDAdfAL02.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Ddp1uNfH.chunk.js → CE1Dxq8p.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Ddp1uNfH.chunk.js.map → CE1Dxq8p.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{C99MPG7E.chunk.js → CG2julEA.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{C99MPG7E.chunk.js.map → CG2julEA.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{tyY3GHEC2.chunk.js → CGcN4g0d2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{tyY3GHEC2.chunk.js.map → CGcN4g0d2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{wODD7tmB2.chunk.js → CJmV_FfR2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{wODD7tmB2.chunk.js.map → CJmV_FfR2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DavA1dZZ.chunk.js → CKvVGIRL.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DavA1dZZ.chunk.js.map → CKvVGIRL.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CrndJnZp.chunk.js → CL1DcbTZ.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CrndJnZp.chunk.js.map → CL1DcbTZ.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DLLL2lwS.chunk.js → CNLx6_fS.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DLLL2lwS.chunk.js.map → CNLx6_fS.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{w2lackHw.chunk.js → CNUVs80P.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{w2lackHw.chunk.js.map → CNUVs80P.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CCzvD0H4.chunk.js → CPa__SNX.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CCzvD0H4.chunk.js.map → CPa__SNX.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DeDh-wVP.chunk.js → CSA2Tnv9.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DeDh-wVP.chunk.js.map → CSA2Tnv9.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CjZJx6-O2.chunk.js → CT-xEpNT2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CjZJx6-O2.chunk.js.map → CT-xEpNT2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BRPP3VZ1.chunk.js → CT0vfLa0.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BRPP3VZ1.chunk.js.map → CT0vfLa0.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DGjNB2Bz.chunk.js → CUDnXypB.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DGjNB2Bz.chunk.js.map → CUDnXypB.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{cXanUGwK.chunk.js → CeMQZB5J.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{cXanUGwK.chunk.js.map → CeMQZB5J.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/Cf5cjLzK.chunk.js +2 -0
- package/dist/Assets/js/dist/scripts/{D2iK_uRt.chunk.js.map → Cf5cjLzK.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CRNBuqmR.chunk.js → CfGaxIgd.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CRNBuqmR.chunk.js.map → CfGaxIgd.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BNr7ZL3F2.chunk.js → Cqfub35W2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BNr7ZL3F2.chunk.js.map → Cqfub35W2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DRmwJ1it2.chunk.js → Cv8UpP5_2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DRmwJ1it2.chunk.js.map → Cv8UpP5_2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DOfeXfSj.chunk.js → CvV6jx2d.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DOfeXfSj.chunk.js.map → CvV6jx2d.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DnGnhqys.chunk.js → CxENQntH.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DnGnhqys.chunk.js.map → CxENQntH.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{NMDkdR-8.chunk.js → CxIfJCSc.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{NMDkdR-8.chunk.js.map → CxIfJCSc.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B9H-d-YC.chunk.js → CxggKQxV.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B9H-d-YC.chunk.js.map → CxggKQxV.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B3I44IzQ.chunk.js → CyNNZ1So.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B3I44IzQ.chunk.js.map → CyNNZ1So.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B2V1N14S.chunk.js → Cz-WSyAE.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B2V1N14S.chunk.js.map → Cz-WSyAE.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{S9cTzcQc2.chunk.js → D2aQFJWt2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{S9cTzcQc2.chunk.js.map → D2aQFJWt2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CEsXUxxo2.chunk.js → D2h9W4GA2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CEsXUxxo2.chunk.js.map → D2h9W4GA2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DqCsVhOS.chunk.js → D3NAhMJm.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DqCsVhOS.chunk.js.map → D3NAhMJm.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DpM1KgHy.chunk.js → D3aWaqBW.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DpM1KgHy.chunk.js.map → D3aWaqBW.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CxtxOtyF2.chunk.js → D4xcR0492.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CxtxOtyF2.chunk.js.map → D4xcR0492.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BEeh_Vbr.chunk.js → D5ek2PiI.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BEeh_Vbr.chunk.js.map → D5ek2PiI.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DjqQYm43.chunk.js → D61ei_h6.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DjqQYm43.chunk.js.map → D61ei_h6.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{lgpeNdac.chunk.js → D6wyTufc.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{lgpeNdac.chunk.js.map → D6wyTufc.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B8li8ced.chunk.js → D7I90XOo.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B8li8ced.chunk.js.map → D7I90XOo.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DBAwgllB.chunk.js → DArfNv9S.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DBAwgllB.chunk.js.map → DArfNv9S.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B6uYrrzJ2.chunk.js → DB-51xws2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B6uYrrzJ2.chunk.js.map → DB-51xws2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{C-flCrUr.chunk.js → DENdEA1F.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{C-flCrUr.chunk.js.map → DENdEA1F.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BuF_pg9-2.chunk.js → DFYiLmms2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BuF_pg9-2.chunk.js.map → DFYiLmms2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BE6LUVEo2.chunk.js → DHa-x1js2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BE6LUVEo2.chunk.js.map → DHa-x1js2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DDHep0UM.chunk.js → DHeA2NJS.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DDHep0UM.chunk.js.map → DHeA2NJS.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{D5OaPA-v.chunk.js → DIDxfMO_.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{D5OaPA-v.chunk.js.map → DIDxfMO_.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CV7UIOmh2.chunk.js → DMq1wDNm2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CV7UIOmh2.chunk.js.map → DMq1wDNm2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{ByMU9ltp2.chunk.js → DNWM9yfh2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{ByMU9ltp2.chunk.js.map → DNWM9yfh2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DFwtjofq2.chunk.js → DSj7VCEo2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DFwtjofq2.chunk.js.map → DSj7VCEo2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BSYuzR8N2.chunk.js → DSvehN9D2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BSYuzR8N2.chunk.js.map → DSvehN9D2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{FS74_jrx.chunk.js → DTvCgZ4c.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{FS74_jrx.chunk.js.map → DTvCgZ4c.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{C7Gmh7eY.chunk.js → DWHKdmdQ.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{C7Gmh7eY.chunk.js.map → DWHKdmdQ.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DXcaOjI_.chunk.js → DYFGF9Pe.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DXcaOjI_.chunk.js.map → DYFGF9Pe.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CIw53qNO2.chunk.js → DYOxTenc2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CIw53qNO2.chunk.js.map → DYOxTenc2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CignflP_2.chunk.js → DZthp5T62.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CignflP_2.chunk.js.map → DZthp5T62.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BlqDwJRY.chunk.js → Djgwr16q.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BlqDwJRY.chunk.js.map → Djgwr16q.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BwToh2X9.chunk.js → DjnvbVQs.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BwToh2X9.chunk.js.map → DjnvbVQs.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{UelJUmgx2.chunk.js → DmrhyI9D2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{UelJUmgx2.chunk.js.map → DmrhyI9D2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{0KUhq7W7.chunk.js → DnZGILQc.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{0KUhq7W7.chunk.js.map → DnZGILQc.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BSPrErub.chunk.js → DqnZw1cj.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BSPrErub.chunk.js.map → DqnZw1cj.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Bkx2vKcX2.chunk.js → DrAKpy8L2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Bkx2vKcX2.chunk.js.map → DrAKpy8L2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DX9DFxX2.chunk.js → DsM1bfoR.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DX9DFxX2.chunk.js.map → DsM1bfoR.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Dh3G-ann.chunk.js → Dt2TCPUI.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Dh3G-ann.chunk.js.map → Dt2TCPUI.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DA6Ynhan.chunk.js → DtylOK55.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DA6Ynhan.chunk.js.map → DtylOK55.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CJBiVila2.chunk.js → DuTcsFNo2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CJBiVila2.chunk.js.map → DuTcsFNo2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BBFS0f7w.chunk.js → Dw0mo6Cf.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BBFS0f7w.chunk.js.map → Dw0mo6Cf.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Cg5KHpRA.chunk.js → DwISzabN.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Cg5KHpRA.chunk.js.map → DwISzabN.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DMxtE2iS.chunk.js → DxW67uUT.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DMxtE2iS.chunk.js.map → DxW67uUT.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BOGS-BOS.chunk.js → Eg4zYYCO.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BOGS-BOS.chunk.js.map → Eg4zYYCO.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CSuC7le7.chunk.js → GT6nO4Jv.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CSuC7le7.chunk.js.map → GT6nO4Jv.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BhKv6dKl2.chunk.js → GpDEun8c2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BhKv6dKl2.chunk.js.map → GpDEun8c2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DKJC5qg0.chunk.js → OKjYL31I.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DKJC5qg0.chunk.js.map → OKjYL31I.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{D8rrJ-jY2.chunk.js → OrCUhFjq2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{D8rrJ-jY2.chunk.js.map → OrCUhFjq2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{D3exV_Ay2.chunk.js → SVXAAhk02.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{D3exV_Ay2.chunk.js.map → SVXAAhk02.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CcZKy7SH.chunk.js → SmmnJrec.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CcZKy7SH.chunk.js.map → SmmnJrec.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Dy4nscVE2.chunk.js → T3BageSw2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Dy4nscVE2.chunk.js.map → T3BageSw2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B8PM5Ji3.chunk.js → T6xxjp_W.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B8PM5Ji3.chunk.js.map → T6xxjp_W.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Cp6Af16p.chunk.js → Uc2eW092.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Cp6Af16p.chunk.js.map → Uc2eW092.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DmKyGgLu.chunk.js → XHoEdG1q.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DmKyGgLu.chunk.js.map → XHoEdG1q.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BdVoyBI02.chunk.js → Y14NYZ692.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BdVoyBI02.chunk.js.map → Y14NYZ692.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DrszevCi.chunk.js → Y_IcNhI9.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DrszevCi.chunk.js.map → Y_IcNhI9.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CMGpVYHd.chunk.js → Yr5eNz05.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CMGpVYHd.chunk.js.map → Yr5eNz05.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{QnwProbJ2.chunk.js → Yrc9o6bG2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{QnwProbJ2.chunk.js.map → Yrc9o6bG2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{app-Dl-tzfIp.js → app-RphP4Ht0.js} +4 -4
- package/dist/Assets/js/dist/scripts/{app-Dl-tzfIp.js.map → app-RphP4Ht0.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B96Bwi2D.chunk.js → cUgHqo-u.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B96Bwi2D.chunk.js.map → cUgHqo-u.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{oGkpmMft2.chunk.js → dmUfJoJz2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{oGkpmMft2.chunk.js.map → dmUfJoJz2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DjlPflaG.chunk.js → fapHSEex.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DjlPflaG.chunk.js.map → fapHSEex.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CaEXONXp2.chunk.js → jf0e_ii92.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CaEXONXp2.chunk.js.map → jf0e_ii92.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Co7TevGA.chunk.js → kp4jXqVv.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Co7TevGA.chunk.js.map → kp4jXqVv.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/lAvSm0ti.chunk.js +2 -0
- package/dist/Assets/js/dist/scripts/lAvSm0ti.chunk.js.map +1 -0
- package/dist/Assets/js/dist/scripts/{Dmf5vYc42.chunk.js → n7lzp_Mc2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Dmf5vYc42.chunk.js.map → n7lzp_Mc2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CG9yCT4r2.chunk.js → nvtWO4PW2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CG9yCT4r2.chunk.js.map → nvtWO4PW2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CACu0hGi2.chunk.js → oYKM19q12.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CACu0hGi2.chunk.js.map → oYKM19q12.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B5v11U7g.chunk.js → ohTu1tHz.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B5v11U7g.chunk.js.map → ohTu1tHz.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BrT-onLe2.chunk.js → uCRnfBEw2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BrT-onLe2.chunk.js.map → uCRnfBEw2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{3XkTogZ22.chunk.js → udVWVmrH2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{3XkTogZ22.chunk.js.map → udVWVmrH2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DW-yUqjB2.chunk.js → v0VARBBE2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DW-yUqjB2.chunk.js.map → v0VARBBE2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{B4lIRWK22.chunk.js → vf9_5VGa2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{B4lIRWK22.chunk.js.map → vf9_5VGa2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{pOwOak4Z2.chunk.js → wTEWtWoE2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{pOwOak4Z2.chunk.js.map → wTEWtWoE2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DPYIBfGB.chunk.js → xj8_Pfx7.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DPYIBfGB.chunk.js.map → xj8_Pfx7.chunk.js.map} +1 -1
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/package.json +1 -1
- package/dist/Assets/js/dist/scripts/D2iK_uRt.chunk.js +0 -2
- package/dist/Assets/js/dist/scripts/DBUreHJA.chunk.js +0 -3
- package/dist/Assets/js/dist/scripts/DBUreHJA.chunk.js.map +0 -1
- package/dist/Assets/js/dist/scripts/Dh5DbdtP.chunk.js +0 -2
- package/dist/Assets/js/dist/scripts/Dh5DbdtP.chunk.js.map +0 -1
- package/dist/Assets/js/dist/scripts/DrBVabtm.chunk.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"q7pjZoNd.chunk.js","names":[],"sources":["../../../../../src/apps/subjects/views/audiences/delete-audience/DeleteAudienceView.tsx","../../../../../src/apps/subjects/views/audiences/edit-audience/EditAudienceView.tsx","../../../../../src/apps/subjects/views/audiences/new-audience/NewAudienceView.tsx","../../../../../src/apps/subjects/views/audiences/audience-nav/audience-nav.module.scss","../../../../../src/apps/subjects/views/audiences/audience-nav/AudienceNavView.tsx","../../../../../src/apps/subjects/views/audiences/edit-audience-members/EditAudienceMembers.tsx","../../../../../src/apps/subjects/views/classifications/classification-nav/classification-nav.module.scss","../../../../../src/apps/subjects/views/classifications/classification-nav/ClassificationNavView.tsx","../../../../../src/apps/subjects/views/classifications/delete-classification/DeleteClassificationView.tsx","../../../../../src/apps/subjects/views/classifications/edit-classification/EditClassificationView.tsx","../../../../../src/apps/subjects/views/classifications/new-classification/NewClassificationView.tsx","../../../../../src/apps/subjects/views/levels/edit-level/EditLevelView.tsx","../../../../../src/apps/subjects/views/levels/levels-redirect/LevelsRedirectView.tsx","../../../../../src/apps/subjects/views/levels/new-level/NewLevelView.tsx","../../../../../src/apps/subjects/views/levels/level-nav/level-nav.module.scss","../../../../../src/apps/subjects/views/levels/level-nav/LevelNavView.tsx","../../../../../src/apps/subjects/components/levels/level-audiences/LevelAudiences.tsx","../../../../../src/apps/subjects/views/levels/level-audiences/LevelAudiencesView.tsx","../../../../../src/apps/subjects/views/levels/edit-level-members/EditLevelMembersUtils.ts","../../../../../src/apps/subjects/views/levels/edit-level-members/EditLevelMembersView.tsx","../../../../../src/apps/subjects/views/levels/remove-level-member/RemoveLevelMemberView.tsx","../../../../../src/apps/subjects/views/presentations/edit-presentation/EditPresentationView.tsx","../../../../../src/apps/subjects/views/presentations/edit-presentations-list/EditPresentationsListView.tsx","../../../../../src/apps/subjects/views/presentations/new-presentation/NewPresentationView.tsx","../../../../../src/apps/subjects/views/subjects/add-subject-members/AddSubjectMembersUtils.ts","../../../../../src/apps/subjects/views/subjects/add-subject-members/AddSubjectMembersView.tsx","../../../../../src/apps/subjects/views/subjects/delete-subject/DeleteSubjectView.tsx","../../../../../src/apps/subjects/components/backbone-classifications/EditTopicSubjectDetailsForm.tsx","../../../../../src/apps/subjects/views/subjects/edit-subject/EditSubjectView.tsx","../../../../../src/apps/subjects/views/subjects/edit-subject-members/EditSubjectMembersUtils.ts","../../../../../src/apps/subjects/views/subjects/edit-subject-members/EditSubjectMembersView.tsx","../../../../../src/apps/subjects/views/subjects/new-subject/NewSubjectView.tsx","../../../../../src/apps/subjects/views/subjects/remove-subject-member/RemoveSubjectMemberView.tsx","../../../../../src/apps/subjects/views/subjects/subject-classifications/SubjectClassificationsView.tsx","../../../../../src/apps/subjects/views/subjects/subject-nav/subject-nav.module.scss","../../../../../src/apps/subjects/views/subjects/subject-nav/SubjectNavView.tsx","../../../../../src/apps/subjects/views/top-nav/TopNavView.tsx","../../../../../src/apps/subjects/views/index.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { PopupViewProps, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\ninterface DeleteAudienceViewProps {\n id: string;\n routeToOnDelete?: Core.AppLink;\n}\n\nexport function DeleteAudienceView(props: DeleteAudienceViewProps & PopupViewProps): React.ReactElement {\n const { id, routeToOnDelete, closePopup } = props;\n\n const [ audience, setAudience ] = React.useState<PresentationAudience>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getAudienceFetchOptions(id, setAudience), [id]);\n\n const deleteAudience = (): void => {\n setShowButtonSpinner(true);\n\n const onSuccess = () => {\n closePopup();\n\n if (routeToOnDelete)\n Core.AppLinkHelper.trigger(routeToOnDelete);\n };\n\n subjectDataService.deleteAudience(id, onSuccess, closePopup);\n };\n\n return (\n <Popup title='Delete Audience' closePopup={closePopup} showLoadingSpinner={!audience}>\n {!!audience &&\n <>\n <div>\n <p>Are you sure you want to delete <strong>{audience.name}</strong>?</p>\n </div>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='danger'\n onClick={deleteAudience}\n text='Yes, delete this audience'\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Presentation, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { CreateOrUpdateAudienceRequest } from 'shared/interfaces/data-requests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditAudienceDetails } from 'apps/subjects/components';\nimport { EditAudienceNav } from 'apps/subjects/components/audiences/edit-audience-nav/EditAudienceNav';\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\ninterface EditAudienceViewProps {\n presentationId: string;\n audienceId: string;\n presentationType: PresentationType;\n}\n\nexport function EditAudienceView(props: EditAudienceViewProps): React.ReactElement {\n const [ audience, setAudience ] = React.useState<PresentationAudience>();\n const [ levels, setLevels ] = React.useState<Level[]>();\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getAudienceFetchOptions(props.audienceId, setAudience), [props.audienceId]);\n useFetch(SubjectDataServiceHelper.getLevelsFetchOptions(setLevels), []);\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(\n props.presentationId,\n setPresentation\n ), [props.presentationId]);\n\n const saveAudience = (data: CreateOrUpdateAudienceRequest, onDone: () => void) =>\n subjectDataService.updateAudience(\n props.audienceId,\n { ...data, presentationId: props.presentationId },\n onDone,\n onDone\n );\n\n const appLinks = getSubjectAppLinks(props.presentationType);\n\n return (\n <>\n <EditAudienceNav\n presentation={presentation}\n audienceId={props.audienceId}\n presentationType={props.presentationType}\n />\n {!!audience && !!levels &&\n <EditAudienceDetails\n audience={audience}\n levels={levels}\n saveAudience={saveAudience}\n presentationId={props.presentationId}\n deleteAppLink={appLinks.deleteAudience(props.presentationId, props.audienceId)}\n />\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { BackButton } from 'shared/components';\nimport { DataServices } from 'shared/constants';\nimport { CreateOrUpdateAudienceRequest } from 'shared/interfaces/data-requests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { PresentationHelper } from 'shared/utils/PresentationHelper';\n\nimport { EditAudienceDetails } from 'apps/subjects/components';\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\ninterface NewAudienceViewProps {\n presentationId: string;\n presentationType: PresentationType;\n}\n\nexport function NewAudienceView({ presentationId, presentationType }: NewAudienceViewProps): React.ReactElement {\n const [ levels, setLevels ] = React.useState<Level[]>();\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getLevelsFetchOptions(setLevels), []);\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation), [presentationId]);\n\n const appLinks = getSubjectAppLinks(presentationType);\n\n const saveAudience = (data: CreateOrUpdateAudienceRequest, onDone: () => void) =>\n subjectDataService.createAudience(\n { ...data, presentationId },\n newAudience => {\n onDone();\n Core.AppLinkHelper.trigger(appLinks.audience(presentationId, newAudience.masterId));\n },\n onDone\n );\n\n return (\n <>\n <div className='pb-2'>\n <BackButton appLink={appLinks.presentationAudiences(presentationId)} backToName='audiences' />\n </div>\n {!!presentation && <h6>{`Presentation: ${PresentationHelper.formatPresentationName(presentation)}`}</h6>}\n {!!levels && <EditAudienceDetails levels={levels} presentationId={presentationId} saveAudience={saveAudience} />}\n </>\n );\n}\n",":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\nimport styles from './audience-nav.module.scss';\n\ninterface AudienceNavViewProps {\n presentationId: string;\n presentationType: PresentationType;\n selectedAudienceId?: string;\n}\n\nexport function AudienceNavView(props: AudienceNavViewProps): React.ReactElement {\n const [ audiences, setAudiences ] = React.useState<PresentationAudience[]>();\n\n useFetch(SubjectDataServiceHelper.getAudiencesFetchOptions(props.presentationId, setAudiences), []);\n\n const appLinks = getSubjectAppLinks(props.presentationType);\n\n return (\n <div className={`${styles.navContainer} h-auto pe-2 border-end`}>\n <h5 className='border-bottom pb-2'>Audiences</h5>\n <AppLink appLink={appLinks.newAudience(props.presentationId)} className='d-inline-block pb-2'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Audience</span>\n </AppLink>\n\n <div className='border-top pt-1'>\n <ul className='list-unstyled'>\n {audiences && audiences.map(audience => (\n <li key={audience.masterId} className='position-relative py-1'>\n <AppLink\n className={props.selectedAudienceId?.toString() === audience.masterId.toString() ? 'text-primary fw-semibold' : ''}\n appLink={appLinks.audience(props.presentationId, audience.masterId)}\n >\n {audience.name}\n </AppLink>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Audience, BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { LevelMemberType, OwnerType } from 'shared/enums';\nimport { SubjectDataServiceHelper } from 'shared/services';\nimport { PropHelper } from 'shared/utils';\n\nimport { AudienceMemberList, EditAudienceNav } from 'apps/subjects/components';\nimport { LevelMemberHelper } from 'apps/subjects/utils';\n\ninterface EditAudienceMembersViewProps {\n presentationId: string;\n audienceId: string;\n memberType: LevelMemberType;\n presentationType: PresentationType;\n}\n\nexport function EditAudienceMembersView(props: EditAudienceMembersViewProps): React.ReactElement {\n const { presentationId, audienceId, memberType, presentationType } = props;\n\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n const [ , setAudience ] = React.useState<Audience>();\n const [ members, setMembers ] = React.useState<BasePaginatedCollection<BaseObject>>();\n\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation), []);\n\n useFetch(SubjectDataServiceHelper.getAudienceFetchOptions(audienceId, setAudience), [audienceId]);\n\n useFetch(\n SubjectDataServiceHelper.getAudienceMembersFetchOptions(audienceId, memberType, setMembers),\n [ audienceId, memberType ]\n );\n\n const audienceMemberListProps = {\n items: members && members.data,\n memberType,\n getItemAppLink: (item: BaseObject) => LevelMemberHelper.getMemberAppLink(memberType, item.id),\n getActions: (item: BaseObject) =>\n LevelMemberHelper.getMemberActions(audienceId, OwnerType.Audience, memberType, item.id, presentationType)\n };\n\n const headerProps = { presentation, audienceId };\n\n const dataLoaded = PropHelper.propsLoaded(audienceMemberListProps);\n\n return (\n <>\n <EditAudienceNav {...headerProps} memberType={memberType} presentationType={presentationType} />\n {dataLoaded &&\n <AudienceMemberList {...audienceMemberListProps} />\n }\n </>\n );\n}\n",":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { useBulkFetch } from 'libs/common/react/hooks/UseBulkFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tree } from 'libs/shared/components/tree/Tree';\nimport { TreeNodeAction } from 'libs/shared/components/tree/TreeNode';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { ClassificationTree } from 'shared/interfaces/models';\nimport { SubjectDataServiceHelper } from 'shared/services/SubjectDataService';\n\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\nimport styles from './classification-nav.module.scss';\n\ninterface ClassificationNavViewProps {\n presentationId: string;\n presentationType: PresentationType;\n selectedClassificationId?: string;\n}\n\nfunction useFetchData(\n presentationId: string,\n setClassificationTree: (data: ClassificationTree) => void,\n setPresentation: (data: Presentation) => void\n): void {\n const classificationTreeFetchOptions =\n SubjectDataServiceHelper.getClassificationTreeFetchOptions(presentationId, setClassificationTree);\n\n const presentationFetchOptions =\n SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation);\n\n useBulkFetch([ classificationTreeFetchOptions, presentationFetchOptions ], [presentationId]);\n}\n\nexport function ClassificationNavView(props: ClassificationNavViewProps): React.ReactElement {\n const { presentationId, selectedClassificationId } = props;\n\n const [ classificationTree, setClassificationTree ] = React.useState<ClassificationTree>();\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n\n useFetchData(presentationId, setClassificationTree, setPresentation);\n\n const { hasPermissions } = useCuratorPermissions();\n\n const appLinks = getSubjectAppLinks(props.presentationType);\n\n const canEdit = hasPermissions(CuratorPermissionName.TopicsClassificationUpdate);\n const canDelete = hasPermissions(CuratorPermissionName.TopicsClassificationDelete);\n\n function getActions(): TreeNodeAction<ClassificationTree>[] {\n const actions = [];\n \n if (canEdit)\n actions.push({\n label: 'Add child',\n getAppLink: (c: ClassificationTree) => appLinks.newClassification(presentationId, c.id)\n });\n \n if (canDelete)\n actions.push({\n label: 'Delete topic',\n getAppLink: (c: ClassificationTree) => appLinks.deleteClassification(presentationId, c.id),\n className: 'text-danger'\n });\n \n return actions;\n }\n\n return (\n <div className={`${styles.navContainer} h-auto pe-2 border-end`}>\n {!!presentation && (\n <div className='pb-2 mb-2 border-bottom'>\n <div className='d-flex align-items-center justify-content-between mb-2'>\n <h6 className='mb-0'>\n Topics\n </h6>\n\n <AppLink\n appLink={{\n application: AppChannels.VISUALISER,\n action: Actions.Visualiser.PRESENTATION,\n args: [presentationId]\n }}\n className='btn btn-outline-dark btn-sm'\n >\n Visualise\n </AppLink>\n </div>\n <p className='mb-0'>{presentation.name}</p>\n <p className='mb-2'><em>{presentation.description}</em></p>\n </div>\n )}\n {canEdit &&\n <AppLink appLink={appLinks.newClassification(presentationId)} className='d-inline-block pb-2'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Topic</span>\n </AppLink>\n }\n {!!classificationTree &&\n <div className={`${canEdit ? 'border-top' : ''} pt-1`}>\n <Tree<ClassificationTree>\n tree={classificationTree}\n getAppLink={\n (classification: ClassificationTree) => appLinks.classification(presentationId, classification.id)\n }\n selectedIds={[selectedClassificationId]}\n actions={getActions()}\n />\n </div>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Classification, PopupViewProps } from 'libs/shared/interfaces';\n\nimport { ConfirmInputChallenge } from 'shared/components/confirm-input-challenge/ConfirmInputChallenge';\nimport { DataServices } from 'shared/constants';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\ninterface DeleteClassificationViewProps {\n classificationId: string;\n routeToOnDelete?: Core.AppLink;\n}\n\nexport function DeleteClassificationView(props: DeleteClassificationViewProps & PopupViewProps): React.ReactElement {\n const { classificationId, routeToOnDelete, closePopup } = props;\n\n const [ classification, setClassification ] = React.useState<Classification>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n const [ isChallengePassed, setIsChallengePassed ] = React.useState(false);\n\n useFetch(SubjectDataServiceHelper.getClassificationFetchOptions(classificationId, setClassification), []);\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const deleteClassification = (): void => {\n setShowButtonSpinner(true);\n\n const onSuccess = () => {\n closePopup();\n\n if (routeToOnDelete)\n Core.AppLinkHelper.trigger(routeToOnDelete);\n };\n\n subjectDataService.deleteClassification(classificationId, onSuccess, closePopup);\n };\n\n return (\n <Popup title='Delete Classification' closePopup={closePopup} showLoadingSpinner={!classification}>\n {!!classification &&\n <>\n <div>\n <p>Are you sure you want to delete <strong>{classification.name}</strong>?</p>\n </div>\n <ConfirmInputChallenge\n challengePhrase={classification.name}\n onChallengePass={(isPass: boolean) => setIsChallengePassed(isPass)}\n />\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='danger'\n onClick={deleteClassification}\n text='Yes, delete this classification'\n showSpinner={showButtonSpinner}\n disabled={!isChallengePassed}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { Classification, CuratedDashboardCollection, DashboardStatus, DashboardTargetType, Presentation, PresentationTheme } from 'libs/shared/interfaces';\nimport { THEME_ASSET_KEYS } from 'libs/shared/utils/ThemeAssetHelper';\n\nimport { EditClassificationDetails, EditClassificationNav } from 'shared/components/classifications';\nimport { AppChannels } from 'shared/constants';\nimport { AiRequests } from 'shared/flight-requests/AiRequests';\nimport { DashboardRequests } from 'shared/flight-requests/DashboardRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { ThemeRequests } from 'shared/flight-requests/ThemeRequests';\nimport { UpdateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { ClassificationTree, CuratorClassification, SubjectTree } from 'shared/interfaces/models';\nimport { DescriptionSuggestion } from 'shared/interfaces/models/DescriptionSuggestion';\nimport { TopicsNavHelper } from 'shared/utils';\n\nimport { AiError, getErrorMessage } from 'apps/assembly-line/hooks/useAi';\nimport { EditTopicClassificationDetailsForm } from 'apps/subjects/components/classifications';\nimport { ClassificationValidationSchema } from 'apps/subjects/utils';\n\ninterface EditClassificationViewProps {\n presentationId: string;\n classificationId: string;\n}\n\nexport function EditClassificationView(props: EditClassificationViewProps): React.ReactElement {\n const { presentationId, classificationId } = props;\n\n const fetchAsync = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n\n const classification = Flight.useBasicFetch<CuratorClassification>(\n SubjectRequests.classification(classificationId)\n );\n const presentation = Flight.useBasicFetch<Presentation>(\n SubjectRequests.presentation(presentationId)\n );\n const presentationThemes = Flight.useBasicFetch<PresentationTheme[]>(\n ThemeRequests.presentationThemes(presentationId)\n );\n\n const classificationTree = Flight.useBasicFetch<ClassificationTree>(\n SubjectRequests.getClassificationTree(presentationId)\n );\n const subjectTree = Flight.useBasicFetch<SubjectTree>(\n SubjectRequests.getSubjectTree(PresentationType.Subject, false)\n );\n\n const dashboards = Flight.useBasicFetch<CuratedDashboardCollection>(\n DashboardRequests.dashboards({\n targetType: DashboardTargetType.Classification,\n classificationId\n }, true)\n );\n\n async function updateClassificationCore(updatedClassification: Classification): Promise<void> {\n await fetchAsync(SubjectRequests.updateClassification(updatedClassification));\n\n if (!ObjectHelper.isEqual(updatedClassification.externalMetadata, classification.data.externalMetadata)) {\n await fetchAsync(SubjectRequests.updateClassificationExternalMetadata(\n updatedClassification.id,\n updatedClassification.externalMetadata\n ));\n }\n }\n\n async function getAiGeneratedDescription(classification: CuratorClassification): Promise<string | undefined> {\n try {\n const res = await fetchAsync<DescriptionSuggestion>(\n AiRequests.getTopicDescriptionSuggestion(classification.id, {})\n );\n return res.description;\n } catch (exception) {\n alerts.error(getErrorMessage((exception as AiError).responseJSON?.type));\n }\n }\n\n async function syncThemeAssets(data: UpdateClassificationRequest): Promise<void> {\n // remove: dissociate existing assets\n const deleteAssetRequests = ArrayHelper.flatMap(data.themes ?? [], submittedTheme => {\n const existingTheme = classification.data.themes?.data?.find(\n t => t.systemName === submittedTheme.systemName\n );\n if (!existingTheme) return [];\n\n return ArrayHelper.flatMap([...THEME_ASSET_KEYS], key => {\n const existingAsset = existingTheme[key];\n if ((!submittedTheme[key] || !Object.keys(submittedTheme[key]).length) && existingAsset?.id) {\n return [fetchAsync(SubjectRequests.deleteThemeAsset(existingTheme.id, existingAsset.id, key))];\n }\n });\n });\n\n await Promise.all(deleteAssetRequests);\n\n // update or add\n await Promise.all((data.themes ?? []).map(submittedTheme => {\n const existingTheme = classification.data.themes?.data?.find(\n t => t.systemName === submittedTheme.systemName\n );\n // only include changed assets in the payload\n const hasChanged = (key: typeof THEME_ASSET_KEYS[number]) =>\n submittedTheme[key] &&\n Object.keys(submittedTheme[key]).length &&\n !ObjectHelper.isEqual(submittedTheme[key], existingTheme?.[key]);\n\n if (!THEME_ASSET_KEYS.some(hasChanged)) return;\n\n return fetchAsync(ThemeRequests.updateClassificationTheme(classificationId, {\n themeSystemName: submittedTheme.systemName,\n ...(hasChanged('cover') && { cover: submittedTheme.cover }),\n ...(hasChanged('banner') && { banner: submittedTheme.banner }),\n ...(hasChanged('thumbnail') && { thumbnail: submittedTheme.thumbnail }),\n ...(hasChanged('tallPoster') && { tallPoster: submittedTheme.tallPoster }),\n ...(hasChanged('icon') && { icon: submittedTheme.icon })\n }));\n }));\n }\n\n async function saveClassification(data: UpdateClassificationRequest, onDone: () => void): Promise<void> {\n const updatedClassification = {\n ...classification.data,\n pinnedVideoMasterId: classification.data.pinnedVideoMasterId || null,\n ...data\n };\n\n delete updatedClassification.followers;\n delete updatedClassification.themes;\n\n try {\n await updateClassificationCore(updatedClassification);\n } catch {\n alerts.error(`Something went wrong while updating ${updatedClassification.name}. Please try again.`);\n onDone();\n return;\n }\n\n try {\n await syncThemeAssets(data);\n } catch {\n alerts.error(`Something went wrong while updating theme assets for ${updatedClassification.name}. Please try again.`);\n onDone();\n return;\n }\n\n alerts.success(`Successfully updated ${updatedClassification.name}.`);\n onDone();\n }\n\n const hasPublishedDashboard = dashboards.data?.data?.some(d => {\n return d.status === DashboardStatus.Published;\n });\n\n return (\n <div>\n <EditClassificationNav\n presentation={presentation.data}\n classificationId={classificationId}\n getTabs={(presentationId: string, classificationId: string, hasPermissions) =>\n TopicsNavHelper.getEditClassificationTabs(\n AppChannels.SUBJECTS,\n presentationId,\n classificationId,\n hasPermissions\n )}\n />\n {classification.hasCompleted && classificationTree.hasCompleted && subjectTree.hasCompleted &&\n <EditClassificationDetails\n classification={classification.data}\n saveClassification={saveClassification}\n validationSchema={ClassificationValidationSchema}\n >\n <EditTopicClassificationDetailsForm\n presentationId={presentationId}\n presentationType={presentation.data?.type}\n classificationTree={classificationTree.data}\n themes={presentationThemes.data}\n subjectTree={subjectTree.data}\n classification={classification.data}\n hasPublishedDashboard={hasPublishedDashboard}\n getAiGeneratedDescription={getAiGeneratedDescription}\n />\n </EditClassificationDetails>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { EditClassificationDetails } from 'shared/components/classifications';\nimport { DataServices } from 'shared/constants';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { CreateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService } from 'shared/services';\n\nimport { EditTopicClassificationDetailsForm } from 'apps/subjects/components/classifications';\nimport { ClassificationValidationSchema } from 'apps/subjects/utils';\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\nconst onCreateSuccess = (\n presentationId: string,\n presentationType: PresentationType,\n onDone: () => void\n) => (newClassification: Classification) => {\n onDone();\n\n if (!newClassification || !newClassification.id)\n return;\n\n Core.AppLinkHelper.trigger(getSubjectAppLinks(presentationType).newClassification(presentationId));\n};\n\ninterface NewClassificationViewProps {\n presentationId: string;\n parentId?: string;\n presentationType: PresentationType;\n}\n\nexport function NewClassificationView(props: NewClassificationViewProps): React.ReactElement {\n const { presentationId, parentId } = props;\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const classificationTree = Flight.useBasicFetch<ClassificationTree>(\n SubjectRequests.getClassificationTree(presentationId)\n );\n const subjectTree = Flight.useBasicFetch<SubjectTree>(\n SubjectRequests.getSubjectTree(PresentationType.Subject, false)\n );\n\n const saveClassification = (data: CreateClassificationRequest, onDone: () => void): void =>\n subjectDataService.createClassification(\n { ...data, presentationId },\n onCreateSuccess(presentationId, props.presentationType, onDone),\n onDone\n );\n\n return (\n <div>\n <h4 className='py-2'>Create New Classification</h4>\n {classificationTree.hasCompleted && subjectTree.hasCompleted &&\n <EditClassificationDetails\n classification={(parentId ? { parentIds: [parentId]} : {}) as Classification}\n saveClassification={saveClassification}\n validationSchema={ClassificationValidationSchema}\n >\n <EditTopicClassificationDetailsForm\n presentationId={props.presentationId}\n presentationType={props.presentationType}\n classificationTree={classificationTree.data}\n subjectTree={subjectTree.data}\n hasPublishedDashboard={false}\n />\n </EditClassificationDetails>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Actions, DataServices } from 'shared/constants';\nimport { CreateOrUpdateLevelRequest } from 'shared/interfaces/data-requests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditLevelDetails, EditLevelNav } from 'apps/subjects/components';\n\ninterface EditLevelViewProps {\n id: string;\n}\n\nexport function EditLevelView({ id }: EditLevelViewProps): React.ReactElement {\n const [ level, setLevel ] = React.useState<Level>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getLevelFetchOptions(id, setLevel), [id]);\n\n const saveLevel = (data: CreateOrUpdateLevelRequest, onDone: () => void) =>\n subjectDataService.updateLevel(id, data, onDone, onDone);\n\n return (\n <>\n <EditLevelNav levelId={id} activeAction={Actions.Subjects.EDIT_LEVEL} />\n <h4 className='py-2'>Edit Level</h4>\n {!!level && <EditLevelDetails level={level} saveLevel={saveLevel} />}\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nexport function LevelsRedirectView(): React.ReactElement {\n const [ levels, setLevels ] = React.useState<Level[]>();\n\n useFetch(SubjectDataServiceHelper.getLevelsFetchOptions(setLevels), []);\n\n React.useEffect(() => {\n if (!levels)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_LEVEL,\n args: [ArrayHelper.first(levels).id]\n }, { replace: true });\n }, [levels]);\n\n return <></>;\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdateLevelRequest } from 'shared/interfaces/data-requests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService } from 'shared/services';\n\nimport { EditLevelDetails } from 'apps/subjects/components';\n\nconst onCreateSuccess = (onDone: () => void) => (newLevel: Level) => {\n onDone();\n\n if (!newLevel || !newLevel.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_LEVEL,\n args: [newLevel.id]\n });\n};\n\nexport function NewLevelView(): React.ReactElement {\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const saveLevel = (data: CreateOrUpdateLevelRequest, onDone: () => void): void =>\n subjectDataService.createLevel(data, onCreateSuccess(onDone), onDone);\n\n return (\n <>\n <h4 className='py-2'>Create New Level</h4>\n <EditLevelDetails saveLevel={saveLevel} />\n </>\n );\n}\n",":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nimport styles from './level-nav.module.scss';\n\ninterface LevelNavViewProps {\n selectedLevelId?: string;\n}\n\nexport function LevelNavView({ selectedLevelId }: LevelNavViewProps): React.ReactElement {\n const [ levels, setLevels ] = React.useState<Level[]>();\n\n useFetch(SubjectDataServiceHelper.getLevelsFetchOptions(setLevels), []);\n\n const getAppLink = (level: Level) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_LEVEL,\n args: [level.id]\n });\n\n const newLevelAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.NEW_LEVEL\n };\n\n return (\n <div className={`${styles.navContainer} h-auto pe-2 border-end`}>\n <h5 className='border-bottom pb-2'>Backbone Audiences</h5>\n <AppLink appLink={newLevelAppLink} className='d-inline-block pb-2'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Backbone Audience</span>\n </AppLink>\n\n <div className='border-top pt-1'>\n <ul className='list-unstyled'>\n {levels && levels.map(level => (\n <li className='position-relative py-1'>\n <AppLink\n className={selectedLevelId?.toString() === level.id.toString() ? 'text-primary fw-semibold' : ''}\n appLink={getAppLink(level)}\n >\n {level.name}\n </AppLink>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PresentationAudience } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels } from 'shared/constants';\n\nconst getAudienceAppLink = (presentationId: string, audienceId: string) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_AUDIENCE,\n args: [ presentationId, audienceId ]\n});\n\ninterface PresentationAudiencesProps {\n presentation: Presentation;\n audiences: PresentationAudience[];\n}\n\nconst PresentationAudiences = (props: PresentationAudiencesProps) => (\n <div className='border rounded p-2 mb-3'>\n <h6 className='border-bottom pb-1'>{props.presentation.name}</h6>\n {(props.audiences && props.audiences.length) ?\n (\n <ul className='list-unstyled mb-0'>\n {props.audiences.map(a => (\n <li key={a.masterId} className='py-1'>\n <AppLink appLink={getAudienceAppLink(props.presentation.id, a.masterId)}>\n {a.name}\n </AppLink>\n </li>\n ))}\n </ul>\n ) : <p><em>There are no audiences mapped to this level in this presentation.</em></p>\n }\n </div>\n);\n\ninterface LevelAudiencesProps {\n presentations: Presentation[];\n audienceDictionary: {[presentationId: string]: PresentationAudience[] };\n}\n\nexport const LevelAudiences = (props: LevelAudiencesProps) => (\n <>\n {!!props.presentations && !!props.audienceDictionary && props.presentations.map(p => (\n <PresentationAudiences\n key={p.id}\n presentation={p}\n audiences={props.audienceDictionary[p.id]}\n />\n ))}\n </>\n);\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PresentationAudience } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { Actions } from 'shared/constants';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditLevelNav } from 'apps/subjects/components';\nimport { LevelAudiences } from 'apps/subjects/components/levels/level-audiences/LevelAudiences';\n\nfunction useFetchData(\n levelId: string,\n setState: React.Dispatch<React.SetStateAction<LevelAudiencesViewState>>\n): void {\n const getSetState = (key: keyof LevelAudiencesViewState) => StateHelper.getSetStateByKey(setState, key);\n\n useFetch(\n SubjectDataServiceHelper.getLevelAudiencesFetchOptions(levelId, getSetState('audiences')),\n [levelId]\n );\n\n useFetch(SubjectDataServiceHelper.getPresentationsFetchOptions(getSetState('presentations'), PresentationType.Subject), []);\n}\n\ninterface LevelAudiencesViewState {\n audiences?: PresentationAudience[];\n presentations?: Presentation[];\n}\n\ninterface LevelAudiencesViewProps {\n levelId: string;\n}\n\nexport function LevelAudiencesView({ levelId }: LevelAudiencesViewProps): JSX.Element {\n const [ state, setState ] = React.useState<LevelAudiencesViewState>({});\n\n useFetchData(levelId, setState);\n\n return (\n <>\n <EditLevelNav levelId={levelId} activeAction={Actions.Subjects.LEVEL_AUDIENCES} />\n <LevelAudiences\n presentations={state.presentations}\n audienceDictionary={ArrayHelper.groupBy(state.audiences, 'presentationId')}\n />\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Audience, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { LevelMemberType } from 'shared/enums';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { ClipRequests } from 'apps/clips/flight-requests/CuratorClipRequests';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { LevelMemberViewModel } from 'apps/subjects/components';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nimport { EditLevelMembersState, EditLevelMembersViewProps } from './EditLevelMembersView';\n\ntype SetState = React.Dispatch<React.SetStateAction<EditLevelMembersState>>;\n\n// Wrapper function for typing StateHelper.getSetStateByKey<T>\nexport function getSetState(setState: SetState, key: keyof EditLevelMembersState): (data: any) => void {\n return StateHelper.getSetStateByKey<EditLevelMembersState>(setState, key);\n}\n\n// Hook to fetch all data required for AddSubjectMembersView\nexport function useFetchData(\n props: EditLevelMembersViewProps,\n state: EditLevelMembersState,\n setState: SetState\n): void {\n const { presentationId, levelId, memberType } = props;\n\n useFetch(\n SubjectDataServiceHelper.getPresentationsFetchOptions(\n getSetState(setState, 'presentations'),\n PresentationType.Subject\n ),\n []\n );\n\n useFetch(\n SubjectDataServiceHelper.getLevelMemberIdsFetchOptions(\n levelId,\n memberType,\n getSetState(setState, 'memberIds')\n ),\n [ levelId, memberType ]\n );\n\n useFetch(\n !!presentationId &&\n SubjectDataServiceHelper.getLevelAudiencesFetchOptions(\n levelId,\n getSetState(setState, 'audiences'),\n presentationId,\n memberType\n ),\n [ levelId, memberType, presentationId ],\n !!presentationId\n );\n}\n\n// Hook to map audiences to members\nexport function useMapData(\n members: BaseObject[],\n props: EditLevelMembersViewProps,\n state: EditLevelMembersState,\n setState: SetState\n): void {\n const { audiences } = state;\n\n // Map audiences\n React.useEffect(() => {\n const setMembersWithAudiences = getSetState(setState, 'membersWithAudiences');\n setMembersWithAudiences(mapAudiencesToMembers(props.memberType, members, audiences));\n }, [ members, audiences ]);\n}\n\nexport function getMembersRequest(memberType: LevelMemberType, ids: string[]): Flight.Request {\n switch (memberType) {\n case LevelMemberType.Playlists:\n return PlaylistRequests.playlistsById(ids);\n\n case LevelMemberType.Series:\n return SeriesRequests.seriesById(ids);\n\n case LevelMemberType.Videos:\n return VideoRequests.videosById(ids);\n\n case LevelMemberType.Clips:\n return ClipRequests.clipsById(ids);\n\n case LevelMemberType.Interactives:\n return InteractiveRequests.interactivesById(ids);\n }\n}\n\nexport const getAudienceAppLink = (memberType: LevelMemberType, presentationId: string) =>\n (audienceId: string): Core.AppLink => {\n const application = AppChannels.SUBJECTS;\n const args = [ presentationId, audienceId ];\n\n let action;\n\n switch (memberType) {\n case LevelMemberType.Playlists:\n action = Actions.Subjects.EDIT_AUDIENCE_PLAYLISTS;\n break;\n\n case LevelMemberType.Series:\n action = Actions.Subjects.EDIT_AUDIENCE_SERIES;\n break;\n\n case LevelMemberType.Videos:\n action = Actions.Subjects.EDIT_AUDIENCE_VIDEOS;\n break;\n\n case LevelMemberType.Clips:\n action = Actions.Subjects.EDIT_AUDIENCE_CLIPS;\n break;\n\n case LevelMemberType.Interactives:\n action = Actions.Subjects.EDIT_AUDIENCE_INTERACTIVES;\n break;\n }\n\n return { application, action, args };\n };\n\n/**\n * For each member, list the audiences on the subject with a flag\n * to determine whether or not the member is associated with that audience.\n */\nfunction mapAudiencesToMembers(\n memberType: LevelMemberType,\n members: BaseObject[],\n audiences: PresentationAudience[]\n): LevelMemberViewModel[] {\n if (!members || !audiences)\n return;\n\n const isMemberInAudience = (member: BaseObject, audience: Audience) =>\n !!(audience as any)[memberType] &&\n !!(audience as any)[memberType].data.filter((m: BaseObject) => m.id === member.id).length;\n\n return members.map(m => ({\n id: m.id,\n name: m.name,\n audiences: audiences.map(a => ({ id: a.masterId, selected: isMemberInAudience(m, a) }))\n }));\n}\n\nexport function toggleObjectsInAudience(\n d: SubjectDataService,\n memberType: LevelMemberType,\n memberIds: string[],\n levelId: string,\n presentationId: string,\n audienceId: string,\n selected: boolean\n): void {\n const apiFn = selected ?\n d.addObjectsToAudience.bind(d) :\n d.removeObjectsFromAudience.bind(d);\n\n apiFn(audienceId, memberIds, memberType, levelId, presentationId);\n}\n\nexport function getActiveAction(memberType: LevelMemberType): string {\n switch (memberType) {\n case LevelMemberType.Playlists:\n return Actions.Subjects.EDIT_LEVEL_PLAYLISTS;\n\n case LevelMemberType.Series:\n return Actions.Subjects.EDIT_LEVEL_SERIES;\n\n case LevelMemberType.Videos:\n return Actions.Subjects.EDIT_LEVEL_VIDEOS;\n\n case LevelMemberType.Clips:\n return Actions.Subjects.EDIT_LEVEL_CLIPS;\n\n case LevelMemberType.Interactives:\n return Actions.Subjects.EDIT_LEVEL_INTERACTIVES;\n }\n}\n","import * as React from 'react';\nimport { Alert } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject, PresentationAudience } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { PresentationSelect } from 'shared/components/presentations';\nimport { AppChannels, DataServices } from 'shared/constants';\nimport { LevelMemberType, OwnerType } from 'shared/enums';\nimport { SubjectDataService } from 'shared/services';\n\nimport { EditLevelNav, LevelMemberViewModel } from 'apps/subjects/components';\nimport { LevelMemberList } from 'apps/subjects/components/levels/level-member-list';\nimport { LevelMemberHelper } from 'apps/subjects/utils';\n\nimport {\n getActiveAction,\n getAudienceAppLink,\n getMembersRequest,\n toggleObjectsInAudience,\n useFetchData,\n useMapData } from './EditLevelMembersUtils';\n\nexport interface EditLevelMembersState {\n // Data fetched from api.\n presentations?: Presentation[];\n audiences?: PresentationAudience[];\n memberIds?: string[];\n\n // View state.\n membersWithAudiences?: LevelMemberViewModel[];\n}\n\nexport interface EditLevelMembersViewProps {\n levelId: string;\n presentationId: string;\n memberType: LevelMemberType;\n action: string;\n}\n\nexport function EditLevelMembersView(props: EditLevelMembersViewProps): React.ReactElement {\n const [ state, setState ] = React.useState<EditLevelMembersState>({});\n\n const { presentations, audiences, memberIds, membersWithAudiences } = state;\n\n const members = Flight.useBasicFetch<BaseObject[]>((Array.isArray(memberIds) && memberIds.length) ?\n getMembersRequest(props.memberType, memberIds) :\n null);\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetchData(props, state, setState);\n useMapData(members.data, props, state, setState);\n\n React.useEffect(() => {\n if (props.presentationId || !presentations?.length)\n return;\n\n setPresentationParam(ArrayHelper.first(presentations).id);\n }, [props.presentationId]);\n\n function setPresentationParam(id: string): void {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: props.action,\n args: [props.levelId],\n params: {\n presentationId: id\n }\n });\n }\n\n const levelMemberDataLoaded = !!props.presentationId && !!audiences;\n\n return (\n <>\n <EditLevelNav\n levelId={props.levelId}\n presentationId={props.presentationId}\n activeAction={getActiveAction(props.memberType)}\n />\n <Alert variant='info' className='m-0'>\n {\n `Select which ${props.memberType} are shown for each audience in this level.` +\n ' Change the selected presentation to view different audiences.'\n }\n </Alert>\n <div className='w-50 py-2'>\n {!!presentations &&\n <PresentationSelect\n presentations={presentations}\n currentPresentationId={props.presentationId}\n setCurrentPresentation={p => setPresentationParam(p.id)}\n />\n }\n </div>\n {levelMemberDataLoaded &&\n <LevelMemberList\n members={membersWithAudiences || []}\n memberType={props.memberType}\n getMemberAppLink={(itemId: string) => LevelMemberHelper.getMemberAppLink(props.memberType, itemId)}\n getActions={(itemId: string) =>\n LevelMemberHelper.getMemberActions(\n props.levelId,\n OwnerType.Level,\n props.memberType,\n itemId\n )\n }\n audiences={audiences}\n getAudienceAppLink={props.presentationId &&\n getAudienceAppLink(props.memberType, props.presentationId)\n }\n onToggleAudience={(audienceId: string, selected: boolean, memberId?: string) =>\n toggleObjectsInAudience(\n subjectDataService,\n props.memberType,\n memberId ? [memberId] : memberIds,\n props.levelId,\n props.presentationId,\n audienceId,\n selected\n )\n }\n />\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Playlist, PopupViewProps, Series, Video } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { LevelMemberType } from 'shared/enums';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { LevelMemberHelper } from 'apps/subjects/utils';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nfunction getMemberRequest(memberType: LevelMemberType, memberId: string): Flight.Request {\n switch (memberType) {\n case LevelMemberType.Playlists:\n return PlaylistRequests.playlist(memberId);\n\n case LevelMemberType.Series:\n return SeriesRequests.series(memberId);\n\n case LevelMemberType.Videos:\n return VideoRequests.video(memberId);\n\n case LevelMemberType.Clips:\n return SubjectRequests.member(memberId);\n\n case LevelMemberType.Interactives:\n return SubjectRequests.member(memberId);\n }\n}\n\ninterface RemoveLevelMemberViewProps {\n levelId: string;\n memberId: string;\n memberType: LevelMemberType;\n}\n\ntype MemberType = Playlist | Series | Video;\n\ntype PropTypes = RemoveLevelMemberViewProps & PopupViewProps;\n\nexport function RemoveLevelMemberView(props: PropTypes): React.ReactElement {\n const [ level, setLevel ] = React.useState<Level>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const member = Flight.useBasicFetch<MemberType>(getMemberRequest(props.memberType, props.memberId));\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(\n SubjectDataServiceHelper.getLevelFetchOptions(props.levelId, setLevel),\n [props.levelId]\n );\n\n const removeMember = () => {\n setShowButtonSpinner(true);\n\n subjectDataService.removeObjectsFromLevel(\n props.levelId,\n [props.memberId],\n props.memberType,\n props.closePopup,\n props.closePopup\n );\n };\n\n const dataLoaded = !!level && !!member.data;\n\n const popupTitle = `Remove ${TextHelper.toTitleCase(LevelMemberHelper.singularizeMemberType(props.memberType))}`;\n\n return (\n <Popup title={popupTitle} closePopup={props.closePopup} showLoadingSpinner={!dataLoaded}>\n {dataLoaded &&\n <>\n <div>\n <p>\n Are you sure you want to remove <strong>\n {member.data.name}</strong> from <strong>{level.name}</strong>?\n </p>\n <p>Please ensure that it is not in any audiences before removing.</p>\n </div>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='danger'\n onClick={removeMember}\n text={`Yes, remove this ${LevelMemberHelper.singularizeMemberType(props.memberType)}`}\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ContentRegionCollection, Presentation, PresentationTheme } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { ContentRegionRequests } from 'shared/flight-requests/ContentRegionRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { ThemeRequests } from 'shared/flight-requests/ThemeRequests';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces';\n\nimport { PresentationRequests } from 'apps/cv-live/flight-requests/CvLivePresentationRequests';\nimport { EditTopicPresentationDetailsForm } from 'apps/subjects/components';\nimport { PresentationValidationSchema } from 'apps/subjects/utils';\n\ninterface EditPresentationViewProps {\n id: string;\n}\n\nexport function EditPresentationView({ id }: EditPresentationViewProps): React.ReactElement {\n const asyncFetch = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n\n const presentation = Flight.useBasicFetch<Presentation>(SubjectRequests.presentation(id));\n\n const cvLivePresentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.cvLivePresentation()\n );\n\n const contentRegionsResponse = Flight.useBasicFetch<ContentRegionCollection>(\n ContentRegionRequests.contentRegions()\n );\n const allPresentationThemes = Flight.useBasicFetch<PresentationTheme[]>(ThemeRequests.allThemes());\n const presentationThemes = Flight.useBasicFetch<PresentationTheme[]>(ThemeRequests.presentationThemes(id));\n\n const isStreamableLearning = presentation.data?.id === cvLivePresentation.data?.id;\n\n async function savePresentation(data: CreateOrUpdatePresentationRequest, onDone: () => void): Promise<void> {\n const { themes, defaultThemeSystemName, ...rest } = data;\n const payload = { ...rest, defaultThemeSystemName: defaultThemeSystemName || null };\n\n // associate & disassociate themes to presentation\n const oldThemes = presentationThemes.data?.map(t => t.systemName);\n const newThemes = themes;\n const toAdd = newThemes.filter(t => !oldThemes.includes(t));\n const toRemove = oldThemes.filter(t => !newThemes.includes(t));\n\n try {\n await Promise.all([\n ...toAdd.map(themeId => asyncFetch(ThemeRequests.addPresentationTheme(id, themeId))),\n ...toRemove.map(themeId => asyncFetch(ThemeRequests.removePresentationTheme(id, themeId)))\n ]);\n } catch {\n alerts.error('Failed to update presentation themes.');\n onDone();\n return;\n }\n\n // update presentation after themes are successfully associated/disassociated.\n try {\n await asyncFetch(SubjectRequests.updatePresentation(id, payload));\n alerts.success('Successfully updated presentation.');\n } catch {\n alerts.error('Failed to update presentation.');\n }\n onDone();\n }\n\n function getImageAppLink(): Core.AppLink {\n if (+cvLivePresentation.data?.id === +id)\n return {\n application: AppChannels.CV_LIVE,\n action: Actions.CvLive.UPLOAD_IMAGE\n };\n\n return {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.UPLOAD_IMAGE\n };\n }\n\n return (\n <>\n <h4 className='py-2'>Edit Presentation</h4>\n {!!presentation.data?.id && !!presentationThemes.hasCompleted &&\n <FormWrapper<CreateOrUpdatePresentationRequest, Presentation>\n initialValues={{\n ...presentation.data,\n\n learningLevel:\n TopicsHelper.getMappedPresentationLevel(presentation.data.learningLevel) as PresentationLearningLevel,\n themes: presentationThemes.data.map(t => t.systemName)\n }}\n validationSchema={PresentationValidationSchema}\n onSubmit={savePresentation}\n >\n <EditTopicPresentationDetailsForm\n isStreamableLearning={isStreamableLearning}\n isNew={false}\n imageAppLink={getImageAppLink()}\n contentRegions={contentRegionsResponse.data?.data}\n allPresentationThemes={allPresentationThemes.data}\n />\n </FormWrapper>\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { PresentationListNav } from 'shared/components/presentations/presentation-list';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nconst getAppLink = (presentation: Presentation) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_PRESENTATION,\n args: [presentation.id]\n});\n\nconst newPresentationAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.NEW_PRESENTATION\n};\n\nexport function EditPresentationsListView(): React.ReactElement {\n const [ presentations, setPresentations ] = React.useState<Presentation[]>();\n\n useFetch(SubjectDataServiceHelper.getPresentationsFetchOptions(setPresentations, PresentationType.Subject), []);\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canCreate = hasPermissions(CuratorPermissionName.TopicsPresentationsCreate);\n\n return (\n <div>\n <div className='d-flex justify-content-between mb-2'>\n <h5 className='d-inline-block m-0'>Select a presentation to edit:</h5>\n {canCreate &&\n <AppLink appLink={newPresentationAppLink} className='d-block'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Presentation</span>\n </AppLink>\n }\n </div>\n <PresentationListNav presentations={presentations} getAppLink={getAppLink} />\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ContentRegionCollection, Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { ContentRegionRequests } from 'shared/flight-requests/ContentRegionRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { ThemeRequests } from 'shared/flight-requests/ThemeRequests';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces';\n\nimport { EditTopicPresentationDetailsForm } from 'apps/subjects/components';\nimport { PresentationValidationSchema } from 'apps/subjects/utils';\n\nexport function NewPresentationView(): React.ReactElement {\n const asyncFetch = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n const { hasPermissions } = useCuratorPermissions();\n\n const canCreate = hasPermissions(CuratorPermissionName.TopicsPresentationsCreate);\n\n const contentRegionsResponse = Flight.useBasicFetch<ContentRegionCollection>(\n ContentRegionRequests.contentRegions()\n );\n\n async function savePresentation(data: CreateOrUpdatePresentationRequest, onDone: () => void): Promise<void> {\n let newPresentation: Presentation;\n try {\n newPresentation = await asyncFetch<Presentation>(SubjectRequests.createPresentation(data));\n } catch {\n alerts.error('Failed to create presentation.');\n onDone();\n return;\n }\n\n alerts.success('Successfully created presentation.');\n try {\n if (data.defaultThemeSystemName) {\n await asyncFetch(ThemeRequests.addPresentationTheme(newPresentation.id, data.defaultThemeSystemName));\n }\n\n onDone();\n\n if (!newPresentation.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_PRESENTATION,\n args: [newPresentation.id]\n });\n } catch {\n alerts.error('Failed to add theme to presentation.');\n }\n }\n\n const imageAppLink: Core.AppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.UPLOAD_IMAGE\n };\n\n // Redirect non-dev accounts back to presentation list\n if (!canCreate) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.PRESENTATIONS\n });\n\n return;\n }\n\n return (\n <>\n <h4 className='py-2'>Create New Presentation</h4>\n <FormWrapper<CreateOrUpdatePresentationRequest, Presentation>\n initialValues={null}\n validationSchema={PresentationValidationSchema}\n onSubmit={savePresentation}\n >\n <EditTopicPresentationDetailsForm\n isNew={true}\n imageAppLink={imageAppLink}\n contentRegions={contentRegionsResponse.data?.data}\n />\n </FormWrapper>\n </>\n );\n}\n","import { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\nimport { SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { ClassificationMemberHelper } from 'shared/utils';\n\nimport { ClipRequests } from 'apps/clips/flight-requests/CuratorClipRequests';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nimport { AddSubjectMembersViewProps, AddSubjectMembersViewState } from './AddSubjectMembersView';\n\ntype SetState = React.Dispatch<React.SetStateAction<AddSubjectMembersViewState>>;\n\n// Wrapper function for typing StateHelper.getSetStateByKey<T>\nexport function getSetState(setState: SetState, key: keyof AddSubjectMembersViewState): (data: any) => void {\n return StateHelper.getSetStateByKey<AddSubjectMembersViewState>(setState, key);\n}\n\n// Hook to fetch all data required for AddSubjectMembersView\nexport function useFetchData(\n props: AddSubjectMembersViewProps,\n setState: SetState\n): void {\n const subjectTreeFetchOptions = SubjectDataServiceHelper.getSubjectTreeFetchOptions(\n getSetState(setState, 'subjectTree'),\n PresentationType.Subject\n );\n\n useFetch(subjectTreeFetchOptions, []);\n}\n\nexport function addToSubject(\n objects: BaseObject[],\n subjectDataService: SubjectDataService,\n props: AddSubjectMembersViewProps,\n state: AddSubjectMembersViewState,\n setState: SetState\n): void {\n const { selectedSubject } = state;\n\n const onDone = () => getSetState(setState, 'showConfirmationPopup')(false);\n\n const onSuccess = () => {\n onDone();\n Core.AppLinkHelper.trigger(getSubjectMemberAppLink(selectedSubject.id, props.memberType));\n };\n\n subjectDataService.addObjectsToSubject(\n selectedSubject.id,\n objects.map(o => o.id),\n props.memberType,\n state.addToClassifications,\n onSuccess,\n onDone\n );\n}\n\nexport function getObjectRequest(memberType: SubjectMemberType, ids: string[]): Flight.Request {\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return PlaylistRequests.playlistsById(ids);\n\n case SubjectMemberType.Series:\n return SeriesRequests.seriesById(ids);\n\n case SubjectMemberType.Videos:\n return VideoRequests.videosById(ids);\n\n case SubjectMemberType.Clips:\n return ClipRequests.clipsById(ids);\n\n case SubjectMemberType.Interactives:\n return InteractiveRequests.interactivesById(ids);\n }\n}\n\nexport function getConfirmationPopupTitle(\n memberType: SubjectMemberType,\n objects: BaseObject[],\n subject: SubjectTree\n): string {\n if (!objects || !subject)\n return;\n\n const memberText = objects.length === 1 ?\n `this ${ClassificationMemberHelper.singularizeMemberType(memberType)}` :\n `these ${memberType}`;\n\n return `Add ${memberText} to ${subject.name}`;\n}\n\nfunction getSubjectMemberAppLink(subjectId: string, memberType: SubjectMemberType): Core.AppLink {\n const baseAppLink = { application: AppChannels.SUBJECTS, args: [subjectId]};\n\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_PLAYLISTS };\n\n case SubjectMemberType.Series:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_SERIES };\n\n case SubjectMemberType.Videos:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_VIDEOS };\n\n case SubjectMemberType.Clips:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_CLIPS };\n\n case SubjectMemberType.Interactives:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_INTERACTIVES };\n }\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ConfirmationPopup } from 'libs/shared/components/confirmation-popup/ConfirmationPopup';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { AddSubjectMembers } from 'shared/components';\nimport { DataServices } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService } from 'shared/services';\nimport { ClassificationMemberHelper } from 'shared/utils';\n\nimport {\n addToSubject,\n getConfirmationPopupTitle,\n getObjectRequest,\n getSetState,\n useFetchData } from './AddSubjectMembersUtils';\n\nfunction getMemberName(memberType: SubjectMemberType): string {\n return TextHelper.toTitleCase(ClassificationMemberHelper.singularizeMemberType(memberType));\n}\n\nfunction getOnClickAddToSubject(\n state: AddSubjectMembersViewState,\n setState: React.Dispatch<React.SetStateAction<AddSubjectMembersViewState>>\n): (backboneClassificationIds: string[], addToClassifications: boolean, setSubmittingFalse: () => void) => void {\n return (backboneClassificationIds: string[], addToClassifications: boolean, setSubmittingFalse: () => void) => {\n // Set submitting to false as we are showing a confirmation popup before making an api call.\n setSubmittingFalse();\n\n getSetState(setState, 'selectedSubject')(TreeHelper.find(state.subjectTree, ArrayHelper.first(backboneClassificationIds)));\n getSetState(setState, 'addToClassifications')(addToClassifications);\n getSetState(setState, 'showConfirmationPopup')(true);\n };\n}\n\nexport interface AddSubjectMembersViewState {\n // Api Data\n subjectTree?: SubjectTree;\n classificationTree?: ClassificationTree;\n\n // View State\n selectedSubject?: SubjectTree;\n addToClassifications?: boolean;\n showConfirmationPopup?: boolean;\n}\n\nexport interface AddSubjectMembersViewProps {\n memberType: SubjectMemberType;\n objectIds: string[];\n}\n\nexport function AddSubjectMembersView(props: AddSubjectMembersViewProps): React.ReactElement {\n const [ state, setState ] = React.useState<AddSubjectMembersViewState>({});\n\n const objects = Flight.useBasicFetch<BaseObject[]>(getObjectRequest(props.memberType, props.objectIds));\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetchData(props, setState);\n\n const setShowConfirmationPopup = (show: boolean) => getSetState(setState, 'showConfirmationPopup')(show);\n\n return (\n <>\n {!!objects.data && !!state.subjectTree &&\n <AddSubjectMembers\n memberType={props.memberType}\n presentationType={PresentationType.Subject}\n objects={objects.data}\n subjectTree={state.subjectTree}\n onClickAddToSubject={getOnClickAddToSubject(state, setState)}\n />\n }\n {state.showConfirmationPopup &&\n <ConfirmationPopup\n title={getConfirmationPopupTitle(props.memberType, objects.data, state.selectedSubject)}\n onClickConfirm={() => addToSubject(objects.data, subjectDataService, props, state, setState)}\n closePopup={() => setShowConfirmationPopup(false)}\n >\n <p>\n {`The following ${props.memberType} will be added to `}\n <strong>{state.selectedSubject.name}</strong>\n {state.addToClassifications ? ` and its mapped topics:` : ':'}\n </p>\n <ul>\n {objects.data.map(o =>\n <li key={o.id}>{o.name}</li>)}\n </ul>\n {!state.addToClassifications &&\n <p>{`${objects.data.length === 1 ? 'It' : 'They'} will not be added to its mapped topics.`}</p>\n }\n <p>\n {`${getMemberName(props.memberType)} to topic mappings can be managed from the `}\n <strong>{`Edit Backbone Subject ${TextHelper.toTitleCase(props.memberType)} `}</strong>\n page.\n </p>\n </ConfirmationPopup>\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { PopupViewProps, Subject } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\ninterface DeleteSubjectViewProps {\n subjectId: string;\n routeToOnDelete?: Core.AppLink;\n}\n\nexport function DeleteSubjectView(props: DeleteSubjectViewProps & PopupViewProps): React.ReactElement {\n const { subjectId, routeToOnDelete, closePopup } = props;\n\n const [ subject, setSubject ] = React.useState<Subject>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n useFetch(SubjectDataServiceHelper.getSubjectFetchOptions(subjectId, setSubject), []);\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const deleteSubject = (): void => {\n setShowButtonSpinner(true);\n\n const onSuccess = () => {\n closePopup();\n\n if (routeToOnDelete)\n Core.AppLinkHelper.trigger(routeToOnDelete);\n };\n\n subjectDataService.deleteSubject(subjectId, onSuccess, closePopup);\n };\n\n return (\n <Popup title='Delete Backbone Subject' closePopup={closePopup} showLoadingSpinner={!subject}>\n {!!subject &&\n <>\n <div>\n <p>Are you sure you want to delete <strong>{subject.name}</strong>?</p>\n <p>Backbone subject that have mapped topics cannot be deleted.</p>\n </div>\n <PopupButtons>\n <PopupButtons.Cancel onClick={closePopup} />\n <PopupButtons.Submit\n variant='danger'\n onClick={deleteSubject}\n text='Yes, delete this backbone subject'\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\nimport { Form, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { useCanSubmitForm } from 'libs/shared/hooks/UseCanSubmitForm';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { TreeSelect } from 'shared/components';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { CreateOrUpdateSubjectRequest } from 'shared/interfaces/data-requests';\nimport { SubjectTree } from 'shared/interfaces/models';\n\nconst isNodeDisabled = (subjectTree: SubjectTree, subjectId: string) =>\n (node: SubjectTree) => {\n if (node.id === subjectId)\n return true;\n\n const subjectNode = TreeHelper.find(subjectTree, subjectId);\n\n return !!TreeHelper.find(subjectNode, node.id);\n };\n\ninterface EditTopicSubjectDetailsFormProps {\n id?: string;\n subjectTree: SubjectTree;\n deleteSubject: Core.AppLink;\n}\n\nexport function EditTopicSubjectDetailsForm(props: EditTopicSubjectDetailsFormProps): React.ReactElement {\n const isNew = !props.id;\n\n const formikProps = useFormikContext<CreateOrUpdateSubjectRequest>();\n\n const canSubmit = useCanSubmitForm(formikProps);\n\n const collapseInitialState = !isNew || !!formikProps.values.parentId;\n\n const [ collapseParentSelect, setCollapseParentSelect ] = React.useState(collapseInitialState);\n\n React.useEffect(() => setCollapseParentSelect(collapseInitialState), [ props.id, formikProps.values.parentId ]);\n\n const onSelectParent = (item: SubjectTree) => {\n const newParentId = item.id === formikProps.values.parentId ?\n null :\n item.id;\n\n formikProps.setFieldValue('parentId', newParentId);\n };\n\n const treeSelectClassName = `${FormHelper.getCustomFormControlClassName(formikProps.errors, formikProps.touched, 'parentId')} h-auto py-2`;\n\n const { hasPermissions } = useCuratorPermissions();\n const canEdit = hasPermissions(CuratorPermissionName.TopicsBackboneUpdate);\n\n return (\n <Form>\n <FormField<CreateOrUpdateSubjectRequest>\n label='Name'\n name='name'\n id='name'\n value={formikProps.values.name}\n placeholder='Enter a name for this backbone subject'\n disabled={!canEdit}\n autoFocus\n />\n <FormField<CreateOrUpdateSubjectRequest>\n name='parentId'\n disabled={!canEdit}\n >\n {() => (\n <div className={treeSelectClassName}>\n <TreeSelect<SubjectTree>\n label='Parent Backbone Subject'\n tree={props.subjectTree}\n selectedIds={[formikProps.values.parentId]}\n onSelect={onSelectParent}\n collapse={collapseParentSelect}\n noSelectionMessage='No parent selected, this will be a root backbone subject.'\n isNodeDisabled={isNodeDisabled(props.subjectTree, props.id)}\n />\n </div>\n )}\n </FormField>\n <div className='d-flex justify-content-between'>\n {canEdit &&\n <SpinnerButton showSpinner={formikProps.isSubmitting} type='submit' disabled={!canSubmit}>\n {isNew ? 'Create' : 'Save'}\n </SpinnerButton>\n }\n {!isNew && hasPermissions(CuratorPermissionName.TopicsBackboneDelete) &&\n <AppLink\n className='btn btn-outline-danger'\n appLink={({\n ...props.deleteSubject,\n args: [props.id]\n })}\n >\n Delete\n </AppLink>\n }\n </div>\n </Form>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Subject } from 'libs/shared/interfaces';\n\nimport { EditSubjectNav } from 'shared/components';\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdateSubjectRequest } from 'shared/interfaces/data-requests';\nimport { SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { TopicsNavHelper } from 'shared/utils';\n\nimport { EditTopicSubjectDetailsForm } from 'apps/subjects/components/backbone-classifications';\nimport { SubjectValidationSchema } from 'apps/subjects/utils';\n\ninterface EditSubjectViewProps {\n subjectId: string;\n}\n\nexport function EditSubjectView({ subjectId }: EditSubjectViewProps): React.ReactElement {\n const [ subject, setSubject ] = React.useState<Subject>();\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const subjectFetchOptions =\n SubjectDataServiceHelper.getSubjectFetchOptions(subjectId, setSubject);\n\n const subjectTreeFetchOptions =\n SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Subject);\n\n useFetch(subjectTreeFetchOptions, []);\n useFetch(subjectFetchOptions, [subjectId]);\n\n const saveSubject = (data: CreateOrUpdateSubjectRequest, onDone: () => void): void =>\n subjectDataService.updateSubject(subjectId, data, onDone, onDone);\n\n const deleteSubjectAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.DELETE_SUBJECT\n };\n\n return (\n <>\n <EditSubjectNav\n subjectId={subjectId}\n presentationType={PresentationType.Subject}\n activeAction={Actions.Subjects.EDIT_SUBJECT}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.SUBJECTS, subjectId, presentationId)}\n />\n {!!subject && !!subjectTree &&\n <FormWrapper<CreateOrUpdateSubjectRequest>\n initialValues={subject}\n validationSchema={SubjectValidationSchema}\n onSubmit={saveSubject}\n >\n <EditTopicSubjectDetailsForm\n id={subjectId}\n subjectTree={subjectTree}\n deleteSubject={deleteSubjectAppLink}\n />\n </FormWrapper>\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { BaseObject, Classification } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { SubjectMemberViewModel } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { ClipRequests } from 'apps/clips/flight-requests/CuratorClipRequests';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nimport { EditSubjectMembersState, EditSubjectMembersViewProps } from './EditSubjectMembersView';\n\ntype SetState = React.Dispatch<React.SetStateAction<EditSubjectMembersState>>;\n\n// Wrapper function for typing StateHelper.getSetStateByKey<T>\nexport function getSetState(setState: SetState, key: keyof EditSubjectMembersState): (data: any) => void {\n return StateHelper.getSetStateByKey<EditSubjectMembersState>(setState, key);\n}\n\n// Hook to fetch all data required for AddSubjectMembersView\nexport function useFetchData(\n props: EditSubjectMembersViewProps,\n state: EditSubjectMembersState,\n setState: SetState\n): void {\n const { subjectId, memberType, presentationId } = props;\n\n useFetch(\n SubjectDataServiceHelper.getPresentationsFetchOptions(\n getSetState(setState, 'presentations'),\n PresentationType.Subject\n ),\n []\n );\n\n useFetch(\n SubjectDataServiceHelper.getSubjectMemberIdsFetchOptions(\n subjectId,\n memberType,\n getSetState(setState, 'memberIds')\n ),\n [ subjectId, memberType ]\n );\n\n useFetch(\n !!presentationId &&\n SubjectDataServiceHelper.getSubjectClassificationFetchOptions(\n subjectId,\n getSetState(setState, 'classifications'),\n presentationId,\n memberType\n ),\n [ subjectId, memberType, presentationId ],\n !!presentationId\n );\n}\n\n// Hook to map classifications to members\nexport function useMapData(\n members: BaseObject[],\n props: EditSubjectMembersViewProps,\n state: EditSubjectMembersState,\n setState: SetState\n): void {\n const { classifications } = state;\n\n // Map classifications\n React.useEffect(() => {\n const setMembersWithClassifications = getSetState(setState, 'membersWithClassifications');\n setMembersWithClassifications(mapClassificationsToMembers(props.memberType, members, classifications));\n }, [ members, classifications ]);\n}\n\nexport function getMembersRequest(memberType: SubjectMemberType, ids: string[]): Flight.Request {\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return PlaylistRequests.playlistsById(ids);\n\n case SubjectMemberType.Series:\n return SeriesRequests.seriesById(ids);\n\n case SubjectMemberType.Videos:\n return VideoRequests.videosById(ids);\n\n case SubjectMemberType.Clips:\n return ClipRequests.clipsById(ids);\n\n case SubjectMemberType.Interactives:\n return InteractiveRequests.interactivesById(ids);\n }\n}\n\nexport const getClassificationAppLink = (memberType: SubjectMemberType, presentationId: string) =>\n (classificationId: string): Core.AppLink => {\n const application = AppChannels.SUBJECTS;\n const args = [ presentationId, classificationId ];\n\n let action;\n\n switch (memberType) {\n case SubjectMemberType.Playlists:\n action = Actions.Subjects.EDIT_CLASSIFICATION_PLAYLISTS;\n break;\n\n case SubjectMemberType.Series:\n action = Actions.Subjects.EDIT_CLASSIFICATION_SERIES;\n break;\n\n case SubjectMemberType.Videos:\n action = Actions.Subjects.EDIT_CLASSIFICATION_VIDEOS;\n break;\n\n case SubjectMemberType.Clips:\n action = Actions.Subjects.EDIT_CLASSIFICATION_CLIPS;\n break;\n\n case SubjectMemberType.Interactives:\n action = Actions.Subjects.EDIT_CLASSIFICATION_INTERACTIVES;\n break;\n }\n\n return { application, action, args };\n };\n\n/**\n * For each member, list the classifications on the subject with a flag\n * to determine whether or not the member is associated with that classification.\n */\nfunction mapClassificationsToMembers(\n memberType: SubjectMemberType,\n members: BaseObject[],\n classifications: Classification[]\n): SubjectMemberViewModel[] {\n if (!members || !Array.isArray(members) || !classifications)\n return;\n\n const isMemberInClassification = (member: BaseObject, classification: Classification) =>\n !!(classification as any)[memberType] &&\n !!(classification as any)[memberType].data.filter((m: BaseObject) => m.id === member.id).length;\n\n return members.map(m => ({\n id: m.id,\n name: m.name,\n classifications: classifications.map(c => ({ id: c.id, selected: isMemberInClassification(m, c) }))\n }));\n}\n\nexport function toggleObjectsInClassification(\n d: SubjectDataService,\n memberType: SubjectMemberType,\n memberIds: string[],\n subjectId: string,\n presentationId: string,\n classificationId: string,\n selected: boolean\n): void {\n const apiFn = selected ?\n d.addObjectsToClassification.bind(d) :\n d.removeObjectsFromClassification.bind(d);\n\n apiFn(classificationId, memberIds, memberType, subjectId, presentationId);\n}\n\nexport function getActiveAction(memberType: SubjectMemberType): string {\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return Actions.Subjects.EDIT_SUBJECT_PLAYLISTS;\n\n case SubjectMemberType.Series:\n return Actions.Subjects.EDIT_SUBJECT_SERIES;\n\n case SubjectMemberType.Videos:\n return Actions.Subjects.EDIT_SUBJECT_VIDEOS;\n\n case SubjectMemberType.Clips:\n return Actions.Subjects.EDIT_SUBJECT_CLIPS;\n\n case SubjectMemberType.Interactives:\n return Actions.Subjects.EDIT_SUBJECT_INTERACTIVES;\n }\n}\n","import * as React from 'react';\nimport { Alert } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { BaseObject, Classification } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { EditSubjectNav, SubjectMemberList, SubjectMemberViewModel } from 'shared/components';\nimport { PresentationSelect } from 'shared/components/presentations';\nimport { AppChannels, DataServices } from 'shared/constants';\nimport { OwnerType, SubjectMemberType } from 'shared/enums';\nimport { SubjectDataService } from 'shared/services';\nimport { ClassificationMemberHelper, TopicsNavHelper } from 'shared/utils';\n\nimport {\n getActiveAction,\n getClassificationAppLink,\n getMembersRequest,\n toggleObjectsInClassification,\n useFetchData,\n useMapData } from './EditSubjectMembersUtils';\n\nexport interface EditSubjectMembersState {\n // Data fetched from api.\n presentations?: Presentation[];\n classifications?: Classification[];\n memberIds?: string[];\n\n // View state.\n membersWithClassifications?: SubjectMemberViewModel[];\n}\n\nexport interface EditSubjectMembersViewProps {\n subjectId: string;\n presentationId: string;\n memberType: SubjectMemberType;\n action: string;\n}\n\nexport function EditSubjectMembersView(props: EditSubjectMembersViewProps): React.ReactElement {\n const [ state, setState ] = React.useState<EditSubjectMembersState>({});\n\n const { presentations, classifications, memberIds, membersWithClassifications } = state;\n\n const manageableMembers = memberIds?.length >= 50 ? memberIds.slice(0, 49) : memberIds;\n\n const members = Flight.useBasicFetch<BaseObject[]>(manageableMembers\n && getMembersRequest(props.memberType, manageableMembers));\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetchData(props, state, setState);\n useMapData(members.data, props, state, setState);\n\n React.useEffect(() => {\n if (props.presentationId || !presentations?.length)\n return;\n\n setPresentationParam(ArrayHelper.first(presentations).id);\n }, [props.presentationId]);\n\n function setPresentationParam(id: string): void {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: props.action,\n args: [props.subjectId],\n params: {\n presentationId: id\n }\n });\n }\n\n const subjectMemberDataLoaded = !!props.presentationId && !!classifications;\n\n return (\n <>\n <EditSubjectNav\n subjectId={props.subjectId}\n presentationType={PresentationType.Subject}\n presentationId={props.presentationId}\n activeAction={getActiveAction(props.memberType)}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.SUBJECTS, subjectId, presentationId)}\n />\n <Alert variant='info' className='m-0'>\n {\n `Select which ${props.memberType} are shown for each topic in this backbone subject.` +\n ' Change the selected presentation to view different topics.'\n }\n </Alert>\n <div className='w-50 py-2'>\n {!!presentations &&\n <PresentationSelect\n presentations={presentations}\n currentPresentationId={props.presentationId}\n setCurrentPresentation={p => setPresentationParam(p.id)}\n />\n }\n </div>\n {subjectMemberDataLoaded &&\n <SubjectMemberList\n members={membersWithClassifications || []}\n memberType={props.memberType}\n getMemberAppLink={(itemId: string) => ClassificationMemberHelper.getMemberAppLink(props.memberType, itemId)}\n getActions={(itemId: string) =>\n ClassificationMemberHelper.getMemberActions(\n AppChannels.SUBJECTS,\n props.subjectId,\n OwnerType.Subject,\n props.memberType,\n itemId\n )\n }\n classifications={classifications}\n getClassificationAppLink={props.presentationId &&\n getClassificationAppLink(props.memberType, props.presentationId)\n }\n onToggleClassification={(classificationId: string, selected: boolean, memberId?: string) =>\n toggleObjectsInClassification(\n subjectDataService,\n props.memberType,\n memberId ? [memberId] : memberIds,\n props.subjectId,\n props.presentationId,\n classificationId,\n selected\n )\n }\n />\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Subject } from 'libs/shared/interfaces';\n\nimport { BackButton } from 'shared/components';\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdateSubjectRequest } from 'shared/interfaces/data-requests';\nimport { SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditTopicSubjectDetailsForm } from 'apps/subjects/components/backbone-classifications';\nimport { SubjectValidationSchema } from 'apps/subjects/utils';\n\nconst onCreateSuccess = (onDone: () => void) => (newSubject: Subject) => {\n onDone();\n\n if (!newSubject || !newSubject.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_SUBJECT,\n args: [newSubject.id]\n });\n};\n\ninterface NewSubjectViewProps {\n parentId?: string;\n}\n\nexport function NewSubjectView({ parentId }: NewSubjectViewProps): React.ReactElement {\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const subjectTreeFetchOptions =\n SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Subject);\n\n useFetch(subjectTreeFetchOptions, []);\n\n const saveSubject = (data: CreateOrUpdateSubjectRequest, onDone: () => void): void => {\n /**\n * Where no parent is selected, we want to map the backbone-classificatino to the root node.\n * Because we have both Subject and Curriculum root nodes, we need to ensure that is hooked \n * to the correct object\n */\n if (!+data.parentId)\n data.parentId = subjectTree.id;\n\n return subjectDataService.createSubject(data, onCreateSuccess(onDone), onDone);\n };\n\n const presentationAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.PRESENTATIONS\n };\n\n const deleteSubjectAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.DELETE_SUBJECT\n };\n\n return (\n <>\n <div className='pb-2 border-bottom'>\n <BackButton backToName='Presentations' appLink={presentationAppLink} />\n </div>\n <h4 className='py-2'>Create New Subject</h4>\n {!!subjectTree &&\n <FormWrapper<CreateOrUpdateSubjectRequest>\n initialValues={{ parentId }}\n validationSchema={SubjectValidationSchema}\n onSubmit={saveSubject}\n >\n <EditTopicSubjectDetailsForm\n id={parentId}\n subjectTree={subjectTree}\n deleteSubject={deleteSubjectAppLink}\n />\n </FormWrapper>\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Playlist, PopupViewProps, Series, Subject, Video } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { ClassificationMemberHelper } from 'shared/utils';\n\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nfunction getMemberRequest(memberType: SubjectMemberType, memberId: string): Flight.Request {\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return PlaylistRequests.playlist(memberId);\n\n case SubjectMemberType.Series:\n return SeriesRequests.series(memberId);\n\n case SubjectMemberType.Videos:\n return VideoRequests.video(memberId);\n\n case SubjectMemberType.Clips:\n return SubjectRequests.member(memberId);\n\n case SubjectMemberType.Interactives:\n return SubjectRequests.member(memberId);\n }\n}\n\ninterface RemoveSubjectMemberViewProps {\n subjectId: string;\n memberId: string;\n memberType: SubjectMemberType;\n}\n\ntype MemberType = Playlist | Series | Video;\n\ntype PropTypes = RemoveSubjectMemberViewProps & PopupViewProps;\n\nexport function RemoveSubjectMemberView(props: PropTypes): React.ReactElement {\n const [ subject, setSubject ] = React.useState<Subject>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const member = Flight.useBasicFetch<MemberType>(getMemberRequest(props.memberType, props.memberId));\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(\n SubjectDataServiceHelper.getSubjectFetchOptions(props.subjectId, setSubject),\n [props.subjectId]\n );\n\n const removeMember = () => {\n setShowButtonSpinner(true);\n\n subjectDataService.removeObjectsFromSubject(\n props.subjectId,\n [props.memberId],\n props.memberType,\n props.closePopup,\n props.closePopup\n );\n };\n\n const dataLoaded = !!subject && !!member.data;\n\n const popupTitle = `Remove ${TextHelper.toTitleCase(\n ClassificationMemberHelper.singularizeMemberType(props.memberType)\n )}`;\n\n return (\n <Popup title={popupTitle} closePopup={props.closePopup} showLoadingSpinner={!dataLoaded}>\n {dataLoaded &&\n <>\n <div>\n <p>\n Are you sure you want to remove <strong>\n {member.data.name}</strong> from <strong>{subject.name}</strong>?\n </p>\n <p>Please ensure that it is not in any classifications before removing.</p>\n </div>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n onClick={removeMember}\n variant='danger'\n text={`Yes, remove this ${ClassificationMemberHelper.singularizeMemberType(props.memberType)}`}\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Classification } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { EditSubjectNav, SubjectClassifications } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { SubjectDataServiceHelper } from 'shared/services';\nimport { TopicsNavHelper } from 'shared/utils';\n\nfunction useFetchData(\n subjectId: string,\n setState: React.Dispatch<React.SetStateAction<SubjectClassificationsViewState>>\n): void {\n const getSetState = (key: keyof SubjectClassificationsViewState) => StateHelper.getSetStateByKey(setState, key);\n\n useFetch(\n SubjectDataServiceHelper.getSubjectClassificationFetchOptions(subjectId, getSetState('classifications')),\n [subjectId]\n );\n\n useFetch(SubjectDataServiceHelper.getPresentationsFetchOptions(getSetState('presentations'), PresentationType.Subject), []);\n}\n\ninterface SubjectClassificationsViewState {\n classifications?: Classification[];\n presentations?: Presentation[];\n}\n\ninterface SubjectClassificationsViewProps {\n subjectId: string;\n}\n\nexport function SubjectClassificationsView({ subjectId }: SubjectClassificationsViewProps): JSX.Element {\n const [ state, setState ] = React.useState<SubjectClassificationsViewState>({});\n\n useFetchData(subjectId, setState);\n\n return (\n <>\n <EditSubjectNav\n subjectId={subjectId}\n presentationType={PresentationType.Subject}\n activeAction={Actions.Subjects.SUBJECT_CLASSIFICATIONS}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.SUBJECTS, subjectId, presentationId)\n }\n />\n <SubjectClassifications\n presentations={state.presentations}\n classificationDictionary={ArrayHelper.groupBy(state.classifications, 'presentationId')}\n />\n </>\n );\n}\n",":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tree } from 'libs/shared/components/tree/Tree';\nimport { TreeNodeAction } from 'libs/shared/components/tree/TreeNode';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nimport styles from './subject-nav.module.scss';\n\ninterface SubjectNavViewProps {\n selectedSubjectId?: string;\n}\n\nexport function SubjectNavView({ selectedSubjectId }: SubjectNavViewProps): React.ReactElement {\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n useFetch(SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Subject), []);\n\n const getAppLink = React.useCallback((subject: SubjectTree) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_SUBJECT,\n args: [subject.id]\n }), []);\n\n const newSubjectAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.NEW_SUBJECT\n };\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canEdit = hasPermissions(CuratorPermissionName.TopicsClassificationUpdate);\n const canDelete = hasPermissions(CuratorPermissionName.TopicsClassificationDelete);\n\n function getActions(): TreeNodeAction<SubjectTree>[] {\n const actions = [];\n\n if (canEdit)\n actions.push({\n label: 'Add child',\n getAppLink: (s: SubjectTree) => ({\n ...newSubjectAppLink,\n params: { parentId: s.id }\n })\n });\n\n if (canDelete)\n actions.push({\n label: 'Delete backbone subject',\n getAppLink: (s: SubjectTree) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.DELETE_SUBJECT,\n args: [s.id]\n }),\n className: 'text-danger'\n });\n\n return actions;\n }\n\n return (\n <div className={`${styles.navContainer} h-auto pe-2 border-end`}>\n <h2 className='h5 m-0 text-center'>Backbone Subjects</h2>\n <div className='d-flex justify-content-center'>\n <span className={`${canEdit ? 'border-bottom' : ''} badge bg-warning my-2`}>Topics</span>\n </div>\n {canEdit &&\n <AppLink appLink={newSubjectAppLink} className='d-inline-block border-top p-2'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Backbone Subject</span>\n </AppLink>\n }\n {!!subjectTree &&\n <div className='border-top pt-1'>\n <Tree<SubjectTree>\n tree={subjectTree}\n getAppLink={getAppLink}\n selectedIds={[selectedSubjectId]}\n actions={getActions()}\n />\n </div>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { TopNav } from 'shared/components';\nimport { AppChannels } from 'shared/constants';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { TopicsNavHelper } from 'shared/utils';\n\ninterface TopNavViewProps {\n currentAppLink: Core.AppLink;\n}\n\nexport function TopNavView({ currentAppLink }: TopNavViewProps): React.ReactElement {\n const { hasPermissions } = useCuratorPermissions();\n\n const navItems = TopicsNavHelper.getTopNavItems(AppChannels.SUBJECTS, hasPermissions);\n\n if (navItems.length < 2)\n return <></>;\n \n return (\n <TopNav\n navItems={navItems}\n currentAppLink={currentAppLink}\n />\n );\n}\n","export * from './audiences';\nexport * from './classifications';\nexport * from './levels';\nexport * from './presentations';\nexport * from './subjects';\nexport * from './top-nav';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"2zbtFQka.chunk.js","names":[],"sources":["../../../../../src/apps/subjects/views/audiences/delete-audience/DeleteAudienceView.tsx","../../../../../src/apps/subjects/views/audiences/edit-audience/EditAudienceView.tsx","../../../../../src/apps/subjects/views/audiences/new-audience/NewAudienceView.tsx","../../../../../src/apps/subjects/views/audiences/audience-nav/audience-nav.module.scss","../../../../../src/apps/subjects/views/audiences/audience-nav/AudienceNavView.tsx","../../../../../src/apps/subjects/views/audiences/edit-audience-members/EditAudienceMembers.tsx","../../../../../src/apps/subjects/views/classifications/classification-nav/classification-nav.module.scss","../../../../../src/apps/subjects/views/classifications/classification-nav/ClassificationNavView.tsx","../../../../../src/apps/subjects/views/classifications/delete-classification/DeleteClassificationView.tsx","../../../../../src/apps/subjects/views/classifications/edit-classification/EditClassificationView.tsx","../../../../../src/apps/subjects/views/classifications/new-classification/NewClassificationView.tsx","../../../../../src/apps/subjects/views/levels/edit-level/EditLevelView.tsx","../../../../../src/apps/subjects/views/levels/levels-redirect/LevelsRedirectView.tsx","../../../../../src/apps/subjects/views/levels/new-level/NewLevelView.tsx","../../../../../src/apps/subjects/views/levels/level-nav/level-nav.module.scss","../../../../../src/apps/subjects/views/levels/level-nav/LevelNavView.tsx","../../../../../src/apps/subjects/components/levels/level-audiences/LevelAudiences.tsx","../../../../../src/apps/subjects/views/levels/level-audiences/LevelAudiencesView.tsx","../../../../../src/apps/subjects/views/levels/edit-level-members/EditLevelMembersUtils.ts","../../../../../src/apps/subjects/views/levels/edit-level-members/EditLevelMembersView.tsx","../../../../../src/apps/subjects/views/levels/remove-level-member/RemoveLevelMemberView.tsx","../../../../../src/apps/subjects/views/presentations/edit-presentation/EditPresentationView.tsx","../../../../../src/apps/subjects/views/presentations/edit-presentations-list/EditPresentationsListView.tsx","../../../../../src/apps/subjects/views/presentations/new-presentation/NewPresentationView.tsx","../../../../../src/apps/subjects/views/subjects/add-subject-members/AddSubjectMembersUtils.ts","../../../../../src/apps/subjects/views/subjects/add-subject-members/AddSubjectMembersView.tsx","../../../../../src/apps/subjects/views/subjects/delete-subject/DeleteSubjectView.tsx","../../../../../src/apps/subjects/components/backbone-classifications/EditTopicSubjectDetailsForm.tsx","../../../../../src/apps/subjects/views/subjects/edit-subject/EditSubjectView.tsx","../../../../../src/apps/subjects/views/subjects/edit-subject-members/EditSubjectMembersUtils.ts","../../../../../src/apps/subjects/views/subjects/edit-subject-members/EditSubjectMembersView.tsx","../../../../../src/apps/subjects/views/subjects/new-subject/NewSubjectView.tsx","../../../../../src/apps/subjects/views/subjects/remove-subject-member/RemoveSubjectMemberView.tsx","../../../../../src/apps/subjects/views/subjects/subject-classifications/SubjectClassificationsView.tsx","../../../../../src/apps/subjects/views/subjects/subject-nav/subject-nav.module.scss","../../../../../src/apps/subjects/views/subjects/subject-nav/SubjectNavView.tsx","../../../../../src/apps/subjects/views/top-nav/TopNavView.tsx","../../../../../src/apps/subjects/views/index.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { PopupViewProps, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\ninterface DeleteAudienceViewProps {\n id: string;\n routeToOnDelete?: Core.AppLink;\n}\n\nexport function DeleteAudienceView(props: DeleteAudienceViewProps & PopupViewProps): React.ReactElement {\n const { id, routeToOnDelete, closePopup } = props;\n\n const [ audience, setAudience ] = React.useState<PresentationAudience>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getAudienceFetchOptions(id, setAudience), [id]);\n\n const deleteAudience = (): void => {\n setShowButtonSpinner(true);\n\n const onSuccess = () => {\n closePopup();\n\n if (routeToOnDelete)\n Core.AppLinkHelper.trigger(routeToOnDelete);\n };\n\n subjectDataService.deleteAudience(id, onSuccess, closePopup);\n };\n\n return (\n <Popup title='Delete Audience' closePopup={closePopup} showLoadingSpinner={!audience}>\n {!!audience &&\n <>\n <div>\n <p>Are you sure you want to delete <strong>{audience.name}</strong>?</p>\n </div>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='danger'\n onClick={deleteAudience}\n text='Yes, delete this audience'\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Presentation, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { CreateOrUpdateAudienceRequest } from 'shared/interfaces/data-requests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditAudienceDetails } from 'apps/subjects/components';\nimport { EditAudienceNav } from 'apps/subjects/components/audiences/edit-audience-nav/EditAudienceNav';\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\ninterface EditAudienceViewProps {\n presentationId: string;\n audienceId: string;\n presentationType: PresentationType;\n}\n\nexport function EditAudienceView(props: EditAudienceViewProps): React.ReactElement {\n const [ audience, setAudience ] = React.useState<PresentationAudience>();\n const [ levels, setLevels ] = React.useState<Level[]>();\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getAudienceFetchOptions(props.audienceId, setAudience), [props.audienceId]);\n useFetch(SubjectDataServiceHelper.getLevelsFetchOptions(setLevels), []);\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(\n props.presentationId,\n setPresentation\n ), [props.presentationId]);\n\n const saveAudience = (data: CreateOrUpdateAudienceRequest, onDone: () => void) =>\n subjectDataService.updateAudience(\n props.audienceId,\n { ...data, presentationId: props.presentationId },\n onDone,\n onDone\n );\n\n const appLinks = getSubjectAppLinks(props.presentationType);\n\n return (\n <>\n <EditAudienceNav\n presentation={presentation}\n audienceId={props.audienceId}\n presentationType={props.presentationType}\n />\n {!!audience && !!levels &&\n <EditAudienceDetails\n audience={audience}\n levels={levels}\n saveAudience={saveAudience}\n presentationId={props.presentationId}\n deleteAppLink={appLinks.deleteAudience(props.presentationId, props.audienceId)}\n />\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { BackButton } from 'shared/components';\nimport { DataServices } from 'shared/constants';\nimport { CreateOrUpdateAudienceRequest } from 'shared/interfaces/data-requests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { PresentationHelper } from 'shared/utils/PresentationHelper';\n\nimport { EditAudienceDetails } from 'apps/subjects/components';\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\ninterface NewAudienceViewProps {\n presentationId: string;\n presentationType: PresentationType;\n}\n\nexport function NewAudienceView({ presentationId, presentationType }: NewAudienceViewProps): React.ReactElement {\n const [ levels, setLevels ] = React.useState<Level[]>();\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getLevelsFetchOptions(setLevels), []);\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation), [presentationId]);\n\n const appLinks = getSubjectAppLinks(presentationType);\n\n const saveAudience = (data: CreateOrUpdateAudienceRequest, onDone: () => void) =>\n subjectDataService.createAudience(\n { ...data, presentationId },\n newAudience => {\n onDone();\n Core.AppLinkHelper.trigger(appLinks.audience(presentationId, newAudience.masterId));\n },\n onDone\n );\n\n return (\n <>\n <div className='pb-2'>\n <BackButton appLink={appLinks.presentationAudiences(presentationId)} backToName='audiences' />\n </div>\n {!!presentation && <h6>{`Presentation: ${PresentationHelper.formatPresentationName(presentation)}`}</h6>}\n {!!levels && <EditAudienceDetails levels={levels} presentationId={presentationId} saveAudience={saveAudience} />}\n </>\n );\n}\n",":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\nimport styles from './audience-nav.module.scss';\n\ninterface AudienceNavViewProps {\n presentationId: string;\n presentationType: PresentationType;\n selectedAudienceId?: string;\n}\n\nexport function AudienceNavView(props: AudienceNavViewProps): React.ReactElement {\n const [ audiences, setAudiences ] = React.useState<PresentationAudience[]>();\n\n useFetch(SubjectDataServiceHelper.getAudiencesFetchOptions(props.presentationId, setAudiences), []);\n\n const appLinks = getSubjectAppLinks(props.presentationType);\n\n return (\n <div className={`${styles.navContainer} h-auto pe-2 border-end`}>\n <h5 className='border-bottom pb-2'>Audiences</h5>\n <AppLink appLink={appLinks.newAudience(props.presentationId)} className='d-inline-block pb-2'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Audience</span>\n </AppLink>\n\n <div className='border-top pt-1'>\n <ul className='list-unstyled'>\n {audiences && audiences.map(audience => (\n <li key={audience.masterId} className='position-relative py-1'>\n <AppLink\n className={props.selectedAudienceId?.toString() === audience.masterId.toString() ? 'text-primary fw-semibold' : ''}\n appLink={appLinks.audience(props.presentationId, audience.masterId)}\n >\n {audience.name}\n </AppLink>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Audience, BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { LevelMemberType, OwnerType } from 'shared/enums';\nimport { SubjectDataServiceHelper } from 'shared/services';\nimport { PropHelper } from 'shared/utils';\n\nimport { AudienceMemberList, EditAudienceNav } from 'apps/subjects/components';\nimport { LevelMemberHelper } from 'apps/subjects/utils';\n\ninterface EditAudienceMembersViewProps {\n presentationId: string;\n audienceId: string;\n memberType: LevelMemberType;\n presentationType: PresentationType;\n}\n\nexport function EditAudienceMembersView(props: EditAudienceMembersViewProps): React.ReactElement {\n const { presentationId, audienceId, memberType, presentationType } = props;\n\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n const [ , setAudience ] = React.useState<Audience>();\n const [ members, setMembers ] = React.useState<BasePaginatedCollection<BaseObject>>();\n\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation), []);\n\n useFetch(SubjectDataServiceHelper.getAudienceFetchOptions(audienceId, setAudience), [audienceId]);\n\n useFetch(\n SubjectDataServiceHelper.getAudienceMembersFetchOptions(audienceId, memberType, setMembers),\n [ audienceId, memberType ]\n );\n\n const audienceMemberListProps = {\n items: members && members.data,\n memberType,\n getItemAppLink: (item: BaseObject) => LevelMemberHelper.getMemberAppLink(memberType, item.id),\n getActions: (item: BaseObject) =>\n LevelMemberHelper.getMemberActions(audienceId, OwnerType.Audience, memberType, item.id, presentationType)\n };\n\n const headerProps = { presentation, audienceId };\n\n const dataLoaded = PropHelper.propsLoaded(audienceMemberListProps);\n\n return (\n <>\n <EditAudienceNav {...headerProps} memberType={memberType} presentationType={presentationType} />\n {dataLoaded &&\n <AudienceMemberList {...audienceMemberListProps} />\n }\n </>\n );\n}\n",":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { useBulkFetch } from 'libs/common/react/hooks/UseBulkFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tree } from 'libs/shared/components/tree/Tree';\nimport { TreeNodeAction } from 'libs/shared/components/tree/TreeNode';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { ClassificationTree } from 'shared/interfaces/models';\nimport { SubjectDataServiceHelper } from 'shared/services/SubjectDataService';\n\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\nimport styles from './classification-nav.module.scss';\n\ninterface ClassificationNavViewProps {\n presentationId: string;\n presentationType: PresentationType;\n selectedClassificationId?: string;\n}\n\nfunction useFetchData(\n presentationId: string,\n setClassificationTree: (data: ClassificationTree) => void,\n setPresentation: (data: Presentation) => void\n): void {\n const classificationTreeFetchOptions =\n SubjectDataServiceHelper.getClassificationTreeFetchOptions(presentationId, setClassificationTree);\n\n const presentationFetchOptions =\n SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation);\n\n useBulkFetch([ classificationTreeFetchOptions, presentationFetchOptions ], [presentationId]);\n}\n\nexport function ClassificationNavView(props: ClassificationNavViewProps): React.ReactElement {\n const { presentationId, selectedClassificationId } = props;\n\n const [ classificationTree, setClassificationTree ] = React.useState<ClassificationTree>();\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n\n useFetchData(presentationId, setClassificationTree, setPresentation);\n\n const { hasPermissions } = useCuratorPermissions();\n\n const appLinks = getSubjectAppLinks(props.presentationType);\n\n const canEdit = hasPermissions(CuratorPermissionName.TopicsClassificationUpdate);\n const canDelete = hasPermissions(CuratorPermissionName.TopicsClassificationDelete);\n\n function getActions(): TreeNodeAction<ClassificationTree>[] {\n const actions = [];\n \n if (canEdit)\n actions.push({\n label: 'Add child',\n getAppLink: (c: ClassificationTree) => appLinks.newClassification(presentationId, c.id)\n });\n \n if (canDelete)\n actions.push({\n label: 'Delete topic',\n getAppLink: (c: ClassificationTree) => appLinks.deleteClassification(presentationId, c.id),\n className: 'text-danger'\n });\n \n return actions;\n }\n\n return (\n <div className={`${styles.navContainer} h-auto pe-2 border-end`}>\n {!!presentation && (\n <div className='pb-2 mb-2 border-bottom'>\n <div className='d-flex align-items-center justify-content-between mb-2'>\n <h6 className='mb-0'>\n Topics\n </h6>\n\n <AppLink\n appLink={{\n application: AppChannels.VISUALISER,\n action: Actions.Visualiser.PRESENTATION,\n args: [presentationId]\n }}\n className='btn btn-outline-dark btn-sm'\n >\n Visualise\n </AppLink>\n </div>\n <p className='mb-0'>{presentation.name}</p>\n <p className='mb-2'><em>{presentation.description}</em></p>\n </div>\n )}\n {canEdit &&\n <AppLink appLink={appLinks.newClassification(presentationId)} className='d-inline-block pb-2'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Topic</span>\n </AppLink>\n }\n {!!classificationTree &&\n <div className={`${canEdit ? 'border-top' : ''} pt-1`}>\n <Tree<ClassificationTree>\n tree={classificationTree}\n getAppLink={\n (classification: ClassificationTree) => appLinks.classification(presentationId, classification.id)\n }\n selectedIds={[selectedClassificationId]}\n actions={getActions()}\n />\n </div>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Classification, PopupViewProps } from 'libs/shared/interfaces';\n\nimport { ConfirmInputChallenge } from 'shared/components/confirm-input-challenge/ConfirmInputChallenge';\nimport { DataServices } from 'shared/constants';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\ninterface DeleteClassificationViewProps {\n classificationId: string;\n routeToOnDelete?: Core.AppLink;\n}\n\nexport function DeleteClassificationView(props: DeleteClassificationViewProps & PopupViewProps): React.ReactElement {\n const { classificationId, routeToOnDelete, closePopup } = props;\n\n const [ classification, setClassification ] = React.useState<Classification>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n const [ isChallengePassed, setIsChallengePassed ] = React.useState(false);\n\n useFetch(SubjectDataServiceHelper.getClassificationFetchOptions(classificationId, setClassification), []);\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const deleteClassification = (): void => {\n setShowButtonSpinner(true);\n\n const onSuccess = () => {\n closePopup();\n\n if (routeToOnDelete)\n Core.AppLinkHelper.trigger(routeToOnDelete);\n };\n\n subjectDataService.deleteClassification(classificationId, onSuccess, closePopup);\n };\n\n return (\n <Popup title='Delete Classification' closePopup={closePopup} showLoadingSpinner={!classification}>\n {!!classification &&\n <>\n <div>\n <p>Are you sure you want to delete <strong>{classification.name}</strong>?</p>\n </div>\n <ConfirmInputChallenge\n challengePhrase={classification.name}\n onChallengePass={(isPass: boolean) => setIsChallengePassed(isPass)}\n />\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='danger'\n onClick={deleteClassification}\n text='Yes, delete this classification'\n showSpinner={showButtonSpinner}\n disabled={!isChallengePassed}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { Classification, CuratedDashboardCollection, DashboardStatus, DashboardTargetType, Presentation, PresentationTheme } from 'libs/shared/interfaces';\nimport { THEME_ASSET_KEYS } from 'libs/shared/utils/ThemeAssetHelper';\n\nimport { EditClassificationDetails, EditClassificationNav } from 'shared/components/classifications';\nimport { AppChannels } from 'shared/constants';\nimport { AiRequests } from 'shared/flight-requests/AiRequests';\nimport { DashboardRequests } from 'shared/flight-requests/DashboardRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { ThemeRequests } from 'shared/flight-requests/ThemeRequests';\nimport { UpdateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { ClassificationTree, CuratorClassification, SubjectTree } from 'shared/interfaces/models';\nimport { DescriptionSuggestion } from 'shared/interfaces/models/DescriptionSuggestion';\nimport { TopicsNavHelper } from 'shared/utils';\n\nimport { AiError, getErrorMessage } from 'apps/assembly-line/hooks/useAi';\nimport { EditTopicClassificationDetailsForm } from 'apps/subjects/components/classifications';\nimport { ClassificationValidationSchema } from 'apps/subjects/utils';\n\ninterface EditClassificationViewProps {\n presentationId: string;\n classificationId: string;\n}\n\nexport function EditClassificationView(props: EditClassificationViewProps): React.ReactElement {\n const { presentationId, classificationId } = props;\n\n const fetchAsync = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n\n const classification = Flight.useBasicFetch<CuratorClassification>(\n SubjectRequests.classification(classificationId)\n );\n const presentation = Flight.useBasicFetch<Presentation>(\n SubjectRequests.presentation(presentationId)\n );\n const presentationThemes = Flight.useBasicFetch<PresentationTheme[]>(\n ThemeRequests.presentationThemes(presentationId)\n );\n\n const classificationTree = Flight.useBasicFetch<ClassificationTree>(\n SubjectRequests.getClassificationTree(presentationId)\n );\n const subjectTree = Flight.useBasicFetch<SubjectTree>(\n SubjectRequests.getSubjectTree(PresentationType.Subject, false)\n );\n\n const dashboards = Flight.useBasicFetch<CuratedDashboardCollection>(\n DashboardRequests.dashboards({\n targetType: DashboardTargetType.Classification,\n classificationId\n }, true)\n );\n\n async function updateClassificationCore(updatedClassification: Classification): Promise<void> {\n await fetchAsync(SubjectRequests.updateClassification(updatedClassification));\n\n if (!ObjectHelper.isEqual(updatedClassification.externalMetadata, classification.data.externalMetadata)) {\n await fetchAsync(SubjectRequests.updateClassificationExternalMetadata(\n updatedClassification.id,\n updatedClassification.externalMetadata\n ));\n }\n }\n\n async function getAiGeneratedDescription(classification: CuratorClassification): Promise<string | undefined> {\n try {\n const res = await fetchAsync<DescriptionSuggestion>(\n AiRequests.getTopicDescriptionSuggestion(classification.id, {})\n );\n return res.description;\n } catch (exception) {\n alerts.error(getErrorMessage((exception as AiError).responseJSON?.type));\n }\n }\n\n async function syncThemeAssets(data: UpdateClassificationRequest): Promise<void> {\n // remove: dissociate existing assets\n const deleteAssetRequests = ArrayHelper.flatMap(data.themes ?? [], submittedTheme => {\n const existingTheme = classification.data.themes?.data?.find(\n t => t.systemName === submittedTheme.systemName\n );\n if (!existingTheme) return [];\n\n return ArrayHelper.flatMap([...THEME_ASSET_KEYS], key => {\n const existingAsset = existingTheme[key];\n if ((!submittedTheme[key] || !Object.keys(submittedTheme[key]).length) && existingAsset?.id) {\n return [fetchAsync(SubjectRequests.deleteThemeAsset(existingTheme.id, existingAsset.id, key))];\n }\n });\n });\n\n await Promise.all(deleteAssetRequests);\n\n // update or add\n await Promise.all((data.themes ?? []).map(submittedTheme => {\n const existingTheme = classification.data.themes?.data?.find(\n t => t.systemName === submittedTheme.systemName\n );\n // only include changed assets in the payload\n const hasChanged = (key: typeof THEME_ASSET_KEYS[number]) =>\n submittedTheme[key] &&\n Object.keys(submittedTheme[key]).length &&\n !ObjectHelper.isEqual(submittedTheme[key], existingTheme?.[key]);\n\n if (!THEME_ASSET_KEYS.some(hasChanged)) return;\n\n return fetchAsync(ThemeRequests.updateClassificationTheme(classificationId, {\n themeSystemName: submittedTheme.systemName,\n ...(hasChanged('cover') && { cover: submittedTheme.cover }),\n ...(hasChanged('banner') && { banner: submittedTheme.banner }),\n ...(hasChanged('thumbnail') && { thumbnail: submittedTheme.thumbnail }),\n ...(hasChanged('tallPoster') && { tallPoster: submittedTheme.tallPoster }),\n ...(hasChanged('icon') && { icon: submittedTheme.icon })\n }));\n }));\n }\n\n async function saveClassification(data: UpdateClassificationRequest, onDone: () => void): Promise<void> {\n const updatedClassification = {\n ...classification.data,\n pinnedVideoMasterId: classification.data.pinnedVideoMasterId || null,\n ...data\n };\n\n delete updatedClassification.followers;\n delete updatedClassification.themes;\n\n try {\n await updateClassificationCore(updatedClassification);\n } catch {\n alerts.error(`Something went wrong while updating ${updatedClassification.name}. Please try again.`);\n onDone();\n return;\n }\n\n try {\n await syncThemeAssets(data);\n } catch {\n alerts.error(`Something went wrong while updating theme assets for ${updatedClassification.name}. Please try again.`);\n onDone();\n return;\n }\n\n alerts.success(`Successfully updated ${updatedClassification.name}.`);\n onDone();\n }\n\n const hasPublishedDashboard = dashboards.data?.data?.some(d => {\n return d.status === DashboardStatus.Published;\n });\n\n return (\n <div>\n <EditClassificationNav\n presentation={presentation.data}\n classificationId={classificationId}\n getTabs={(presentationId: string, classificationId: string, hasPermissions) =>\n TopicsNavHelper.getEditClassificationTabs(\n AppChannels.SUBJECTS,\n presentationId,\n classificationId,\n hasPermissions\n )}\n />\n {classification.hasCompleted && classificationTree.hasCompleted && subjectTree.hasCompleted &&\n <EditClassificationDetails\n classification={classification.data}\n saveClassification={saveClassification}\n validationSchema={ClassificationValidationSchema}\n >\n <EditTopicClassificationDetailsForm\n presentationId={presentationId}\n presentationType={presentation.data?.type}\n classificationTree={classificationTree.data}\n themes={presentationThemes.data}\n subjectTree={subjectTree.data}\n classification={classification.data}\n hasPublishedDashboard={hasPublishedDashboard}\n getAiGeneratedDescription={getAiGeneratedDescription}\n />\n </EditClassificationDetails>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Classification } from 'libs/shared/interfaces';\n\nimport { EditClassificationDetails } from 'shared/components/classifications';\nimport { DataServices } from 'shared/constants';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { CreateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService } from 'shared/services';\n\nimport { EditTopicClassificationDetailsForm } from 'apps/subjects/components/classifications';\nimport { ClassificationValidationSchema } from 'apps/subjects/utils';\nimport { getSubjectAppLinks } from 'apps/subjects/utils/getSubjectAppLinks';\n\nconst onCreateSuccess = (\n presentationId: string,\n presentationType: PresentationType,\n onDone: () => void\n) => (newClassification: Classification) => {\n onDone();\n\n if (!newClassification || !newClassification.id)\n return;\n\n Core.AppLinkHelper.trigger(getSubjectAppLinks(presentationType).newClassification(presentationId));\n};\n\ninterface NewClassificationViewProps {\n presentationId: string;\n parentId?: string;\n presentationType: PresentationType;\n}\n\nexport function NewClassificationView(props: NewClassificationViewProps): React.ReactElement {\n const { presentationId, parentId } = props;\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const classificationTree = Flight.useBasicFetch<ClassificationTree>(\n SubjectRequests.getClassificationTree(presentationId)\n );\n const subjectTree = Flight.useBasicFetch<SubjectTree>(\n SubjectRequests.getSubjectTree(PresentationType.Subject, false)\n );\n\n const saveClassification = (data: CreateClassificationRequest, onDone: () => void): void =>\n subjectDataService.createClassification(\n { ...data, presentationId },\n onCreateSuccess(presentationId, props.presentationType, onDone),\n onDone\n );\n\n return (\n <div>\n <h4 className='py-2'>Create New Classification</h4>\n {classificationTree.hasCompleted && subjectTree.hasCompleted &&\n <EditClassificationDetails\n classification={(parentId ? { parentIds: [parentId]} : {}) as Classification}\n saveClassification={saveClassification}\n validationSchema={ClassificationValidationSchema}\n >\n <EditTopicClassificationDetailsForm\n presentationId={props.presentationId}\n presentationType={props.presentationType}\n classificationTree={classificationTree.data}\n subjectTree={subjectTree.data}\n hasPublishedDashboard={false}\n />\n </EditClassificationDetails>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Actions, DataServices } from 'shared/constants';\nimport { CreateOrUpdateLevelRequest } from 'shared/interfaces/data-requests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditLevelDetails, EditLevelNav } from 'apps/subjects/components';\n\ninterface EditLevelViewProps {\n id: string;\n}\n\nexport function EditLevelView({ id }: EditLevelViewProps): React.ReactElement {\n const [ level, setLevel ] = React.useState<Level>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getLevelFetchOptions(id, setLevel), [id]);\n\n const saveLevel = (data: CreateOrUpdateLevelRequest, onDone: () => void) =>\n subjectDataService.updateLevel(id, data, onDone, onDone);\n\n return (\n <>\n <EditLevelNav levelId={id} activeAction={Actions.Subjects.EDIT_LEVEL} />\n <h4 className='py-2'>Edit Level</h4>\n {!!level && <EditLevelDetails level={level} saveLevel={saveLevel} />}\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nexport function LevelsRedirectView(): React.ReactElement {\n const [ levels, setLevels ] = React.useState<Level[]>();\n\n useFetch(SubjectDataServiceHelper.getLevelsFetchOptions(setLevels), []);\n\n React.useEffect(() => {\n if (!levels)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_LEVEL,\n args: [ArrayHelper.first(levels).id]\n }, { replace: true });\n }, [levels]);\n\n return <></>;\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdateLevelRequest } from 'shared/interfaces/data-requests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService } from 'shared/services';\n\nimport { EditLevelDetails } from 'apps/subjects/components';\n\nconst onCreateSuccess = (onDone: () => void) => (newLevel: Level) => {\n onDone();\n\n if (!newLevel || !newLevel.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_LEVEL,\n args: [newLevel.id]\n });\n};\n\nexport function NewLevelView(): React.ReactElement {\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const saveLevel = (data: CreateOrUpdateLevelRequest, onDone: () => void): void =>\n subjectDataService.createLevel(data, onCreateSuccess(onDone), onDone);\n\n return (\n <>\n <h4 className='py-2'>Create New Level</h4>\n <EditLevelDetails saveLevel={saveLevel} />\n </>\n );\n}\n",":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nimport styles from './level-nav.module.scss';\n\ninterface LevelNavViewProps {\n selectedLevelId?: string;\n}\n\nexport function LevelNavView({ selectedLevelId }: LevelNavViewProps): React.ReactElement {\n const [ levels, setLevels ] = React.useState<Level[]>();\n\n useFetch(SubjectDataServiceHelper.getLevelsFetchOptions(setLevels), []);\n\n const getAppLink = (level: Level) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_LEVEL,\n args: [level.id]\n });\n\n const newLevelAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.NEW_LEVEL\n };\n\n return (\n <div className={`${styles.navContainer} h-auto pe-2 border-end`}>\n <h5 className='border-bottom pb-2'>Backbone Audiences</h5>\n <AppLink appLink={newLevelAppLink} className='d-inline-block pb-2'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Backbone Audience</span>\n </AppLink>\n\n <div className='border-top pt-1'>\n <ul className='list-unstyled'>\n {levels && levels.map(level => (\n <li className='position-relative py-1'>\n <AppLink\n className={selectedLevelId?.toString() === level.id.toString() ? 'text-primary fw-semibold' : ''}\n appLink={getAppLink(level)}\n >\n {level.name}\n </AppLink>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PresentationAudience } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels } from 'shared/constants';\n\nconst getAudienceAppLink = (presentationId: string, audienceId: string) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_AUDIENCE,\n args: [ presentationId, audienceId ]\n});\n\ninterface PresentationAudiencesProps {\n presentation: Presentation;\n audiences: PresentationAudience[];\n}\n\nconst PresentationAudiences = (props: PresentationAudiencesProps) => (\n <div className='border rounded p-2 mb-3'>\n <h6 className='border-bottom pb-1'>{props.presentation.name}</h6>\n {(props.audiences && props.audiences.length) ?\n (\n <ul className='list-unstyled mb-0'>\n {props.audiences.map(a => (\n <li key={a.masterId} className='py-1'>\n <AppLink appLink={getAudienceAppLink(props.presentation.id, a.masterId)}>\n {a.name}\n </AppLink>\n </li>\n ))}\n </ul>\n ) : <p><em>There are no audiences mapped to this level in this presentation.</em></p>\n }\n </div>\n);\n\ninterface LevelAudiencesProps {\n presentations: Presentation[];\n audienceDictionary: {[presentationId: string]: PresentationAudience[] };\n}\n\nexport const LevelAudiences = (props: LevelAudiencesProps) => (\n <>\n {!!props.presentations && !!props.audienceDictionary && props.presentations.map(p => (\n <PresentationAudiences\n key={p.id}\n presentation={p}\n audiences={props.audienceDictionary[p.id]}\n />\n ))}\n </>\n);\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PresentationAudience } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { Actions } from 'shared/constants';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditLevelNav } from 'apps/subjects/components';\nimport { LevelAudiences } from 'apps/subjects/components/levels/level-audiences/LevelAudiences';\n\nfunction useFetchData(\n levelId: string,\n setState: React.Dispatch<React.SetStateAction<LevelAudiencesViewState>>\n): void {\n const getSetState = (key: keyof LevelAudiencesViewState) => StateHelper.getSetStateByKey(setState, key);\n\n useFetch(\n SubjectDataServiceHelper.getLevelAudiencesFetchOptions(levelId, getSetState('audiences')),\n [levelId]\n );\n\n useFetch(SubjectDataServiceHelper.getPresentationsFetchOptions(getSetState('presentations'), PresentationType.Subject), []);\n}\n\ninterface LevelAudiencesViewState {\n audiences?: PresentationAudience[];\n presentations?: Presentation[];\n}\n\ninterface LevelAudiencesViewProps {\n levelId: string;\n}\n\nexport function LevelAudiencesView({ levelId }: LevelAudiencesViewProps): JSX.Element {\n const [ state, setState ] = React.useState<LevelAudiencesViewState>({});\n\n useFetchData(levelId, setState);\n\n return (\n <>\n <EditLevelNav levelId={levelId} activeAction={Actions.Subjects.LEVEL_AUDIENCES} />\n <LevelAudiences\n presentations={state.presentations}\n audienceDictionary={ArrayHelper.groupBy(state.audiences, 'presentationId')}\n />\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Audience, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { LevelMemberType } from 'shared/enums';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { ClipRequests } from 'apps/clips/flight-requests/CuratorClipRequests';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { LevelMemberViewModel } from 'apps/subjects/components';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nimport { EditLevelMembersState, EditLevelMembersViewProps } from './EditLevelMembersView';\n\ntype SetState = React.Dispatch<React.SetStateAction<EditLevelMembersState>>;\n\n// Wrapper function for typing StateHelper.getSetStateByKey<T>\nexport function getSetState(setState: SetState, key: keyof EditLevelMembersState): (data: any) => void {\n return StateHelper.getSetStateByKey<EditLevelMembersState>(setState, key);\n}\n\n// Hook to fetch all data required for AddSubjectMembersView\nexport function useFetchData(\n props: EditLevelMembersViewProps,\n state: EditLevelMembersState,\n setState: SetState\n): void {\n const { presentationId, levelId, memberType } = props;\n\n useFetch(\n SubjectDataServiceHelper.getPresentationsFetchOptions(\n getSetState(setState, 'presentations'),\n PresentationType.Subject\n ),\n []\n );\n\n useFetch(\n SubjectDataServiceHelper.getLevelMemberIdsFetchOptions(\n levelId,\n memberType,\n getSetState(setState, 'memberIds')\n ),\n [ levelId, memberType ]\n );\n\n useFetch(\n !!presentationId &&\n SubjectDataServiceHelper.getLevelAudiencesFetchOptions(\n levelId,\n getSetState(setState, 'audiences'),\n presentationId,\n memberType\n ),\n [ levelId, memberType, presentationId ],\n !!presentationId\n );\n}\n\n// Hook to map audiences to members\nexport function useMapData(\n members: BaseObject[],\n props: EditLevelMembersViewProps,\n state: EditLevelMembersState,\n setState: SetState\n): void {\n const { audiences } = state;\n\n // Map audiences\n React.useEffect(() => {\n const setMembersWithAudiences = getSetState(setState, 'membersWithAudiences');\n setMembersWithAudiences(mapAudiencesToMembers(props.memberType, members, audiences));\n }, [ members, audiences ]);\n}\n\nexport function getMembersRequest(memberType: LevelMemberType, ids: string[]): Flight.Request {\n switch (memberType) {\n case LevelMemberType.Playlists:\n return PlaylistRequests.playlistsById(ids);\n\n case LevelMemberType.Series:\n return SeriesRequests.seriesById(ids);\n\n case LevelMemberType.Videos:\n return VideoRequests.videosById(ids);\n\n case LevelMemberType.Clips:\n return ClipRequests.clipsById(ids);\n\n case LevelMemberType.Interactives:\n return InteractiveRequests.interactivesById(ids);\n }\n}\n\nexport const getAudienceAppLink = (memberType: LevelMemberType, presentationId: string) =>\n (audienceId: string): Core.AppLink => {\n const application = AppChannels.SUBJECTS;\n const args = [ presentationId, audienceId ];\n\n let action;\n\n switch (memberType) {\n case LevelMemberType.Playlists:\n action = Actions.Subjects.EDIT_AUDIENCE_PLAYLISTS;\n break;\n\n case LevelMemberType.Series:\n action = Actions.Subjects.EDIT_AUDIENCE_SERIES;\n break;\n\n case LevelMemberType.Videos:\n action = Actions.Subjects.EDIT_AUDIENCE_VIDEOS;\n break;\n\n case LevelMemberType.Clips:\n action = Actions.Subjects.EDIT_AUDIENCE_CLIPS;\n break;\n\n case LevelMemberType.Interactives:\n action = Actions.Subjects.EDIT_AUDIENCE_INTERACTIVES;\n break;\n }\n\n return { application, action, args };\n };\n\n/**\n * For each member, list the audiences on the subject with a flag\n * to determine whether or not the member is associated with that audience.\n */\nfunction mapAudiencesToMembers(\n memberType: LevelMemberType,\n members: BaseObject[],\n audiences: PresentationAudience[]\n): LevelMemberViewModel[] {\n if (!members || !audiences)\n return;\n\n const isMemberInAudience = (member: BaseObject, audience: Audience) =>\n !!(audience as any)[memberType] &&\n !!(audience as any)[memberType].data.filter((m: BaseObject) => m.id === member.id).length;\n\n return members.map(m => ({\n id: m.id,\n name: m.name,\n audiences: audiences.map(a => ({ id: a.masterId, selected: isMemberInAudience(m, a) }))\n }));\n}\n\nexport function toggleObjectsInAudience(\n d: SubjectDataService,\n memberType: LevelMemberType,\n memberIds: string[],\n levelId: string,\n presentationId: string,\n audienceId: string,\n selected: boolean\n): void {\n const apiFn = selected ?\n d.addObjectsToAudience.bind(d) :\n d.removeObjectsFromAudience.bind(d);\n\n apiFn(audienceId, memberIds, memberType, levelId, presentationId);\n}\n\nexport function getActiveAction(memberType: LevelMemberType): string {\n switch (memberType) {\n case LevelMemberType.Playlists:\n return Actions.Subjects.EDIT_LEVEL_PLAYLISTS;\n\n case LevelMemberType.Series:\n return Actions.Subjects.EDIT_LEVEL_SERIES;\n\n case LevelMemberType.Videos:\n return Actions.Subjects.EDIT_LEVEL_VIDEOS;\n\n case LevelMemberType.Clips:\n return Actions.Subjects.EDIT_LEVEL_CLIPS;\n\n case LevelMemberType.Interactives:\n return Actions.Subjects.EDIT_LEVEL_INTERACTIVES;\n }\n}\n","import * as React from 'react';\nimport { Alert } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject, PresentationAudience } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { PresentationSelect } from 'shared/components/presentations';\nimport { AppChannels, DataServices } from 'shared/constants';\nimport { LevelMemberType, OwnerType } from 'shared/enums';\nimport { SubjectDataService } from 'shared/services';\n\nimport { EditLevelNav, LevelMemberViewModel } from 'apps/subjects/components';\nimport { LevelMemberList } from 'apps/subjects/components/levels/level-member-list';\nimport { LevelMemberHelper } from 'apps/subjects/utils';\n\nimport {\n getActiveAction,\n getAudienceAppLink,\n getMembersRequest,\n toggleObjectsInAudience,\n useFetchData,\n useMapData } from './EditLevelMembersUtils';\n\nexport interface EditLevelMembersState {\n // Data fetched from api.\n presentations?: Presentation[];\n audiences?: PresentationAudience[];\n memberIds?: string[];\n\n // View state.\n membersWithAudiences?: LevelMemberViewModel[];\n}\n\nexport interface EditLevelMembersViewProps {\n levelId: string;\n presentationId: string;\n memberType: LevelMemberType;\n action: string;\n}\n\nexport function EditLevelMembersView(props: EditLevelMembersViewProps): React.ReactElement {\n const [ state, setState ] = React.useState<EditLevelMembersState>({});\n\n const { presentations, audiences, memberIds, membersWithAudiences } = state;\n\n const members = Flight.useBasicFetch<BaseObject[]>((Array.isArray(memberIds) && memberIds.length) ?\n getMembersRequest(props.memberType, memberIds) :\n null);\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetchData(props, state, setState);\n useMapData(members.data, props, state, setState);\n\n React.useEffect(() => {\n if (props.presentationId || !presentations?.length)\n return;\n\n setPresentationParam(ArrayHelper.first(presentations).id);\n }, [props.presentationId]);\n\n function setPresentationParam(id: string): void {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: props.action,\n args: [props.levelId],\n params: {\n presentationId: id\n }\n });\n }\n\n const levelMemberDataLoaded = !!props.presentationId && !!audiences;\n\n return (\n <>\n <EditLevelNav\n levelId={props.levelId}\n presentationId={props.presentationId}\n activeAction={getActiveAction(props.memberType)}\n />\n <Alert variant='info' className='m-0'>\n {\n `Select which ${props.memberType} are shown for each audience in this level.` +\n ' Change the selected presentation to view different audiences.'\n }\n </Alert>\n <div className='w-50 py-2'>\n {!!presentations &&\n <PresentationSelect\n presentations={presentations}\n currentPresentationId={props.presentationId}\n setCurrentPresentation={p => setPresentationParam(p.id)}\n />\n }\n </div>\n {levelMemberDataLoaded &&\n <LevelMemberList\n members={membersWithAudiences || []}\n memberType={props.memberType}\n getMemberAppLink={(itemId: string) => LevelMemberHelper.getMemberAppLink(props.memberType, itemId)}\n getActions={(itemId: string) =>\n LevelMemberHelper.getMemberActions(\n props.levelId,\n OwnerType.Level,\n props.memberType,\n itemId\n )\n }\n audiences={audiences}\n getAudienceAppLink={props.presentationId &&\n getAudienceAppLink(props.memberType, props.presentationId)\n }\n onToggleAudience={(audienceId: string, selected: boolean, memberId?: string) =>\n toggleObjectsInAudience(\n subjectDataService,\n props.memberType,\n memberId ? [memberId] : memberIds,\n props.levelId,\n props.presentationId,\n audienceId,\n selected\n )\n }\n />\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Playlist, PopupViewProps, Series, Video } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { LevelMemberType } from 'shared/enums';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { Level } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { LevelMemberHelper } from 'apps/subjects/utils';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nfunction getMemberRequest(memberType: LevelMemberType, memberId: string): Flight.Request {\n switch (memberType) {\n case LevelMemberType.Playlists:\n return PlaylistRequests.playlist(memberId);\n\n case LevelMemberType.Series:\n return SeriesRequests.series(memberId);\n\n case LevelMemberType.Videos:\n return VideoRequests.video(memberId);\n\n case LevelMemberType.Clips:\n return SubjectRequests.member(memberId);\n\n case LevelMemberType.Interactives:\n return SubjectRequests.member(memberId);\n }\n}\n\ninterface RemoveLevelMemberViewProps {\n levelId: string;\n memberId: string;\n memberType: LevelMemberType;\n}\n\ntype MemberType = Playlist | Series | Video;\n\ntype PropTypes = RemoveLevelMemberViewProps & PopupViewProps;\n\nexport function RemoveLevelMemberView(props: PropTypes): React.ReactElement {\n const [ level, setLevel ] = React.useState<Level>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const member = Flight.useBasicFetch<MemberType>(getMemberRequest(props.memberType, props.memberId));\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(\n SubjectDataServiceHelper.getLevelFetchOptions(props.levelId, setLevel),\n [props.levelId]\n );\n\n const removeMember = () => {\n setShowButtonSpinner(true);\n\n subjectDataService.removeObjectsFromLevel(\n props.levelId,\n [props.memberId],\n props.memberType,\n props.closePopup,\n props.closePopup\n );\n };\n\n const dataLoaded = !!level && !!member.data;\n\n const popupTitle = `Remove ${TextHelper.toTitleCase(LevelMemberHelper.singularizeMemberType(props.memberType))}`;\n\n return (\n <Popup title={popupTitle} closePopup={props.closePopup} showLoadingSpinner={!dataLoaded}>\n {dataLoaded &&\n <>\n <div>\n <p>\n Are you sure you want to remove <strong>\n {member.data.name}</strong> from <strong>{level.name}</strong>?\n </p>\n <p>Please ensure that it is not in any audiences before removing.</p>\n </div>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='danger'\n onClick={removeMember}\n text={`Yes, remove this ${LevelMemberHelper.singularizeMemberType(props.memberType)}`}\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PresentationLearningLevel } from 'libs/shared/enums/PresentationLearningLevel';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ContentRegionCollection, Presentation, PresentationTheme } from 'libs/shared/interfaces';\nimport { TopicsHelper } from 'libs/shared/utils/topics-helper/TopicsHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { ContentRegionRequests } from 'shared/flight-requests/ContentRegionRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { ThemeRequests } from 'shared/flight-requests/ThemeRequests';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces';\n\nimport { PresentationRequests } from 'apps/cv-live/flight-requests/CvLivePresentationRequests';\nimport { EditTopicPresentationDetailsForm } from 'apps/subjects/components';\nimport { PresentationValidationSchema } from 'apps/subjects/utils';\n\ninterface EditPresentationViewProps {\n id: string;\n}\n\nexport function EditPresentationView({ id }: EditPresentationViewProps): React.ReactElement {\n const asyncFetch = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n\n const presentation = Flight.useBasicFetch<Presentation>(SubjectRequests.presentation(id));\n\n const cvLivePresentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.cvLivePresentation()\n );\n\n const contentRegionsResponse = Flight.useBasicFetch<ContentRegionCollection>(\n ContentRegionRequests.contentRegions()\n );\n const allPresentationThemes = Flight.useBasicFetch<PresentationTheme[]>(ThemeRequests.allThemes());\n const presentationThemes = Flight.useBasicFetch<PresentationTheme[]>(ThemeRequests.presentationThemes(id));\n\n const isStreamableLearning = presentation.data?.id === cvLivePresentation.data?.id;\n\n async function savePresentation(data: CreateOrUpdatePresentationRequest, onDone: () => void): Promise<void> {\n const { themes, defaultThemeSystemName, ...rest } = data;\n const payload = { ...rest, defaultThemeSystemName: defaultThemeSystemName || null };\n\n // associate & disassociate themes to presentation\n const oldThemes = presentationThemes.data?.map(t => t.systemName);\n const newThemes = themes;\n const toAdd = newThemes.filter(t => !oldThemes.includes(t));\n const toRemove = oldThemes.filter(t => !newThemes.includes(t));\n\n try {\n await Promise.all([\n ...toAdd.map(themeId => asyncFetch(ThemeRequests.addPresentationTheme(id, themeId))),\n ...toRemove.map(themeId => asyncFetch(ThemeRequests.removePresentationTheme(id, themeId)))\n ]);\n } catch {\n alerts.error('Failed to update presentation themes.');\n onDone();\n return;\n }\n\n // update presentation after themes are successfully associated/disassociated.\n try {\n await asyncFetch(SubjectRequests.updatePresentation(id, payload));\n alerts.success('Successfully updated presentation.');\n } catch {\n alerts.error('Failed to update presentation.');\n }\n onDone();\n }\n\n function getImageAppLink(): Core.AppLink {\n if (+cvLivePresentation.data?.id === +id)\n return {\n application: AppChannels.CV_LIVE,\n action: Actions.CvLive.UPLOAD_IMAGE\n };\n\n return {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.UPLOAD_IMAGE\n };\n }\n\n return (\n <>\n <h4 className='py-2'>Edit Presentation</h4>\n {!!presentation.data?.id && !!presentationThemes.hasCompleted &&\n <FormWrapper<CreateOrUpdatePresentationRequest, Presentation>\n initialValues={{\n ...presentation.data,\n\n learningLevel:\n TopicsHelper.getMappedPresentationLevel(presentation.data.learningLevel) as PresentationLearningLevel,\n themes: presentationThemes.data.map(t => t.systemName)\n }}\n validationSchema={PresentationValidationSchema}\n onSubmit={savePresentation}\n >\n <EditTopicPresentationDetailsForm\n isStreamableLearning={isStreamableLearning}\n isNew={false}\n imageAppLink={getImageAppLink()}\n contentRegions={contentRegionsResponse.data?.data}\n allPresentationThemes={allPresentationThemes.data}\n />\n </FormWrapper>\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { PresentationListNav } from 'shared/components/presentations/presentation-list';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nconst getAppLink = (presentation: Presentation) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_PRESENTATION,\n args: [presentation.id]\n});\n\nconst newPresentationAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.NEW_PRESENTATION\n};\n\nexport function EditPresentationsListView(): React.ReactElement {\n const [ presentations, setPresentations ] = React.useState<Presentation[]>();\n\n useFetch(SubjectDataServiceHelper.getPresentationsFetchOptions(setPresentations, PresentationType.Subject), []);\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canCreate = hasPermissions(CuratorPermissionName.TopicsPresentationsCreate);\n\n return (\n <div>\n <div className='d-flex justify-content-between mb-2'>\n <h5 className='d-inline-block m-0'>Select a presentation to edit:</h5>\n {canCreate &&\n <AppLink appLink={newPresentationAppLink} className='d-block'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Presentation</span>\n </AppLink>\n }\n </div>\n <PresentationListNav presentations={presentations} getAppLink={getAppLink} />\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ContentRegionCollection, Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { ContentRegionRequests } from 'shared/flight-requests/ContentRegionRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { ThemeRequests } from 'shared/flight-requests/ThemeRequests';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces';\n\nimport { EditTopicPresentationDetailsForm } from 'apps/subjects/components';\nimport { PresentationValidationSchema } from 'apps/subjects/utils';\n\nexport function NewPresentationView(): React.ReactElement {\n const asyncFetch = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n const { hasPermissions } = useCuratorPermissions();\n\n const canCreate = hasPermissions(CuratorPermissionName.TopicsPresentationsCreate);\n\n const contentRegionsResponse = Flight.useBasicFetch<ContentRegionCollection>(\n ContentRegionRequests.contentRegions()\n );\n\n async function savePresentation(data: CreateOrUpdatePresentationRequest, onDone: () => void): Promise<void> {\n let newPresentation: Presentation;\n try {\n newPresentation = await asyncFetch<Presentation>(SubjectRequests.createPresentation(data));\n } catch {\n alerts.error('Failed to create presentation.');\n onDone();\n return;\n }\n\n alerts.success('Successfully created presentation.');\n try {\n if (data.defaultThemeSystemName) {\n await asyncFetch(ThemeRequests.addPresentationTheme(newPresentation.id, data.defaultThemeSystemName));\n }\n\n onDone();\n\n if (!newPresentation.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_PRESENTATION,\n args: [newPresentation.id]\n });\n } catch {\n alerts.error('Failed to add theme to presentation.');\n }\n }\n\n const imageAppLink: Core.AppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.UPLOAD_IMAGE\n };\n\n // Redirect non-dev accounts back to presentation list\n if (!canCreate) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.PRESENTATIONS\n });\n\n return;\n }\n\n return (\n <>\n <h4 className='py-2'>Create New Presentation</h4>\n <FormWrapper<CreateOrUpdatePresentationRequest, Presentation>\n initialValues={null}\n validationSchema={PresentationValidationSchema}\n onSubmit={savePresentation}\n >\n <EditTopicPresentationDetailsForm\n isNew={true}\n imageAppLink={imageAppLink}\n contentRegions={contentRegionsResponse.data?.data}\n />\n </FormWrapper>\n </>\n );\n}\n","import { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\nimport { SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { ClassificationMemberHelper } from 'shared/utils';\n\nimport { ClipRequests } from 'apps/clips/flight-requests/CuratorClipRequests';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nimport { AddSubjectMembersViewProps, AddSubjectMembersViewState } from './AddSubjectMembersView';\n\ntype SetState = React.Dispatch<React.SetStateAction<AddSubjectMembersViewState>>;\n\n// Wrapper function for typing StateHelper.getSetStateByKey<T>\nexport function getSetState(setState: SetState, key: keyof AddSubjectMembersViewState): (data: any) => void {\n return StateHelper.getSetStateByKey<AddSubjectMembersViewState>(setState, key);\n}\n\n// Hook to fetch all data required for AddSubjectMembersView\nexport function useFetchData(\n props: AddSubjectMembersViewProps,\n setState: SetState\n): void {\n const subjectTreeFetchOptions = SubjectDataServiceHelper.getSubjectTreeFetchOptions(\n getSetState(setState, 'subjectTree'),\n PresentationType.Subject\n );\n\n useFetch(subjectTreeFetchOptions, []);\n}\n\nexport function addToSubject(\n objects: BaseObject[],\n subjectDataService: SubjectDataService,\n props: AddSubjectMembersViewProps,\n state: AddSubjectMembersViewState,\n setState: SetState\n): void {\n const { selectedSubject } = state;\n\n const onDone = () => getSetState(setState, 'showConfirmationPopup')(false);\n\n const onSuccess = () => {\n onDone();\n Core.AppLinkHelper.trigger(getSubjectMemberAppLink(selectedSubject.id, props.memberType));\n };\n\n subjectDataService.addObjectsToSubject(\n selectedSubject.id,\n objects.map(o => o.id),\n props.memberType,\n state.addToClassifications,\n onSuccess,\n onDone\n );\n}\n\nexport function getObjectRequest(memberType: SubjectMemberType, ids: string[]): Flight.Request {\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return PlaylistRequests.playlistsById(ids);\n\n case SubjectMemberType.Series:\n return SeriesRequests.seriesById(ids);\n\n case SubjectMemberType.Videos:\n return VideoRequests.videosById(ids);\n\n case SubjectMemberType.Clips:\n return ClipRequests.clipsById(ids);\n\n case SubjectMemberType.Interactives:\n return InteractiveRequests.interactivesById(ids);\n }\n}\n\nexport function getConfirmationPopupTitle(\n memberType: SubjectMemberType,\n objects: BaseObject[],\n subject: SubjectTree\n): string {\n if (!objects || !subject)\n return;\n\n const memberText = objects.length === 1 ?\n `this ${ClassificationMemberHelper.singularizeMemberType(memberType)}` :\n `these ${memberType}`;\n\n return `Add ${memberText} to ${subject.name}`;\n}\n\nfunction getSubjectMemberAppLink(subjectId: string, memberType: SubjectMemberType): Core.AppLink {\n const baseAppLink = { application: AppChannels.SUBJECTS, args: [subjectId]};\n\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_PLAYLISTS };\n\n case SubjectMemberType.Series:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_SERIES };\n\n case SubjectMemberType.Videos:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_VIDEOS };\n\n case SubjectMemberType.Clips:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_CLIPS };\n\n case SubjectMemberType.Interactives:\n return { ...baseAppLink, action: Actions.Subjects.EDIT_SUBJECT_INTERACTIVES };\n }\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ConfirmationPopup } from 'libs/shared/components/confirmation-popup/ConfirmationPopup';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { AddSubjectMembers } from 'shared/components';\nimport { DataServices } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService } from 'shared/services';\nimport { ClassificationMemberHelper } from 'shared/utils';\n\nimport {\n addToSubject,\n getConfirmationPopupTitle,\n getObjectRequest,\n getSetState,\n useFetchData } from './AddSubjectMembersUtils';\n\nfunction getMemberName(memberType: SubjectMemberType): string {\n return TextHelper.toTitleCase(ClassificationMemberHelper.singularizeMemberType(memberType));\n}\n\nfunction getOnClickAddToSubject(\n state: AddSubjectMembersViewState,\n setState: React.Dispatch<React.SetStateAction<AddSubjectMembersViewState>>\n): (backboneClassificationIds: string[], addToClassifications: boolean, setSubmittingFalse: () => void) => void {\n return (backboneClassificationIds: string[], addToClassifications: boolean, setSubmittingFalse: () => void) => {\n // Set submitting to false as we are showing a confirmation popup before making an api call.\n setSubmittingFalse();\n\n getSetState(setState, 'selectedSubject')(TreeHelper.find(state.subjectTree, ArrayHelper.first(backboneClassificationIds)));\n getSetState(setState, 'addToClassifications')(addToClassifications);\n getSetState(setState, 'showConfirmationPopup')(true);\n };\n}\n\nexport interface AddSubjectMembersViewState {\n // Api Data\n subjectTree?: SubjectTree;\n classificationTree?: ClassificationTree;\n\n // View State\n selectedSubject?: SubjectTree;\n addToClassifications?: boolean;\n showConfirmationPopup?: boolean;\n}\n\nexport interface AddSubjectMembersViewProps {\n memberType: SubjectMemberType;\n objectIds: string[];\n}\n\nexport function AddSubjectMembersView(props: AddSubjectMembersViewProps): React.ReactElement {\n const [ state, setState ] = React.useState<AddSubjectMembersViewState>({});\n\n const objects = Flight.useBasicFetch<BaseObject[]>(getObjectRequest(props.memberType, props.objectIds));\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetchData(props, setState);\n\n const setShowConfirmationPopup = (show: boolean) => getSetState(setState, 'showConfirmationPopup')(show);\n\n return (\n <>\n {!!objects.data && !!state.subjectTree &&\n <AddSubjectMembers\n memberType={props.memberType}\n presentationType={PresentationType.Subject}\n objects={objects.data}\n subjectTree={state.subjectTree}\n onClickAddToSubject={getOnClickAddToSubject(state, setState)}\n />\n }\n {state.showConfirmationPopup &&\n <ConfirmationPopup\n title={getConfirmationPopupTitle(props.memberType, objects.data, state.selectedSubject)}\n onClickConfirm={() => addToSubject(objects.data, subjectDataService, props, state, setState)}\n closePopup={() => setShowConfirmationPopup(false)}\n >\n <p>\n {`The following ${props.memberType} will be added to `}\n <strong>{state.selectedSubject.name}</strong>\n {state.addToClassifications ? ` and its mapped topics:` : ':'}\n </p>\n <ul>\n {objects.data.map(o =>\n <li key={o.id}>{o.name}</li>)}\n </ul>\n {!state.addToClassifications &&\n <p>{`${objects.data.length === 1 ? 'It' : 'They'} will not be added to its mapped topics.`}</p>\n }\n <p>\n {`${getMemberName(props.memberType)} to topic mappings can be managed from the `}\n <strong>{`Edit Backbone Subject ${TextHelper.toTitleCase(props.memberType)} `}</strong>\n page.\n </p>\n </ConfirmationPopup>\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { PopupViewProps, Subject } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\ninterface DeleteSubjectViewProps {\n subjectId: string;\n routeToOnDelete?: Core.AppLink;\n}\n\nexport function DeleteSubjectView(props: DeleteSubjectViewProps & PopupViewProps): React.ReactElement {\n const { subjectId, routeToOnDelete, closePopup } = props;\n\n const [ subject, setSubject ] = React.useState<Subject>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n useFetch(SubjectDataServiceHelper.getSubjectFetchOptions(subjectId, setSubject), []);\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const deleteSubject = (): void => {\n setShowButtonSpinner(true);\n\n const onSuccess = () => {\n closePopup();\n\n if (routeToOnDelete)\n Core.AppLinkHelper.trigger(routeToOnDelete);\n };\n\n subjectDataService.deleteSubject(subjectId, onSuccess, closePopup);\n };\n\n return (\n <Popup title='Delete Backbone Subject' closePopup={closePopup} showLoadingSpinner={!subject}>\n {!!subject &&\n <>\n <div>\n <p>Are you sure you want to delete <strong>{subject.name}</strong>?</p>\n <p>Backbone subject that have mapped topics cannot be deleted.</p>\n </div>\n <PopupButtons>\n <PopupButtons.Cancel onClick={closePopup} />\n <PopupButtons.Submit\n variant='danger'\n onClick={deleteSubject}\n text='Yes, delete this backbone subject'\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\nimport { Form, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { useCanSubmitForm } from 'libs/shared/hooks/UseCanSubmitForm';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { TreeSelect } from 'shared/components';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { CreateOrUpdateSubjectRequest } from 'shared/interfaces/data-requests';\nimport { SubjectTree } from 'shared/interfaces/models';\n\nconst isNodeDisabled = (subjectTree: SubjectTree, subjectId: string) =>\n (node: SubjectTree) => {\n if (node.id === subjectId)\n return true;\n\n const subjectNode = TreeHelper.find(subjectTree, subjectId);\n\n return !!TreeHelper.find(subjectNode, node.id);\n };\n\ninterface EditTopicSubjectDetailsFormProps {\n id?: string;\n subjectTree: SubjectTree;\n deleteSubject: Core.AppLink;\n}\n\nexport function EditTopicSubjectDetailsForm(props: EditTopicSubjectDetailsFormProps): React.ReactElement {\n const isNew = !props.id;\n\n const formikProps = useFormikContext<CreateOrUpdateSubjectRequest>();\n\n const canSubmit = useCanSubmitForm(formikProps);\n\n const collapseInitialState = !isNew || !!formikProps.values.parentId;\n\n const [ collapseParentSelect, setCollapseParentSelect ] = React.useState(collapseInitialState);\n\n React.useEffect(() => setCollapseParentSelect(collapseInitialState), [ props.id, formikProps.values.parentId ]);\n\n const onSelectParent = (item: SubjectTree) => {\n const newParentId = item.id === formikProps.values.parentId ?\n null :\n item.id;\n\n formikProps.setFieldValue('parentId', newParentId);\n };\n\n const treeSelectClassName = `${FormHelper.getCustomFormControlClassName(formikProps.errors, formikProps.touched, 'parentId')} h-auto py-2`;\n\n const { hasPermissions } = useCuratorPermissions();\n const canEdit = hasPermissions(CuratorPermissionName.TopicsBackboneUpdate);\n\n return (\n <Form>\n <FormField<CreateOrUpdateSubjectRequest>\n label='Name'\n name='name'\n id='name'\n value={formikProps.values.name}\n placeholder='Enter a name for this backbone subject'\n disabled={!canEdit}\n autoFocus\n />\n <FormField<CreateOrUpdateSubjectRequest>\n name='parentId'\n disabled={!canEdit}\n >\n {() => (\n <div className={treeSelectClassName}>\n <TreeSelect<SubjectTree>\n label='Parent Backbone Subject'\n tree={props.subjectTree}\n selectedIds={[formikProps.values.parentId]}\n onSelect={onSelectParent}\n collapse={collapseParentSelect}\n noSelectionMessage='No parent selected, this will be a root backbone subject.'\n isNodeDisabled={isNodeDisabled(props.subjectTree, props.id)}\n />\n </div>\n )}\n </FormField>\n <div className='d-flex justify-content-between'>\n {canEdit &&\n <SpinnerButton showSpinner={formikProps.isSubmitting} type='submit' disabled={!canSubmit}>\n {isNew ? 'Create' : 'Save'}\n </SpinnerButton>\n }\n {!isNew && hasPermissions(CuratorPermissionName.TopicsBackboneDelete) &&\n <AppLink\n className='btn btn-outline-danger'\n appLink={({\n ...props.deleteSubject,\n args: [props.id]\n })}\n >\n Delete\n </AppLink>\n }\n </div>\n </Form>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Subject } from 'libs/shared/interfaces';\n\nimport { EditSubjectNav } from 'shared/components';\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdateSubjectRequest } from 'shared/interfaces/data-requests';\nimport { SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { TopicsNavHelper } from 'shared/utils';\n\nimport { EditTopicSubjectDetailsForm } from 'apps/subjects/components/backbone-classifications';\nimport { SubjectValidationSchema } from 'apps/subjects/utils';\n\ninterface EditSubjectViewProps {\n subjectId: string;\n}\n\nexport function EditSubjectView({ subjectId }: EditSubjectViewProps): React.ReactElement {\n const [ subject, setSubject ] = React.useState<Subject>();\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const subjectFetchOptions =\n SubjectDataServiceHelper.getSubjectFetchOptions(subjectId, setSubject);\n\n const subjectTreeFetchOptions =\n SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Subject);\n\n useFetch(subjectTreeFetchOptions, []);\n useFetch(subjectFetchOptions, [subjectId]);\n\n const saveSubject = (data: CreateOrUpdateSubjectRequest, onDone: () => void): void =>\n subjectDataService.updateSubject(subjectId, data, onDone, onDone);\n\n const deleteSubjectAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.DELETE_SUBJECT\n };\n\n return (\n <>\n <EditSubjectNav\n subjectId={subjectId}\n presentationType={PresentationType.Subject}\n activeAction={Actions.Subjects.EDIT_SUBJECT}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.SUBJECTS, subjectId, presentationId)}\n />\n {!!subject && !!subjectTree &&\n <FormWrapper<CreateOrUpdateSubjectRequest>\n initialValues={subject}\n validationSchema={SubjectValidationSchema}\n onSubmit={saveSubject}\n >\n <EditTopicSubjectDetailsForm\n id={subjectId}\n subjectTree={subjectTree}\n deleteSubject={deleteSubjectAppLink}\n />\n </FormWrapper>\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { BaseObject, Classification } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { SubjectMemberViewModel } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { ClipRequests } from 'apps/clips/flight-requests/CuratorClipRequests';\nimport { InteractiveRequests } from 'apps/interactives/flight-requests/CuratorInteractiveRequests';\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nimport { EditSubjectMembersState, EditSubjectMembersViewProps } from './EditSubjectMembersView';\n\ntype SetState = React.Dispatch<React.SetStateAction<EditSubjectMembersState>>;\n\n// Wrapper function for typing StateHelper.getSetStateByKey<T>\nexport function getSetState(setState: SetState, key: keyof EditSubjectMembersState): (data: any) => void {\n return StateHelper.getSetStateByKey<EditSubjectMembersState>(setState, key);\n}\n\n// Hook to fetch all data required for AddSubjectMembersView\nexport function useFetchData(\n props: EditSubjectMembersViewProps,\n state: EditSubjectMembersState,\n setState: SetState\n): void {\n const { subjectId, memberType, presentationId } = props;\n\n useFetch(\n SubjectDataServiceHelper.getPresentationsFetchOptions(\n getSetState(setState, 'presentations'),\n PresentationType.Subject\n ),\n []\n );\n\n useFetch(\n SubjectDataServiceHelper.getSubjectMemberIdsFetchOptions(\n subjectId,\n memberType,\n getSetState(setState, 'memberIds')\n ),\n [ subjectId, memberType ]\n );\n\n useFetch(\n !!presentationId &&\n SubjectDataServiceHelper.getSubjectClassificationFetchOptions(\n subjectId,\n getSetState(setState, 'classifications'),\n presentationId,\n memberType\n ),\n [ subjectId, memberType, presentationId ],\n !!presentationId\n );\n}\n\n// Hook to map classifications to members\nexport function useMapData(\n members: BaseObject[],\n props: EditSubjectMembersViewProps,\n state: EditSubjectMembersState,\n setState: SetState\n): void {\n const { classifications } = state;\n\n // Map classifications\n React.useEffect(() => {\n const setMembersWithClassifications = getSetState(setState, 'membersWithClassifications');\n setMembersWithClassifications(mapClassificationsToMembers(props.memberType, members, classifications));\n }, [ members, classifications ]);\n}\n\nexport function getMembersRequest(memberType: SubjectMemberType, ids: string[]): Flight.Request {\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return PlaylistRequests.playlistsById(ids);\n\n case SubjectMemberType.Series:\n return SeriesRequests.seriesById(ids);\n\n case SubjectMemberType.Videos:\n return VideoRequests.videosById(ids);\n\n case SubjectMemberType.Clips:\n return ClipRequests.clipsById(ids);\n\n case SubjectMemberType.Interactives:\n return InteractiveRequests.interactivesById(ids);\n }\n}\n\nexport const getClassificationAppLink = (memberType: SubjectMemberType, presentationId: string) =>\n (classificationId: string): Core.AppLink => {\n const application = AppChannels.SUBJECTS;\n const args = [ presentationId, classificationId ];\n\n let action;\n\n switch (memberType) {\n case SubjectMemberType.Playlists:\n action = Actions.Subjects.EDIT_CLASSIFICATION_PLAYLISTS;\n break;\n\n case SubjectMemberType.Series:\n action = Actions.Subjects.EDIT_CLASSIFICATION_SERIES;\n break;\n\n case SubjectMemberType.Videos:\n action = Actions.Subjects.EDIT_CLASSIFICATION_VIDEOS;\n break;\n\n case SubjectMemberType.Clips:\n action = Actions.Subjects.EDIT_CLASSIFICATION_CLIPS;\n break;\n\n case SubjectMemberType.Interactives:\n action = Actions.Subjects.EDIT_CLASSIFICATION_INTERACTIVES;\n break;\n }\n\n return { application, action, args };\n };\n\n/**\n * For each member, list the classifications on the subject with a flag\n * to determine whether or not the member is associated with that classification.\n */\nfunction mapClassificationsToMembers(\n memberType: SubjectMemberType,\n members: BaseObject[],\n classifications: Classification[]\n): SubjectMemberViewModel[] {\n if (!members || !Array.isArray(members) || !classifications)\n return;\n\n const isMemberInClassification = (member: BaseObject, classification: Classification) =>\n !!(classification as any)[memberType] &&\n !!(classification as any)[memberType].data.filter((m: BaseObject) => m.id === member.id).length;\n\n return members.map(m => ({\n id: m.id,\n name: m.name,\n classifications: classifications.map(c => ({ id: c.id, selected: isMemberInClassification(m, c) }))\n }));\n}\n\nexport function toggleObjectsInClassification(\n d: SubjectDataService,\n memberType: SubjectMemberType,\n memberIds: string[],\n subjectId: string,\n presentationId: string,\n classificationId: string,\n selected: boolean\n): void {\n const apiFn = selected ?\n d.addObjectsToClassification.bind(d) :\n d.removeObjectsFromClassification.bind(d);\n\n apiFn(classificationId, memberIds, memberType, subjectId, presentationId);\n}\n\nexport function getActiveAction(memberType: SubjectMemberType): string {\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return Actions.Subjects.EDIT_SUBJECT_PLAYLISTS;\n\n case SubjectMemberType.Series:\n return Actions.Subjects.EDIT_SUBJECT_SERIES;\n\n case SubjectMemberType.Videos:\n return Actions.Subjects.EDIT_SUBJECT_VIDEOS;\n\n case SubjectMemberType.Clips:\n return Actions.Subjects.EDIT_SUBJECT_CLIPS;\n\n case SubjectMemberType.Interactives:\n return Actions.Subjects.EDIT_SUBJECT_INTERACTIVES;\n }\n}\n","import * as React from 'react';\nimport { Alert } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { BaseObject, Classification } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { EditSubjectNav, SubjectMemberList, SubjectMemberViewModel } from 'shared/components';\nimport { PresentationSelect } from 'shared/components/presentations';\nimport { AppChannels, DataServices } from 'shared/constants';\nimport { OwnerType, SubjectMemberType } from 'shared/enums';\nimport { SubjectDataService } from 'shared/services';\nimport { ClassificationMemberHelper, TopicsNavHelper } from 'shared/utils';\n\nimport {\n getActiveAction,\n getClassificationAppLink,\n getMembersRequest,\n toggleObjectsInClassification,\n useFetchData,\n useMapData } from './EditSubjectMembersUtils';\n\nexport interface EditSubjectMembersState {\n // Data fetched from api.\n presentations?: Presentation[];\n classifications?: Classification[];\n memberIds?: string[];\n\n // View state.\n membersWithClassifications?: SubjectMemberViewModel[];\n}\n\nexport interface EditSubjectMembersViewProps {\n subjectId: string;\n presentationId: string;\n memberType: SubjectMemberType;\n action: string;\n}\n\nexport function EditSubjectMembersView(props: EditSubjectMembersViewProps): React.ReactElement {\n const [ state, setState ] = React.useState<EditSubjectMembersState>({});\n\n const { presentations, classifications, memberIds, membersWithClassifications } = state;\n\n const manageableMembers = memberIds?.length >= 50 ? memberIds.slice(0, 49) : memberIds;\n\n const members = Flight.useBasicFetch<BaseObject[]>(manageableMembers\n && getMembersRequest(props.memberType, manageableMembers));\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetchData(props, state, setState);\n useMapData(members.data, props, state, setState);\n\n React.useEffect(() => {\n if (props.presentationId || !presentations?.length)\n return;\n\n setPresentationParam(ArrayHelper.first(presentations).id);\n }, [props.presentationId]);\n\n function setPresentationParam(id: string): void {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: props.action,\n args: [props.subjectId],\n params: {\n presentationId: id\n }\n });\n }\n\n const subjectMemberDataLoaded = !!props.presentationId && !!classifications;\n\n return (\n <>\n <EditSubjectNav\n subjectId={props.subjectId}\n presentationType={PresentationType.Subject}\n presentationId={props.presentationId}\n activeAction={getActiveAction(props.memberType)}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.SUBJECTS, subjectId, presentationId)}\n />\n <Alert variant='info' className='m-0'>\n {\n `Select which ${props.memberType} are shown for each topic in this backbone subject.` +\n ' Change the selected presentation to view different topics.'\n }\n </Alert>\n <div className='w-50 py-2'>\n {!!presentations &&\n <PresentationSelect\n presentations={presentations}\n currentPresentationId={props.presentationId}\n setCurrentPresentation={p => setPresentationParam(p.id)}\n />\n }\n </div>\n {subjectMemberDataLoaded &&\n <SubjectMemberList\n members={membersWithClassifications || []}\n memberType={props.memberType}\n getMemberAppLink={(itemId: string) => ClassificationMemberHelper.getMemberAppLink(props.memberType, itemId)}\n getActions={(itemId: string) =>\n ClassificationMemberHelper.getMemberActions(\n AppChannels.SUBJECTS,\n props.subjectId,\n OwnerType.Subject,\n props.memberType,\n itemId\n )\n }\n classifications={classifications}\n getClassificationAppLink={props.presentationId &&\n getClassificationAppLink(props.memberType, props.presentationId)\n }\n onToggleClassification={(classificationId: string, selected: boolean, memberId?: string) =>\n toggleObjectsInClassification(\n subjectDataService,\n props.memberType,\n memberId ? [memberId] : memberIds,\n props.subjectId,\n props.presentationId,\n classificationId,\n selected\n )\n }\n />\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Subject } from 'libs/shared/interfaces';\n\nimport { BackButton } from 'shared/components';\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdateSubjectRequest } from 'shared/interfaces/data-requests';\nimport { SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditTopicSubjectDetailsForm } from 'apps/subjects/components/backbone-classifications';\nimport { SubjectValidationSchema } from 'apps/subjects/utils';\n\nconst onCreateSuccess = (onDone: () => void) => (newSubject: Subject) => {\n onDone();\n\n if (!newSubject || !newSubject.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_SUBJECT,\n args: [newSubject.id]\n });\n};\n\ninterface NewSubjectViewProps {\n parentId?: string;\n}\n\nexport function NewSubjectView({ parentId }: NewSubjectViewProps): React.ReactElement {\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const subjectTreeFetchOptions =\n SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Subject);\n\n useFetch(subjectTreeFetchOptions, []);\n\n const saveSubject = (data: CreateOrUpdateSubjectRequest, onDone: () => void): void => {\n /**\n * Where no parent is selected, we want to map the backbone-classificatino to the root node.\n * Because we have both Subject and Curriculum root nodes, we need to ensure that is hooked \n * to the correct object\n */\n if (!+data.parentId)\n data.parentId = subjectTree.id;\n\n return subjectDataService.createSubject(data, onCreateSuccess(onDone), onDone);\n };\n\n const presentationAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.PRESENTATIONS\n };\n\n const deleteSubjectAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.DELETE_SUBJECT\n };\n\n return (\n <>\n <div className='pb-2 border-bottom'>\n <BackButton backToName='Presentations' appLink={presentationAppLink} />\n </div>\n <h4 className='py-2'>Create New Subject</h4>\n {!!subjectTree &&\n <FormWrapper<CreateOrUpdateSubjectRequest>\n initialValues={{ parentId }}\n validationSchema={SubjectValidationSchema}\n onSubmit={saveSubject}\n >\n <EditTopicSubjectDetailsForm\n id={parentId}\n subjectTree={subjectTree}\n deleteSubject={deleteSubjectAppLink}\n />\n </FormWrapper>\n }\n </>\n );\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Playlist, PopupViewProps, Series, Subject, Video } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { ClassificationMemberHelper } from 'shared/utils';\n\nimport { PlaylistRequests } from 'apps/playlists/flight-requests/CuratorPlaylistRequests';\nimport { SeriesRequests } from 'apps/series/flight-requests/CuratorSeriesRequests';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\nfunction getMemberRequest(memberType: SubjectMemberType, memberId: string): Flight.Request {\n switch (memberType) {\n case SubjectMemberType.Playlists:\n return PlaylistRequests.playlist(memberId);\n\n case SubjectMemberType.Series:\n return SeriesRequests.series(memberId);\n\n case SubjectMemberType.Videos:\n return VideoRequests.video(memberId);\n\n case SubjectMemberType.Clips:\n return SubjectRequests.member(memberId);\n\n case SubjectMemberType.Interactives:\n return SubjectRequests.member(memberId);\n }\n}\n\ninterface RemoveSubjectMemberViewProps {\n subjectId: string;\n memberId: string;\n memberType: SubjectMemberType;\n}\n\ntype MemberType = Playlist | Series | Video;\n\ntype PropTypes = RemoveSubjectMemberViewProps & PopupViewProps;\n\nexport function RemoveSubjectMemberView(props: PropTypes): React.ReactElement {\n const [ subject, setSubject ] = React.useState<Subject>();\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n const member = Flight.useBasicFetch<MemberType>(getMemberRequest(props.memberType, props.memberId));\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(\n SubjectDataServiceHelper.getSubjectFetchOptions(props.subjectId, setSubject),\n [props.subjectId]\n );\n\n const removeMember = () => {\n setShowButtonSpinner(true);\n\n subjectDataService.removeObjectsFromSubject(\n props.subjectId,\n [props.memberId],\n props.memberType,\n props.closePopup,\n props.closePopup\n );\n };\n\n const dataLoaded = !!subject && !!member.data;\n\n const popupTitle = `Remove ${TextHelper.toTitleCase(\n ClassificationMemberHelper.singularizeMemberType(props.memberType)\n )}`;\n\n return (\n <Popup title={popupTitle} closePopup={props.closePopup} showLoadingSpinner={!dataLoaded}>\n {dataLoaded &&\n <>\n <div>\n <p>\n Are you sure you want to remove <strong>\n {member.data.name}</strong> from <strong>{subject.name}</strong>?\n </p>\n <p>Please ensure that it is not in any classifications before removing.</p>\n </div>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n onClick={removeMember}\n variant='danger'\n text={`Yes, remove this ${ClassificationMemberHelper.singularizeMemberType(props.memberType)}`}\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Classification } from 'libs/shared/interfaces';\nimport { Presentation } from 'libs/shared/interfaces';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport { EditSubjectNav, SubjectClassifications } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { SubjectDataServiceHelper } from 'shared/services';\nimport { TopicsNavHelper } from 'shared/utils';\n\nfunction useFetchData(\n subjectId: string,\n setState: React.Dispatch<React.SetStateAction<SubjectClassificationsViewState>>\n): void {\n const getSetState = (key: keyof SubjectClassificationsViewState) => StateHelper.getSetStateByKey(setState, key);\n\n useFetch(\n SubjectDataServiceHelper.getSubjectClassificationFetchOptions(subjectId, getSetState('classifications')),\n [subjectId]\n );\n\n useFetch(SubjectDataServiceHelper.getPresentationsFetchOptions(getSetState('presentations'), PresentationType.Subject), []);\n}\n\ninterface SubjectClassificationsViewState {\n classifications?: Classification[];\n presentations?: Presentation[];\n}\n\ninterface SubjectClassificationsViewProps {\n subjectId: string;\n}\n\nexport function SubjectClassificationsView({ subjectId }: SubjectClassificationsViewProps): JSX.Element {\n const [ state, setState ] = React.useState<SubjectClassificationsViewState>({});\n\n useFetchData(subjectId, setState);\n\n return (\n <>\n <EditSubjectNav\n subjectId={subjectId}\n presentationType={PresentationType.Subject}\n activeAction={Actions.Subjects.SUBJECT_CLASSIFICATIONS}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.SUBJECTS, subjectId, presentationId)\n }\n />\n <SubjectClassifications\n presentations={state.presentations}\n classificationDictionary={ArrayHelper.groupBy(state.classifications, 'presentationId')}\n />\n </>\n );\n}\n",":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tree } from 'libs/shared/components/tree/Tree';\nimport { TreeNodeAction } from 'libs/shared/components/tree/TreeNode';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataServiceHelper } from 'shared/services';\n\nimport styles from './subject-nav.module.scss';\n\ninterface SubjectNavViewProps {\n selectedSubjectId?: string;\n}\n\nexport function SubjectNavView({ selectedSubjectId }: SubjectNavViewProps): React.ReactElement {\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n useFetch(SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Subject), []);\n\n const getAppLink = React.useCallback((subject: SubjectTree) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.EDIT_SUBJECT,\n args: [subject.id]\n }), []);\n\n const newSubjectAppLink = {\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.NEW_SUBJECT\n };\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canEdit = hasPermissions(CuratorPermissionName.TopicsClassificationUpdate);\n const canDelete = hasPermissions(CuratorPermissionName.TopicsClassificationDelete);\n\n function getActions(): TreeNodeAction<SubjectTree>[] {\n const actions = [];\n\n if (canEdit)\n actions.push({\n label: 'Add child',\n getAppLink: (s: SubjectTree) => ({\n ...newSubjectAppLink,\n params: { parentId: s.id }\n })\n });\n\n if (canDelete)\n actions.push({\n label: 'Delete backbone subject',\n getAppLink: (s: SubjectTree) => ({\n application: AppChannels.SUBJECTS,\n action: Actions.Subjects.DELETE_SUBJECT,\n args: [s.id]\n }),\n className: 'text-danger'\n });\n\n return actions;\n }\n\n return (\n <div className={`${styles.navContainer} h-auto pe-2 border-end`}>\n <h2 className='h5 m-0 text-center'>Backbone Subjects</h2>\n <div className='d-flex justify-content-center'>\n <span className={`${canEdit ? 'border-bottom' : ''} badge bg-warning my-2`}>Topics</span>\n </div>\n {canEdit &&\n <AppLink appLink={newSubjectAppLink} className='d-inline-block border-top p-2'>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small} />\n <span>New Backbone Subject</span>\n </AppLink>\n }\n {!!subjectTree &&\n <div className='border-top pt-1'>\n <Tree<SubjectTree>\n tree={subjectTree}\n getAppLink={getAppLink}\n selectedIds={[selectedSubjectId]}\n actions={getActions()}\n />\n </div>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { TopNav } from 'shared/components';\nimport { AppChannels } from 'shared/constants';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { TopicsNavHelper } from 'shared/utils';\n\ninterface TopNavViewProps {\n currentAppLink: Core.AppLink;\n}\n\nexport function TopNavView({ currentAppLink }: TopNavViewProps): React.ReactElement {\n const { hasPermissions } = useCuratorPermissions();\n\n const navItems = TopicsNavHelper.getTopNavItems(AppChannels.SUBJECTS, hasPermissions);\n\n if (navItems.length < 2)\n return <></>;\n \n return (\n <TopNav\n navItems={navItems}\n currentAppLink={currentAppLink}\n />\n );\n}\n","export * from './audiences';\nexport * from './classifications';\nexport * from './levels';\nexport * from './presentations';\nexport * from './subjects';\nexport * from './top-nav';\n"],"mappings":"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"}
|