@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":"CSuC7le7.chunk.js","names":[],"sources":["../../../../../src/apps/curriculums/views/classifications/classification-nav/classification-nav.module.scss","../../../../../src/apps/curriculums/views/classifications/classification-nav/ClassificationNavView.tsx","../../../../../src/apps/curriculums/views/classifications/delete-classification/DeleteClassificationView.tsx","../../../../../src/apps/curriculums/components/classifications/EditCurriculumClassificationDetailsForm.tsx","../../../../../src/apps/curriculums/utils/validation/ClassificationValidation.ts","../../../../../src/apps/curriculums/utils/validation/PresentationValidation.ts","../../../../../src/apps/curriculums/utils/validation/SubjectValidation.ts","../../../../../src/apps/curriculums/utils/SubjectsNavHelper.ts","../../../../../src/apps/curriculums/views/classifications/edit-classification/EditClassificationView.tsx","../../../../../src/apps/curriculums/views/classifications/edit-classification-members/EditClassificationMembersView.tsx","../../../../../src/apps/curriculums/components/backbone-classifications/EditCurriculumSubjectDetailsForm.tsx","../../../../../src/apps/curriculums/components/presentations/EditCurriculumPresentationDetailsForm.tsx","../../../../../src/apps/curriculums/views/classifications/new-classification/NewClassificationView.tsx","../../../../../src/apps/curriculums/views/classifications/remove-classification-member/RemoveClassificationMemberView.tsx","../../../../../src/apps/curriculums/views/presentations/edit-presentation/EditPresentationView.tsx","../../../../../src/apps/curriculums/views/presentations/edit-presentations-list/EditPresentationsListView.tsx","../../../../../src/apps/curriculums/views/presentations/new-presentation/NewPresentationView.tsx","../../../../../src/apps/curriculums/views/subjects/add-subject-members/AddSubjectMembersUtils.ts","../../../../../src/apps/curriculums/views/subjects/add-subject-members/AddSubjectMembersView.tsx","../../../../../src/apps/curriculums/views/subjects/delete-subject/DeleteSubjectView.tsx","../../../../../src/apps/curriculums/views/subjects/edit-subject/EditSubjectView.tsx","../../../../../src/apps/curriculums/views/subjects/edit-subject-members/EditSubjectMembersUtils.ts","../../../../../src/apps/curriculums/views/subjects/edit-subject-members/EditSubjectMembersView.tsx","../../../../../src/apps/curriculums/views/subjects/new-subject/NewSubjectView.tsx","../../../../../src/apps/curriculums/views/subjects/remove-subject-member/RemoveSubjectMemberView.tsx","../../../../../src/apps/curriculums/views/subjects/subject-classifications/SubjectClassificationsView.tsx","../../../../../src/apps/curriculums/views/subjects/subject-nav/subject-nav.module.scss","../../../../../src/apps/curriculums/views/subjects/subject-nav/SubjectNavView.tsx","../../../../../src/apps/curriculums/views/top-nav/TopNavView.tsx","../../../../../src/apps/curriculums/views/index.ts"],"sourcesContent":[":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\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 { 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 styles from './classification-nav.module.scss';\n\ninterface ClassificationNavViewProps {\n presentationId: string;\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\nfunction getClassificationAppLink(presentationId: string, classification: ClassificationTree): Core.AppLink {\n return {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_CLASSIFICATION,\n args: [ presentationId, classification.id ]\n };\n}\n\nfunction getNewClassificationAppLink(presentationId: string): Core.AppLink {\n return {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.NEW_CLASSIFICATION,\n args: [presentationId]\n };\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 canEdit = hasPermissions(CuratorPermissionName.CurriculumsClassificationUpdate);\n const canDelete = hasPermissions(CuratorPermissionName.CurriculumsClassificationDelete);\n\n function getActions(): TreeNodeAction<ClassificationTree>[] {\n const actions = [];\n \n if (canEdit)\n actions.push({\n label: 'Add child',\n getAppLink: (c: ClassificationTree) => ({\n ...getNewClassificationAppLink(presentationId),\n args: [presentationId],\n params: { parentId: c.id }\n })\n });\n \n if (canDelete)\n actions.push({\n label: 'Delete topic',\n getAppLink: (c: ClassificationTree) => ({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.DELETE_CLASSIFICATION,\n args: [ presentationId, c.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 {!!presentation && (\n <div className='pb-2 mb-2 border-bottom'>\n <h6>\n Topics\n </h6>\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={getNewClassificationAppLink(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) => getClassificationAppLink(presentationId, classification)\n }\n selectedIds={[selectedClassificationId]}\n actions={getActions()}\n selectedLinkClassName='bg-light fw-semibold'\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 { 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\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 <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 />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\nimport { Form, useFormikContext } from 'formik';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\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 { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { useCanSubmitForm } from 'libs/shared/hooks/UseCanSubmitForm';\nimport { Classification } from 'libs/shared/interfaces';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { TreeSelect } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport {\n CreateClassificationRequest,\n UpdateClassificationRequest\n} from 'shared/interfaces/data-requests';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\n\ntype RequestType = CreateClassificationRequest | UpdateClassificationRequest;\n\nconst getSubjectAppLink = (subjectId: string) => ({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_SUBJECT,\n args: [subjectId]\n});\n\nconst isNodeDisabled = (classificationTree: ClassificationTree, classificationId: string) =>\n (node: ClassificationTree) => {\n if (node.id === classificationId)\n return true;\n\n const classificationNode = TreeHelper.find(classificationTree, classificationId);\n\n return !!TreeHelper.find(classificationNode, node.id);\n };\n\ninterface EditClassificationDetailsFormProps {\n presentationId: string;\n classificationTree: ClassificationTree;\n subjectTree: SubjectTree;\n classification?: Classification;\n}\n\nexport function EditCurriculumClassificationDetailsForm(props: EditClassificationDetailsFormProps): React.ReactElement {\n const formikProps = useFormikContext<RequestType>();\n\n const canSubmit = useCanSubmitForm(formikProps);\n\n const isNew = !props.classification?.id;\n\n const collapseInitialState = !isNew || !!(formikProps.values.parentIds && formikProps.values.parentIds.length);\n\n const [ collapseClassificationSelect, setCollapseClassificationSelect ] = React.useState(collapseInitialState);\n\n React.useEffect(() =>\n setCollapseClassificationSelect(collapseInitialState), [ props.classification?.id, formikProps.values.parentIds ]);\n\n /**\n * Set backboneClassificationIds to 'touched' so that errors will be displayed if no subject is selected.\n * On a new subject this will not trigger until a subject has been selected.\n */\n React.useEffect(() => {\n if (formikProps.values.backboneClassificationIds.length && !formikProps.touched.backboneClassificationIds)\n formikProps.setFieldTouched('backboneClassificationIds', true);\n }, [formikProps.values.backboneClassificationIds]);\n\n const handleParentIdSelect = (item: ClassificationTree) => formikProps.setFieldValue(\n 'parentIds',\n ArrayHelper.addOrRemove(formikProps.values.parentIds.map(pId => pId.toString()), item.id.toString())\n );\n\n const handleSubjectSelect = (item: SubjectTree) => formikProps.setFieldValue(\n 'backboneClassificationIds',\n ArrayHelper.addOrRemove(formikProps.values.backboneClassificationIds.map(sId => sId.toString()), item.id.toString())\n );\n\n const getTreeSelectClassName = (field: keyof RequestType) =>\n `${FormHelper.getCustomFormControlClassName(formikProps.errors, formikProps.touched, field)} h-auto py-2`;\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canEdit = hasPermissions(CuratorPermissionName.CurriculumsClassificationUpdate);\n\n return (\n <Form>\n <FormField<RequestType>\n label='Name'\n name='name'\n id='name'\n value={formikProps.values.name}\n placeholder='Enter a name for this curriculum classification'\n disabled={!canEdit}\n autoFocus\n />\n <FormField<RequestType>\n label='Description'\n name='description'\n id='description'\n value={formikProps.values.description}\n placeholder='Add a description for this curriculum classification'\n infoTooltip='Description will be displayed where Name is not populated. This should only be used for elaborations.'\n disabled={!canEdit}\n />\n <FormField<RequestType>\n as='select'\n label='Type'\n name='type'\n id='type'\n value={formikProps.values.type}\n disabled={!canEdit}\n >\n {ObjectHelper.getEnumKeys(\n ObjectHelper.omit(ClassificationType, [ClassificationType.Subject])\n ).map((key: ClassificationType) =>\n <option key={key} value={ClassificationType[key]}>{key}</option>)}\n </FormField>\n <FormField<RequestType>\n as='select'\n label='Status'\n name='status'\n id='status'\n value={formikProps.values.status}\n disabled={!canEdit || isNew}\n >\n {ObjectHelper.getEnumKeys(ClassificationStatus).map((key: ClassificationStatus) =>\n <option key={key} value={ClassificationStatus[key]}>{key}</option>)}\n </FormField>\n <FormField<RequestType>\n name='parentIds'\n disabled={!canEdit}\n >\n {() => (\n <div className={getTreeSelectClassName('parentIds')}>\n <TreeSelect<ClassificationTree>\n label='Parent Topic(s)'\n tree={props.classificationTree}\n selectedIds={formikProps.values.parentIds}\n onSelect={handleParentIdSelect}\n collapse={collapseClassificationSelect}\n noSelectionMessage='No parent selected, this will be a root topic.'\n isNodeDisabled={isNodeDisabled(props.classificationTree, props.classification?.id)}\n multiSelect\n />\n </div>\n )}\n </FormField>\n <FormField<RequestType>\n name='backboneClassificationIds'\n disabled={!canEdit}\n >\n {() => (\n <div className={getTreeSelectClassName('backboneClassificationIds')}>\n <TreeSelect<SubjectTree>\n label='Mapped Backbone Subject(s)'\n tree={props.subjectTree}\n selectedIds={formikProps.values.backboneClassificationIds}\n onSelect={handleSubjectSelect}\n collapse={!isNew}\n getSelectedItemAppLink={getSubjectAppLink}\n multiSelect\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.CurriculumsClassificationDelete) &&\n <AppLink\n className='btn btn-outline-danger'\n appLink={{\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.DELETE_CLASSIFICATION,\n args: [ props.presentationId, props.classification?.id ]\n }}\n >\n Delete\n </AppLink>\n }\n </div>\n </Form>\n );\n}\n","import * as Yup from 'yup';\n\nimport { ClassificationNodeType } from 'libs/shared/apps/subjects/enums/ClassificationNodeType';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\n\nimport { UpdateClassificationRequest } from 'shared/interfaces/data-requests';\n\nexport const ClassificationValidationSchema = Yup.object().shape<UpdateClassificationRequest>({\n name: Yup.string()\n .trim()\n .max(255, 'Name is too long')\n .default(''),\n \n description: Yup.string()\n .trim()\n .max(255, 'Description is too long')\n .default(''),\n\n parentIds: Yup.array().of(Yup.string())\n .default([ClassificationNodeType.Root]),\n\n backboneClassificationIds: Yup.array().of(Yup.string())\n .min(1, 'A classification must be mapped to at least one subject')\n .required('A classification must be mapped to at least one subject')\n .default([]),\n\n type: Yup.mixed<ClassificationType>()\n .required('Type is required')\n .default(ClassificationType.Subject),\n\n status: Yup.mixed<ClassificationStatus>()\n .required('Status is required')\n .default(ClassificationStatus.Draft),\n\n emphasize: Yup.boolean()\n .default(false),\n\n canBePreferred: Yup.boolean()\n .default(false)\n\n}).noUnknown();\n","import * as Yup from 'yup';\n\nimport { PresentationStatus } from 'libs/shared/enums/PresentationStatus';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\n\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces/data-requests';\n\nexport const PresentationValidationSchema = Yup.object().shape<CreateOrUpdatePresentationRequest>({\n name: Yup.string()\n .max(255, 'Name is too long')\n .required('Name is required'),\n\n description: Yup.string()\n .max(16000, 'Description is too long')\n .required('Description is required'),\n\n status: Yup.mixed<PresentationStatus>()\n .required('Status is required')\n .default(PresentationStatus.Draft),\n\n type: Yup.mixed<PresentationType>()\n .required('Type is required')\n .default(PresentationType.Curriculum)\n});\n","import * as Yup from 'yup';\n\nimport { SubjectNodeType } from 'shared/enums';\nimport { CreateOrUpdateSubjectRequest } from 'shared/interfaces/data-requests';\n\nexport const SubjectValidationSchema = Yup.object().shape<CreateOrUpdateSubjectRequest>({\n name: Yup.string()\n .trim()\n .max(255, 'Name is too long')\n .required('Name is required')\n .default(''),\n\n parentId: Yup.string()\n .default(SubjectNodeType.Root)\n\n}).noUnknown();\n","import { Core } from 'libs/common/core';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { NavItem } from 'shared/interfaces';\n\nexport const CurriculumsNavHelper = {\n getTopNavItems(): NavItem[] {\n const application = AppChannels.CURRICULUMS;\n const actions = Actions.Subjects;\n\n return [\n {\n label: 'Topics',\n appLink: { application, action: actions.CLASSIFICATIONS },\n activeActions: [\n actions.CLASSIFICATIONS,\n actions.PRESENTATION_CLASSIFICATIONS,\n actions.NEW_CLASSIFICATION,\n actions.EDIT_CLASSIFICATION,\n actions.EDIT_CLASSIFICATION_PLAYLISTS,\n actions.EDIT_CLASSIFICATION_SERIES,\n actions.EDIT_CLASSIFICATION_VIDEOS,\n actions.DELETE_CLASSIFICATION,\n actions.REMOVE_CLASSIFICATION_MEMBER\n ]\n },\n {\n label: 'Backbone Subjects',\n appLink: { application, action: actions.SUBJECTS },\n activeActions: [\n actions.SUBJECTS,\n actions.NEW_SUBJECT,\n actions.EDIT_SUBJECT,\n actions.EDIT_SUBJECT_PLAYLISTS,\n actions.EDIT_SUBJECT_SERIES,\n actions.EDIT_SUBJECT_VIDEOS,\n actions.SUBJECT_CLASSIFICATIONS,\n actions.DELETE_SUBJECT,\n actions.ADD_SUBJECT_MEMBERS,\n actions.REMOVE_SUBJECT_MEMBER\n ]\n },\n {\n label: 'Presentations',\n appLink: { application, action: actions.PRESENTATIONS },\n activeActions: [ actions.PRESENTATIONS, actions.NEW_PRESENTATION, actions.EDIT_PRESENTATION ]\n }\n ];\n },\n\n getEditSubjectTabs(subjectId: string, presentationId?: string): NavItem[] {\n const application = AppChannels.CURRICULUMS;\n const actions = Actions.Subjects;\n const args = [subjectId];\n\n return [\n { label: 'Edit Backbone Subject Details', appLink: { action: actions.EDIT_SUBJECT } },\n { label: 'Topics', appLink: { action: actions.SUBJECT_CLASSIFICATIONS } },\n { label: 'Videos', appLink: { action: actions.EDIT_SUBJECT_VIDEOS } }\n ].map(tab => {\n const appLink: Core.AppLink = {\n ...tab.appLink,\n application,\n args\n };\n\n if (presentationId)\n appLink.params = { presentationId };\n\n return {\n label: tab.label,\n appLink\n };\n });\n },\n\n getEditClassificationTabs(presentationId: string, classificationId: string): NavItem[] {\n const application = AppChannels.CURRICULUMS;\n const actions = Actions.Subjects;\n\n return [\n {\n label: 'Edit Topic Details',\n appLink: { application, action: actions.EDIT_CLASSIFICATION, args: [ presentationId, classificationId ]}\n },\n {\n label: 'Videos',\n appLink: { application, action: actions.EDIT_CLASSIFICATION_VIDEOS, args: [ presentationId, classificationId ]}\n }\n ];\n }\n};\n","import * as React from 'react';\n\nimport { useBulkFetch } from 'libs/common/react/hooks/UseBulkFetch';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\n\nimport { EditClassificationDetails, EditClassificationNav } from 'shared/components/classifications';\nimport { DataServices } from 'shared/constants';\nimport { UpdateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditCurriculumClassificationDetailsForm } from 'apps/curriculums/components/classifications';\nimport { ClassificationValidationSchema, CurriculumsNavHelper } from 'apps/curriculums/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 [ classification, setClassification ] = React.useState<Classification>();\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n const [ classificationTree, setClassificationTree ] = React.useState<ClassificationTree>();\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const classificationFetchOptions =\n SubjectDataServiceHelper.getClassificationFetchOptions(classificationId, setClassification);\n\n const presentationFetchOptions =\n SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation);\n\n const classificationTreeFetchOptions =\n SubjectDataServiceHelper.getClassificationTreeFetchOptions(presentationId, setClassificationTree);\n\n const subjectTreeFetchOptions =\n SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Curriculum);\n\n useFetch(subjectTreeFetchOptions, []);\n useFetch(classificationFetchOptions, [classificationId]);\n useBulkFetch([ presentationFetchOptions, classificationTreeFetchOptions ], [presentationId]);\n\n const saveClassification = (data: UpdateClassificationRequest, onDone: () => void): void => {\n const updatedClassification: UpdateClassificationRequest = {\n pinnedVideoMasterId: classification?.pinnedVideoMasterId || null,\n ...data\n };\n\n return subjectDataService.updateClassification(classificationId, updatedClassification, onDone, onDone);\n };\n\n const getTabs = (presentationId: string, classificationId: string) => {\n if (classification?.type !== ClassificationType.CurriculumLeaf)\n return [];\n \n return CurriculumsNavHelper.getEditClassificationTabs(presentationId, classificationId);\n };\n \n return (\n <div>\n <EditClassificationNav\n presentation={presentation}\n classificationId={classificationId}\n getTabs={getTabs}\n />\n {!!classification && !!classificationTree && !!subjectTree &&\n <EditClassificationDetails\n classification={classification}\n saveClassification={saveClassification}\n validationSchema={ClassificationValidationSchema}\n >\n <EditCurriculumClassificationDetailsForm\n presentationId={presentationId}\n classificationTree={classificationTree}\n subjectTree={subjectTree}\n classification={classification}\n />\n </EditClassificationDetails>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { useGetFetch } from 'libs/common/react/flight/FlightHelpers';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { useFetchAll } from 'libs/shared/hooks/UseFetchAll';\nimport { BaseObject, Classification, Presentation } from 'libs/shared/interfaces';\n\nimport { ClassificationMemberList, EditClassificationNav } from 'shared/components/classifications';\nimport { AppChannels, DataServices } from 'shared/constants';\nimport { OwnerType, SubjectMemberType } from 'shared/enums';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { UpdateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { PropHelper } from 'shared/utils';\nimport { ClassificationMemberHelper } from 'shared/utils';\n\nimport { CurriculumsNavHelper } from 'apps/curriculums/utils';\n\nfunction useFetchAllMembers(classificationId: string, memberType: SubjectMemberType): BaseObject[] {\n const fetch = useGetFetch();\n\n function getMembersRequest(cursor?: string): Flight.Request {\n return SubjectRequests.classificationMembers(classificationId, memberType, cursor);\n }\n\n function fetchNextMembers(cursor?: string): void {\n fetch(getMembersRequest(cursor));\n }\n\n return (useFetchAll(getMembersRequest, fetchNextMembers)).items;\n}\n\ninterface EditClassificationMembersViewProps {\n presentationId: string;\n classificationId: string;\n memberType: SubjectMemberType;\n}\n\nexport function EditClassificationMembersView(props: EditClassificationMembersViewProps): React.ReactElement {\n const { presentationId, classificationId, memberType } = props;\n\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n const [ classification, setClassification ] = React.useState<Classification>();\n\n const members = useFetchAllMembers(props.classificationId, props.memberType);\n\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation), []);\n\n useFetch(\n SubjectDataServiceHelper.getClassificationFetchOptions(classificationId, setClassification),\n [classificationId]\n );\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const updatePinnedVideo = (id: string, callback: (data: Classification) => void): void => {\n const requestObject: UpdateClassificationRequest = {\n ...classification,\n pinnedVideoMasterId: id\n };\n subjectDataService.updateClassification(classificationId, requestObject, callback);\n };\n\n const classificationMemberListProps = {\n items: members,\n memberType,\n classification,\n updatePinnedVideo,\n getItemAppLink: (item: BaseObject) => ClassificationMemberHelper.getMemberAppLink(memberType, item.id),\n getActions: (item: BaseObject) =>\n ClassificationMemberHelper.getMemberActions(\n AppChannels.CURRICULUMS,\n classificationId,\n OwnerType.Classification,\n memberType,\n item.id\n )\n };\n\n const headerProps = { presentation, classificationId, getTabs: CurriculumsNavHelper.getEditClassificationTabs };\n\n const dataLoaded = PropHelper.propsLoaded(classificationMemberListProps);\n\n return (\n <>\n <EditClassificationNav {...headerProps} memberType={memberType} />\n {dataLoaded &&\n <ClassificationMemberList {...classificationMemberListProps} />\n }\n </>\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 EditCurriculumSubjectDetailsFormProps {\n id?: string;\n subjectTree: SubjectTree;\n deleteSubject: Core.AppLink;\n}\n\nexport function EditCurriculumSubjectDetailsForm(props: EditCurriculumSubjectDetailsFormProps): 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\n const canEdit = hasPermissions(CuratorPermissionName.CurriculumsBackboneUpdate);\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.CurriculumsBackboneDelete) &&\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';\nimport { Form, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/core';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { PresentationStatus } from 'libs/shared/enums/PresentationStatus';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\n\nimport { ImageSelect } from 'shared/components/forms/image-select/ImageSelect';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces/data-requests';\n\ninterface EditCurriculumPresentationDetailsFormProps {\n isNew: boolean;\n imageAppLink: Core.AppLink;\n}\n\nexport function EditCurriculumPresentationDetailsForm(\n props: EditCurriculumPresentationDetailsFormProps\n): React.ReactElement {\n const formikProps = useFormikContext<CreateOrUpdatePresentationRequest>();\n\n return (\n <Form>\n <FormField<CreateOrUpdatePresentationRequest>\n label='Name'\n type='text'\n name='name'\n id='name'\n value={formikProps.values.name}\n placeholder='Enter a name for this presentation'\n autoFocus\n />\n <FormField<CreateOrUpdatePresentationRequest>\n label='Description'\n as='textarea'\n name='description'\n id='description'\n value={formikProps.values.description}\n placeholder='Describe this presentation here'\n />\n <FormField<CreateOrUpdatePresentationRequest>\n as='select'\n label='Status'\n name='status'\n id='status'\n value={formikProps.values.status}\n disabled={props.isNew}\n >\n {ObjectHelper.getEnumKeys(PresentationStatus).map((key: PresentationStatus) =>\n <option key={key} value={PresentationStatus[key]}>{key}</option>)}\n </FormField>\n <FormField<CreateOrUpdatePresentationRequest>\n as='select'\n label='Type'\n name='type'\n id='type'\n value={formikProps.values.type}\n >\n {ObjectHelper.getEnumKeys(PresentationType).map((key: PresentationType) =>\n <option key={key} value={PresentationType[key]}>{key}</option>)}\n </FormField>\n <ImageSelect<CreateOrUpdatePresentationRequest>\n imageType={ImageType.Covers}\n fieldName='cover'\n uploadAppLink={props.imageAppLink}\n />\n <div className='btn-container d-flex justify-content-end'>\n <FormButtons isNew={props.isNew} />\n </div>\n </Form>\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 { Classification } from 'libs/shared/interfaces';\n\nimport { EditClassificationDetails } from 'shared/components/classifications';\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditCurriculumClassificationDetailsForm } from 'apps/curriculums/components';\nimport { ClassificationValidationSchema } from 'apps/curriculums/utils';\n\nconst onCreateSuccess = (presentationId: string, onDone: () => void) => (newClassification: Classification) => {\n onDone();\n\n if (!newClassification || !newClassification.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_CLASSIFICATION,\n args: [ presentationId, newClassification.id ]\n });\n};\n\ninterface NewClassificationViewProps {\n presentationId: string;\n parentId?: string;\n}\n\nexport function NewClassificationView(props: NewClassificationViewProps): React.ReactElement {\n const { presentationId, parentId } = props;\n\n const [ classificationTree, setClassificationTree ] = React.useState<ClassificationTree>();\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const classificationTreeFetchOptions =\n SubjectDataServiceHelper.getClassificationTreeFetchOptions(presentationId, setClassificationTree);\n\n const subjectTreeFetchOptions =\n SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Curriculum);\n\n useFetch(subjectTreeFetchOptions, []);\n useFetch(classificationTreeFetchOptions, [presentationId]);\n\n const saveClassification = (data: CreateClassificationRequest, onDone: () => void): void =>\n subjectDataService.createClassification(\n { ...data, presentationId },\n onCreateSuccess(presentationId, onDone),\n onDone\n );\n\n return (\n <div>\n <h4 className='py-2'>Create New Classification</h4>\n {!!subjectTree && !!classificationTree &&\n <EditClassificationDetails\n classification={(parentId ? { parentIds: [parentId]} : {}) as Classification}\n saveClassification={saveClassification}\n validationSchema={ClassificationValidationSchema}\n >\n <EditCurriculumClassificationDetailsForm\n presentationId={props.presentationId}\n classificationTree={classificationTree}\n subjectTree={subjectTree}\n />\n </EditClassificationDetails>\n }\n </div>\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 { Classification, Playlist, PopupViewProps, Series, Video } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\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}\n\ninterface RemoveClassificationMemberViewProps {\n classificationId: string;\n memberId: string;\n memberType: SubjectMemberType;\n}\n\ntype MemberType = Playlist | Series | Video;\n\ntype PropTypes = RemoveClassificationMemberViewProps & PopupViewProps;\n\nexport function RemoveClassificationMemberView(props: PropTypes): React.ReactElement {\n const [ classification, setClassification ] = React.useState<Classification>();\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.getClassificationFetchOptions(props.classificationId, setClassification),\n [props.classificationId]\n );\n\n const removeMember = () => {\n setShowButtonSpinner(true);\n\n subjectDataService.removeObjectsFromClassification(\n props.classificationId,\n [props.memberId],\n props.memberType,\n null,\n null,\n props.closePopup,\n props.closePopup\n );\n\n if (classification.pinnedVideoMasterId === props.memberId) {\n subjectDataService.updateClassification(props.classificationId, {\n ...classification,\n pinnedVideoMasterId: null\n });\n }\n };\n\n const dataLoaded = !!classification && !!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>{classification.name}</strong>?\n </p>\n <p>This will not remove it from the backbone subject.</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 ${ClassificationMemberHelper.singularizeMemberType(props.memberType)}`}\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\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 { ContentRegionObject, Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces/data-requests';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditCurriculumPresentationDetailsForm } from 'apps/curriculums/components';\nimport { PresentationValidationSchema } from 'apps/curriculums/utils';\n\ninterface EditPresentationViewProps {\n id: string;\n}\n\nexport type CreateOrUpdatePresentationFormValues = Omit<CreateOrUpdatePresentationRequest, 'contentRegions'> & {\n contentRegions: ContentRegionObject[]\n};\n\nexport function EditPresentationView({ id }: EditPresentationViewProps): React.ReactElement {\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(id, setPresentation), [id]);\n\n function savePresentation(data: CreateOrUpdatePresentationFormValues, onDone: () => void): void {\n const payload: CreateOrUpdatePresentationRequest = {\n ...data,\n contentRegions: data.contentRegions?.map(cr => cr.systemName)\n };\n subjectDataService.updatePresentation(id, payload, onDone, onDone);\n }\n\n const imageAppLink: Core.AppLink = {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.UPLOAD_IMAGE\n };\n\n const dataLoaded = presentation?.id;\n\n return (\n <>\n <h4 className='py-2'>Edit Presentation</h4>\n {!!dataLoaded &&\n <FormWrapper<CreateOrUpdatePresentationFormValues, Presentation>\n initialValues={presentation}\n validationSchema={PresentationValidationSchema}\n onSubmit={savePresentation}\n >\n <EditCurriculumPresentationDetailsForm\n isNew={!presentation?.id}\n imageAppLink={imageAppLink}\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.CURRICULUMS,\n action: Actions.Subjects.EDIT_PRESENTATION,\n args: [presentation.id]\n});\n\nconst newPresentationAppLink = {\n application: AppChannels.CURRICULUMS,\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.Curriculum), []);\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canEdit = hasPermissions(CuratorPermissionName.CurriculumsBackboneUpdate);\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 {canEdit &&\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 * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces/data-requests';\nimport { SubjectDataService } from 'shared/services';\n\nimport { EditCurriculumPresentationDetailsForm } from 'apps/curriculums/components';\nimport { PresentationValidationSchema } from 'apps/curriculums/utils';\n\nexport function NewPresentationView(): React.ReactElement {\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n function savePresentation(data: CreateOrUpdatePresentationRequest, onDone: () => void): void {\n function success(newPresentation: Presentation): void {\n onDone();\n\n if (!newPresentation || !newPresentation.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_PRESENTATION,\n args: [newPresentation.id]\n });\n }\n\n subjectDataService.createPresentation(data, success, onDone);\n }\n\n const imageAppLink: Core.AppLink = {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.UPLOAD_IMAGE\n };\n\n return (\n <>\n <h4 className='py-2'>Create New Presentation</h4>\n <FormWrapper<CreateOrUpdatePresentationRequest, Presentation>\n initialValues={{} as Presentation}\n validationSchema={PresentationValidationSchema}\n onSubmit={savePresentation}\n >\n <EditCurriculumPresentationDetailsForm\n isNew={true}\n imageAppLink={imageAppLink}\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 { 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.Curriculum\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}\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.CURRICULUMS, 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}\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.Curriculum}\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';\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 { EditCurriculumSubjectDetailsForm } from 'apps/curriculums/components/backbone-classifications';\nimport { SubjectValidationSchema } from 'apps/curriculums/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.Curriculum);\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.CURRICULUMS,\n action: Actions.Subjects.DELETE_SUBJECT\n };\n\n return (\n <>\n <EditSubjectNav\n subjectId={subjectId}\n presentationType={PresentationType.Curriculum}\n activeAction={Actions.Subjects.EDIT_SUBJECT}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.CURRICULUMS, subjectId, presentationId)}\n />\n {!!subject && !!subjectTree &&\n <FormWrapper<CreateOrUpdateSubjectRequest>\n initialValues={subject}\n validationSchema={SubjectValidationSchema}\n onSubmit={saveSubject}\n >\n <EditCurriculumSubjectDetailsForm\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 { 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.Curriculum\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}\n\nexport const getClassificationAppLink = (memberType: SubjectMemberType, presentationId: string) =>\n (classificationId: string): Core.AppLink => {\n const application = AppChannels.CURRICULUMS;\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\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 || !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}\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 members = Flight.useBasicFetch<BaseObject[]>(Array.isArray(memberIds)\n && getMembersRequest(props.memberType, memberIds));\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.CURRICULUMS,\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.Curriculum}\n presentationId={props.presentationId}\n activeAction={getActiveAction(props.memberType)}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.CURRICULUMS, 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.CURRICULUMS,\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 { EditCurriculumSubjectDetailsForm } from 'apps/curriculums/components/backbone-classifications';\nimport { SubjectValidationSchema } from 'apps/curriculums/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.CURRICULUMS,\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.Curriculum);\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.CURRICULUMS,\n action: Actions.Subjects.PRESENTATIONS\n };\n\n const deleteSubjectAppLink = {\n application: AppChannels.CURRICULUMS,\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 <EditCurriculumSubjectDetailsForm\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 { 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}\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.Curriculum), []);\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.Curriculum}\n activeAction={Actions.Subjects.SUBJECT_CLASSIFICATIONS}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.CURRICULUMS, subjectId, presentationId)}\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.Curriculum), []);\n\n const getAppLink = React.useCallback((subject: SubjectTree) => ({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_SUBJECT,\n args: [subject.id]\n }), []);\n\n const newSubjectAppLink = {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.NEW_SUBJECT\n };\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canEdit = hasPermissions(CuratorPermissionName.CurriculumsBackboneUpdate);\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-blue my-2`}>Curriculums</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 // Deliberately empty as we don't want to delete or add child curriculums \n actions={[] as TreeNodeAction<SubjectTree>[]}\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';\n\nimport { CurriculumsNavHelper } from 'apps/curriculums/utils';\n\ninterface TopNavViewProps {\n currentAppLink: Core.AppLink;\n}\n\nexport function TopNavView({ currentAppLink }: TopNavViewProps): React.ReactElement {\n return <TopNav navItems={CurriculumsNavHelper.getTopNavItems()} currentAppLink={currentAppLink} />;\n}\n","export * from './classifications';\nexport * from './presentations';\nexport * from './subjects';\nexport * from './top-nav';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GT6nO4Jv.chunk.js","names":[],"sources":["../../../../../src/apps/curriculums/views/classifications/classification-nav/classification-nav.module.scss","../../../../../src/apps/curriculums/views/classifications/classification-nav/ClassificationNavView.tsx","../../../../../src/apps/curriculums/views/classifications/delete-classification/DeleteClassificationView.tsx","../../../../../src/apps/curriculums/components/classifications/EditCurriculumClassificationDetailsForm.tsx","../../../../../src/apps/curriculums/utils/validation/ClassificationValidation.ts","../../../../../src/apps/curriculums/utils/validation/PresentationValidation.ts","../../../../../src/apps/curriculums/utils/validation/SubjectValidation.ts","../../../../../src/apps/curriculums/utils/SubjectsNavHelper.ts","../../../../../src/apps/curriculums/views/classifications/edit-classification/EditClassificationView.tsx","../../../../../src/apps/curriculums/views/classifications/edit-classification-members/EditClassificationMembersView.tsx","../../../../../src/apps/curriculums/components/backbone-classifications/EditCurriculumSubjectDetailsForm.tsx","../../../../../src/apps/curriculums/components/presentations/EditCurriculumPresentationDetailsForm.tsx","../../../../../src/apps/curriculums/views/classifications/new-classification/NewClassificationView.tsx","../../../../../src/apps/curriculums/views/classifications/remove-classification-member/RemoveClassificationMemberView.tsx","../../../../../src/apps/curriculums/views/presentations/edit-presentation/EditPresentationView.tsx","../../../../../src/apps/curriculums/views/presentations/edit-presentations-list/EditPresentationsListView.tsx","../../../../../src/apps/curriculums/views/presentations/new-presentation/NewPresentationView.tsx","../../../../../src/apps/curriculums/views/subjects/add-subject-members/AddSubjectMembersUtils.ts","../../../../../src/apps/curriculums/views/subjects/add-subject-members/AddSubjectMembersView.tsx","../../../../../src/apps/curriculums/views/subjects/delete-subject/DeleteSubjectView.tsx","../../../../../src/apps/curriculums/views/subjects/edit-subject/EditSubjectView.tsx","../../../../../src/apps/curriculums/views/subjects/edit-subject-members/EditSubjectMembersUtils.ts","../../../../../src/apps/curriculums/views/subjects/edit-subject-members/EditSubjectMembersView.tsx","../../../../../src/apps/curriculums/views/subjects/new-subject/NewSubjectView.tsx","../../../../../src/apps/curriculums/views/subjects/remove-subject-member/RemoveSubjectMemberView.tsx","../../../../../src/apps/curriculums/views/subjects/subject-classifications/SubjectClassificationsView.tsx","../../../../../src/apps/curriculums/views/subjects/subject-nav/subject-nav.module.scss","../../../../../src/apps/curriculums/views/subjects/subject-nav/SubjectNavView.tsx","../../../../../src/apps/curriculums/views/top-nav/TopNavView.tsx","../../../../../src/apps/curriculums/views/index.ts"],"sourcesContent":[":local {\n .navContainer {\n min-height: 100%;\n }\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\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 { 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 styles from './classification-nav.module.scss';\n\ninterface ClassificationNavViewProps {\n presentationId: string;\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\nfunction getClassificationAppLink(presentationId: string, classification: ClassificationTree): Core.AppLink {\n return {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_CLASSIFICATION,\n args: [ presentationId, classification.id ]\n };\n}\n\nfunction getNewClassificationAppLink(presentationId: string): Core.AppLink {\n return {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.NEW_CLASSIFICATION,\n args: [presentationId]\n };\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 canEdit = hasPermissions(CuratorPermissionName.CurriculumsClassificationUpdate);\n const canDelete = hasPermissions(CuratorPermissionName.CurriculumsClassificationDelete);\n\n function getActions(): TreeNodeAction<ClassificationTree>[] {\n const actions = [];\n \n if (canEdit)\n actions.push({\n label: 'Add child',\n getAppLink: (c: ClassificationTree) => ({\n ...getNewClassificationAppLink(presentationId),\n args: [presentationId],\n params: { parentId: c.id }\n })\n });\n \n if (canDelete)\n actions.push({\n label: 'Delete topic',\n getAppLink: (c: ClassificationTree) => ({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.DELETE_CLASSIFICATION,\n args: [ presentationId, c.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 {!!presentation && (\n <div className='pb-2 mb-2 border-bottom'>\n <h6>\n Topics\n </h6>\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={getNewClassificationAppLink(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) => getClassificationAppLink(presentationId, classification)\n }\n selectedIds={[selectedClassificationId]}\n actions={getActions()}\n selectedLinkClassName='bg-light fw-semibold'\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 { 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\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 <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 />\n </PopupButtons>\n </>\n }\n </Popup>\n );\n}\n","import * as React from 'react';\nimport { Form, useFormikContext } from 'formik';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\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 { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { useCanSubmitForm } from 'libs/shared/hooks/UseCanSubmitForm';\nimport { Classification } from 'libs/shared/interfaces';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { TreeSelect } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport {\n CreateClassificationRequest,\n UpdateClassificationRequest\n} from 'shared/interfaces/data-requests';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\n\ntype RequestType = CreateClassificationRequest | UpdateClassificationRequest;\n\nconst getSubjectAppLink = (subjectId: string) => ({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_SUBJECT,\n args: [subjectId]\n});\n\nconst isNodeDisabled = (classificationTree: ClassificationTree, classificationId: string) =>\n (node: ClassificationTree) => {\n if (node.id === classificationId)\n return true;\n\n const classificationNode = TreeHelper.find(classificationTree, classificationId);\n\n return !!TreeHelper.find(classificationNode, node.id);\n };\n\ninterface EditClassificationDetailsFormProps {\n presentationId: string;\n classificationTree: ClassificationTree;\n subjectTree: SubjectTree;\n classification?: Classification;\n}\n\nexport function EditCurriculumClassificationDetailsForm(props: EditClassificationDetailsFormProps): React.ReactElement {\n const formikProps = useFormikContext<RequestType>();\n\n const canSubmit = useCanSubmitForm(formikProps);\n\n const isNew = !props.classification?.id;\n\n const collapseInitialState = !isNew || !!(formikProps.values.parentIds && formikProps.values.parentIds.length);\n\n const [ collapseClassificationSelect, setCollapseClassificationSelect ] = React.useState(collapseInitialState);\n\n React.useEffect(() =>\n setCollapseClassificationSelect(collapseInitialState), [ props.classification?.id, formikProps.values.parentIds ]);\n\n /**\n * Set backboneClassificationIds to 'touched' so that errors will be displayed if no subject is selected.\n * On a new subject this will not trigger until a subject has been selected.\n */\n React.useEffect(() => {\n if (formikProps.values.backboneClassificationIds.length && !formikProps.touched.backboneClassificationIds)\n formikProps.setFieldTouched('backboneClassificationIds', true);\n }, [formikProps.values.backboneClassificationIds]);\n\n const handleParentIdSelect = (item: ClassificationTree) => formikProps.setFieldValue(\n 'parentIds',\n ArrayHelper.addOrRemove(formikProps.values.parentIds.map(pId => pId.toString()), item.id.toString())\n );\n\n const handleSubjectSelect = (item: SubjectTree) => formikProps.setFieldValue(\n 'backboneClassificationIds',\n ArrayHelper.addOrRemove(formikProps.values.backboneClassificationIds.map(sId => sId.toString()), item.id.toString())\n );\n\n const getTreeSelectClassName = (field: keyof RequestType) =>\n `${FormHelper.getCustomFormControlClassName(formikProps.errors, formikProps.touched, field)} h-auto py-2`;\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canEdit = hasPermissions(CuratorPermissionName.CurriculumsClassificationUpdate);\n\n return (\n <Form>\n <FormField<RequestType>\n label='Name'\n name='name'\n id='name'\n value={formikProps.values.name}\n placeholder='Enter a name for this curriculum classification'\n disabled={!canEdit}\n autoFocus\n />\n <FormField<RequestType>\n label='Description'\n name='description'\n id='description'\n value={formikProps.values.description}\n placeholder='Add a description for this curriculum classification'\n infoTooltip='Description will be displayed where Name is not populated. This should only be used for elaborations.'\n disabled={!canEdit}\n />\n <FormField<RequestType>\n as='select'\n label='Type'\n name='type'\n id='type'\n value={formikProps.values.type}\n disabled={!canEdit}\n >\n {ObjectHelper.getEnumKeys(\n ObjectHelper.omit(ClassificationType, [ClassificationType.Subject])\n ).map((key: ClassificationType) =>\n <option key={key} value={ClassificationType[key]}>{key}</option>)}\n </FormField>\n <FormField<RequestType>\n as='select'\n label='Status'\n name='status'\n id='status'\n value={formikProps.values.status}\n disabled={!canEdit || isNew}\n >\n {ObjectHelper.getEnumKeys(ClassificationStatus).map((key: ClassificationStatus) =>\n <option key={key} value={ClassificationStatus[key]}>{key}</option>)}\n </FormField>\n <FormField<RequestType>\n name='parentIds'\n disabled={!canEdit}\n >\n {() => (\n <div className={getTreeSelectClassName('parentIds')}>\n <TreeSelect<ClassificationTree>\n label='Parent Topic(s)'\n tree={props.classificationTree}\n selectedIds={formikProps.values.parentIds}\n onSelect={handleParentIdSelect}\n collapse={collapseClassificationSelect}\n noSelectionMessage='No parent selected, this will be a root topic.'\n isNodeDisabled={isNodeDisabled(props.classificationTree, props.classification?.id)}\n multiSelect\n />\n </div>\n )}\n </FormField>\n <FormField<RequestType>\n name='backboneClassificationIds'\n disabled={!canEdit}\n >\n {() => (\n <div className={getTreeSelectClassName('backboneClassificationIds')}>\n <TreeSelect<SubjectTree>\n label='Mapped Backbone Subject(s)'\n tree={props.subjectTree}\n selectedIds={formikProps.values.backboneClassificationIds}\n onSelect={handleSubjectSelect}\n collapse={!isNew}\n getSelectedItemAppLink={getSubjectAppLink}\n multiSelect\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.CurriculumsClassificationDelete) &&\n <AppLink\n className='btn btn-outline-danger'\n appLink={{\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.DELETE_CLASSIFICATION,\n args: [ props.presentationId, props.classification?.id ]\n }}\n >\n Delete\n </AppLink>\n }\n </div>\n </Form>\n );\n}\n","import * as Yup from 'yup';\n\nimport { ClassificationNodeType } from 'libs/shared/apps/subjects/enums/ClassificationNodeType';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\n\nimport { UpdateClassificationRequest } from 'shared/interfaces/data-requests';\n\nexport const ClassificationValidationSchema = Yup.object().shape<UpdateClassificationRequest>({\n name: Yup.string()\n .trim()\n .max(255, 'Name is too long')\n .default(''),\n \n description: Yup.string()\n .trim()\n .max(255, 'Description is too long')\n .default(''),\n\n parentIds: Yup.array().of(Yup.string())\n .default([ClassificationNodeType.Root]),\n\n backboneClassificationIds: Yup.array().of(Yup.string())\n .min(1, 'A classification must be mapped to at least one subject')\n .required('A classification must be mapped to at least one subject')\n .default([]),\n\n type: Yup.mixed<ClassificationType>()\n .required('Type is required')\n .default(ClassificationType.Subject),\n\n status: Yup.mixed<ClassificationStatus>()\n .required('Status is required')\n .default(ClassificationStatus.Draft),\n\n emphasize: Yup.boolean()\n .default(false),\n\n canBePreferred: Yup.boolean()\n .default(false)\n\n}).noUnknown();\n","import * as Yup from 'yup';\n\nimport { PresentationStatus } from 'libs/shared/enums/PresentationStatus';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\n\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces/data-requests';\n\nexport const PresentationValidationSchema = Yup.object().shape<CreateOrUpdatePresentationRequest>({\n name: Yup.string()\n .max(255, 'Name is too long')\n .required('Name is required'),\n\n description: Yup.string()\n .max(16000, 'Description is too long')\n .required('Description is required'),\n\n status: Yup.mixed<PresentationStatus>()\n .required('Status is required')\n .default(PresentationStatus.Draft),\n\n type: Yup.mixed<PresentationType>()\n .required('Type is required')\n .default(PresentationType.Curriculum)\n});\n","import * as Yup from 'yup';\n\nimport { SubjectNodeType } from 'shared/enums';\nimport { CreateOrUpdateSubjectRequest } from 'shared/interfaces/data-requests';\n\nexport const SubjectValidationSchema = Yup.object().shape<CreateOrUpdateSubjectRequest>({\n name: Yup.string()\n .trim()\n .max(255, 'Name is too long')\n .required('Name is required')\n .default(''),\n\n parentId: Yup.string()\n .default(SubjectNodeType.Root)\n\n}).noUnknown();\n","import { Core } from 'libs/common/core';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { NavItem } from 'shared/interfaces';\n\nexport const CurriculumsNavHelper = {\n getTopNavItems(): NavItem[] {\n const application = AppChannels.CURRICULUMS;\n const actions = Actions.Subjects;\n\n return [\n {\n label: 'Topics',\n appLink: { application, action: actions.CLASSIFICATIONS },\n activeActions: [\n actions.CLASSIFICATIONS,\n actions.PRESENTATION_CLASSIFICATIONS,\n actions.NEW_CLASSIFICATION,\n actions.EDIT_CLASSIFICATION,\n actions.EDIT_CLASSIFICATION_PLAYLISTS,\n actions.EDIT_CLASSIFICATION_SERIES,\n actions.EDIT_CLASSIFICATION_VIDEOS,\n actions.DELETE_CLASSIFICATION,\n actions.REMOVE_CLASSIFICATION_MEMBER\n ]\n },\n {\n label: 'Backbone Subjects',\n appLink: { application, action: actions.SUBJECTS },\n activeActions: [\n actions.SUBJECTS,\n actions.NEW_SUBJECT,\n actions.EDIT_SUBJECT,\n actions.EDIT_SUBJECT_PLAYLISTS,\n actions.EDIT_SUBJECT_SERIES,\n actions.EDIT_SUBJECT_VIDEOS,\n actions.SUBJECT_CLASSIFICATIONS,\n actions.DELETE_SUBJECT,\n actions.ADD_SUBJECT_MEMBERS,\n actions.REMOVE_SUBJECT_MEMBER\n ]\n },\n {\n label: 'Presentations',\n appLink: { application, action: actions.PRESENTATIONS },\n activeActions: [ actions.PRESENTATIONS, actions.NEW_PRESENTATION, actions.EDIT_PRESENTATION ]\n }\n ];\n },\n\n getEditSubjectTabs(subjectId: string, presentationId?: string): NavItem[] {\n const application = AppChannels.CURRICULUMS;\n const actions = Actions.Subjects;\n const args = [subjectId];\n\n return [\n { label: 'Edit Backbone Subject Details', appLink: { action: actions.EDIT_SUBJECT } },\n { label: 'Topics', appLink: { action: actions.SUBJECT_CLASSIFICATIONS } },\n { label: 'Videos', appLink: { action: actions.EDIT_SUBJECT_VIDEOS } }\n ].map(tab => {\n const appLink: Core.AppLink = {\n ...tab.appLink,\n application,\n args\n };\n\n if (presentationId)\n appLink.params = { presentationId };\n\n return {\n label: tab.label,\n appLink\n };\n });\n },\n\n getEditClassificationTabs(presentationId: string, classificationId: string): NavItem[] {\n const application = AppChannels.CURRICULUMS;\n const actions = Actions.Subjects;\n\n return [\n {\n label: 'Edit Topic Details',\n appLink: { application, action: actions.EDIT_CLASSIFICATION, args: [ presentationId, classificationId ]}\n },\n {\n label: 'Videos',\n appLink: { application, action: actions.EDIT_CLASSIFICATION_VIDEOS, args: [ presentationId, classificationId ]}\n }\n ];\n }\n};\n","import * as React from 'react';\n\nimport { useBulkFetch } from 'libs/common/react/hooks/UseBulkFetch';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { ClassificationType } from 'libs/shared/enums/ClassificationType';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { Classification, Presentation } from 'libs/shared/interfaces';\n\nimport { EditClassificationDetails, EditClassificationNav } from 'shared/components/classifications';\nimport { DataServices } from 'shared/constants';\nimport { UpdateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditCurriculumClassificationDetailsForm } from 'apps/curriculums/components/classifications';\nimport { ClassificationValidationSchema, CurriculumsNavHelper } from 'apps/curriculums/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 [ classification, setClassification ] = React.useState<Classification>();\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n const [ classificationTree, setClassificationTree ] = React.useState<ClassificationTree>();\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const classificationFetchOptions =\n SubjectDataServiceHelper.getClassificationFetchOptions(classificationId, setClassification);\n\n const presentationFetchOptions =\n SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation);\n\n const classificationTreeFetchOptions =\n SubjectDataServiceHelper.getClassificationTreeFetchOptions(presentationId, setClassificationTree);\n\n const subjectTreeFetchOptions =\n SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Curriculum);\n\n useFetch(subjectTreeFetchOptions, []);\n useFetch(classificationFetchOptions, [classificationId]);\n useBulkFetch([ presentationFetchOptions, classificationTreeFetchOptions ], [presentationId]);\n\n const saveClassification = (data: UpdateClassificationRequest, onDone: () => void): void => {\n const updatedClassification: UpdateClassificationRequest = {\n pinnedVideoMasterId: classification?.pinnedVideoMasterId || null,\n ...data\n };\n\n return subjectDataService.updateClassification(classificationId, updatedClassification, onDone, onDone);\n };\n\n const getTabs = (presentationId: string, classificationId: string) => {\n if (classification?.type !== ClassificationType.CurriculumLeaf)\n return [];\n \n return CurriculumsNavHelper.getEditClassificationTabs(presentationId, classificationId);\n };\n \n return (\n <div>\n <EditClassificationNav\n presentation={presentation}\n classificationId={classificationId}\n getTabs={getTabs}\n />\n {!!classification && !!classificationTree && !!subjectTree &&\n <EditClassificationDetails\n classification={classification}\n saveClassification={saveClassification}\n validationSchema={ClassificationValidationSchema}\n >\n <EditCurriculumClassificationDetailsForm\n presentationId={presentationId}\n classificationTree={classificationTree}\n subjectTree={subjectTree}\n classification={classification}\n />\n </EditClassificationDetails>\n }\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { useGetFetch } from 'libs/common/react/flight/FlightHelpers';\nimport { useFetch } from 'libs/common/react/hooks/UseFetch';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { useFetchAll } from 'libs/shared/hooks/UseFetchAll';\nimport { BaseObject, Classification, Presentation } from 'libs/shared/interfaces';\n\nimport { ClassificationMemberList, EditClassificationNav } from 'shared/components/classifications';\nimport { AppChannels, DataServices } from 'shared/constants';\nimport { OwnerType, SubjectMemberType } from 'shared/enums';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { UpdateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\nimport { PropHelper } from 'shared/utils';\nimport { ClassificationMemberHelper } from 'shared/utils';\n\nimport { CurriculumsNavHelper } from 'apps/curriculums/utils';\n\nfunction useFetchAllMembers(classificationId: string, memberType: SubjectMemberType): BaseObject[] {\n const fetch = useGetFetch();\n\n function getMembersRequest(cursor?: string): Flight.Request {\n return SubjectRequests.classificationMembers(classificationId, memberType, cursor);\n }\n\n function fetchNextMembers(cursor?: string): void {\n fetch(getMembersRequest(cursor));\n }\n\n return (useFetchAll(getMembersRequest, fetchNextMembers)).items;\n}\n\ninterface EditClassificationMembersViewProps {\n presentationId: string;\n classificationId: string;\n memberType: SubjectMemberType;\n}\n\nexport function EditClassificationMembersView(props: EditClassificationMembersViewProps): React.ReactElement {\n const { presentationId, classificationId, memberType } = props;\n\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n const [ classification, setClassification ] = React.useState<Classification>();\n\n const members = useFetchAllMembers(props.classificationId, props.memberType);\n\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(presentationId, setPresentation), []);\n\n useFetch(\n SubjectDataServiceHelper.getClassificationFetchOptions(classificationId, setClassification),\n [classificationId]\n );\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const updatePinnedVideo = (id: string, callback: (data: Classification) => void): void => {\n const requestObject: UpdateClassificationRequest = {\n ...classification,\n pinnedVideoMasterId: id\n };\n subjectDataService.updateClassification(classificationId, requestObject, callback);\n };\n\n const classificationMemberListProps = {\n items: members,\n memberType,\n classification,\n updatePinnedVideo,\n getItemAppLink: (item: BaseObject) => ClassificationMemberHelper.getMemberAppLink(memberType, item.id),\n getActions: (item: BaseObject) =>\n ClassificationMemberHelper.getMemberActions(\n AppChannels.CURRICULUMS,\n classificationId,\n OwnerType.Classification,\n memberType,\n item.id\n )\n };\n\n const headerProps = { presentation, classificationId, getTabs: CurriculumsNavHelper.getEditClassificationTabs };\n\n const dataLoaded = PropHelper.propsLoaded(classificationMemberListProps);\n\n return (\n <>\n <EditClassificationNav {...headerProps} memberType={memberType} />\n {dataLoaded &&\n <ClassificationMemberList {...classificationMemberListProps} />\n }\n </>\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 EditCurriculumSubjectDetailsFormProps {\n id?: string;\n subjectTree: SubjectTree;\n deleteSubject: Core.AppLink;\n}\n\nexport function EditCurriculumSubjectDetailsForm(props: EditCurriculumSubjectDetailsFormProps): 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\n const canEdit = hasPermissions(CuratorPermissionName.CurriculumsBackboneUpdate);\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.CurriculumsBackboneDelete) &&\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';\nimport { Form, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/core';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { PresentationStatus } from 'libs/shared/enums/PresentationStatus';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\n\nimport { ImageSelect } from 'shared/components/forms/image-select/ImageSelect';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces/data-requests';\n\ninterface EditCurriculumPresentationDetailsFormProps {\n isNew: boolean;\n imageAppLink: Core.AppLink;\n}\n\nexport function EditCurriculumPresentationDetailsForm(\n props: EditCurriculumPresentationDetailsFormProps\n): React.ReactElement {\n const formikProps = useFormikContext<CreateOrUpdatePresentationRequest>();\n\n return (\n <Form>\n <FormField<CreateOrUpdatePresentationRequest>\n label='Name'\n type='text'\n name='name'\n id='name'\n value={formikProps.values.name}\n placeholder='Enter a name for this presentation'\n autoFocus\n />\n <FormField<CreateOrUpdatePresentationRequest>\n label='Description'\n as='textarea'\n name='description'\n id='description'\n value={formikProps.values.description}\n placeholder='Describe this presentation here'\n />\n <FormField<CreateOrUpdatePresentationRequest>\n as='select'\n label='Status'\n name='status'\n id='status'\n value={formikProps.values.status}\n disabled={props.isNew}\n >\n {ObjectHelper.getEnumKeys(PresentationStatus).map((key: PresentationStatus) =>\n <option key={key} value={PresentationStatus[key]}>{key}</option>)}\n </FormField>\n <FormField<CreateOrUpdatePresentationRequest>\n as='select'\n label='Type'\n name='type'\n id='type'\n value={formikProps.values.type}\n >\n {ObjectHelper.getEnumKeys(PresentationType).map((key: PresentationType) =>\n <option key={key} value={PresentationType[key]}>{key}</option>)}\n </FormField>\n <ImageSelect<CreateOrUpdatePresentationRequest>\n imageType={ImageType.Covers}\n fieldName='cover'\n uploadAppLink={props.imageAppLink}\n />\n <div className='btn-container d-flex justify-content-end'>\n <FormButtons isNew={props.isNew} />\n </div>\n </Form>\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 { Classification } from 'libs/shared/interfaces';\n\nimport { EditClassificationDetails } from 'shared/components/classifications';\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateClassificationRequest } from 'shared/interfaces/data-requests';\nimport { ClassificationTree, SubjectTree } from 'shared/interfaces/models';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditCurriculumClassificationDetailsForm } from 'apps/curriculums/components';\nimport { ClassificationValidationSchema } from 'apps/curriculums/utils';\n\nconst onCreateSuccess = (presentationId: string, onDone: () => void) => (newClassification: Classification) => {\n onDone();\n\n if (!newClassification || !newClassification.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_CLASSIFICATION,\n args: [ presentationId, newClassification.id ]\n });\n};\n\ninterface NewClassificationViewProps {\n presentationId: string;\n parentId?: string;\n}\n\nexport function NewClassificationView(props: NewClassificationViewProps): React.ReactElement {\n const { presentationId, parentId } = props;\n\n const [ classificationTree, setClassificationTree ] = React.useState<ClassificationTree>();\n const [ subjectTree, setSubjectTree ] = React.useState<SubjectTree>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n const classificationTreeFetchOptions =\n SubjectDataServiceHelper.getClassificationTreeFetchOptions(presentationId, setClassificationTree);\n\n const subjectTreeFetchOptions =\n SubjectDataServiceHelper.getSubjectTreeFetchOptions(setSubjectTree, PresentationType.Curriculum);\n\n useFetch(subjectTreeFetchOptions, []);\n useFetch(classificationTreeFetchOptions, [presentationId]);\n\n const saveClassification = (data: CreateClassificationRequest, onDone: () => void): void =>\n subjectDataService.createClassification(\n { ...data, presentationId },\n onCreateSuccess(presentationId, onDone),\n onDone\n );\n\n return (\n <div>\n <h4 className='py-2'>Create New Classification</h4>\n {!!subjectTree && !!classificationTree &&\n <EditClassificationDetails\n classification={(parentId ? { parentIds: [parentId]} : {}) as Classification}\n saveClassification={saveClassification}\n validationSchema={ClassificationValidationSchema}\n >\n <EditCurriculumClassificationDetailsForm\n presentationId={props.presentationId}\n classificationTree={classificationTree}\n subjectTree={subjectTree}\n />\n </EditClassificationDetails>\n }\n </div>\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 { Classification, Playlist, PopupViewProps, Series, Video } from 'libs/shared/interfaces';\n\nimport { DataServices } from 'shared/constants';\nimport { SubjectMemberType } from 'shared/enums';\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}\n\ninterface RemoveClassificationMemberViewProps {\n classificationId: string;\n memberId: string;\n memberType: SubjectMemberType;\n}\n\ntype MemberType = Playlist | Series | Video;\n\ntype PropTypes = RemoveClassificationMemberViewProps & PopupViewProps;\n\nexport function RemoveClassificationMemberView(props: PropTypes): React.ReactElement {\n const [ classification, setClassification ] = React.useState<Classification>();\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.getClassificationFetchOptions(props.classificationId, setClassification),\n [props.classificationId]\n );\n\n const removeMember = () => {\n setShowButtonSpinner(true);\n\n subjectDataService.removeObjectsFromClassification(\n props.classificationId,\n [props.memberId],\n props.memberType,\n null,\n null,\n props.closePopup,\n props.closePopup\n );\n\n if (classification.pinnedVideoMasterId === props.memberId) {\n subjectDataService.updateClassification(props.classificationId, {\n ...classification,\n pinnedVideoMasterId: null\n });\n }\n };\n\n const dataLoaded = !!classification && !!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>{classification.name}</strong>?\n </p>\n <p>This will not remove it from the backbone subject.</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 ${ClassificationMemberHelper.singularizeMemberType(props.memberType)}`}\n showSpinner={showButtonSpinner}\n />\n </PopupButtons>\n </>\n }\n </Popup>\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 { ContentRegionObject, Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces/data-requests';\nimport { SubjectDataService, SubjectDataServiceHelper } from 'shared/services';\n\nimport { EditCurriculumPresentationDetailsForm } from 'apps/curriculums/components';\nimport { PresentationValidationSchema } from 'apps/curriculums/utils';\n\ninterface EditPresentationViewProps {\n id: string;\n}\n\nexport type CreateOrUpdatePresentationFormValues = Omit<CreateOrUpdatePresentationRequest, 'contentRegions'> & {\n contentRegions: ContentRegionObject[]\n};\n\nexport function EditPresentationView({ id }: EditPresentationViewProps): React.ReactElement {\n const [ presentation, setPresentation ] = React.useState<Presentation>();\n\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n useFetch(SubjectDataServiceHelper.getPresentationFetchOptions(id, setPresentation), [id]);\n\n function savePresentation(data: CreateOrUpdatePresentationFormValues, onDone: () => void): void {\n const payload: CreateOrUpdatePresentationRequest = {\n ...data,\n contentRegions: data.contentRegions?.map(cr => cr.systemName)\n };\n subjectDataService.updatePresentation(id, payload, onDone, onDone);\n }\n\n const imageAppLink: Core.AppLink = {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.UPLOAD_IMAGE\n };\n\n const dataLoaded = presentation?.id;\n\n return (\n <>\n <h4 className='py-2'>Edit Presentation</h4>\n {!!dataLoaded &&\n <FormWrapper<CreateOrUpdatePresentationFormValues, Presentation>\n initialValues={presentation}\n validationSchema={PresentationValidationSchema}\n onSubmit={savePresentation}\n >\n <EditCurriculumPresentationDetailsForm\n isNew={!presentation?.id}\n imageAppLink={imageAppLink}\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.CURRICULUMS,\n action: Actions.Subjects.EDIT_PRESENTATION,\n args: [presentation.id]\n});\n\nconst newPresentationAppLink = {\n application: AppChannels.CURRICULUMS,\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.Curriculum), []);\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canEdit = hasPermissions(CuratorPermissionName.CurriculumsBackboneUpdate);\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 {canEdit &&\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 * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { useService } from 'libs/common/react/hooks/UseService';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Presentation } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels, DataServices } from 'shared/constants';\nimport { CreateOrUpdatePresentationRequest } from 'shared/interfaces/data-requests';\nimport { SubjectDataService } from 'shared/services';\n\nimport { EditCurriculumPresentationDetailsForm } from 'apps/curriculums/components';\nimport { PresentationValidationSchema } from 'apps/curriculums/utils';\n\nexport function NewPresentationView(): React.ReactElement {\n const subjectDataService = useService<SubjectDataService>(DataServices.SUBJECT);\n\n function savePresentation(data: CreateOrUpdatePresentationRequest, onDone: () => void): void {\n function success(newPresentation: Presentation): void {\n onDone();\n\n if (!newPresentation || !newPresentation.id)\n return;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_PRESENTATION,\n args: [newPresentation.id]\n });\n }\n\n subjectDataService.createPresentation(data, success, onDone);\n }\n\n const imageAppLink: Core.AppLink = {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.UPLOAD_IMAGE\n };\n\n return (\n <>\n <h4 className='py-2'>Create New Presentation</h4>\n <FormWrapper<CreateOrUpdatePresentationRequest, Presentation>\n initialValues={{} as Presentation}\n validationSchema={PresentationValidationSchema}\n onSubmit={savePresentation}\n >\n <EditCurriculumPresentationDetailsForm\n isNew={true}\n imageAppLink={imageAppLink}\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 { 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.Curriculum\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}\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.CURRICULUMS, 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}\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.Curriculum}\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';\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 { EditCurriculumSubjectDetailsForm } from 'apps/curriculums/components/backbone-classifications';\nimport { SubjectValidationSchema } from 'apps/curriculums/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.Curriculum);\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.CURRICULUMS,\n action: Actions.Subjects.DELETE_SUBJECT\n };\n\n return (\n <>\n <EditSubjectNav\n subjectId={subjectId}\n presentationType={PresentationType.Curriculum}\n activeAction={Actions.Subjects.EDIT_SUBJECT}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.CURRICULUMS, subjectId, presentationId)}\n />\n {!!subject && !!subjectTree &&\n <FormWrapper<CreateOrUpdateSubjectRequest>\n initialValues={subject}\n validationSchema={SubjectValidationSchema}\n onSubmit={saveSubject}\n >\n <EditCurriculumSubjectDetailsForm\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 { 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.Curriculum\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}\n\nexport const getClassificationAppLink = (memberType: SubjectMemberType, presentationId: string) =>\n (classificationId: string): Core.AppLink => {\n const application = AppChannels.CURRICULUMS;\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\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 || !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}\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 members = Flight.useBasicFetch<BaseObject[]>(Array.isArray(memberIds)\n && getMembersRequest(props.memberType, memberIds));\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.CURRICULUMS,\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.Curriculum}\n presentationId={props.presentationId}\n activeAction={getActiveAction(props.memberType)}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.CURRICULUMS, 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.CURRICULUMS,\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 { EditCurriculumSubjectDetailsForm } from 'apps/curriculums/components/backbone-classifications';\nimport { SubjectValidationSchema } from 'apps/curriculums/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.CURRICULUMS,\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.Curriculum);\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.CURRICULUMS,\n action: Actions.Subjects.PRESENTATIONS\n };\n\n const deleteSubjectAppLink = {\n application: AppChannels.CURRICULUMS,\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 <EditCurriculumSubjectDetailsForm\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 { 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}\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.Curriculum), []);\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.Curriculum}\n activeAction={Actions.Subjects.SUBJECT_CLASSIFICATIONS}\n getTabs={(subjectId: string, presentationId: string) =>\n TopicsNavHelper.getEditBackboneClassificationTabs(AppChannels.CURRICULUMS, subjectId, presentationId)}\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.Curriculum), []);\n\n const getAppLink = React.useCallback((subject: SubjectTree) => ({\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.EDIT_SUBJECT,\n args: [subject.id]\n }), []);\n\n const newSubjectAppLink = {\n application: AppChannels.CURRICULUMS,\n action: Actions.Subjects.NEW_SUBJECT\n };\n\n const { hasPermissions } = useCuratorPermissions();\n\n const canEdit = hasPermissions(CuratorPermissionName.CurriculumsBackboneUpdate);\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-blue my-2`}>Curriculums</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 // Deliberately empty as we don't want to delete or add child curriculums \n actions={[] as TreeNodeAction<SubjectTree>[]}\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';\n\nimport { CurriculumsNavHelper } from 'apps/curriculums/utils';\n\ninterface TopNavViewProps {\n currentAppLink: Core.AppLink;\n}\n\nexport function TopNavView({ currentAppLink }: TopNavViewProps): React.ReactElement {\n return <TopNav navItems={CurriculumsNavHelper.getTopNavItems()} currentAppLink={currentAppLink} />;\n}\n","export * from './classifications';\nexport * from './presentations';\nexport * from './subjects';\nexport * from './top-nav';\n"],"mappings":"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"}
|