{"version":3,"file":"app.85a28855ba25348a416e.js","mappings":"uJAAA,IAAIA,EAAM,CACT,uCAAwC,CACvC,MACA,KAED,qCAAsC,CACrC,MACA,KAED,+CAAgD,CAC/C,MACA,KAED,iCAAkC,CACjC,MACA,KAED,yCAA0C,CACzC,MACA,KAED,uCAAwC,CACvC,MACA,KAED,qCAAsC,CACrC,MACA,GAED,kCAAmC,CAClC,MACA,IAED,iCAAkC,CACjC,MACA,KAED,+CAAgD,CAC/C,MACA,MAGF,SAASC,EAAoBC,GAC5B,IAAIC,EAAoBC,EAAEJ,EAAKE,GAC9B,OAAOG,QAAQC,UAAUC,MAAK,KAC7B,IAAIC,EAAI,IAAIC,MAAM,uBAAyBP,EAAM,KAEjD,MADAM,EAAEE,KAAO,mBACHF,CAAC,IAIT,IAAIG,EAAMX,EAAIE,GAAMU,EAAKD,EAAI,GAC7B,OAAOR,EAAoBK,EAAEG,EAAI,IAAIJ,MAAK,IAClCJ,EAAoBS,IAE7B,CACAX,EAAoBY,KAAO,IAAOC,OAAOD,KAAKb,GAC9CC,EAAoBW,GAAK,MACzBG,EAAOC,QAAUf,C,+GCtDjB,MAAMgB,GAAQC,EAAAA,EAAAA,aAAY,CACxBC,KAAM,OACNC,aAAc,CACZC,OAAQ,GAERC,YAAa,KAIbC,cAAe,KACfC,OAAQC,EAAAA,GAAcC,YACtBC,WAAYF,EAAAA,GAAcG,YAE5BC,SAAU,CACRC,SAAUA,CAACC,EAAKC,KAAkB,IAAhB,QAAEC,GAASD,EAC3BD,EAAMP,OAASC,EAAAA,GAAcG,WAC7BG,EAAMJ,WAAaF,EAAAA,GAAcG,WACjCd,OAAOoB,OAAOH,EAAOE,EAAQ,EAE/BE,UAAWA,CAACJ,EAAKK,KAAkB,IAAhB,QAAEH,GAASG,EAC5B,MAAM,MAAEC,GAAUJ,EAClBF,EAAMR,cAAgBc,CAAK,EAE7BC,aAAcA,CAACP,EAAKQ,KAAkB,IAAhB,QAAEN,GAASM,EAC/B,MAAM,OAAEf,GAAWS,EACnBF,EAAMP,OAASA,CAAM,EAEvBgB,iBAAkBA,CAACT,EAAKU,KAAkB,IAAhB,QAAER,GAASQ,EACnC,MAAM,OAAEjB,GAAWS,EACnBF,EAAMJ,WAAaH,CAAM,MAKlB,SACXM,EAAQ,UACRK,EAAS,aACTG,EAAY,iBACZE,GACEvB,EAAMyB,SAEG,QACXC,GACE1B,C,uLC/CG,MAAM2B,EAAc,aACdC,EAAc,QACdC,EAAmB,yBACnBC,EAA8B,eAC9BC,EAA8B,gBAC9BC,EAAyB,CACpCC,QAAS,UACTC,QAAS,UACTC,MAAO,SAGIC,EAAa,CACxBC,MAAO,aACPC,MAAO,SAQIC,EAAwB,CACnCC,OAAQ,SACRC,OAAQ,SACRC,YAAa,cACbC,SAAU,WACVC,QAAS,UACTC,QAAS,UACTC,eAAgB,qBAChBC,WAAY,aACZC,mBAAoB,uBACpBC,wBAAyB,6BACzBC,MAAO,IAGIC,EAAqB,QAErBC,EAAwB,CACnCC,YAAa,cACbnB,QAAS,UACToB,QAAS,UACTC,OAAQ,SACRC,sBAAuB,4BAGZC,EAAiB,CAC5BC,YAAa,CACX,kCACA,wBAISC,EAAuB,SAEvBC,EAAsB,CACjCC,QAAS,CAAElE,GAAI,UAAWO,KAAM,WAChC4D,WAAY,CAAEnE,GAAI,aAAcO,KAAM,cACtC6D,SAAU,CAAEpE,GAAI,WAAYO,KAAM,QAClC8D,UAAW,CAAErE,GAAI,YAAaO,KAAM,cAGzB+D,EAA2B,2BAE3BC,EAAmB,CAC9BC,QAAS,UACTC,MAAO,QACPC,QAAS,UACTlC,MAAO,SAGImC,EAA0B,CAAC,WAAY,aAAc,UAAW,S,qFC/DtE,MAAM9D,EAAsC,CACjDC,YAAa,cACbE,WAAY,aACZ4D,OAAQ,SACRC,OAAQ,SACRC,QAAS,UACTC,MAAO,QACPC,QAAS,UACTC,gBAAiB,kBACjBC,UAAW,aAQAC,EAAkC,CAC7CC,QAAS,EACTC,IAAK,EACLC,IAAK,KAQMC,EAAmC,CAC9CC,KAAM,OACNC,eAAgB,iBAChBC,gBAAiB,kBACjBC,aAAc,gBAGHC,EAAwC,CACnDC,KAAM,OACNC,OAAQ,UAGGC,EAAwC,CACnDC,MAAO,QACPC,KAAM,OACNC,WAAY,aACZC,eAAgB,iBAChBC,YAAa,cACbC,gBAAiB,kB,m9BClDnB,SAASC,EAAInF,EAAOoF,EAAWC,GAC7B,MAAM,GAAExG,GAAOwG,OACUC,IAArBtF,EAAMoF,KACRpF,EAAMoF,GAAa,CAAC,GAEtBpF,EAAMoF,GAAWvG,GAAMwG,CACzB,CAEA,SAASE,EAAOvF,EAAOoF,EAAWC,QACPC,IAArBtF,EAAMoF,KACRpF,EAAMoF,GAAa,CAAC,GAEtBpF,EAAMoF,GAAWC,EAAMxG,IAAG2G,EAAAA,EAAA,GAAQxF,EAAMoF,GAAWC,EAAMxG,KAAQwG,EACnE,CAEA,SAASI,EAAOzF,EAAOoF,EAAWvG,QACPyG,IAArBtF,EAAMoF,KACRpF,EAAMoF,GAAa,CAAC,UAGfpF,EAAMoF,GAAWvG,EAC1B,C,iFAEA,MAAMK,GAAQC,E,SAAAA,aAAY,CACxBC,KAAM,SACNC,aAAc,CAAC,EACfS,SAAU,CACR4F,SAAUA,CAAC1F,EAAKC,KAAkB,IAAhB,QAAEC,GAASD,EAC3B,MAAM,UAAEmF,EAAS,MAAEC,GAAUnF,EAC7BiF,EAAInF,EAAOoF,EAAWC,EAAM,EAE9BM,UAAWA,CAAC3F,EAAKK,KAAkB,IAAhB,QAAEH,GAASG,EAC5B,MAAM,UAAE+E,EAAS,OAAEQ,GAAW1F,EAC9B0F,EAAOC,SAAQR,GAASF,EAAInF,EAAOoF,EAAWC,IAAO,EAEvDS,aAAcA,CAAC9F,EAAKQ,KAAkB,IAAhB,QAAEN,GAASM,EAC/B,MAAM,UAAE4E,EAAS,UAAEW,GAAc7F,EACjCnB,OAAOiH,OAAOD,GAAWF,SAAQR,GAASF,EAAInF,EAAOoF,EAAWC,IAAO,EAEzEY,YAAaA,CAACjG,EAAKU,KAAkB,IAAhB,QAAER,GAASQ,EAC9B,MAAM,UAAE0E,EAAS,MAAEC,GAAUnF,EAC7BqF,EAAOvF,EAAOoF,EAAWC,EAAM,EAEjCa,aAAcA,CAAClG,EAAKmG,KAAkB,IAAhB,QAAEjG,GAASiG,EAC/B,MAAM,UAAEf,EAAS,OAAEQ,GAAW1F,EAC9B0F,EAAOC,SAAQR,GAASE,EAAOvF,EAAOoF,EAAWC,IAAO,EAE1De,gBAAiBA,CAACpG,EAAKqG,KAAkB,IAAhB,QAAEnG,GAASmG,EAClC,MAAM,UAAEjB,EAAS,UAAEW,GAAc7F,EACjCnB,OAAOiH,OAAOD,GAAWF,SAAQR,GAASE,EAAOvF,EAAOoF,EAAWC,IAAO,EAE5EiB,YAAaA,CAACtG,EAAKuG,KAAkB,IAAhB,QAAErG,GAASqG,EAC9B,MAAM,UAAEnB,EAAS,GAAEvG,GAAOqB,EAC1BuF,EAAOzF,EAAOoF,EAAWvG,EAAG,EAE9B2H,aAAcA,CAACxG,EAAKyG,KAAkB,IAAhB,QAAEvG,GAASuG,EAC/B,MAAM,UAAErB,EAAS,IAAExG,GAAQsB,EAC3BtB,EAAIiH,SAAQhH,GAAM4G,EAAOzF,EAAOoF,EAAWvG,IAAI,MAKxC,SACX6G,EAAQ,UACRC,EAAS,aACTG,EAAY,YACZG,EAAW,aACXC,EAAY,gBACZE,EAAe,YACfE,EAAW,aACXE,GACEtH,EAAMyB,SAEG,QAAEC,GAAY1B,E,eC1EpB,SAASwH,EAASC,EAAM9H,GAC7B,OAAO+H,EAAAA,EAAAA,cACL5G,QAAiCsF,IAAvBtF,EAAM4F,OAAOe,GAAsB3G,EAAM4F,OAAOe,GAAM9H,QAAMyG,GACtEuB,EAAAA,aAEJ,CAEO,SAASC,EAAUH,EAAM/H,GAC9B,OAAOgI,EAAAA,EAAAA,cACL5G,GAASpB,EAAIX,KACXY,QAA8ByG,IAAvBtF,EAAM4F,OAAOe,GAAsB3G,EAAM4F,OAAOe,GAAM9H,QAAMyG,KAErEuB,EAAAA,aAEJ,C,gDCdA,MAYA,GAZiBE,E,SAAAA,IAAe,CAC9BC,gBAAiB,CACfnI,GAAI,mCACJoI,eAAgB,oMAChBC,YAAa,oFAEfC,YAAa,CACXtI,GAAI,+BACJoI,eAAgB,iB,oFCRb,MAAMG,EAAoBpH,GAAUA,EAAMqH,kBAAkBC,cACtDC,EAAmBvH,GAAUA,EAAMqH,kBAAkBG,aACrDC,EAA0BzH,GAAUA,EAAMqH,kBAAkBK,oBAC5DC,EAA4BC,GAAa5H,GACpDA,EAAMqH,kBAAkBQ,kBAAkBD,IAAUE,MAEzCC,EAAkB/H,GAAUA,EAAMqH,kBAAkBW,W,0ICHjE,MAAM9I,GAAQC,EAAAA,EAAAA,aAAY,CACxBC,KAAM,oBACNC,aAAc,CACZ4I,aAAc,GACdX,cAAe5H,EAAAA,GAAcC,YAC7B6H,aAAc,GACdQ,YAAa,GACbN,oBAAqB,CAAC,EACtBG,kBAAmB,CAAC,GAEtB/H,SAAU,CACRoI,uBAAwBA,CAAClI,EAAKC,KAAkB,IAAhB,QAAEC,GAASD,EACzCD,EAAMiI,aAAe/H,EAAQ+H,YAAY,EAE3CE,oBAAqBA,CAACnI,EAAKK,KAAkB,IAAhB,QAAEH,GAASG,EACtCL,EAAMsH,cAAgBpH,EAAQT,MAAM,EAEtC2I,mBAAoBA,CAACpI,EAAKQ,KAAkB,IAAhB,QAAEN,GAASM,EACrCR,EAAMwH,aAAetH,EAAQT,MAAM,EAErC4I,kBAAmBA,CAACrI,EAAKU,KAAkB,IAAhB,QAAER,GAASQ,EACpCV,EAAMgI,YAAc9H,EAAQT,MAAM,EAEpC6I,0BAA2BA,CAACtI,EAAKmG,KAAkB,IAAhB,QAAEjG,GAASiG,EAC5CnG,EAAM0H,oBAAsBxH,EAAQT,MAAM,EAE5C8I,+BAAgCA,CAACvI,EAAKqG,KAAkB,IAAhB,QAAEnG,GAASmG,EACjDtH,OAAOoB,OAAOH,EAAM6H,kBAAmB3H,EAAQ,EAEjDsI,gCAAiCA,CAACxI,EAAKuG,KAAkB,IAAhB,QAAErG,GAASqG,EAClDxH,OAAOoB,OAAOH,EAAM6H,kBAAmB3H,EAAQ,MAKxC,uBACXgI,EAAsB,oBACtBC,EAAmB,mBACnBC,EAAkB,kBAClBC,EAAiB,0BACjBC,EAAyB,+BACzBC,EAA8B,gCAC9BC,GACEtJ,EAAMyB,SAEG,QACXC,GACE1B,C,kJC9CJuJ,EAAAA,EAAAA,IAAa,CACX,mBACC,2BAEH,MAAMC,EAAgBA,KAAMC,EAAAA,EAAAA,MAAYC,gBAClCC,EAAsBA,IAAO,GAAEH,8BAC/BI,EAAkCA,IAAO,GAAEJ,4C,eCGjD,MAAMK,EAAoB,CACxB,WACA,aACA,QACA,WACA,OACA,aACA,aACA,OACA,YACA,eACA,gBAIK,SAASC,EAAgBC,GAC9B,OAAOC,UACLC,GAAShB,EAAAA,EAAAA,IAAoB,CAAEc,WAAUxJ,OAAQC,EAAAA,GAAcC,eAE/D,IACE,MAAMyJ,QDhBLF,eAA6BD,GAClC,MAAM,KAAEI,SAAeC,EAAAA,EAAAA,MACpBC,IAAK,GAAEV,OAAyBI,KACnC,OAAOO,EAAAA,EAAAA,IAAgBH,EACzB,CCY+BI,CAAcR,GAEvCG,EAAWM,MAAK,CAACC,EAASC,IACxBb,EAAkBc,QAAQF,EAAQ9K,IAAMkK,EAAkBc,QAAQD,EAAS/K,MAE7EsK,GAASxD,EAAAA,EAAAA,IAAU,CAAEP,UAAW,aAAcQ,OAAQwD,KACtDD,GAASjB,EAAAA,EAAAA,IAAuB,CAC9BD,aAAcmB,EAAWnL,KAAI6L,GAAaA,EAAUjL,QAEtDsK,GAAShB,EAAAA,EAAAA,IAAoB,CAAEc,WAAUxJ,OAAQC,EAAAA,GAAcG,aACjE,CAAE,MAAOwB,GACHA,EAAM0I,UAAsC,MAA1B1I,EAAM0I,SAAStK,QACnC0J,GAASb,EAAAA,EAAAA,IAA0B,CAAE7I,OAAQC,EAAAA,GAAcgE,UAG7DyF,GAAShB,EAAAA,EAAAA,IAAoB,CAAEc,WAAUxJ,OAAQC,EAAAA,GAAc+D,SACjE,EAEJ,CAEO,SAASuG,EAAgBf,EAAU3I,EAAON,GAC/C,OAAOkJ,UACLC,GAASf,EAAAA,EAAAA,IAAmB,CAAE3I,OAAQC,EAAAA,GAAcC,eAEpD,IAIE,aDhCCuJ,eAA+BD,EAAU3I,EAAON,SAC/CsJ,EAAAA,EAAAA,MACHW,MACE,GAAEpB,OAAyBI,IAC5B,CACEpK,GAAIyB,EACJ4J,QAASlK,GAGjB,CCoBYmK,CAAgBlB,EAAU3I,EAAON,GACvCmJ,GAASlD,EAAAA,EAAAA,IAAY,CAAEb,UAAW,aAAcC,MAAO,CAAExG,GAAIyB,EAAO4J,QAASlK,MAC7EmJ,GAASf,EAAAA,EAAAA,IAAmB,CAAE3I,OAAQC,EAAAA,GAAcG,eAC7C,CACT,CAAE,MAAOwB,GAEP,OADA8H,GAASf,EAAAA,EAAAA,IAAmB,CAAE3I,OAAQC,EAAAA,GAAc+D,WAC7C,CACT,EAEJ,CAEO,SAAS2G,EAAuBnB,EAAUoB,GAC/C,OAAOnB,UACLC,GAAShB,EAAAA,EAAAA,IAAoB,CAAE1I,OAAQC,EAAAA,GAAcC,eAErD,IACE,MAAM2K,QD5BLpB,eAAyCD,EAAUoB,GACxD,MAAM,KAAEhB,SAAeC,EAAAA,EAAAA,MACpBC,IAAK,GAAET,OAAqCG,IAAY,CAAEsB,cAAeF,EAASpM,IAAIuM,EAAAA,WAAWC,KAAK,OACzG,OAAOjB,EAAAA,EAAAA,IAAgBH,EACzB,CCwBkCqB,CAA0BzB,EAAUoB,GAChElB,GAASZ,EAAAA,EAAAA,IAA+B+B,IACxCnB,GAAShB,EAAAA,EAAAA,IAAoB,CAAE1I,OAAQC,EAAAA,GAAcG,aACvD,CAAE,MAAOwB,GACP8H,GAAShB,EAAAA,EAAAA,IAAoB,CAAE1I,OAAQC,EAAAA,GAAc+D,SACvD,EAEJ,CAEO,SAASkH,EAAuB1B,EAAUrB,EAASE,GACxD,OAAOoB,UACLC,GAASf,EAAAA,EAAAA,IAAmB,CAAE3I,OAAQC,EAAAA,GAAcC,eAEpD,IACE,MAAM2K,QD7BLpB,eAA4CD,EAAUrB,EAASE,GACpE,MAAM,KAAEuB,SAAeC,EAAAA,EAAAA,MACpBW,MAAO,GAAEnB,OAAqCG,IAAY,CAAE,EAACuB,EAAAA,EAAAA,WAAU5C,IAAW,CAAEE,WACvF,OAAO0B,EAAAA,EAAAA,IAAgBH,EACzB,CCyBkCuB,CAA6B3B,EAAUrB,EAASE,GAG5E,OAFAqB,GAASX,EAAAA,EAAAA,IAAgC8B,IACzCnB,GAASf,EAAAA,EAAAA,IAAmB,CAAE3I,OAAQC,EAAAA,GAAcG,eAC7C,CACT,CAAE,MAAOwB,GAEP,OADA8H,GAASf,EAAAA,EAAAA,IAAmB,CAAE3I,OAAQC,EAAAA,GAAc+D,WAC7C,CACT,EAEJ,C,gDCjGA,MAycA,GAzciBsD,E,SAAAA,IAAe,CAC9B8D,+BAAgC,CAC9BhM,GAAI,wDACJoI,eACE,wFAEFC,YACE,8GAGJ4D,aAAc,CACZjM,GAAI,sCACJoI,eAAgB,oBAElB8D,UAAW,CACTlM,GAAI,kCACJoI,eAAgB,yBAElB+D,GAAI,CACFnM,GAAI,2BACJoI,eAAgB,KAChBC,YAAa,gEAEf+D,OAAQ,CACNpM,GAAI,+BACJoI,eAAgB,SAChBC,YAAa,6EAEfgE,QAAS,CACPrM,GAAI,gCACJoI,eAAgB,UAChBC,YAAa,qDAEfiE,2BAA4B,CAC1BtM,GAAI,mDACJoI,eAAgB,2DAChBC,YAAa,iEAEfkE,8BAA+B,CAC7BvM,GAAI,sDACJoI,eAAgB,qDAChBC,YAAa,mGAEfmE,6BAA8B,CAC5BxM,GAAI,qDACJoI,eAAgB,sDAChBC,YAAa,oGAEfoE,yBAA0B,CACxBzM,GAAI,iDACJoI,eAAgB,0HAChBC,YAAa,mGAEfqE,wBAAyB,CACvB1M,GAAI,gDACJoI,eAAgB,uOAChBC,YAAa,oGAEfsE,WAAY,CACV3M,GAAI,mCACJoI,eAAgB,OAChBC,YAAa,mEAEfuE,WAAY,CACV5M,GAAI,mCACJoI,eAAgB,OAChBC,YAAa,sEAEfwE,aAAc,CACZ7M,GAAI,qCACJoI,eAAgB,SAChBC,YAAa,sEAEfyE,YAAa,CACX9M,GAAI,oCACJoI,eAAgB,QAChBC,YAAa,mFAIf,iBAAkB,CAChBrI,GAAI,qDACJoI,eAAgB,SAChBC,YAAa,+BAEf,oBAAqB,CACnBrI,GAAI,wDACJoI,eAAgB,YAChBC,YAAa,kCAEf,mBAAoB,CAClBrI,GAAI,uDACJoI,eAAgB,WAChBC,YAAa,iCAEf,oBAAqB,CACnBrI,GAAI,wDACJoI,eAAgB,YAChBC,YAAa,kCAEf,qBAAsB,CACpBrI,GAAI,yDACJoI,eAAgB,gBAChBC,YAAa,sCAEf,iBAAkB,CAChBrI,GAAI,qDACJoI,eAAgB,MAChBC,YAAa,+CAEf,kBAAmB,CACjBrI,GAAI,sDACJoI,eAAgB,YAChBC,YAAa,4CAEf0E,gBAAiB,CACf/M,GAAI,gDACJoI,eAAgB,WAElB4E,qBAAsB,CACpBhN,GAAI,sDACJoI,eAAgB,gCAChBC,YAAa,uMAEf4E,oBAAqB,CACnBjN,GAAI,qDACJoI,eAAgB,mGAChBC,YAAa,wEAEf6E,iCAAkC,CAChClN,GAAI,kEACJoI,eAAgB,uCAChBC,YAAa,2EAEf8E,gCAAiC,CAC/BnN,GAAI,iEACJoI,eAAgB,uFAChBC,YAAa,0FAEf+E,mBAAoB,CAClBpN,GAAI,yDACJoI,eAAgB,UAChBC,YAAa,4FAEfgF,2BAA4B,CAC1BrN,GAAI,iEACJoI,eAAgB,wBAChBC,YAAa,+IAEfiF,eAAgB,CACdtN,GAAI,qDACJoI,eAAgB,mDAChBC,YAAa,kDAEfkF,oBAAqB,CACnBvN,GAAI,0DACJoI,eAAgB,uBAChBC,YAAa,uCAGfmF,oBAAqB,CACnBxN,GAAI,oDACJoI,eAAgB,wCAElBqF,qBAAsB,CACpBzN,GAAI,sDACJoI,eAAgB,qDAElBsF,oBAAqB,CACnB1N,GAAI,qDACJoI,eAAgB,yFAElBuF,8BAA+B,CAC7B3N,GAAI,+DACJoI,eAAgB,uDAElBwF,6BAA8B,CAC5B5N,GAAI,8DACJoI,eAAgB,wOAIlByF,iBAAkB,CAChB7N,GAAI,iDACJoI,eAAgB,qBAElB0F,yBAA0B,CACxB9N,GAAI,qDACJoI,eAAgB,oCAElB2F,wBAAyB,CACvB/N,GAAI,oDACJoI,eAAgB,0EAElB4F,8BAA+B,CAC7BhO,GAAI,0DACJoI,eAAgB,6CAElB6F,6BAA8B,CAC5BjO,GAAI,yDACJoI,eAAgB,2GAIlB8F,kCAAmC,CACjClO,GAAI,kEACJoI,eAAgB,iBAElB+F,uCAAwC,CACtCnO,GAAI,wEACJoI,eAAgB,4CAElBgG,sCAAuC,CACrCpO,GAAI,uEACJoI,eAAgB,iKAIlBiG,iBAAkB,CAChBrO,GAAI,yCACJoI,eAAgB,qBAElBkG,sBAAuB,CACrBtO,GAAI,+CACJoI,eAAgB,4BAChBC,YAAa,0EAEfkG,qBAAsB,CACpBvO,GAAI,8CACJoI,eAAgB,6HAChBC,YAAa,wFAEfmG,wBAAyB,CACvBxO,GAAI,iDACJoI,eAAgB,iCAChBC,YAAa,qFAEfoG,gCAAiC,CAC/BzO,GAAI,0DACJoI,eAAgB,4CAChBC,YAAa,6FAEfqG,eAAgB,CACd1O,GAAI,uCACJoI,eAAgB,YAChBC,YAAa,iDAEfsG,aAAc,CACZ3O,GAAI,qCACJoI,eAAgB,SAChBC,YAAa,qEAEfuG,aAAc,CACZ5O,GAAI,qCACJoI,eAAgB,SAChBC,YAAa,oEAEfwG,4BAA6B,CAC3B7O,GAAI,qDACJoI,eAAgB,uFAChBC,YAAa,0EAEfyG,6BAA8B,CAC5B9O,GAAI,sDACJoI,eAAgB,qBAChBC,YAAa,8EAEf0G,mBAAoB,CAClB/O,GAAI,yDACJoI,eAAgB,uBAChBC,YAAa,yEAEf2G,iBAAkB,CAChBhP,GAAI,8CACJoI,eAAgB,wDAChBC,YAAa,4DAEf4G,yBAA0B,CACxBjP,GAAI,+DACJoI,eAAgB,kBAChBC,YAAa,+EAEf6G,iBAAkB,CAChBlP,GAAI,yCACJoI,eAAgB,sCAChBC,YAAa,0DAGf8G,wBAAyB,CACvBnP,GAAI,iDACJoI,eAAgB,uCAElBgH,sBAAuB,CACrBpP,GAAI,+CACJoI,eAAgB,sCAElBiH,wBAAyB,CACvBrP,GAAI,iDACJoI,eAAgB,qCAElBkH,sBAAuB,CACrBtP,GAAI,+CACJoI,eAAgB,oCAElBmH,sBAAuB,CACrBvP,GAAI,mCACJoI,eAAgB,YAElBoH,4BAA6B,CAC3BxP,GAAI,+CACJoI,eAAgB,iCAChBC,YAAa,qFAEfoH,0BAA2B,CACzBzP,GAAI,6CACJoI,eAAgB,+BAChBC,YAAa,mFAEfqH,0BAA2B,CACzB1P,GAAI,6CACJoI,eAAgB,sCAChBC,YAAa,gGAEfsH,wBAAyB,CACvB3P,GAAI,2CACJoI,eAAgB,uCAChBC,YAAa,iGAEfuH,0BAA2B,CACzB5P,GAAI,6CACJoI,eAAgB,sCAChBC,YAAa,gGAEfwH,wBAAyB,CACvB7P,GAAI,2CACJoI,eAAgB,uCAChBC,YAAa,iGAEfyH,iCAAkC,CAChC9P,GAAI,oDACJoI,eAAgB,2BAChBC,YAAa,oEAEf0H,+BAAgC,CAC9B/P,GAAI,kDACJoI,eAAgB,yBAChBC,YAAa,kEAEf2H,iCAAkC,CAChChQ,GAAI,oDACJoI,eAAgB,2BAChBC,YAAa,oEAEf4H,+BAAgC,CAC9BjQ,GAAI,kDACJoI,eAAgB,yBAChBC,YAAa,kEAEf6H,2BAA4B,CAC1BlQ,GAAI,4DACJoI,eAAgB,2BAElB+H,0BAA2B,CACzBnQ,GAAI,mDACJoI,eAAgB,iEAElBgI,+BAAgC,CAC9BpQ,GAAI,wDACJoI,eAAgB,mFAElBiI,yBAA0B,CACxBrQ,GAAI,iDACJoI,eAAgB,wBAElBkI,yBAA0B,CACxBtQ,GAAI,+DACJoI,eAAgB,mCAElBmI,mCAAoC,CAClCvQ,GAAI,4DACJoI,eAAgB,kCAChBC,YAAa,qGAEfmI,kCAAmC,CACjCxQ,GAAI,2DACJoI,eAAgB,8JAChBC,YAAa,iFAEfoI,oCAAqC,CACnCzQ,GAAI,6DACJoI,eAAgB,0DAChBC,YAAa,mFAEfqI,6BAA8B,CAC5B1Q,GAAI,sDACJoI,eAAgB,2BAChBC,YAAa,8FAEfsI,4BAA6B,CAC3B3Q,GAAI,qDACJoI,eAAgB,+EAChBC,YAAa,mFAEfuI,sCAAuC,CACrC5Q,GAAI,uDACJoI,eAAgB,4DAElByI,qCAAsC,CACpC7Q,GAAI,sDACJoI,eAAgB,gEAElB0I,4CAA6C,CAC3C9Q,GAAI,6DACJoI,eAAgB,mFAElB2I,uCAAwC,CACtC/Q,GAAI,gEACJoI,eAAgB,4BAElB4I,sCAAuC,CACrChR,GAAI,+DACJoI,eAAgB,qDAElB6I,cAAe,CACbjR,GAAI,0BACJoI,eAAgB,gBAElB8I,cAAe,CACblR,GAAI,0BACJoI,eAAgB,UAElB+I,gBAAiB,CACfnR,GAAI,4BACJoI,eAAgB,YAElBgJ,eAAgB,CACdpR,GAAI,uCACJoI,eAAgB,aAChBC,YAAa,8BAEfgJ,eAAgB,CACdrR,GAAI,uCACJoI,eAAgB,wBAChBC,YAAa,8BAEfiJ,aAAc,CACZtR,GAAI,qCACJoI,eAAgB,WAChBC,YAAa,4BAEfkJ,aAAc,CACZvR,GAAI,qCACJoI,eAAgB,sBAChBC,YAAa,6B,uOClcV,MAAMmJ,EAAuBA,CAACC,EAAOC,EAAKzI,IAC/CwI,EAAME,QAAOC,GAAQA,EAAKF,KAASzI,IAGxB4I,EAAmBA,CAACC,EAASC,EAAQC,EAAWC,KAC3D,MAAMC,EAAOF,EAAa,GAAEA,KAAaC,IAAiBA,EAC1D,OAAOE,SAAQC,EAAAA,EAAAA,IAAML,EAAQG,KAASE,EAAAA,EAAAA,IAAMN,EAASI,GAAM,EAKhDG,EAAcjR,IAA0B,IAAxBkR,EAAWC,GAAQnR,EAC9C,MAAMoR,EAAQC,MAAU,IAAI7R,EAS5B,OANEA,EADE6R,IAAOF,GAASG,SAASF,EAAO,QACzBG,EAAAA,GAAUC,SACVH,IAAOH,GAAWO,QAAQL,EAAO,QACjCG,EAAAA,GAAUG,SAEVH,EAAAA,GAAUI,OAEdnS,CAAM,EAGFoS,EAAmB,CAAC,UAAW,SAC/BC,EAAgBA,CAACC,EAAMC,IAAWD,GAAQC,EAAS,GAAED,KAAQC,IAASD,EAItEE,EAAWC,GAAcA,EAAWA,EAASC,MAAM,KAAK,GAAK,GAC7DC,EAAsBL,GAAST,IAAOS,EAAM,CAAC,aAAc,eAAe,GAAMM,UAChFC,EAAsBN,GAASA,GAAQV,IAAOU,EAAMH,GAAkB,GAAMQ,UAC5EE,EAAkBP,GAASA,GAAQV,MAASkB,QAAQ,OAAOC,OAAO,SAClEC,EAAgBV,GAASA,GAAQV,MAASqB,MAAM,OAAOF,OAAO,SAC9DG,EAAiBZ,GAASA,GAAQV,IAAOU,EAAMH,GAAkB,GAAMY,OAAO,SAC9EI,EAAiBd,GAAST,IAAOS,EAAM,CAAC,aAAc,mBAAoB,eAAe,GAAMU,OAAO,cAEtGK,EAAiBA,CAACf,EAAMC,KACnC,MAAMe,EAAQF,EAAcd,GACtBiB,EAAQJ,EAAcZ,GAE5B,OAAOV,IAAOQ,EAAciB,EAAOC,GAAO,EAG/BC,EAA8BA,CAAC5J,EAAM5J,EAAQyT,IACxDC,IAAAA,QACE9J,EAAKmH,QAAOuB,GAAQA,EAAKtS,SAAWA,IACpC,CAAE2T,GAAQN,EAAeM,EAAIjC,UAAWoB,EAAea,EAAIC,aAC3D,CAACH,IAIQI,EAAwBjT,IAE/B,IACAkT,GAHgC,UACpCpC,EAAS,UAAEkC,EAAS,QAAEjC,EAAO,QAAEoC,GAChCnT,EAEC,MAAMoT,EA9BiBC,EAACvC,EAAWC,IAAYE,IAAOH,GAAWwC,OAAOvC,EAAS,OA8B9DsC,CAAUvC,EAAWC,GAClCwC,EA9BmBC,EAAC1C,EAAWC,IAAYE,IAAOH,GAAWwC,OAAOvC,EAAS,SA8B9DyC,CAAY1C,EAAWC,GACtC0C,EA9BkBC,EAAC5C,EAAWC,IAAYE,IAAOH,GAAWwC,OAAOvC,EAAS,QA8B9D2C,CAAW5C,EAAWC,GACpC4C,EAAkBhD,QAAQqC,GAAaG,GACvCS,EAAa3C,IAAOH,GACpB+C,EAAW5C,IAAOF,GAClB+C,EAAiBrB,EAAe3B,EAAWoB,EAAec,IAC1De,EAAetB,EAAe1B,EAASsB,EAAac,IA8B1D,OA3BED,EADEE,IAAeO,EACDC,EAAWxB,OAAO,gBACzBgB,GAAcO,EACN,WACbG,EAAe1B,OAAO,mCACtB2B,EAAa3B,OAAO,iBAEfmB,IAAiBI,EACT,WACbC,EAAWxB,OAAO,sBAClByB,EAASzB,OAAO,mBAEVmB,IAAgBE,GAAgBE,EAKhCJ,GAAiBE,GAAgBE,EAM1B,WACbG,EAAe1B,OAAO,mCACtB2B,EAAa3B,OAAO,+BAPP,WACbwB,EAAWxB,OAAO,4BAClByB,EAASzB,OAAO,wBAPH,WACbwB,EAAWxB,OAAO,sBAClByB,EAASzB,OAAO,wBAafc,CAAa,C,gIC9Ff,MAAMnF,EAAwB,CACnCuD,SAAU,WACVF,SAAU,WACVG,OAAQ,UAGGyC,EAAe,CAC1B1C,SAAU,UACVF,SAAU,QACVG,OAAQ,WAGG0C,EAAkC,CAC7C3C,SAAU4C,EAAAA,EAAS/E,4BACnBiC,SAAU8C,EAAAA,EAASjF,oCACnBsC,OAAQ2C,EAAAA,EAASlF,mCAGNmF,EAAwB,CACnCC,SAAU,WACVC,QAAS,UACTC,UAAW,aASAC,EAA+B,CAC1C,CACE9M,MAAO0M,EAAsBC,SAC7BI,QAASN,EAAAA,EAAS9E,sCAClBqF,MATG,OAWL,CACEhN,MAAO0M,EAAsBE,QAC7BG,QAASN,EAAAA,EAAS7E,qCAClBoF,MAbE,MAeJ,CACEhN,MAAO0M,EAAsBG,UAC7BE,QAASN,EAAAA,EAAS5E,4CAClBmF,MAjBS,cAqBAzD,EAAQC,MAKRyD,GAJU1D,EAAMoB,OAAO,oBAAqBpB,EAAMlM,IAAI,EAAG,SAASsN,OAAO,oBAC7DpB,EAAMlM,IAAI,EAAG,QAAQsN,OAAO,cAAepB,EAAMlM,IAAI,EAAG,QAAQsN,OAAO,cACvEpB,EAAM2D,SAAS,EAAG,QAAQvC,OAAO,cAAepB,EAAM2D,SAAS,EAAG,QAAQvC,OAAO,cAE7E,CAAC,QAAS,UAAW,OAAQ,U,kxCCnCnD,SAASwC,IACd,OAAOC,EAAAA,EAAAA,eAAc,CAAEC,MAAO,yBAChC,CAEO,SAASC,IACd,OAAOF,EAAAA,EAAAA,eAAc,CAAEC,MAAO,sBAChC,CAEO,SAASE,EAAyBjC,GAAuB,IAAlBkC,EAAQC,UAAAC,OAAA,QAAAlQ,IAAAiQ,UAAA,IAAAA,UAAA,GACpD,OAAOxW,OAAOD,KAAKsU,GAAKqC,QAAO,CAACC,EAAcnF,KAC5C,MAAMoF,GAAenL,EAAAA,EAAAA,WAAU+F,GACzBzI,EAAQwN,EAAWlC,EAAI7C,GAAO,CAAEzI,MAAOsL,EAAI7C,IACjD,OAAA/K,EAAAA,EAAA,GACKkQ,GAAY,IACf,CAACC,GAAe7N,GAAK,GAEtB,CAAC,EACN,CAEO,SAAS8N,EAA8BxC,GAC5C,GAAmB,iBAARA,GAA4B,OAARA,EAC7B,OAAOA,EAGT,GAAIyC,MAAMC,QAAQ1C,GAChB,OAAOA,EAAInV,KAAKwS,GAASmF,EAA8BnF,KAGzD,MAAMsF,EAAe,CAAC,EAKtB,OAJAhX,OAAOD,KAAKsU,GAAKvN,SAAS0K,IACxB,MAAMyF,EAAezF,EAAI0F,QAAQ,aAAa,CAACC,EAAOC,IAAOA,EAAGC,gBAChEL,EAAaC,GAAgBJ,EAA8BxC,EAAI7C,GAAK,IAE/DwF,CACT,CAEO,SAASM,EAA8BjD,GAC5C,GAAmB,iBAARA,GAA4B,OAARA,EAC7B,OAAOA,EAGT,GAAIyC,MAAMC,QAAQ1C,GAChB,OAAOA,EAAInV,KAAKwS,GAAS4F,EAA8B5F,KAGzD,MAAMiF,EAAe,CAAC,EAKtB,OAJA3W,OAAOuX,QAAQlD,GAAKvN,SAAQ5F,IAAkB,IAAhBsQ,EAAKzI,GAAM7H,EACvC,MAAM0V,EAAepF,EAAI0F,QAAQ,kBAAmB,SAASM,cAC7Db,EAAaC,GAAwB,iBAARpF,EAAyBzI,EAAQuO,EAA8BvO,EAAM,IAE7F4N,CACT,CAEO,SAASc,EAAyBpD,GACvC,OAAOA,EAAI7C,IAAI0F,QAAQ,aAAa,CAACC,EAAOO,IAAWA,EAAOL,eAChE,CAEO,SAASM,EAAyBtD,GACvC,MAAMuD,EAAS,CAAC,EAchB,OAZA5X,OAAOuX,QAAQlD,GAAKvN,SAAQxF,IAAkB,IAAhBkQ,EAAKzI,GAAMzH,EACvC,IACOuW,OAAOC,MAAMD,OAAO9O,IAGvB6O,EAAOpG,GAAOuG,KAAKC,MAAMjP,GAFzB6O,EAAOpG,GAAOzI,CAIlB,CAAE,MAAOrJ,GACPkY,EAAOpG,GAAOzI,CAChB,KAGK6O,CACT,CAOO,MAAMK,EAA8BC,IACzC,IAAIC,GAAWC,EAAAA,EAAAA,KAAQxO,EAAAA,EAAAA,MAAYyO,aAMnC,OAJIF,EAASG,SAAS,OACpBH,EAAWA,EAAShY,MAAM,GAAI,IAG3B+X,EAAUK,WAAWJ,GAInBD,EAHG,GAAEC,IAAWD,GAGP,EAGX,SAASM,EAAYtO,EAAUuO,EAAkBC,GACtD,MAAyB,SAArBD,EAEOR,EADY,SAAjBS,EACiC,WAAUxO,wBAEZ,WAAUA,KAAYwO,KAEnD,IAAE9O,EAAAA,EAAAA,MAAYC,mBAAmB6O,KAAgBxO,GAC3D,CAEO,SAASyO,EAAcC,GAC5B,MAAMxO,GAAWyO,EAAAA,EAAAA,gBACX,SAAE3O,IAAa4O,EAAAA,EAAAA,YAAWC,EAAAA,GAC1BC,GAAenR,EAAAA,EAAAA,cAAYe,EAAAA,EAAAA,IAAyBgQ,IACpDrQ,GAAgBV,EAAAA,EAAAA,aAAYQ,EAAAA,GAWlC,OAVA4Q,EAAAA,EAAAA,YAAU,KACJ,CAACtY,EAAAA,GAAcgE,OAAQhE,EAAAA,GAAc+D,QAAQwU,SAAS3Q,IAGtDyQ,SACF5O,GAASiB,EAAAA,EAAAA,IAAuBnB,EAAU,CAAC0O,IAC7C,GACC,CAAC1O,IAGG,CAAC8O,EADY7O,SAAiBC,GAASwB,EAAAA,EAAAA,IAAuB1B,EAAU0O,EAAa7P,IAE9F,CAEO,MAAMoQ,EAAeA,CAACC,EAAStZ,KACpC,MAAMuZ,EAAcD,EAAQE,MAAMC,GAAWA,EAAOzZ,KAAOA,IAC3D,OAAOuZ,EAAcA,EAAYtD,MAAQ,EAAE,EAMtC,SAASyD,IAIdC,EAAAA,GAAcA,EAAAA,GAAW,kBAAkB,SAAwBC,EAAU5D,GAC3E,OAAO6D,KAAKC,KAAK,SAAU,IAAI,SAAwBC,GACrD,MAAMhI,EAAS,GAef,GAbAgI,EAAK/S,SAAQ,CAAC4K,EAAMoI,KAClB,MAAMC,EAAgBrI,EAAKgI,GAEvBK,GAAiBF,EAAKpI,QAAOuI,GAASA,EAAMN,KAAcK,IAAetD,OAAS,GACpF5E,EAAOoI,KACLN,KAAKO,YAAY,CACflI,KAAO,GAAE2H,KAAK3H,QAAQ8H,MAAUJ,IAChC5D,YAGN,IAGEjE,EAAO4E,OAAS,EAClB,MAAM,IAAIgD,EAAAA,GAAoB5H,GAGhC,OAAO,CACT,GACF,IAEA4H,EAAAA,GAAcA,EAAAA,GAAY,wBAAwB,SAA8B1H,EAAc+D,GAC5F,OAAO6D,KAAKC,KAAK,SAAU9D,GAAS,SAAwBqE,GAC1D,IAAKA,IAAoBA,EAAgBpI,GACvC,OAAO,EAKT,GAHoB4H,KAAKS,OAAO3I,QAAO4I,GAASA,IAAUF,IACvDG,MAAKD,GAASA,EAAMtI,IAAeyF,gBAAkB2C,EAAgBpI,GAAcyF,gBAGpF,MAAMmC,KAAKO,YAAY,CACrBlI,KAAO,GAAE2H,KAAK3H,QAAQD,IACtBzP,MAAOwT,IAGX,OAAO,CACT,GACF,IAEA2D,EAAAA,GAAcA,EAAAA,GAAY,WAAW,SAAiB3D,EAASlO,GAC7D,OAAO+R,KAAKC,KAAK,YAAa9D,GAAS,WAKrC,KAAK6D,KAAKS,SACFT,KAAKS,OAAO9F,WAAaqF,KAAKS,OAAO3F,SAAqB,SAAT7M,KACjD+R,KAAKS,OAAOhI,WAAauH,KAAKS,OAAO/H,SAAqB,SAATzK,IAEvD,OAAO,EAGT,MAAM2S,GAAgBxG,EAAAA,EAAAA,IAAe4F,KAAKS,OAAOhI,WAAWoB,EAAAA,EAAAA,IAAemG,KAAKS,OAAO9F,YACjFkG,GAAczG,EAAAA,EAAAA,IAAe4F,KAAKS,OAAO/H,SAASsB,EAAAA,EAAAA,IAAagG,KAAKS,OAAO3F,UACjF,IAAIgG,EAQJ,GANa,SAAT7S,EACF6S,EAAyBF,EAAc5H,QAAQ6H,GAC7B,SAAT5S,IACT6S,EAAyBF,EAAcG,cAAcF,IAGnDC,EACF,MAAMd,KAAKO,YAAY,CACrBlI,KAAO,GAAE2H,KAAK3H,OACd1P,MAAOwT,IAGX,OAAO,CACT,GACF,IAEA2D,EAAAA,GAAcA,EAAAA,GAAY,eAAe,SAAqB3D,EAASlO,GACrE,OAAO+R,KAAKC,KAAK,gBAAiB9D,GAAS,WACzC,IAAK6D,KAAKgB,cACR,OAAO,EAET,IAAIrH,EAQJ,GANa,SAAT1L,EACF0L,GAAUD,EAAAA,EAAAA,IAAmBsG,KAAKgB,eAChB,SAAT/S,IACT0L,GAAUC,EAAAA,EAAAA,IAAmBoG,KAAKgB,iBAG/BrH,EACH,MAAMqG,KAAKO,YAAY,CACrBlI,KAAO,GAAE2H,KAAK3H,OACd1P,MAAOwT,IAGX,OAAO,CACT,GACF,GACF,CAEO,MAAM8E,EAA2BC,IAOtC,OAAKA,EAMEtI,KAFgBuI,EAEKC,OAAOF,GAFIC,EAAYE,UAAU,EAAG,MAElBC,SALrC,GAGcH,KAE+B,EAG3CI,EAA2BlI,GAOjCA,EAIET,IAAOS,GAAMU,OAAO1R,EAAAA,IAHlB,GAMEmZ,EAAenI,IAC1B,MAAMoI,EAAiBF,EAAwBlI,GAAMI,MAAM,KAAK,GAEhE,OAAOnB,QAAQmJ,EAAe3E,QAAU,GAAG,EAGhC4E,EAA4BC,IACvC,IAAIC,EAAU,EACVC,EAAOF,EACX,KAAOE,EAAO,KAAQD,EAAU,GAC9BC,GAAQ,IACRD,GAAW,EAIb,MAAQ,GADqB1D,OAAO4D,WAAWD,GAAME,QAAQ,MAD/C,CAAC,IAAK,KAAM,KAAM,KAAM,MAEEH,IAAU,C,4sCCxSpD,MAAMI,EAAoBza,IAAA,IAAC,MACzB0a,EAAK,KACLC,EAAI,YACJC,EAAW,SACXC,EAAQ,QACRC,EAAO,SACPC,EAAQ,SACRC,EAAQ,UACRC,EAAS,UACTC,EAAS,YACTC,GAEDnb,EADIob,E,kXAAKC,CAAArb,EAAAsb,GAAA,OAERC,EAAAA,EAAAA,MAACC,EAAAA,EAAYC,SAAQlW,EAAAA,EAAA,CACnBmW,UAAU,0CACVb,SAAUA,EACVC,QAASA,EACTF,YAAaA,EACbD,KAAMA,GACFS,GAAK,IAAAJ,SAAA,EAETO,EAAAA,EAAAA,MAACC,EAAAA,EAAYG,QAAO,CAClBD,UAAU,yDACVE,MAAO,CAAEC,eAAgB,SAAUb,SAAA,EAEnCc,EAAAA,EAAAA,KAAA,OAAKJ,UAAU,0BAAyBV,SAAEN,KAC1CoB,EAAAA,EAAAA,KAACN,EAAAA,EAAYO,QAAO,CAACC,YAAU,EAAAhB,UAC7Bc,EAAAA,EAAAA,KAAA,OAAKJ,UAAU,mBAAkBV,UAC/Bc,EAAAA,EAAAA,KAACG,EAAAA,EAAU,CAACC,IAAKjB,EAAWkB,IAAKC,EAAAA,EAAYC,OAAQC,EAAAA,EAAMC,QAAQ,cAGvEhB,EAAAA,EAAAA,MAACC,EAAAA,EAAYO,QAAO,CAACS,UAAQ,EAAAxB,SAAA,CAC1BD,IACCe,EAAAA,EAAAA,KAAA,OAAKJ,UAAU,oBAAmBV,UAChCc,EAAAA,EAAAA,KAACG,EAAAA,EAAU,CACTQ,QAAUC,IACRA,EAAMC,kBACN5B,GAAU,EAEZmB,IAAKhB,EACLiB,IAAKS,EAAAA,EACLP,OAAQC,EAAAA,EACRC,QAAQ,YAIdT,EAAAA,EAAAA,KAAA,OAAKJ,UAAU,cAAaV,UAC1Bc,EAAAA,EAAAA,KAACG,EAAAA,EAAU,CAACC,IAAKf,EAAagB,IAAKU,EAAAA,EAAYR,OAAQC,EAAAA,EAAMC,QAAQ,kBAI3ET,EAAAA,EAAAA,KAACN,EAAAA,EAAYsB,KAAI,CAACpB,UAAU,gCAA+BV,SAAEA,OACxC,EAGzBP,EAAkBsC,UAAY,CAC5BpC,KAAMqC,IAAAA,KACNpC,YAAaoC,IAAAA,KACbtC,MAAOsC,IAAAA,KAAeC,WACtBpC,SAAUmC,IAAAA,KAAeC,WACzBlC,SAAUiC,IAAAA,KACVhC,SAAUgC,IAAAA,KAAeC,WACzBhC,UAAW+B,IAAAA,OAAiBC,WAC5B/B,UAAW8B,IAAAA,OAAiBC,WAC5B9B,YAAa6B,IAAAA,OAAiBC,WAC9BnC,QAASkC,IAAAA,MAGXvC,EAAkByC,aAAe,CAC/BnC,SAAU,KACVH,iBAAavV,EACbsV,UAAMtV,EACNyV,QAASA,QAIX,QAAeqC,EAAAA,KAAW1C,E,uIC1E1B,MAAM2C,EAAuBpd,IAAA,IAAC,KAAEqd,GAAMrd,EAAA,OACpC8b,EAAAA,EAAAA,KAACwB,EAAAA,EAAK,CAACf,QAAQ,SAAS,cAAY,uBAAsBvB,UACxDc,EAAAA,EAAAA,KAACyB,EAAAA,EAAgB,CACf3e,GAAG,mCACHoI,eAAe,oMACfjB,OAAQ,CACNyX,aACE1B,EAAAA,EAAAA,KAACwB,EAAAA,EAAMG,KAAI,CAACC,MAAMhV,EAAAA,EAAAA,MAAYiV,YAAY3C,SACvCqC,EAAKO,cAActJ,EAAAA,EAASpN,mBAK/B,EAGVkW,EAAqBL,UAAY,CAC/BM,KAAMQ,EAAAA,GAAUZ,YAGlB,SAAea,EAAAA,EAAAA,GAAWV,E,iHCrB1B,MAAMW,EAAkB/d,IAUlB,IAVmB,GACvBpB,EAAE,KACFO,EAAI,MACJ0V,EAAK,SACLmJ,EAAQ,UACRtC,EAAS,SACTuC,EAAQ,OACRC,EAAM,QACNC,EAAO,SACPC,GACDpe,EACC,MAAMqe,EAAc,GAAEzf,YAKtB,OACEkd,EAAAA,EAAAA,KAACwC,EAAAA,GAAKC,MAAK,CACTC,UAAW5f,EACX8c,UAAWA,EAAUV,UAErBO,EAAAA,EAAAA,MAAA,OAAKG,UAAU,qBAAoBV,SAAA,EACjCO,EAAAA,EAAAA,MAAA,OAAKG,UAAU,kEAAiEV,SAAA,EAC9Ec,EAAAA,EAAAA,KAACwC,EAAAA,GAAKG,MAAK,CAAC/C,UAAU,0BAAyBV,SAC5CnG,KAEHiH,EAAAA,EAAAA,KAAC4C,EAAAA,EAAa,CACZ9f,GAAIA,EACJO,KAAMA,EACN,mBAAkBkf,EAClBJ,SAAUA,EACVC,OAAQA,EACRC,QAASA,EACTC,SAAUA,QAGdtC,EAAAA,EAAAA,KAACwC,EAAAA,GAAKK,KAAI,CACRjD,UAAU,iCACV9c,GAAIyf,EAAWrD,SAEdgD,QAGM,EAGjBD,EAAgBhB,UAAY,CAC1Bne,GAAIoe,IAAAA,OAAiBC,WACrBpI,MAAOmI,IAAAA,KAAeC,WACtB9d,KAAM6d,IAAAA,OACNgB,SAAUhB,IAAAA,KAAeC,WACzBvB,UAAWsB,IAAAA,OACXiB,SAAUjB,IAAAA,KAAeC,WACzBiB,OAAQlB,IAAAA,KACRmB,QAASnB,IAAAA,KAAeC,WACxBmB,SAAUpB,IAAAA,MAEZe,EAAgBb,aAAe,CAC7BxB,UAAW,KACXwC,OAAQ,KACR/e,KAAM,KACNif,UAAU,GAGZ,S,+HCjEA,MAAMQ,EAAsB5e,IAAwB,IAAvB,KAAEb,EAAI,SAAE6b,GAAUhb,EAC7C,MAAM,QAAE0Q,EAAO,OAAEC,IAAWkO,EAAAA,EAAAA,MACtBC,GAAe9N,EAAAA,EAAAA,IAAMN,EAASvR,GAC9B4f,GAAa/N,EAAAA,EAAAA,IAAML,EAAQxR,GAEjC,OACE2c,EAAAA,EAAAA,KAACkD,EAAAA,EAAiB,CAAAhE,SACf8D,GAAgBC,GAEbjD,EAAAA,EAAAA,KAACwC,EAAAA,GAAKW,QAAQC,SAAQ,CAACxY,KAAK,UAAUyY,SAAS,EAAMnE,SAClD+D,GADyD,GAAE5f,qBAK9D2c,EAAAA,EAAAA,KAACqB,EAAAA,SAAc,CAAAnC,SACZA,GADmB,GAAE7b,wBAIV,EAIxByf,EAAoB7B,UAAY,CAC9B5d,KAAM6d,IAAAA,OAAiBC,WACvBjC,SAAUgC,IAAAA,MAEZ4B,EAAoB1B,aAAe,CACjClC,SAAU,MAGZ,U,2+BC5BA,MAAMoE,EAAgBpf,IAOhB,IAPiB,KACrBb,EAAI,MACJ0V,EAAK,KACLwK,EAAI,UACJ3D,EAAS,eACT4D,GAEDtf,EADIuf,E,kXAAMlE,CAAArb,EAAAsb,GAET,MAAM,QACJ5K,EAAO,OAAEC,EAAM,aAAE6O,EAAY,WAAEC,EAAU,cAAEC,IACzCb,EAAAA,EAAAA,MACEC,GAAe9N,EAAAA,EAAAA,IAAMN,EAASvR,GAC9B4f,GAAa/N,EAAAA,EAAAA,IAAML,EAAQxR,GAGjC,OACEoc,EAAAA,EAAAA,MAAC+C,EAAAA,GAAKC,MAAK,CAAC7C,UAAWA,EAAUV,SAAA,CAC9BnG,GACDiH,EAAAA,EAAAA,KAACwC,EAAAA,GAAKW,QAAO1Z,EAAAA,EAAA,GACPga,GAAM,IACVpgB,KAAMA,EACNuc,UAAW4D,EACXrB,SAAUuB,EACVtB,OAAQuB,EACRE,QAXenhB,GAAMkhB,EAAclhB,EAAEohB,OAAOzgB,UAAMkG,GAYlDwa,YAAaf,KAAkBC,MAEjCjD,EAAAA,EAAAA,KAAC8C,EAAmB,CAACzf,KAAMA,EAAK6b,UAC9Bc,EAAAA,EAAAA,KAACwC,EAAAA,GAAKK,KAAI,CAAA3D,SAAEqE,QAEH,EAIjBD,EAAcrC,UAAY,CACxB5d,KAAM6d,IAAAA,OAAiBC,WACvBpI,MAAOmI,IAAAA,QACPqC,KAAMrC,IAAAA,QACNtB,UAAWsB,IAAAA,OACXsC,eAAgBtC,IAAAA,OAChBnV,MAAOmV,IAAAA,UAAoB,CACzBA,IAAAA,OACAA,IAAAA,SACCC,YAGLmC,EAAclC,aAAe,CAC3BmC,MAAMvD,EAAAA,EAAAA,KAAAgE,EAAAA,SAAA,IACNjL,OAAOiH,EAAAA,EAAAA,KAAAgE,EAAAA,SAAA,IACPpE,UAAW,GACX4D,eAAgB,QAGlB,S,0HCvDO,MAAMS,EAAiB/f,IAAA,IAAC,KAAEsa,GAAMta,EAAA,OACrC8b,EAAAA,EAAAA,KAACkE,EAAAA,EAAO,CACNC,UAAU,SACVC,KAAK,SACL3D,QAAQ,UACRjC,KAAMA,EACN6F,kBACErE,EAAAA,EAAAA,KAACyB,EAAAA,EAAgB,CACf3e,GAAG,oBACHoI,eAAe,aACfC,YAAY,uDAGhB,EAGJ8Y,EAAe7C,aAAe,CAC5B5C,UAAMjV,GAGR0a,EAAehD,UAAY,CACzBzC,KAAM0C,IAAAA,QAGR,MAMA,EANgBoD,KACdtE,EAAAA,EAAAA,KAAA,OAAKJ,UAAU,sEAAqEV,UAClFc,EAAAA,EAAAA,KAACiE,EAAc,K,4FC3BnB,MASA,EAT8BM,KAC5BvE,EAAAA,EAAAA,KAACwB,EAAAA,EAAK,CAACf,QAAQ,SAAS,cAAY,wBAAuBvB,UACzDc,EAAAA,EAAAA,KAACyB,EAAAA,EAAgB,CACf3e,GAAG,mCACHoI,eAAe,kJ,6tpgBCoBrB,GACE,GAAMsZ,EACN,Q,66kBACA,GAAMC,EACN,QAASC,EACT,GAAMC,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,EACN,QAASC,EACT,QAASC,EACT,QAASC,EACT,GAAMC,EACN,GAAMC,EACN,GAAMC,EACN,QAASC,EACT,GAAMC,EACN,QAASC,EACT,SAAUC,EACV,GAAMC,EACN,QAASC,EACT,GAAMC,G,s9GCtBR,IACE,GAAMnB,EACN,Q,mHACA,GAAMC,GACN,QAASC,GACT,GAAMC,EACN,GAAMC,EACN,GAAME,EACN,QAASC,EACT,QAASC,EACT,QAASC,EACT,GAAMC,EACN,GAAMC,EACN,GAAMC,EACN,QAASC,EACT,GAAMC,EACN,QAASC,EACT,SAAUC,EACV,GAAMC,EACN,QAASC,EACT,GAAMC,G,4l4HClBR,IACE,GAAMnB,GACN,Q,swHACA,GAAMC,GACN,QAASC,GACT,GAAMC,GACN,GAAMC,GACN,GAAMC,GACN,GAAMC,GACN,QAASC,GACT,QAASC,GACT,QAASC,GACT,GAAMC,GACN,GAAMC,GACN,GAAMC,GACN,QAASC,GACT,GAAMC,GACN,QAASC,GACT,SAAUC,GACV,GAAMC,GACN,QAASC,GACT,GAAME,GACN,GAAMD,I,+uhDCtBR,IACE,GAAMnB,GACN,Q,w2DACA,GAAMC,GACN,QAASC,GACT,GAAMC,GACN,GAAMC,GACN,GAAMC,GACN,GAAMC,GACN,QAASC,GACT,QAASC,GACT,QAASC,GACT,GAAMC,GACN,GAAMC,GACN,GAAMC,GACN,QAASC,GACT,GAAMC,GACN,QAASC,GACT,SAAUC,GACV,GAAMC,GACN,QAASC,GACT,GAAME,GACN,GAAMD,I,w845FCtCR,IACEE,EACAC,GACAC,GACAC,GCYF,CACE,GAAMxB,GACN,Q,i4oGACA,GAAMC,GACN,QAASC,GACT,GAAMC,GACN,GAAMC,GACN,GAAMC,GACN,GAAMC,GACN,QAASC,GACT,QAASC,GACT,QAASC,GACT,GAAMC,GACN,GAAMC,GACN,GAAMC,GACN,QAASC,GACT,GAAMC,GACN,QAASC,GACT,SAAUC,GACV,GAAMC,GACN,QAASC,GACT,GAAME,GACN,GAAMD,K,wCChDD,MAEDxiB,IAAQC,EAAAA,GAAAA,aAAY,CACxBC,KAAM,eACNC,aAAc,CACZ4J,SAAU,KACVxJ,OAAQ,KACRuiB,kBAAmB,MAErBliB,SAAU,CACRS,aAAcA,CAACP,EAAKC,KAAkB,IAAhB,QAAEC,GAASD,EAC/BD,EAAMiJ,SAAW/I,EAAQ+I,SACzBjJ,EAAMP,OAASS,EAAQT,MAAM,EAE/BwiB,yBAA0BA,CAACjiB,EAAKK,KAAkB,IAAhB,QAAEH,GAASG,EAC3CL,EAAMkiB,mBAAqBhiB,EAAQgiB,kBAAkB,MAK9C,aACX3hB,GAAY,yBACZ0hB,IACE/iB,GAAMyB,SAEG,QACXC,IACE1B,GC3BSijB,GAAU,UACVC,GAAS,SACT3e,GAAS,SACTC,GAAS,SACT2e,GAAS,SA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","sources":["webpack://@edx/frontend-app-course-authoring/./node_modules/@openedx-plugins/ lazy ^\\.\\/course\\-app\\-.*\\/Settings\\.jsx$ namespace object","webpack://@edx/frontend-app-course-authoring/./plugins/course-apps/live/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/constants.js","webpack://@edx/frontend-app-course-authoring/./src/data/constants.js","webpack://@edx/frontend-app-course-authoring/./src/generic/model-store/slice.js","webpack://@edx/frontend-app-course-authoring/./src/generic/model-store/hooks.js","webpack://@edx/frontend-app-course-authoring/./src/messages.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/messages.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/utils.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/data/constants.js","webpack://@edx/frontend-app-course-authoring/./src/utils.js","webpack://@edx/frontend-app-course-authoring/./src/generic/CollapsableEditor.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/ConnectionErrorAlert.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/FormSwitchGroup.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/FormikErrorFeedback.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/FormikControl.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/Loading.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/PermissionDeniedAlert.jsx","webpack://@edx/frontend-app-course-authoring/./src/i18n/messages/frontend-lib-content-components/index.js","webpack://@edx/frontend-app-course-authoring/./src/i18n/messages/frontend-platform/index.js","webpack://@edx/frontend-app-course-authoring/./src/i18n/messages/paragon/index.js","webpack://@edx/frontend-app-course-authoring/./src/i18n/messages/frontend-component-footer/index.js","webpack://@edx/frontend-app-course-authoring/./src/i18n/index.js","webpack://@edx/frontend-app-course-authoring/./src/i18n/messages/frontend-app-course-authoring/index.js","webpack://@edx/frontend-app-course-authoring/./src/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/generic/processing-notification/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/help-urls/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/generic/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/constants.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/textbooks/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/data/constants.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/data/slice.js","webpack://@edx/frontend-app-course-authoring/./src/store.js","webpack://@edx/frontend-app-course-authoring/./src/generic/alert-message/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/saving-error-alert/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/saving-error-alert/SavingErrorAlert.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/saving-error-alert/utils.js","webpack://@edx/frontend-app-course-authoring/./src/generic/processing-notification/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/generic/sub-header/SubHeader.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/processing-notification/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/textbooks/empty-placeholder/messages.js","webpack://@edx/frontend-app-course-authoring/./src/textbooks/empty-placeholder/EmptyPlaceholder.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/delete-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/delete-modal/DeleteModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/textbooks/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/generic/promptIfDirty/PromptIfDirty.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/modal-dropzone/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/modal-dropzone/useModalDropzone.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/modal-dropzone/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/generic/modal-dropzone/ModalDropzone.jsx","webpack://@edx/frontend-app-course-authoring/./src/textbooks/textbook-form/messages.js","webpack://@edx/frontend-app-course-authoring/./src/textbooks/textbook-form/validations.js","webpack://@edx/frontend-app-course-authoring/./src/textbooks/textbook-form/TextbookForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/textbooks/utils.js","webpack://@edx/frontend-app-course-authoring/./src/textbooks/textbook-card/messages.js","webpack://@edx/frontend-app-course-authoring/./src/textbooks/textbook-card/TextbooksCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/help-sidebar/constants.js","webpack://@edx/frontend-app-course-authoring/./src/generic/help-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/help-sidebar/HelpSidebarLink.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/help-sidebar/HelpSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/textbooks/textbook-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/help-urls/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/help-urls/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/help-urls/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/help-urls/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/textbooks/textbook-sidebar/TextbookSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/textbooks/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/textbooks/data/thunk.js","webpack://@edx/frontend-app-course-authoring/./src/textbooks/messages.js","webpack://@edx/frontend-app-course-authoring/./src/textbooks/Textbooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/textbooks/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/search-modal/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/search-modal/manager/SearchManager.js","webpack://@edx/frontend-app-course-authoring/./src/search-modal/data/apiHooks.js","webpack://@edx/frontend-app-course-authoring/./src/search-modal/ClearFiltersButton.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/images/empty-search.svg","webpack://@edx/frontend-app-course-authoring/./src/search-modal/images/no-results.svg","webpack://@edx/frontend-app-course-authoring/./src/search-modal/EmptyStates.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/add-component/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/constants.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/search-modal/Highlight.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/SearchResult.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/SearchResults.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/SearchKeywordsField.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/SearchFilterWidget.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/BlockTypeLabel.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/FilterByBlockType.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/FilterByTags.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/Stats.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/SearchUI.jsx","webpack://@edx/frontend-app-course-authoring/./src/search-modal/SearchModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/header/messages.js","webpack://@edx/frontend-app-course-authoring/./src/header/utils.js","webpack://@edx/frontend-app-course-authoring/./src/header/Header.jsx","webpack://@edx/frontend-app-course-authoring/./src/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/generic/NotFoundAlert.jsx","webpack://@edx/frontend-app-course-authoring/./src/CourseAuthoringPage.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/messages.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/messages.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/DiscussionsProvider.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-list/messages.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-list/SupportedFeature.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-list/FeaturesList.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-list/AppCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-list/FeaturesTable.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-list/AppListNextButton.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-list/AppList.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/data/hook.js","webpack://@edx/frontend-app-course-authoring/./src/generic/SaveFormConnectionErrorAlert.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/AnonymousPostingFields.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/ConfirmationPopup.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/FieldFeedback.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-restrictions/RestrictDatesInput.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-restrictions/CollapseCardHeading.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-restrictions/DiscussionRestrictionItem.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-restrictions/RestrictionSchedules.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/DiscussionRestriction.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-topics/TopicItem.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/openedx/OpenedXConfigFormProvider.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/discussion-topics/DiscussionTopics.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/DivisionByGroupFields.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/ReportedContentEmailNotifications.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/InContextDiscussionFields.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/openedx/OpenedXConfigForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/lti/messages.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/AppExternalLinks.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/lti/LtiConfigForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/AppConfigFormProvider.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/AppConfigFormSaveButton.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/AppConfigForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/DiscussionsSettings.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/pages/PageSettingButton.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/pages/PageCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/pages/PageGrid.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/SettingsComponent.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/utils.js","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/PagesAndResources.jsx","webpack://@edx/frontend-app-course-authoring/./src/editors/EditorContainer.jsx","webpack://@edx/frontend-app-course-authoring/./src/selectors/VideoSelectorContainer.jsx","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/data/images/previewLmsStaticPages.png","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/messages.js","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/CustomPagesProvider.jsx","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/CustomPageCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/EditModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/custom-pages/CustomPages.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/constants.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/data/utils.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/messages.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/FilesPageProvider.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/messages.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/FileMenu.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/ThumbnailPreview.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/GalleryCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/sort-and-filter-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/sort-and-filter-modal/utils.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/sort-and-filter-modal/SortAndFilterModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/sort-and-filter-modal/index.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/TableActions.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/utils.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/FilterStatus.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/RowStatus.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/Footer.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/table-custom-columns/AccessColumn.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/table-custom-columns/ActiveColumn.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/table-custom-columns/MoreInfoColumn.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/data/constants.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/table-custom-columns/StatusColumn.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/table-custom-columns/ThumbnailColumn.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/table-components/table-custom-columns/TranscriptColumn.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/data/utils.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/FileInput.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/UsageMetricsMessage.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/InfoModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/ApiStatusToast.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/DeleteConfirmationModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/FileTable.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/utils.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/generic/EditFileErrors.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/FileThumbnail.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/FileInfoModalSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/FileValidationModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/FilesPage.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/files-page/index.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/transcript-settings/FormDropdown.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/transcript-settings/messages.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/transcript-settings/Cielo24Form.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/transcript-settings/ThreePlayMediaForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/transcript-settings/OrderTranscriptForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/data/errors.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/transcript-settings/TranscriptSettings.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/transcript-settings/index.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/messages.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/VideosPageProvider.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/VideoThumbnail.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/InfoTab.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/transcript-item/LanguageSelect.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/transcript-item/messages.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/transcript-item/TranscriptMenu.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/transcript-item/Transcript.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/transcript-item/index.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/TranscriptTab.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/VideoInfoModalSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/info-sidebar/index.js","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/VideosPage.jsx","webpack://@edx/frontend-app-course-authoring/./src/files-and-videos/videos-page/index.js","webpack://@edx/frontend-app-course-authoring/./src/generic/AlertProctoringError.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/internet-connection-alert/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/internet-connection-alert/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/setting-card/messages.js","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/setting-card/SettingCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/settings-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/settings-sidebar/SettingsSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/utils.js","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/messages.js","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/modal-error/ModalErrorListItem.jsx","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/modal-error/messages.js","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/modal-error/ModalError.jsx","webpack://@edx/frontend-app-course-authoring/./src/advanced-settings/AdvancedSettings.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/configure-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/datepicker-control/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/datepicker-control/DatepickerControl.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/configure-modal/BasicTab.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/configure-modal/VisibilityTab.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/configure-modal/PrereqSettings.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/configure-modal/AdvancedTab.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/configure-modal/UnitTab.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/configure-modal/ConfigureModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/header-navigations/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/header-navigations/HeaderNavigations.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/outline-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/outline-sidebar/OutlineSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/outline-sidebar/utils.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/messages.js","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/data/apiHooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/ContentTagsDropDownSelector.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/common/context.js","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/ContentTagsCollapsibleHelper.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/TagsTree.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/ContentTagsCollapsible.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/data/apiHooks.js","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/ContentTagsDrawerHelper.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/utils.js","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/ContentTagsDrawer.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/ContentTagsDrawerSheet.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/tag-count/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/generic/data/apiHooks.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/status-bar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/DraftIcon.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/utils.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/status-bar/StatusBar.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/enable-highlights-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/enable-highlights-modal/EnableHighlightsModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/hooks.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/card-header/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/card-header/StatusBadge.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/card-header/CardStatus.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/card-header/CardHeader.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/drag-helper/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/drag-helper/SortableItem.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/drag-helper/DragContextProvider.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/card-header/TitleButton.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/xblock-status/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/xblock-status/ReleaseStatus.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/xblock-status/GradingPolicyAlert.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/xblock-status/GradingTypeAndDueDate.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/xblock-status/StatusMessages.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/xblock-status/HideAfterDueMessage.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/xblock-status/XBlockStatus.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/section-card/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/section-card/SectionCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/generic/clipboard/hooks/useCopyToClipboard.js","webpack://@edx/frontend-app-course-authoring/./src/generic/clipboard/paste-component/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/clipboard/paste-component/components/WhatsInClipboard.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/clipboard/paste-component/components/PasteButton.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/clipboard/paste-component/constants.js","webpack://@edx/frontend-app-course-authoring/./src/generic/clipboard/paste-component/components/PopoverContent.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/clipboard/paste-component/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/subsection-card/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/subsection-card/SubsectionCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/card-header/TitleLink.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/unit-card/UnitCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/highlights-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/highlights-modal/HighlightsModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/empty-placeholder/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/empty-placeholder/EmptyPlaceholder.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/publish-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/publish-modal/PublishModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/page-alerts/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/page-alerts/PageAlerts.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/drag-helper/utils.js","webpack://@edx/frontend-app-course-authoring/./src/generic/drag-helper/DraggableList.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/utils/courseChecklistValidators.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/utils/getChecklistValues.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/data/thunk.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/utils/getChecklistForStatusBar.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-outline/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-outline/CourseOutline.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/generic/section-sub-header/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/basic-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/basic-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/basic-section/constants.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/credit-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/credit-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/details-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/details-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/course-upload-image/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/course-upload-image/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/course-upload-image/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/generic/WysiwygEditor.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/introducing-section/introduction-video/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/introducing-section/introduction-video/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/introducing-section/extended-course-details/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/introducing-section/extended-course-details/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/introducing-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/introducing-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/pacing-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/pacing-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/schedule-section/schedule-row/ScheduleRow.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/schedule-section/certificate-display-row/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/schedule-section/certificate-display-row/CertificateDisplayRow.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/schedule-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/schedule-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/learning-outcomes-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/learning-outcomes-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/instructors-section/instructor-container/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/instructors-section/instructor-container/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/instructors-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/instructors-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/requirements-section/grade-requirements/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/requirements-section/grade-requirements/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/requirements-section/entrance-exam/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/requirements-section/entrance-exam/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/requirements-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/requirements-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/constants.js","webpack://@edx/frontend-app-course-authoring/./src/generic/ApplyWrapper.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/license-icons/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/license-icons/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/license-display/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/license-display/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/license-selector/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/license-selector/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/license-commons-options/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/license-commons-options/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/license-section/utils.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/schedule-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/schedule-sidebar/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/messages.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/utils.js","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/schedule-and-details/constants.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/grading-scale/react-ranger.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/grading-scale/messages.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/grading-scale/utils.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/grading-scale/components/GradingScaleHandle.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/grading-scale/components/GradingScaleTick.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/grading-scale/components/GradingScaleSegment.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/grading-scale/GradingScale.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/grading-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/grading-sidebar/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/messages.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/assignment-section/utils/enum.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/assignment-section/utils/validation.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/assignment-section/assignments/AssignmentItem.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/assignment-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/assignment-section/assignments/AssignmentTypeName.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/assignment-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/credit-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/credit-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/deadline-section/utils.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/deadline-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/deadline-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/GradingSettings.jsx","webpack://@edx/frontend-app-course-authoring/./src/grading-settings/hooks.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/course-team-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/course-team-sidebar/CourseTeamSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-team/add-user-form/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/constants.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/add-user-form/AddUserForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-team/add-team-member/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/add-team-member/AddTeamMember.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-team/course-team-member/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/course-team-member/CourseTeamMember.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-team/info-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/info-modal/InfoModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-team/utils.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-team/data/thunk.js","webpack://@edx/frontend-app-course-authoring/./src/course-team/CourseTeam.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-updates/course-handouts/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/course-handouts/CourseHandouts.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-updates/course-update/utils.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/course-update/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/course-update/CourseUpdate.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-updates/delete-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/delete-modal/DeleteModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-updates/constants.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/update-form/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/update-form/UpdateForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-updates/update-form/utils.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-updates/utils.js","webpack://@edx/frontend-app-course-authoring/./src/course-updates/CourseUpdates.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-updates/data/thunk.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/add-component/add-component-btn/AddComponentIcon.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/add-component/add-component-btn/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/add-component/add-component-modals/ModalContainer.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/add-component/add-component-modals/ComponentModalView.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/add-component/AddComponent.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-xblock/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-xblock/constants.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-xblock/xblock-messages/XBlockMessages.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-xblock/xblock-messages/utils.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-xblock/CourseXBlock.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/header-title/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/header-title/HeaderTitle.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/breadcrumbs/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/breadcrumbs/Breadcrumbs.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/header-navigations/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/header-navigations/HeaderNavigations.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-sequence/hooks.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-sequence/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-sequence/sequence-navigation/UnitIcon.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-sequence/sequence-navigation/UnitButton.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-sequence/sequence-navigation/SequenceNavigationDropdown.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-sequence/sequence-navigation/SequenceNavigationTabs.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-sequence/sequence-navigation/SequenceNavigation.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/course-sequence/Sequence.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/data/utils.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/data/thunk.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/utils.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/components/SidebarHeader.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/components/ReleaseInfoComponent.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/components/SidebarBody.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/components/sidebar-footer/UnitVisibilityInfo.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/divider/Divider.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/components/sidebar-footer/ActionButtons.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/components/sidebar-footer/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/modal-notification/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/PublishControls.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/sidebar/LocationInfo.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/tags-sidebar-controls/TagsSidebarHeader.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/tags-sidebar-controls/TagsSidebarBody.jsx","webpack://@edx/frontend-app-course-authoring/./src/content-tags-drawer/tags-sidebar-controls/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/clipboard/paste-notification/constants.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/clipboard/paste-notification/components/FileList.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/clipboard/paste-notification/components/AlertContent.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/clipboard/paste-notification/components/ActionButton.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/clipboard/paste-notification/utils.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/clipboard/paste-notification/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-unit/clipboard/paste-notification/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-unit/CourseUnit.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/utils.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/messages.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-section/CertificateSection.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-details/messages.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-details/CertificateDetails.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-details/hooks/useCertificateDetails.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-signatories/messages.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-signatories/signatory/Signatory.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-signatories/signatory/SignatoryForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-signatories/CertificateSignatories.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-signatories/hooks/useEditSignatory.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-signatories/hooks/useCreateSignatory.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/constants.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificates-list/hooks/useCertificatesList.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificates-list/CertificatesList.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-details/CertificateDetailsForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-create-form/hooks/useCertificateCreateForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-create-form/CertificateCreateForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-edit-form/hooks/useCertificateEditForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-edit-form/CertificateEditForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/layout/certificates-sidebar/utils.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/layout/certificates-sidebar/sidebar-block/SidebarBlock.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/layout/certificates-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/certificates/layout/certificates-sidebar/CertificatesSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/layout/header-buttons/hooks/useHeaderButtons.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/layout/header-buttons/HeaderButtons.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/layout/MainLayout.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/layout/hooks/useLayout.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/Certificates.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/certificate-without-modes/CertificateWithoutModes.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/empty-certificates-with-modes/EmptyCertificatesWithModes.jsx","webpack://@edx/frontend-app-course-authoring/./src/certificates/hooks/useCertificates.jsx","webpack://@edx/frontend-app-course-authoring/./src/export-page/messages.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/export-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/export-sidebar/ExportSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/export-page/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/data/constants.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/utils.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/export-modal-error/messages.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/export-modal-error/ExportModalError.jsx","webpack://@edx/frontend-app-course-authoring/./src/export-page/export-footer/messages.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/export-footer/ExportFooter.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/course-stepper/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/export-page/export-stepper/messages.js","webpack://@edx/frontend-app-course-authoring/./src/export-page/export-stepper/ExportStepper.jsx","webpack://@edx/frontend-app-course-authoring/./src/export-page/CourseExportPage.jsx","webpack://@edx/frontend-app-course-authoring/./src/import-page/data/constants.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/utils.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/import-stepper/messages.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/import-stepper/ImportStepper.jsx","webpack://@edx/frontend-app-course-authoring/./src/import-page/import-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/import-sidebar/ImportSidebar.jsx","webpack://@edx/frontend-app-course-authoring/./src/import-page/file-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/file-section/FileSection.jsx","webpack://@edx/frontend-app-course-authoring/./src/import-page/messages.js","webpack://@edx/frontend-app-course-authoring/./src/import-page/CourseImportPage.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/AriaLiveRegion.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/utils/courseChecklistData.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/utils/courseChecklistValidators.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/utils/getFilteredChecklist.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/utils/getValidatedValue.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/ChecklistItemBody.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/ChecklistItemComment.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/ChecklistSection.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/ChecklistSection/index.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/utils.js","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/CourseChecklist.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-checklist/index.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/messages.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/constants.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/empty-placeholder/messages.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/empty-placeholder/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/utils.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/common/messages.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/common/TitleButton.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/common/UsageList.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/prompt-if-dirty/PromptIfDirty.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/content-groups-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/content-groups-section/ContentGroupForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/content-groups-section/utils.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/content-groups-section/ContentGroupCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/content-groups-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/experiment-configurations-section/constants.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/experiment-configurations-section/utils.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/experiment-configurations-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/experiment-configurations-section/ExperimentFormGroups.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/experiment-configurations-section/validation.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/experiment-configurations-section/ExperimentForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/experiment-configurations-section/ExperimentCardGroup.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/experiment-configurations-section/ExperimentCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/experiment-configurations-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/enrollment-track-groups-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/group-configuration-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/group-configuration-sidebar/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/group-configuration-sidebar/utils.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/data/selectors.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/data/thunk.js","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/group-configurations/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/CourseAuthoringRoutes.jsx","webpack://@edx/frontend-app-course-authoring/./src/head/messages.js","webpack://@edx/frontend-app-course-authoring/./src/head/Head.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/home-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/home-sidebar/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/card-item/utils.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/card-item/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/utils.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/libraries-tab/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/archived-tab/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/collapsible-state-with-action/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/collapsible-state-with-action/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/courses-tab/contact-administrator/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/courses-tab/courses-filters/courses-types-filter-menu/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/courses-tab/courses-filters/courses-filter-menu/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/courses-tab/courses-filters/courses-types-filter-menu/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/courses-tab/courses-filters/courses-order-filter-menu/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/courses-tab/courses-filters/courses-order-filter-menu/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/courses-tab/courses-filters/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/processing-courses/course-item/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/processing-courses/course-item/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/processing-courses/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/processing-courses/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/courses-tab/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/tabs-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/organization-section/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/verify-email-layout/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/verify-email-layout/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/create-or-rerun-course/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/create-or-rerun-course/CreateOrRerunCourseForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/generic/create-or-rerun-course/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/create-new-course-form/messages.js","webpack://@edx/frontend-app-course-authoring/./src/studio-home/create-new-course-form/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/StudioHome.jsx","webpack://@edx/frontend-app-course-authoring/./src/studio-home/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-rerun/course-rerun-form/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-rerun/course-rerun-form/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-rerun/course-rerun-sidebar/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-rerun/course-rerun-sidebar/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-rerun/messages.js","webpack://@edx/frontend-app-course-authoring/./src/course-rerun/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/course-rerun/hooks.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/import-tags/messages.js","webpack://@edx/frontend-app-course-authoring/./src/generic/loading-button/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/common/context.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/import-tags/ImportTagsWizard.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/messages.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/export-modal/messages.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/export-modal/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/delete-dialog/messages.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/delete-dialog/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/manage-orgs/messages.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/manage-orgs/ManageOrgsModal.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/manage-orgs/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/taxonomy-menu/messages.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/taxonomy-menu/TaxonomyMenu.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/taxonomy-card/messages.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/system-defined-badge/messages.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/system-defined-badge/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/taxonomy-card/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/TaxonomyListPage.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/import-tags/utils.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/TaxonomyLayout.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/tag-list/messages.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/tag-list/TagListTable.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/tag-list/data/apiHooks.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/taxonomy-detail/messages.js","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/taxonomy-detail/TaxonomyDetailSideCard.jsx","webpack://@edx/frontend-app-course-authoring/./src/taxonomy/taxonomy-detail/TaxonomyDetailPage.jsx","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/messages.js","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/AccessibilityBody/messages.js","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/AccessibilityBody/AccessibilityBody.jsx","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/AccessibilityBody/index.js","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/data/api.js","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/data/thunks.js","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/AccessibilityForm/messages.js","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/AccessibilityForm/AccessibilityForm.jsx","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/AccessibilityForm/hooks.js","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/AccessibilityForm/index.js","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/AccessibilityPage.jsx","webpack://@edx/frontend-app-course-authoring/./src/accessibility-page/index.js","webpack://@edx/frontend-app-course-authoring/./src/index.scss?a034","webpack://@edx/frontend-app-course-authoring/./src/index.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/PagesAndResourcesProvider.jsx","webpack://@edx/frontend-app-course-authoring/./src/pages-and-resources/discussions/app-config-form/apps/shared/AppConfigFormDivider.jsx","webpack://@edx/frontend-app-course-authoring/./node_modules/moment/locale/ sync ^\\.\\/.*$"],"sourcesContent":["var map = {\n\t\"./course-app-calculator/Settings.jsx\": [\n\t\t35952,\n\t\t952\n\t],\n\t\"./course-app-edxnotes/Settings.jsx\": [\n\t\t42248,\n\t\t248\n\t],\n\t\"./course-app-learning_assistant/Settings.jsx\": [\n\t\t71463,\n\t\t463\n\t],\n\t\"./course-app-live/Settings.jsx\": [\n\t\t47124,\n\t\t124\n\t],\n\t\"./course-app-ora_settings/Settings.jsx\": [\n\t\t37708,\n\t\t708\n\t],\n\t\"./course-app-proctoring/Settings.jsx\": [\n\t\t31115,\n\t\t115\n\t],\n\t\"./course-app-progress/Settings.jsx\": [\n\t\t45009,\n\t\t9\n\t],\n\t\"./course-app-teams/Settings.jsx\": [\n\t\t21071,\n\t\t71\n\t],\n\t\"./course-app-wiki/Settings.jsx\": [\n\t\t55116,\n\t\t116\n\t],\n\t\"./course-app-xpert_unit_summary/Settings.jsx\": [\n\t\t67489,\n\t\t489\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 58010;\nmodule.exports = webpackAsyncContext;","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\nimport { RequestStatus } from 'CourseAuthoring/data/constants';\n\nconst slice = createSlice({\n name: 'live',\n initialState: {\n appIds: [],\n // activeAppId is the ID of the app that has been configured for the course.\n activeAppId: null,\n // selectedAppId is the ID of the app that has been selected in the UI. This happens when an\n // activeAppId has been configured but the user is about to configure a different provider\n // instead.\n selectedAppId: null,\n status: RequestStatus.IN_PROGRESS,\n saveStatus: RequestStatus.SUCCESSFUL,\n },\n reducers: {\n loadApps: (state, { payload }) => {\n state.status = RequestStatus.SUCCESSFUL;\n state.saveStatus = RequestStatus.SUCCESSFUL;\n Object.assign(state, payload);\n },\n selectApp: (state, { payload }) => {\n const { appId } = payload;\n state.selectedAppId = appId;\n },\n updateStatus: (state, { payload }) => {\n const { status } = payload;\n state.status = status;\n },\n updateSaveStatus: (state, { payload }) => {\n const { status } = payload;\n state.saveStatus = status;\n },\n },\n});\n\nexport const {\n loadApps,\n selectApp,\n updateStatus,\n updateSaveStatus,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","export const DATE_FORMAT = 'MM/dd/yyyy';\nexport const TIME_FORMAT = 'HH:mm';\nexport const DATE_TIME_FORMAT = 'YYYY-MM-DDTHH:mm:ss\\\\Z';\nexport const COMMA_SEPARATED_DATE_FORMAT = 'MMMM D, YYYY';\nexport const DEFAULT_EMPTY_WYSIWYG_VALUE = '

 

';\nexport const STATEFUL_BUTTON_STATES = {\n default: 'default',\n pending: 'pending',\n error: 'error',\n};\n\nexport const USER_ROLES = {\n admin: 'instructor',\n staff: 'staff',\n};\n\nexport const BADGE_STATES = {\n danger: 'danger',\n secondary: 'secondary',\n};\n\nexport const NOTIFICATION_MESSAGES = {\n adding: 'Adding',\n saving: 'Saving',\n duplicating: 'Duplicating',\n deleting: 'Deleting',\n copying: 'Copying',\n pasting: 'Pasting',\n discardChanges: 'Discarding changes',\n publishing: 'Publishing',\n hidingFromStudents: 'Hiding from students',\n makingVisibleToStudents: 'Making visible to students',\n empty: '',\n};\n\nexport const DEFAULT_TIME_STAMP = '00:00';\n\nexport const COURSE_CREATOR_STATES = {\n unrequested: 'unrequested',\n pending: 'pending',\n granted: 'granted',\n denied: 'denied',\n disallowedForThisSite: 'disallowed_for_this_site',\n};\n\nexport const DECODED_ROUTES = {\n COURSE_UNIT: [\n '/container/:blockId/:sequenceId',\n '/container/:blockId',\n ],\n};\n\nexport const UPLOAD_FILE_MAX_SIZE = 20 * 1024 * 1024; // 100mb\n\nexport const COURSE_BLOCK_NAMES = ({\n chapter: { id: 'chapter', name: 'Section' },\n sequential: { id: 'sequential', name: 'Subsection' },\n vertical: { id: 'vertical', name: 'Unit' },\n component: { id: 'component', name: 'Component' },\n});\n\nexport const STUDIO_CLIPBOARD_CHANNEL = 'studio_clipboard_channel';\n\nexport const CLIPBOARD_STATUS = {\n loading: 'loading',\n ready: 'ready',\n expired: 'expired',\n error: 'error',\n};\n\nexport const STRUCTURAL_XBLOCK_TYPES = ['vertical', 'sequential', 'chapter', 'course'];\n","/* eslint-disable import/prefer-default-export */\n\n/**\n * Enum for request status.\n * @readonly\n * @enum {string}\n */\nexport const RequestStatus = /** @type {const} */ ({\n IN_PROGRESS: 'in-progress',\n SUCCESSFUL: 'successful',\n FAILED: 'failed',\n DENIED: 'denied',\n PENDING: 'pending',\n CLEAR: 'clear',\n PARTIAL: 'partial',\n PARTIAL_FAILURE: 'partial failure',\n NOT_FOUND: 'not-found',\n});\n\n/**\n * Team sizes enum\n * @enum\n * @type {{MIN: number, MAX: number, DEFAULT: number}}\n */\nexport const TeamSizes = /** @type {const} */ ({\n DEFAULT: 5,\n MIN: 1,\n MAX: 500,\n});\n\n/**\n * Group types enum\n * @enum\n * @type {{PRIVATE_MANAGED: string, PUBLIC_MANAGED: string, OPEN: string}}\n */\nexport const GroupTypes = /** @type {const} */ ({\n OPEN: 'open',\n PUBLIC_MANAGED: 'public_managed',\n PRIVATE_MANAGED: 'private_managed',\n OPEN_MANAGED: 'open_managed',\n});\n\nexport const DivisionSchemes = /** @type {const} */ ({\n NONE: 'none',\n COHORT: 'cohort',\n});\n\nexport const VisibilityTypes = /** @type {const} */ ({\n GATED: 'gated',\n LIVE: 'live',\n STAFF_ONLY: 'staff_only',\n HIDE_AFTER_DUE: 'hide_after_due',\n UNSCHEDULED: 'unscheduled',\n NEEDS_ATTENTION: 'needs_attention',\n});\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nfunction add(state, modelType, model) {\n const { id } = model;\n if (state[modelType] === undefined) {\n state[modelType] = {};\n }\n state[modelType][id] = model;\n}\n\nfunction update(state, modelType, model) {\n if (state[modelType] === undefined) {\n state[modelType] = {};\n }\n state[modelType][model.id] = { ...state[modelType][model.id], ...model };\n}\n\nfunction remove(state, modelType, id) {\n if (state[modelType] === undefined) {\n state[modelType] = {};\n }\n\n delete state[modelType][id];\n}\n\nconst slice = createSlice({\n name: 'models',\n initialState: {},\n reducers: {\n addModel: (state, { payload }) => {\n const { modelType, model } = payload;\n add(state, modelType, model);\n },\n addModels: (state, { payload }) => {\n const { modelType, models } = payload;\n models.forEach(model => add(state, modelType, model));\n },\n addModelsMap: (state, { payload }) => {\n const { modelType, modelsMap } = payload;\n Object.values(modelsMap).forEach(model => add(state, modelType, model));\n },\n updateModel: (state, { payload }) => {\n const { modelType, model } = payload;\n update(state, modelType, model);\n },\n updateModels: (state, { payload }) => {\n const { modelType, models } = payload;\n models.forEach(model => update(state, modelType, model));\n },\n updateModelsMap: (state, { payload }) => {\n const { modelType, modelsMap } = payload;\n Object.values(modelsMap).forEach(model => update(state, modelType, model));\n },\n removeModel: (state, { payload }) => {\n const { modelType, id } = payload;\n remove(state, modelType, id);\n },\n removeModels: (state, { payload }) => {\n const { modelType, ids } = payload;\n ids.forEach(id => remove(state, modelType, id));\n },\n },\n});\n\nexport const {\n addModel,\n addModels,\n addModelsMap,\n updateModel,\n updateModels,\n updateModelsMap,\n removeModel,\n removeModels,\n} = slice.actions;\n\nexport const { reducer } = slice;\n","import { useSelector, shallowEqual } from 'react-redux';\n\nexport function useModel(type, id) {\n return useSelector(\n state => (state.models[type] !== undefined ? state.models[type][id] : undefined),\n shallowEqual,\n );\n}\n\nexport function useModels(type, ids) {\n return useSelector(\n state => ids.map(\n id => (state.models[type] !== undefined ? state.models[type][id] : undefined),\n ),\n shallowEqual,\n );\n}\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n connectionError: {\n id: 'authoring.alert.error.connection',\n defaultMessage: 'We encountered a technical error when loading this page. This might be a temporary issue, so please try again in a few minutes. If the problem persists, please go to the {supportLink} for help.',\n description: 'Error message shown to users when there is a connectivity issue with the server.',\n },\n supportText: {\n id: 'authoring.alert.support.text',\n defaultMessage: 'Support Page',\n },\n});\n\nexport default messages;\n","/* eslint-disable import/prefer-default-export */\n\nexport const getLoadingStatus = (state) => state.pagesAndResources.loadingStatus;\nexport const getSavingStatus = (state) => state.pagesAndResources.savingStatus;\nexport const getCourseAppsApiStatus = (state) => state.pagesAndResources.courseAppsApiStatus;\nexport const getCourseAppSettingValue = (setting) => (state) => (\n state.pagesAndResources.courseAppSettings[setting]?.value\n);\nexport const getResetStatus = (state) => state.pagesAndResources.resetStatus;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'pagesAndResources',\n initialState: {\n courseAppIds: [],\n loadingStatus: RequestStatus.IN_PROGRESS,\n savingStatus: '',\n resetStatus: '',\n courseAppsApiStatus: {},\n courseAppSettings: {},\n },\n reducers: {\n fetchCourseAppsSuccess: (state, { payload }) => {\n state.courseAppIds = payload.courseAppIds;\n },\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n updateResetStatus: (state, { payload }) => {\n state.resetStatus = payload.status;\n },\n updateCourseAppsApiStatus: (state, { payload }) => {\n state.courseAppsApiStatus = payload.status;\n },\n fetchCourseAppsSettingsSuccess: (state, { payload }) => {\n Object.assign(state.courseAppSettings, payload);\n },\n updateCourseAppsSettingsSuccess: (state, { payload }) => {\n Object.assign(state.courseAppSettings, payload);\n },\n },\n});\n\nexport const {\n fetchCourseAppsSuccess,\n updateLoadingStatus,\n updateSavingStatus,\n updateResetStatus,\n updateCourseAppsApiStatus,\n fetchCourseAppsSettingsSuccess,\n updateCourseAppsSettingsSuccess,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable import/prefer-default-export */\nimport { snakeCase } from 'lodash/string';\n\nimport { camelCaseObject, ensureConfig, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nensureConfig([\n 'STUDIO_BASE_URL',\n], 'Course Apps API service');\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nconst getCourseAppsApiUrl = () => `${getApiBaseUrl()}/api/course_apps/v1/apps`;\nconst getCourseAdvancedSettingsApiUrl = () => `${getApiBaseUrl()}/api/contentstore/v0/advanced_settings`;\n\n/**\n * Fetches the course apps installed for provided course\n * @param {string} courseId\n * @returns {Promise<[{}]>}\n */\nexport async function getCourseApps(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getCourseAppsApiUrl()}/${courseId}`);\n return camelCaseObject(data);\n}\n\n/**\n * Updates the status of a course app.\n * @param {string} courseId Course ID for the course to operate on\n * @param {string} appId ID for the application to operate on\n * @param {boolean} state The new state\n */\nexport async function updateCourseApp(courseId, appId, state) {\n await getAuthenticatedHttpClient()\n .patch(\n `${getCourseAppsApiUrl()}/${courseId}`,\n {\n id: appId,\n enabled: state,\n },\n );\n}\n\n/**\n * Get's advanced setting for a course.\n * @param {string} courseId\n * @param {[string]} settings\n * @returns {Promise}\n */\nexport async function getCourseAdvancedSettings(courseId, settings) {\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getCourseAdvancedSettingsApiUrl()}/${courseId}`, { filter_fields: settings.map(snakeCase).join(',') });\n return camelCaseObject(data);\n}\n\n/**\n * Get's advanced setting for a course.\n * @param {string} courseId\n * @param {string} setting\n * @param {*} value\n * @returns {Promise}\n */\nexport async function updateCourseAdvancedSettings(courseId, setting, value) {\n const { data } = await getAuthenticatedHttpClient()\n .patch(`${getCourseAdvancedSettingsApiUrl()}/${courseId}`, { [snakeCase(setting)]: { value } });\n return camelCaseObject(data);\n}\n","import { RequestStatus } from '../../data/constants';\nimport { addModels, updateModel } from '../../generic/model-store';\nimport {\n getCourseAdvancedSettings,\n getCourseApps, updateCourseAdvancedSettings,\n updateCourseApp,\n} from './api';\nimport {\n fetchCourseAppsSettingsSuccess,\n fetchCourseAppsSuccess,\n updateCourseAppsApiStatus, updateCourseAppsSettingsSuccess,\n updateLoadingStatus,\n updateSavingStatus,\n} from './slice';\n\nconst COURSE_APPS_ORDER = [\n 'progress',\n 'discussion',\n 'teams',\n 'edxnotes',\n 'wiki',\n 'calculator',\n 'proctoring',\n 'live',\n 'textbooks',\n 'custom_pages',\n 'ora_settings',\n];\n\n/* eslint-disable import/prefer-default-export */\nexport function fetchCourseApps(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.IN_PROGRESS }));\n\n try {\n const courseApps = await getCourseApps(courseId);\n\n courseApps.sort((firstEl, secondEl) => (\n COURSE_APPS_ORDER.indexOf(firstEl.id) - COURSE_APPS_ORDER.indexOf(secondEl.id)));\n\n dispatch(addModels({ modelType: 'courseApps', models: courseApps }));\n dispatch(fetchCourseAppsSuccess({\n courseAppIds: courseApps.map(courseApp => courseApp.id),\n }));\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateCourseAppsApiStatus({ status: RequestStatus.DENIED }));\n }\n\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function updateAppStatus(courseId, appId, state) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n await updateCourseApp(courseId, appId, state);\n dispatch(updateModel({ modelType: 'courseApps', model: { id: appId, enabled: state } }));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport function fetchCourseAppSettings(courseId, settings) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const settingValues = await getCourseAdvancedSettings(courseId, settings);\n dispatch(fetchCourseAppsSettingsSuccess(settingValues));\n dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function updateCourseAppSetting(courseId, setting, value) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const settingValues = await updateCourseAdvancedSettings(courseId, setting, value);\n dispatch(updateCourseAppsSettingsSuccess(settingValues));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n configurationChangeConsequence: {\n id: 'authoring.discussions.configurationChangeConsequences',\n defaultMessage:\n 'Students will lose access to any active or previous'\n + ' discussion posts for your course.',\n description:\n 'Describes that, as a consequence of changing configuration,'\n + ' students will lose access posts on the course.',\n },\n configureApp: {\n id: 'authoring.discussions.configure.app',\n defaultMessage: 'Configure {name}',\n },\n configure: {\n id: 'authoring.discussions.configure',\n defaultMessage: 'Configure discussions',\n },\n ok: {\n id: 'authoring.discussions.ok',\n defaultMessage: 'OK',\n description: 'Button allowing the user to acknowledge the provider change.',\n },\n cancel: {\n id: 'authoring.discussions.cancel',\n defaultMessage: 'Cancel',\n description: 'Button allowing the user to return to discussion provider configurations.',\n },\n confirm: {\n id: 'authoring.discussions.confirm',\n defaultMessage: 'Confirm',\n description: 'Button allowing the user to confirm Confirmation.',\n },\n confirmConfigurationChange: {\n id: 'authoring.discussions.confirmConfigurationChange',\n defaultMessage: 'Are you sure you want to change the discussion settings?',\n description: 'Asks the user whether he/she really wants to change settings.',\n },\n confirmEnableDiscussionsLabel: {\n id: 'authoring.discussions.confirmEnableDiscussionsLabel',\n defaultMessage: 'Enable discussions on units in graded subsections?',\n description: 'Asks the user whether he/she really wants to enable discussions on units in graded subsections.',\n },\n cancelEnableDiscussionsLabel: {\n id: 'authoring.discussions.cancelEnableDiscussionsLabel',\n defaultMessage: 'Disable discussions on units in graded subsections?',\n description: 'Asks the user whether he/she really wants to disable discussions on units in graded subsections.',\n },\n confirmEnableDiscussions: {\n id: 'authoring.discussions.confirmEnableDiscussions',\n defaultMessage: 'Enabling this toggle will automatically enable discussion on all units in graded subsections, that are not timed exams.',\n description: 'Asks the user whether he/she really wants to enable discussions on units in graded subsections.',\n },\n cancelEnableDiscussions: {\n id: 'authoring.discussions.cancelEnableDiscussions',\n defaultMessage: 'Disabling this toggle will automatically disable discussion on all units in graded subsections. Discussion topics containing at least 1 thread will be listed and accessible under “Archived” in Topics tab on the Discussions page.',\n description: 'Asks the user whether he/she really wants to disable discussions on units in graded subsections.',\n },\n backButton: {\n id: 'authoring.discussions.backButton',\n defaultMessage: 'Back',\n description: 'Button allowing the user to return to discussion app selection.',\n },\n saveButton: {\n id: 'authoring.discussions.saveButton',\n defaultMessage: 'Save',\n description: 'Button allowing the user to submit their discussion configuration.',\n },\n savingButton: {\n id: 'authoring.discussions.savingButton',\n defaultMessage: 'Saving',\n description: 'Button label when the discussion configuration is being submitted.',\n },\n savedButton: {\n id: 'authoring.discussions.savedButton',\n defaultMessage: 'Saved',\n description: 'Button label when the discussion configuration has been successfully submitted.',\n },\n\n // App names\n 'appName-piazza': {\n id: 'authoring.discussions.appConfigForm.appName-piazza',\n defaultMessage: 'Piazza',\n description: 'The name of the Piazza app.',\n },\n 'appName-yellowdig': {\n id: 'authoring.discussions.appConfigForm.appName-yellowdig',\n defaultMessage: 'Yellowdig',\n description: 'The name of the yellowdig app.',\n },\n 'appName-inscribe': {\n id: 'authoring.discussions.appConfigForm.appName-inscribe',\n defaultMessage: 'InScribe',\n description: 'The name of the inscribe app.',\n },\n 'appName-discourse': {\n id: 'authoring.discussions.appConfigForm.appName-discourse',\n defaultMessage: 'Discourse',\n description: 'The name of the discourse app.',\n },\n 'appName-ed-discuss': {\n id: 'authoring.discussions.appConfigForm.appName-ed-discuss',\n defaultMessage: 'Ed Discussion',\n description: 'The name of the Ed Discussion app.',\n },\n 'appName-legacy': {\n id: 'authoring.discussions.appConfigForm.appName-legacy',\n defaultMessage: 'edX',\n description: 'The name of the Legacy edX Discussions app.',\n },\n 'appName-openedx': {\n id: 'authoring.discussions.appConfigForm.appName-openedx',\n defaultMessage: 'edX (new)',\n description: 'The name of the new edX Discussions app.',\n },\n divisionByGroup: {\n id: 'authoring.discussions.builtIn.divisionByGroup',\n defaultMessage: 'Cohorts',\n },\n divideByCohortsLabel: {\n id: 'authoring.discussions.builtIn.divideByCohorts.label',\n defaultMessage: 'Divide discussions by cohorts',\n description: 'Label for a switch that enables dividing discussions by cohorts. allowDivisionByUnit, divideCourseWideTopics, divideGeneralTopic, and divideQuestionsForTAs are only used if this setting is true.',\n },\n divideByCohortsHelp: {\n id: 'authoring.discussions.builtIn.divideByCohorts.help',\n defaultMessage: 'Learners will only be able to view and respond to discussions posted by members of their cohort.',\n description: 'Help text for a switch that enables dividing discussions by cohorts.',\n },\n divideCourseTopicsByCohortsLabel: {\n id: 'authoring.discussions.builtIn.divideCourseTopicsByCohorts.label',\n defaultMessage: 'Divide course-wide discussion topics',\n description: 'Label for a switch that enables dividing course wide topics by cohorts.',\n },\n divideCourseTopicsByCohortsHelp: {\n id: 'authoring.discussions.builtIn.divideCourseTopicsByCohorts.help',\n defaultMessage: 'Choose which of your general course-wide discussion topics you would like to divide.',\n description: 'Help text asking the user to pick course-wide topics that should be divided by cohort.',\n },\n divideGeneralTopic: {\n id: 'authoring.discussions.builtIn.divideGeneralTopic.label',\n defaultMessage: 'General',\n description: 'Label for a checkbox allowing a user to divide the General course wide topic by cohorts.',\n },\n divideQuestionsForTAsTopic: {\n id: 'authoring.discussions.builtIn.divideQuestionsForTAsTopic.label',\n defaultMessage: 'Questions for the TAs',\n description: 'Label for a checkbox allowing a user to divide the Questions for the TAs (TA stands for \"teaching assistant\") course wide topic by cohorts.',\n },\n cohortsEnabled: {\n id: 'authoring.discussions.builtIn.cohortsEnabled.label',\n defaultMessage: 'To adjust these settings, enable cohorts on the ',\n description: 'Label text informing the user to enable cohort',\n },\n instructorDashboard: {\n id: 'authoring.discussions.builtIn.instructorDashboard.label',\n defaultMessage: 'instructor dashboard',\n description: 'Label text for instructor dashboard',\n },\n // In-context discussion fields\n visibilityInContext: {\n id: 'authoring.discussions.builtIn.visibilityInContext',\n defaultMessage: 'Visibility of in-context discussions',\n },\n gradedUnitPagesLabel: {\n id: 'authoring.discussions.builtIn.gradedUnitPages.label',\n defaultMessage: 'Enable discussions on units in graded subsections',\n },\n gradedUnitPagesHelp: {\n id: 'authoring.discussions.builtIn.gradedUnitPages.help',\n defaultMessage: 'Allow learners to engage with discussion on all graded unit pages except timed exams.',\n },\n groupInContextSubsectionLabel: {\n id: 'authoring.discussions.builtIn.groupInContextSubsection.label',\n defaultMessage: 'Group in context discussion at the subsection level',\n },\n groupInContextSubsectionHelp: {\n id: 'authoring.discussions.builtIn.groupInContextSubsection.help',\n defaultMessage: 'Learners will be able to view any post in the sub-section no matter which unit page they are viewing. While this is not recommended, if your course has short learning sequences or low enrollment grouping may increase engagement.',\n },\n\n // Anonymous posting fields\n anonymousPosting: {\n id: 'authoring.discussions.builtIn.anonymousPosting',\n defaultMessage: 'Anonymous posting',\n },\n allowAnonymousPostsLabel: {\n id: 'authoring.discussions.builtIn.allowAnonymous.label',\n defaultMessage: 'Allow anonymous discussion posts',\n },\n allowAnonymousPostsHelp: {\n id: 'authoring.discussions.builtIn.allowAnonymous.help',\n defaultMessage: 'If enabled, learners can create posts that are anonymous to all users.',\n },\n allowAnonymousPostsPeersLabel: {\n id: 'authoring.discussions.builtIn.allowAnonymousPeers.label',\n defaultMessage: 'Allow anonymous discussion posts to peers',\n },\n allowAnonymousPostsPeersHelp: {\n id: 'authoring.discussions.builtIn.allowAnonymousPeers.help',\n defaultMessage: 'Learners will be able to post anonymously to other peers but all posts will be visible to course staff.',\n },\n\n // Reported Email Notifications\n reportedContentEmailNotifications: {\n id: 'authoring.discussions.builtIn.reportedContentEmailNotifications',\n defaultMessage: 'Notifications',\n },\n reportedContentEmailNotificationsLabel: {\n id: 'authoring.discussions.builtIn.reportedContentEmailNotifications.label',\n defaultMessage: 'Email notifications for reported content',\n },\n reportedContentEmailNotificationsHelp: {\n id: 'authoring.discussions.builtIn.reportedContentEmailNotifications.help',\n defaultMessage: 'Discussion Admins, Moderators, Community TAs and Group Community TAs (only for their own cohort) will receive an email notification when content is reported.',\n },\n\n // Discussion Topics\n discussionTopics: {\n id: 'authoring.discussions.discussionTopics',\n defaultMessage: 'Discussion topics',\n },\n discussionTopicsLabel: {\n id: 'authoring.discussions.discussionTopics.label',\n defaultMessage: 'General discussion topics',\n description: 'Label for a discussion topic section allowing a user to add new topic.',\n },\n discussionTopicsHelp: {\n id: 'authoring.discussions.discussionTopics.help',\n defaultMessage: 'Discussions can include general topics not contained to the course structure. All courses have a general topic by default.',\n description: 'Help text for adding new discussion topics that in general discussion topic section.',\n },\n discussionTopicRequired: {\n id: 'authoring.discussions.discussionTopic.required',\n defaultMessage: 'Topic name is a required field',\n description: 'Tells the user that the discussion topic field is required and must have a value.',\n },\n discussionTopicNameAlreadyExist: {\n id: 'authoring.discussions.discussionTopic.alreadyExistError',\n defaultMessage: 'It looks like this name is already in use',\n description: 'Tells the user that the discussion topic name already in use and must have a unique name.',\n },\n addTopicButton: {\n id: 'authoring.discussions.addTopicButton',\n defaultMessage: 'Add topic',\n description: 'Button label when Add a new discussion topic.',\n },\n deleteButton: {\n id: 'authoring.discussions.deleteButton',\n defaultMessage: 'Delete',\n description: 'Button label when delete discussion topic from conformation card.',\n },\n cancelButton: {\n id: 'authoring.discussions.cancelButton',\n defaultMessage: 'Cancel',\n description: 'Button label when cancel discussion topic deletion conformation.',\n },\n discussionTopicDeletionHelp: {\n id: 'authoring.discussions.discussionTopicDeletion.help',\n defaultMessage: 'edX recommends that you do not delete discussion topics once your course is running.',\n description: 'Help text for delete a discussion topic from discussion topic section.',\n },\n discussionTopicDeletionLabel: {\n id: 'authoring.discussions.discussionTopicDeletion.label',\n defaultMessage: 'Delete this topic?',\n description: 'Label for discussion topic delete popup allowing a user to delete a topic.',\n },\n renameGeneralTopic: {\n id: 'authoring.discussions.builtIn.renameGeneralTopic.label',\n defaultMessage: 'Rename general topic',\n description: 'Label for default topic allowing user to rename default general topic',\n },\n generalTopicHelp: {\n id: 'authoring.discussions.generalTopicHelp.help',\n defaultMessage: 'This is the default discussion topic for your course.',\n description: 'Help text for general discussion topic collapsible card.',\n },\n configureAdditionalTopic: {\n id: 'authoring.discussions.builtIn.configureAdditionalTopic.label',\n defaultMessage: 'Configure topic',\n description: 'Label for Additional topic allowing user to configure additional topic name',\n },\n addTopicHelpText: {\n id: 'authoring.discussions.addTopicHelpText',\n defaultMessage: 'Choose a unique name for your topic',\n description: 'Help text for input field in adding a discussion topic',\n },\n // Restricted dates\n restrictedStartDateHelp: {\n id: 'authoring.discussions.restrictedStartDate.help',\n defaultMessage: 'Enter a start date, e.g. 12/10/2023',\n },\n restrictedEndDateHelp: {\n id: 'authoring.discussions.restrictedEndDate.help',\n defaultMessage: 'Enter an end date, e.g. 12/17/2023',\n },\n restrictedStartTimeHelp: {\n id: 'authoring.discussions.restrictedStartTime.help',\n defaultMessage: 'Enter a start time, e.g. 09:00 AM',\n },\n restrictedEndTimeHelp: {\n id: 'authoring.discussions.restrictedEndTime.help',\n defaultMessage: 'Enter an end time, e.g. 05:00 PM',\n },\n restrictedDatesStatus: {\n id: 'authoring.restrictedDates.status',\n defaultMessage: '{status}',\n },\n restrictedStartDateRequired: {\n id: 'authoring.restrictedDates.startDate.required',\n defaultMessage: 'Start date is a required field',\n description: 'Tells the user that the restricted dates must have start date and it is required.',\n },\n restrictedEndDateRequired: {\n id: 'authoring.restrictedDates.endDate.required',\n defaultMessage: 'End date is a required field',\n description: 'Tells the user that the restricted dates must have end date and it is required.',\n },\n restrictedStartDateInPast: {\n id: 'authoring.restrictedDates.startDate.inPast',\n defaultMessage: 'Start date cannot be after end date',\n description: 'Tells the user that the restricted start date cannot be in past and cannot be after end date',\n },\n restrictedEndDateInPast: {\n id: 'authoring.restrictedDates.endDate.inPast',\n defaultMessage: 'End date cannot be before start date',\n description: 'Tells the user that the restricted end date cannot be in past and cannot be before start date',\n },\n restrictedStartTimeInPast: {\n id: 'authoring.restrictedDates.startTime.inPast',\n defaultMessage: 'Start time cannot be after end time',\n description: 'Tells the user that the restricted start time cannot be in past and cannot be after end time',\n },\n restrictedEndTimeInPast: {\n id: 'authoring.restrictedDates.endTime.inPast',\n defaultMessage: 'End time cannot be before start time',\n description: 'Tells the user that the restricted end time cannot be in past and cannot be before start time',\n },\n restrictedStartTimeInValidFormat: {\n id: 'authoring.restrictedDates.startTime.inValidFormat',\n defaultMessage: 'Enter a valid start time',\n description: 'Tells the user that the restricted start time format is in valid',\n },\n restrictedEndTimeInValidFormat: {\n id: 'authoring.restrictedDates.endTime.inValidFormat',\n defaultMessage: 'Enter a valid end time',\n description: 'Tells the user that the restricted end time format is in valid',\n },\n restrictedStartDateInValidFormat: {\n id: 'authoring.restrictedDates.startDate.inValidFormat',\n defaultMessage: 'Enter a valid start Date',\n description: 'Tells the user that the restricted start date format is in valid',\n },\n restrictedEndDateInValidFormat: {\n id: 'authoring.restrictedDates.endDate.inValidFormat',\n defaultMessage: 'Enter a valid end date',\n description: 'Tells the user that the restricted end date format is in valid',\n },\n discussionRestrictionLabel: {\n id: 'authoring.discussions.builtIn.discussionRestriction.label',\n defaultMessage: 'Discussion restrictions',\n },\n discussionRestrictionHelp: {\n id: 'authoring.discussions.discussionRestriction.help',\n defaultMessage: 'If enabled, learners will not be able to post in discussions.',\n },\n discussionRestrictionDatesHelp: {\n id: 'authoring.discussions.discussionRestrictionDates.help',\n defaultMessage: 'If added, learners will not be able to post in discussions between these dates.',\n },\n addRestrictedDatesButton: {\n id: 'authoring.discussions.addRestrictedDatesButton',\n defaultMessage: 'Add restricted dates',\n },\n configureRestrictedDates: {\n id: 'authoring.discussions.builtIn.configureRestrictedDates.label',\n defaultMessage: 'Configure restricted date range',\n },\n activeRestrictedDatesDeletionLabel: {\n id: 'authoring.discussions.activeRestrictedDatesDeletion.label',\n defaultMessage: 'Delete active restricted dates?',\n description: 'Label for active restricted dates delete popup allowing a user to delete a restricted date range.',\n },\n activeRestrictedDatesDeletionHelp: {\n id: 'authoring.discussions.activeRestrictedDatesDeletion.help',\n defaultMessage: 'These restricted dates are currently active. If deleted, learners will be able to post in discussions during these dates. Are you sure you want to proceed?',\n description: 'Help text for delete a active restricted dates from restricted dates section.',\n },\n completeRestrictedDatesDeletionHelp: {\n id: 'authoring.discussions.completeRestrictedDatesDeletion.help',\n defaultMessage: 'Are you sure you want to delete these restricted dates?',\n description: 'Help text for delete a complete restricted dates from restricted dates section.',\n },\n restrictedDatesDeletionLabel: {\n id: 'authoring.discussions.restrictedDatesDeletion.label',\n defaultMessage: 'Delete restricted dates?',\n description: 'Label for restricted dates delete popup allowing a user to delete a restricted date range.',\n },\n restrictedDatesDeletionHelp: {\n id: 'authoring.discussions.restrictedDatesDeletion.help',\n defaultMessage: 'If deleted, learners will be able to post in discussions during these dates.',\n description: 'Help text for delete a upcoming restricted dates from restricted dates section.',\n },\n discussionRestrictionOffLabelHelpText: {\n id: 'authoring.discussions.discussionRestrictionOff.label',\n defaultMessage: 'If enabled, learners will be able to post in discussions',\n },\n discussionRestrictionOnLabelHelpText: {\n id: 'authoring.discussions.discussionRestrictionOn.label',\n defaultMessage: 'If enabled, learners will not be able to post in discussions',\n },\n discussionRestrictionScheduledLabelHelpText: {\n id: 'authoring.discussions.discussionRestrictionScheduled.label',\n defaultMessage: 'If added, learners will not be able to post in discussions between these dates.',\n },\n enableRestrictedDatesConfirmationLabel: {\n id: 'authoring.discussions.enableRestrictedDatesConfirmation.label',\n defaultMessage: 'Enable restricted dates?',\n },\n enableRestrictedDatesConfirmationHelp: {\n id: 'authoring.discussions.enableRestrictedDatesConfirmation.help',\n defaultMessage: 'Learners will not be able to post in discussions.',\n },\n deleteAltText: {\n id: 'authoring.topics.delete',\n defaultMessage: 'Delete Topic',\n },\n expandAltText: {\n id: 'authoring.topics.expand',\n defaultMessage: 'Expand',\n },\n collapseAltText: {\n id: 'authoring.topics.collapse',\n defaultMessage: 'Collapse',\n },\n startDateLabel: {\n id: 'authoring.restrictedDates.start.date',\n defaultMessage: 'Start date',\n description: 'Label for start date field',\n },\n startTimeLabel: {\n id: 'authoring.restrictedDates.start.time',\n defaultMessage: 'Start time (optional)',\n description: 'label for start time field',\n },\n endDateLabel: {\n id: 'authoring.restrictedDates.end.date',\n defaultMessage: 'End date',\n description: 'label for end date field',\n },\n endTimeLabel: {\n id: 'authoring.restrictedDates.end.time',\n defaultMessage: 'End time (optional)',\n description: 'label for end time field',\n },\n});\n\nexport default messages;\n","import moment from 'moment';\nimport _ from 'lodash';\nimport { getIn } from 'formik';\nimport { restrictedDatesStatus as constants } from '../data/constants';\n\nexport const filterItemFromObject = (array, key, value) => (\n array.filter(item => item[key] !== value)\n);\n\nexport const checkFieldErrors = (touched, errors, fieldPath, propertyName) => {\n const path = fieldPath ? `${fieldPath}.${propertyName}` : propertyName;\n return Boolean(getIn(errors, path) && getIn(touched, path));\n};\n\nexport const errorExists = (errors, fieldPath, propertyName) => getIn(errors, `${fieldPath}.${propertyName}`);\n\nexport const checkStatus = ([startDate, endDate]) => {\n const today = moment(); let status;\n\n if (moment(endDate).isBefore(today, 'days')) {\n status = constants.COMPLETE;\n } else if (moment(startDate).isAfter(today, 'days')) {\n status = constants.UPCOMING;\n } else {\n status = constants.ACTIVE;\n }\n return status;\n};\n\nexport const validTimeFormats = ['hh:mm A', 'HH:mm'];\nexport const mergeDateTime = (date, time) => ((date && time) ? `${date}T${time}` : date);\nexport const isSameDay = (startDate, endDate) => moment(startDate).isSame(endDate, 'day');\nexport const isSameMonth = (startDate, endDate) => moment(startDate).isSame(endDate, 'month');\nexport const isSameYear = (startDate, endDate) => moment(startDate).isSame(endDate, 'year');\nexport const getTime = (dateTime) => (dateTime ? dateTime.split('T')[1] : '');\nexport const hasValidDateFormat = (date) => moment(date, ['MM/DD/YYYY', 'YYYY-MM-DD'], true).isValid();\nexport const hasValidTimeFormat = (time) => time && moment(time, validTimeFormats, true).isValid();\nexport const startOfDayTime = (time) => time || moment().startOf('day').format('HH:mm');\nexport const endOfDayTime = (time) => time || moment().endOf('day').format('HH:mm');\nexport const normalizeTime = (time) => time && moment(time, validTimeFormats, true).format('HH:mm');\nexport const normalizeDate = (date) => moment(date, ['MM/DD/YYYY', 'YYYY-MM-DDTHH:mm', 'YYYY-MM-DD'], true).format('YYYY-MM-DD');\n\nexport const decodeDateTime = (date, time) => {\n const nDate = normalizeDate(date);\n const nTime = normalizeTime(time);\n\n return moment(mergeDateTime(nDate, nTime));\n};\n\nexport const sortRestrictedDatesByStatus = (data, status, order) => (\n _.orderBy(\n data.filter(date => date.status === status),\n [(obj) => decodeDateTime(obj.startDate, startOfDayTime(obj.startTime))],\n [order],\n )\n);\n\nexport const formatRestrictedDates = ({\n startDate, startTime, endDate, endTime,\n}) => {\n let formattedDate;\n const hasSameDay = isSameDay(startDate, endDate);\n const hasSameMonth = isSameMonth(startDate, endDate);\n const hasSameYear = isSameYear(startDate, endDate);\n const isTimeAvailable = Boolean(startTime || endTime);\n const mStartDate = moment(startDate);\n const mEndDate = moment(endDate);\n const mStartDateTime = decodeDateTime(startDate, startOfDayTime(startTime));\n const mEndDateTime = decodeDateTime(endDate, endOfDayTime(endTime));\n\n if (hasSameDay && !isTimeAvailable) {\n formattedDate = mStartDate.format('MMMM D, YYYY');\n } else if (hasSameDay && isTimeAvailable) {\n formattedDate = `\n ${mStartDateTime.format('MMMM D, YYYY, h:mma')} -\n ${mEndDateTime.format('h:mma')}\n `;\n } else if (hasSameMonth && !isTimeAvailable) {\n formattedDate = `\n ${mStartDate.format('MMMM D')} -\n ${mEndDate.format('D, YYYY')}\n `;\n } else if (!hasSameMonth && hasSameYear && !isTimeAvailable) {\n formattedDate = `\n ${mStartDate.format('MMMM D')} -\n ${mEndDate.format('MMMM D, YYYY')}\n `;\n } else if (!hasSameMonth && !hasSameYear && !isTimeAvailable) {\n formattedDate = `\n ${mStartDate.format('MMMM D, YYYY')} -\n ${mEndDate.format('MMMM D, YYYY')}\n `;\n } else {\n formattedDate = `\n ${mStartDateTime.format('MMMM D, YYYY, h:mma')} -\n ${mEndDateTime.format('MMMM D, YYYY, h:mma')}\n `;\n }\n return formattedDate;\n};\n","import moment from 'moment';\n\nimport messages from '../app-config-form/messages';\n\nexport const restrictedDatesStatus = {\n UPCOMING: 'UPCOMING',\n COMPLETE: 'COMPLETE',\n ACTIVE: 'ACTIVE',\n};\n\nexport const badgeVariant = {\n UPCOMING: 'primary',\n COMPLETE: 'light',\n ACTIVE: 'success',\n};\n\nexport const deleteRestrictedDatesHelperText = {\n UPCOMING: messages.restrictedDatesDeletionHelp,\n COMPLETE: messages.completeRestrictedDatesDeletionHelp,\n ACTIVE: messages.activeRestrictedDatesDeletionHelp,\n};\n\nexport const discussionRestriction = {\n DISABLED: 'disabled',\n ENABLED: 'enabled',\n SCHEDULED: 'scheduled',\n};\n\nexport const discussionRestrictionLabels = {\n OFF: 'Off',\n ON: 'On',\n SCHEDULED: 'Scheduled',\n};\n\nexport const discussionRestrictionOptions = [\n {\n value: discussionRestriction.DISABLED,\n message: messages.discussionRestrictionOffLabelHelpText,\n label: discussionRestrictionLabels.OFF,\n },\n {\n value: discussionRestriction.ENABLED,\n message: messages.discussionRestrictionOnLabelHelpText,\n label: discussionRestrictionLabels.ON,\n },\n {\n value: discussionRestriction.SCHEDULED,\n message: messages.discussionRestrictionScheduledLabelHelpText,\n label: discussionRestrictionLabels.SCHEDULED,\n },\n];\n\nexport const today = moment();\nexport const active = [today.format('YYYY-MM-DDTHH:mm'), today.add(5, 'hours').format('YYYY-MM-DDTHH:mm')];\nexport const upcoming = [today.add(2, 'days').format('YYYY-MM-DD'), today.add(5, 'days').format('YYYY-MM-DD')];\nexport const complete = [today.subtract(7, 'days').format('YYYY-MM-DD'), today.subtract(5, 'days').format('YYYY-MM-DD')];\n\nexport const FEATURE_TYPES = ['basic', 'partial', 'full', 'common'];\n","import { useContext, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useMediaQuery } from 'react-responsive';\nimport * as Yup from 'yup';\nimport { snakeCase } from 'lodash/string';\nimport moment from 'moment';\nimport { getConfig, getPath } from '@edx/frontend-platform';\n\nimport { RequestStatus } from './data/constants';\nimport { getCourseAppSettingValue, getLoadingStatus } from './pages-and-resources/data/selectors';\nimport { fetchCourseAppSettings, updateCourseAppSetting } from './pages-and-resources/data/thunks';\nimport { PagesAndResourcesContext } from './pages-and-resources/PagesAndResourcesProvider';\nimport {\n hasValidDateFormat, hasValidTimeFormat, decodeDateTime, endOfDayTime, startOfDayTime,\n} from './pages-and-resources/discussions/app-config-form/utils';\nimport { DATE_TIME_FORMAT } from './constants';\n\nexport const executeThunk = async (thunk, dispatch, getState) => {\n await thunk(dispatch, getState);\n await new Promise(setImmediate);\n};\n\nexport function useIsMobile() {\n return useMediaQuery({ query: '(max-width: 767.98px)' });\n}\n\nexport function useIsDesktop() {\n return useMediaQuery({ query: '(min-width: 992px)' });\n}\n\nexport function convertObjectToSnakeCase(obj, unpacked = false) {\n return Object.keys(obj).reduce((snakeCaseObj, key) => {\n const snakeCaseKey = snakeCase(key);\n const value = unpacked ? obj[key] : { value: obj[key] };\n return {\n ...snakeCaseObj,\n [snakeCaseKey]: value,\n };\n }, {});\n}\n\nexport function deepConvertingKeysToCamelCase(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepConvertingKeysToCamelCase(item));\n }\n\n const camelCaseObj = {};\n Object.keys(obj).forEach((key) => {\n const camelCaseKey = key.replace(/_([a-z])/g, (match, p1) => p1.toUpperCase());\n camelCaseObj[camelCaseKey] = deepConvertingKeysToCamelCase(obj[key]);\n });\n return camelCaseObj;\n}\n\nexport function deepConvertingKeysToSnakeCase(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => deepConvertingKeysToSnakeCase(item));\n }\n\n const snakeCaseObj = {};\n Object.entries(obj).forEach(([key, value]) => {\n const snakeCaseKey = key.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n snakeCaseObj[snakeCaseKey] = key === 'gradeCutoffs' ? value : deepConvertingKeysToSnakeCase(value);\n });\n return snakeCaseObj;\n}\n\nexport function transformKeysToCamelCase(obj) {\n return obj.key.replace(/_([a-z])/g, (match, letter) => letter.toUpperCase());\n}\n\nexport function parseArrayOrObjectValues(obj) {\n const result = {};\n\n Object.entries(obj).forEach(([key, value]) => {\n try {\n if (!Number.isNaN(Number(value))) {\n result[key] = value;\n } else {\n result[key] = JSON.parse(value);\n }\n } catch (e) {\n result[key] = value;\n }\n });\n\n return result;\n}\n\n/**\n * Create a correct inner path depend on config PUBLIC_PATH.\n * @param {string} checkPath - the internal route path that is validated\n * @returns {string} - the correct internal route path\n */\nexport const createCorrectInternalRoute = (checkPath) => {\n let basePath = getPath(getConfig().PUBLIC_PATH);\n\n if (basePath.endsWith('/')) {\n basePath = basePath.slice(0, -1);\n }\n\n if (!checkPath.startsWith(basePath)) {\n return `${basePath}${checkPath}`;\n }\n\n return checkPath;\n};\n\nexport function getPagePath(courseId, isMfePageEnabled, urlParameter) {\n if (isMfePageEnabled === 'true') {\n if (urlParameter === 'tabs') {\n return createCorrectInternalRoute(`/course/${courseId}/pages-and-resources`);\n }\n return createCorrectInternalRoute(`/course/${courseId}/${urlParameter}`);\n }\n return `${getConfig().STUDIO_BASE_URL}/${urlParameter}/${courseId}`;\n}\n\nexport function useAppSetting(settingName) {\n const dispatch = useDispatch();\n const { courseId } = useContext(PagesAndResourcesContext);\n const settingValue = useSelector(getCourseAppSettingValue(settingName));\n const loadingStatus = useSelector(getLoadingStatus);\n useEffect(() => {\n if ([RequestStatus.DENIED, RequestStatus.FAILED].includes(loadingStatus)) {\n return;\n }\n if (settingValue === undefined || settingValue === null) {\n dispatch(fetchCourseAppSettings(courseId, [settingName]));\n }\n }, [courseId]);\n\n const saveSetting = async (value) => dispatch(updateCourseAppSetting(courseId, settingName, value));\n return [settingValue, saveSetting];\n}\n\nexport const getLabelById = (options, id) => {\n const foundOption = options.find((option) => option.id === id);\n return foundOption ? foundOption.label : '';\n};\n\n/**\n * Adds additional validation methods to Yup.\n */\nexport function setupYupExtensions() {\n // Add a uniqueProperty method to arrays that allows validating that the specified property path is unique\n // across all objects in the array.\n // Credit: https://github.com/jquense/yup/issues/345#issuecomment-717400071\n Yup.addMethod(Yup.array, 'uniqueProperty', function uniqueProperty(property, message) {\n return this.test('unique', '', function testUniqueness(list) {\n const errors = [];\n\n list.forEach((item, index) => {\n const propertyValue = item[property];\n\n if (propertyValue && list.filter(entry => entry[property] === propertyValue).length > 1) {\n errors.push(\n this.createError({\n path: `${this.path}[${index}].${property}`,\n message,\n }),\n );\n }\n });\n\n if (errors.length > 0) {\n throw new Yup.ValidationError(errors);\n }\n\n return true;\n });\n });\n\n Yup.addMethod(Yup.object, 'uniqueObjectProperty', function uniqueObjectProperty(propertyName, message) {\n return this.test('unique', message, function testUniqueness(discussionTopic) {\n if (!discussionTopic || !discussionTopic[propertyName]) {\n return true;\n }\n const isDuplicate = this.parent.filter(topic => topic !== discussionTopic)\n .some(topic => topic[propertyName]?.toLowerCase() === discussionTopic[propertyName].toLowerCase());\n\n if (isDuplicate) {\n throw this.createError({\n path: `${this.path}.${propertyName}`,\n error: message,\n });\n }\n return true;\n });\n });\n\n Yup.addMethod(Yup.string, 'compare', function compare(message, type) {\n return this.test('isGreater', message, function isGreater() {\n // This function compare 2 dates or 2 times. It return no error if dateInstance/timeInstance is empty\n // of if startTime or endTime is not present for time comparison\n // or startDate or endDate is not present for date comparison\n\n if (!this.parent\n || (!(this.parent.startTime && this.parent.endTime) && type === 'time')\n || (!(this.parent.startDate && this.parent.endDate) && type === 'date')\n ) {\n return true;\n }\n\n const startDateTime = decodeDateTime(this.parent.startDate, startOfDayTime(this.parent.startTime));\n const endDateTime = decodeDateTime(this.parent.endDate, endOfDayTime(this.parent.endTime));\n let isInvalidStartDateTime;\n\n if (type === 'date') {\n isInvalidStartDateTime = startDateTime.isAfter(endDateTime);\n } else if (type === 'time') {\n isInvalidStartDateTime = startDateTime.isSameOrAfter(endDateTime);\n }\n\n if (isInvalidStartDateTime) {\n throw this.createError({\n path: `${this.path}`,\n error: message,\n });\n }\n return true;\n });\n });\n\n Yup.addMethod(Yup.string, 'checkFormat', function checkFormat(message, type) {\n return this.test('isValidFormat', message, function isValidFormat() {\n if (!this.originalValue) {\n return true;\n }\n let isValid;\n\n if (type === 'date') {\n isValid = hasValidDateFormat(this.originalValue);\n } else if (type === 'time') {\n isValid = hasValidTimeFormat(this.originalValue);\n }\n\n if (!isValid) {\n throw this.createError({\n path: `${this.path}`,\n error: message,\n });\n }\n return true;\n });\n });\n}\n\nexport const convertToDateFromString = (dateStr) => {\n /**\n * Convert UTC to local time for react-datepicker\n * Note: react-datepicker has a bug where it only interacts with local time\n * @param {string} dateStr - YYYY-MM-DDTHH:MM:SSZ\n * @return {Date} date in local time\n */\n if (!dateStr) {\n return '';\n }\n\n const stripTimeZone = (stringValue) => stringValue.substring(0, 19);\n\n return moment(stripTimeZone(String(dateStr))).toDate();\n};\n\nexport const convertToStringFromDate = (date) => {\n /**\n * Convert local time to UTC from react-datepicker\n * Note: react-datepicker has a bug where it only interacts with local time\n * @param {Date} date - date in local time\n * @return {string} YYYY-MM-DDTHH:MM:SSZ\n */\n if (!date) {\n return '';\n }\n\n return moment(date).format(DATE_TIME_FORMAT);\n};\n\nexport const isValidDate = (date) => {\n const formattedValue = convertToStringFromDate(date).split('T')[0];\n\n return Boolean(formattedValue.length <= 10);\n};\n\nexport const getFileSizeToClosestByte = (fileSize) => {\n let divides = 0;\n let size = fileSize;\n while (size > 1000 && divides < 4) {\n size /= 1000;\n divides += 1;\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const fileSizeFixedDecimal = Number.parseFloat(size).toFixed(2);\n return `${fileSizeFixedDecimal} ${units[divides]}`;\n};\n","import { Collapsible, Icon, IconButton } from '@openedx/paragon';\nimport { Delete, ExpandLess, ExpandMore } from '@openedx/paragon/icons';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nconst CollapsableEditor = ({\n title,\n open,\n defaultOpen,\n onToggle,\n onClose,\n onDelete,\n children,\n expandAlt,\n deleteAlt,\n collapseAlt,\n ...props\n}) => (\n \n \n
{title}
\n \n
\n \n
\n
\n \n {onDelete && (\n
\n {\n event.stopPropagation();\n onDelete();\n }}\n alt={deleteAlt}\n src={Delete}\n iconAs={Icon}\n variant=\"dark\"\n />\n
\n )}\n
\n \n
\n
\n \n {children}\n \n);\n\nCollapsableEditor.propTypes = {\n open: PropTypes.bool,\n defaultOpen: PropTypes.bool,\n title: PropTypes.node.isRequired,\n onToggle: PropTypes.func.isRequired,\n onDelete: PropTypes.func,\n children: PropTypes.node.isRequired,\n expandAlt: PropTypes.string.isRequired,\n deleteAlt: PropTypes.string.isRequired,\n collapseAlt: PropTypes.string.isRequired,\n onClose: PropTypes.func,\n};\n\nCollapsableEditor.defaultProps = {\n onDelete: null,\n defaultOpen: undefined,\n open: undefined,\n onClose: () => {\n },\n};\n\nexport default React.memo(CollapsableEditor);\n","import React from 'react';\nimport { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Alert } from '@openedx/paragon';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport messages from '../messages';\n\nconst ConnectionErrorAlert = ({ intl }) => (\n \n \n {intl.formatMessage(messages.supportText)}\n \n ),\n }}\n />\n \n);\n\nConnectionErrorAlert.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(ConnectionErrorAlert);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Form, SwitchControl } from '@openedx/paragon';\n\nimport './FormSwitchGroup.scss';\n\nconst FormSwitchGroup = ({\n id,\n name,\n label,\n helpText,\n className,\n onChange,\n onBlur,\n checked,\n disabled,\n}) => {\n const helpTextId = `${id}HelpText`;\n\n // Note that we use controlId here _and_ set some IDs and aria-describedby attributes manually.\n // controlId doesn't cover Form.Switch properly, so controlId is just helping to attach\n // a 'for' attribute to the Label.\n return (\n \n
\n
\n \n {label}\n \n \n
\n \n {helpText}\n \n
\n \n );\n};\nFormSwitchGroup.propTypes = {\n id: PropTypes.string.isRequired,\n label: PropTypes.node.isRequired,\n name: PropTypes.string,\n helpText: PropTypes.node.isRequired,\n className: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n onBlur: PropTypes.func,\n checked: PropTypes.bool.isRequired,\n disabled: PropTypes.bool,\n};\nFormSwitchGroup.defaultProps = {\n className: null,\n onBlur: null,\n name: null,\n disabled: false,\n};\n\nexport default FormSwitchGroup;\n","import { Form, TransitionReplace } from '@openedx/paragon';\nimport { getIn, useFormikContext } from 'formik';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nconst FormikErrorFeedback = ({ name, children }) => {\n const { touched, errors } = useFormikContext();\n const fieldTouched = getIn(touched, name);\n const fieldError = getIn(errors, name);\n\n return (\n \n {fieldTouched && fieldError\n ? (\n \n {fieldError}\n \n )\n : (\n \n {children}\n \n )}\n \n );\n};\n\nFormikErrorFeedback.propTypes = {\n name: PropTypes.string.isRequired,\n children: PropTypes.node,\n};\nFormikErrorFeedback.defaultProps = {\n children: null,\n};\n\nexport default FormikErrorFeedback;\n","/* eslint-disable react/jsx-no-useless-fragment */\nimport { Form } from '@openedx/paragon';\nimport { getIn, useFormikContext } from 'formik';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport FormikErrorFeedback from './FormikErrorFeedback';\n\nconst FormikControl = ({\n name,\n label,\n help,\n className,\n controlClasses,\n ...params\n}) => {\n const {\n touched, errors, handleChange, handleBlur, setFieldError,\n } = useFormikContext();\n const fieldTouched = getIn(touched, name);\n const fieldError = getIn(errors, name);\n const handleFocus = (e) => setFieldError(e.target.name, undefined);\n\n return (\n \n {label}\n \n \n {help}\n \n \n );\n};\n\nFormikControl.propTypes = {\n name: PropTypes.string.isRequired,\n label: PropTypes.element,\n help: PropTypes.element,\n className: PropTypes.string,\n controlClasses: PropTypes.string,\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n ]).isRequired,\n};\n\nFormikControl.defaultProps = {\n help: <>,\n label: <>,\n className: '',\n controlClasses: 'pb-2',\n};\n\nexport default FormikControl;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Spinner } from '@openedx/paragon';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\n\nexport const LoadingSpinner = ({ size }) => (\n \n )}\n />\n);\n\nLoadingSpinner.defaultProps = {\n size: undefined,\n};\n\nLoadingSpinner.propTypes = {\n size: PropTypes.string,\n};\n\nconst Loading = () => (\n
\n \n
\n);\n\nexport default Loading;\n","import React from 'react';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Alert } from '@openedx/paragon';\n\nconst PermissionDeniedAlert = () => (\n \n \n \n);\n\nexport default PermissionDeniedAlert;\n","// This file is generated by the openedx/frontend-platform's \"intl-import.js\" script.\n//\n// Refer to the i18n documents in https://docs.openedx.org/en/latest/developers/references/i18n.html to update\n// the file and use the Micro-frontend i18n pattern in new repositories.\n//\n\nimport messagesOfArLanguage from './ar.json';\nimport messagesOfDaLanguage from './da.json';\nimport messagesOfDeDeLanguage from './de_DE.json';\nimport messagesOfElLanguage from './el.json';\nimport messagesOfEs419Language from './es_419.json';\nimport messagesOfEsEsLanguage from './es_ES.json';\nimport messagesOfFaLanguage from './fa.json';\nimport messagesOfFrCaLanguage from './fr_CA.json';\nimport messagesOfHeLanguage from './he.json';\nimport messagesOfHiLanguage from './hi.json';\nimport messagesOfIdLanguage from './id.json';\nimport messagesOfItItLanguage from './it_IT.json';\nimport messagesOfPtBrLanguage from './pt_BR.json';\nimport messagesOfPtPtLanguage from './pt_PT.json';\nimport messagesOfRuLanguage from './ru.json';\nimport messagesOfSwLanguage from './sw.json';\nimport messagesOfTeLanguage from './te.json';\nimport messagesOfThLanguage from './th.json';\nimport messagesOfTrTrLanguage from './tr_TR.json';\nimport messagesOfUkLanguage from './uk.json';\nimport messagesOfZhCnLanguage from './zh_CN.json';\n\nexport default {\n 'ar': messagesOfArLanguage,\n 'zh-cn': messagesOfZhCnLanguage,\n 'uk': messagesOfUkLanguage,\n 'tr-tr': messagesOfTrTrLanguage,\n 'th': messagesOfThLanguage,\n 'te': messagesOfTeLanguage,\n 'sw': messagesOfSwLanguage,\n 'ru': messagesOfRuLanguage,\n 'pt-pt': messagesOfPtPtLanguage,\n 'pt-br': messagesOfPtBrLanguage,\n 'it-it': messagesOfItItLanguage,\n 'id': messagesOfIdLanguage,\n 'hi': messagesOfHiLanguage,\n 'he': messagesOfHeLanguage,\n 'fr-ca': messagesOfFrCaLanguage,\n 'fa': messagesOfFaLanguage,\n 'es-es': messagesOfEsEsLanguage,\n 'es-419': messagesOfEs419Language,\n 'el': messagesOfElLanguage,\n 'de-de': messagesOfDeDeLanguage,\n 'da': messagesOfDaLanguage,\n};\n","// This file is generated by the openedx/frontend-platform's \"intl-import.js\" script.\n//\n// Refer to the i18n documents in https://docs.openedx.org/en/latest/developers/references/i18n.html to update\n// the file and use the Micro-frontend i18n pattern in new repositories.\n//\n\nimport messagesOfArLanguage from './ar.json';\nimport messagesOfDaLanguage from './da.json';\nimport messagesOfDeDeLanguage from './de_DE.json';\nimport messagesOfElLanguage from './el.json';\nimport messagesOfEs419Language from './es_419.json';\nimport messagesOfEsEsLanguage from './es_ES.json';\nimport messagesOfFaLanguage from './fa.json';\nimport messagesOfFrCaLanguage from './fr_CA.json';\nimport messagesOfHeLanguage from './he.json';\nimport messagesOfHiLanguage from './hi.json';\nimport messagesOfIdLanguage from './id.json';\nimport messagesOfItItLanguage from './it_IT.json';\nimport messagesOfPtBrLanguage from './pt_BR.json';\nimport messagesOfPtPtLanguage from './pt_PT.json';\nimport messagesOfRuLanguage from './ru.json';\nimport messagesOfTeLanguage from './te.json';\nimport messagesOfThLanguage from './th.json';\nimport messagesOfTrTrLanguage from './tr_TR.json';\nimport messagesOfUkLanguage from './uk.json';\nimport messagesOfZhCnLanguage from './zh_CN.json';\n\nexport default {\n 'ar': messagesOfArLanguage,\n 'zh-cn': messagesOfZhCnLanguage,\n 'uk': messagesOfUkLanguage,\n 'tr-tr': messagesOfTrTrLanguage,\n 'th': messagesOfThLanguage,\n 'te': messagesOfTeLanguage,\n 'ru': messagesOfRuLanguage,\n 'pt-pt': messagesOfPtPtLanguage,\n 'pt-br': messagesOfPtBrLanguage,\n 'it-it': messagesOfItItLanguage,\n 'id': messagesOfIdLanguage,\n 'hi': messagesOfHiLanguage,\n 'he': messagesOfHeLanguage,\n 'fr-ca': messagesOfFrCaLanguage,\n 'fa': messagesOfFaLanguage,\n 'es-es': messagesOfEsEsLanguage,\n 'es-419': messagesOfEs419Language,\n 'el': messagesOfElLanguage,\n 'de-de': messagesOfDeDeLanguage,\n 'da': messagesOfDaLanguage,\n};\n","// This file is generated by the openedx/frontend-platform's \"intl-import.js\" script.\n//\n// Refer to the i18n documents in https://docs.openedx.org/en/latest/developers/references/i18n.html to update\n// the file and use the Micro-frontend i18n pattern in new repositories.\n//\n\nimport messagesOfArLanguage from './ar.json';\nimport messagesOfDaLanguage from './da.json';\nimport messagesOfDeLanguage from './de.json';\nimport messagesOfDeDeLanguage from './de_DE.json';\nimport messagesOfElLanguage from './el.json';\nimport messagesOfEs419Language from './es_419.json';\nimport messagesOfEsEsLanguage from './es_ES.json';\nimport messagesOfFaLanguage from './fa.json';\nimport messagesOfFrCaLanguage from './fr_CA.json';\nimport messagesOfHeLanguage from './he.json';\nimport messagesOfHiLanguage from './hi.json';\nimport messagesOfIdLanguage from './id.json';\nimport messagesOfItItLanguage from './it_IT.json';\nimport messagesOfPtBrLanguage from './pt_BR.json';\nimport messagesOfPtPtLanguage from './pt_PT.json';\nimport messagesOfRuLanguage from './ru.json';\nimport messagesOfSwLanguage from './sw.json';\nimport messagesOfTeLanguage from './te.json';\nimport messagesOfThLanguage from './th.json';\nimport messagesOfTrTrLanguage from './tr_TR.json';\nimport messagesOfUkLanguage from './uk.json';\nimport messagesOfZhCnLanguage from './zh_CN.json';\n\nexport default {\n 'ar': messagesOfArLanguage,\n 'zh-cn': messagesOfZhCnLanguage,\n 'uk': messagesOfUkLanguage,\n 'tr-tr': messagesOfTrTrLanguage,\n 'th': messagesOfThLanguage,\n 'te': messagesOfTeLanguage,\n 'sw': messagesOfSwLanguage,\n 'ru': messagesOfRuLanguage,\n 'pt-pt': messagesOfPtPtLanguage,\n 'pt-br': messagesOfPtBrLanguage,\n 'it-it': messagesOfItItLanguage,\n 'id': messagesOfIdLanguage,\n 'hi': messagesOfHiLanguage,\n 'he': messagesOfHeLanguage,\n 'fr-ca': messagesOfFrCaLanguage,\n 'fa': messagesOfFaLanguage,\n 'es-es': messagesOfEsEsLanguage,\n 'es-419': messagesOfEs419Language,\n 'el': messagesOfElLanguage,\n 'de-de': messagesOfDeDeLanguage,\n 'de': messagesOfDeLanguage,\n 'da': messagesOfDaLanguage,\n};\n","// This file is generated by the openedx/frontend-platform's \"intl-import.js\" script.\n//\n// Refer to the i18n documents in https://docs.openedx.org/en/latest/developers/references/i18n.html to update\n// the file and use the Micro-frontend i18n pattern in new repositories.\n//\n\nimport messagesOfArLanguage from './ar.json';\nimport messagesOfDaLanguage from './da.json';\nimport messagesOfDeLanguage from './de.json';\nimport messagesOfDeDeLanguage from './de_DE.json';\nimport messagesOfElLanguage from './el.json';\nimport messagesOfEs419Language from './es_419.json';\nimport messagesOfEsEsLanguage from './es_ES.json';\nimport messagesOfFaLanguage from './fa.json';\nimport messagesOfFrCaLanguage from './fr_CA.json';\nimport messagesOfHeLanguage from './he.json';\nimport messagesOfHiLanguage from './hi.json';\nimport messagesOfIdLanguage from './id.json';\nimport messagesOfItItLanguage from './it_IT.json';\nimport messagesOfPtBrLanguage from './pt_BR.json';\nimport messagesOfPtPtLanguage from './pt_PT.json';\nimport messagesOfRuLanguage from './ru.json';\nimport messagesOfSwLanguage from './sw.json';\nimport messagesOfTeLanguage from './te.json';\nimport messagesOfThLanguage from './th.json';\nimport messagesOfTrTrLanguage from './tr_TR.json';\nimport messagesOfUkLanguage from './uk.json';\nimport messagesOfZhCnLanguage from './zh_CN.json';\n\nexport default {\n 'ar': messagesOfArLanguage,\n 'zh-cn': messagesOfZhCnLanguage,\n 'uk': messagesOfUkLanguage,\n 'tr-tr': messagesOfTrTrLanguage,\n 'th': messagesOfThLanguage,\n 'te': messagesOfTeLanguage,\n 'sw': messagesOfSwLanguage,\n 'ru': messagesOfRuLanguage,\n 'pt-pt': messagesOfPtPtLanguage,\n 'pt-br': messagesOfPtBrLanguage,\n 'it-it': messagesOfItItLanguage,\n 'id': messagesOfIdLanguage,\n 'hi': messagesOfHiLanguage,\n 'he': messagesOfHeLanguage,\n 'fr-ca': messagesOfFrCaLanguage,\n 'fa': messagesOfFaLanguage,\n 'es-es': messagesOfEsEsLanguage,\n 'es-419': messagesOfEs419Language,\n 'el': messagesOfElLanguage,\n 'de-de': messagesOfDeDeLanguage,\n 'de': messagesOfDeLanguage,\n 'da': messagesOfDaLanguage,\n};\n","// This file is generated by the openedx/frontend-platform's \"intl-import.js\" script.\n//\n// Refer to the i18n documents in https://docs.openedx.org/en/latest/developers/references/i18n.html to update\n// the file and use the Micro-frontend i18n pattern in new repositories.\n//\n\n// Skipped import due to missing 'frontend-component-ai-translations/index.js' likely due to empty translations..\nimport messagesFromFrontendLibContentComponents from './messages/frontend-lib-content-components';\nimport messagesFromFrontendPlatform from './messages/frontend-platform';\nimport messagesFromParagon from './messages/paragon';\nimport messagesFromFrontendComponentFooter from './messages/frontend-component-footer';\nimport messagesFromFrontendAppCourseAuthoring from './messages/frontend-app-course-authoring';\n\nexport default [\n messagesFromFrontendLibContentComponents,\n messagesFromFrontendPlatform,\n messagesFromParagon,\n messagesFromFrontendComponentFooter,\n messagesFromFrontendAppCourseAuthoring,\n];\n","// This file is generated by the openedx/frontend-platform's \"intl-import.js\" script.\n//\n// Refer to the i18n documents in https://docs.openedx.org/en/latest/developers/references/i18n.html to update\n// the file and use the Micro-frontend i18n pattern in new repositories.\n//\n\nimport messagesOfArLanguage from './ar.json';\nimport messagesOfDaLanguage from './da.json';\nimport messagesOfDeLanguage from './de.json';\nimport messagesOfDeDeLanguage from './de_DE.json';\nimport messagesOfElLanguage from './el.json';\nimport messagesOfEs419Language from './es_419.json';\nimport messagesOfEsEsLanguage from './es_ES.json';\nimport messagesOfFaLanguage from './fa.json';\nimport messagesOfFrCaLanguage from './fr_CA.json';\nimport messagesOfHeLanguage from './he.json';\nimport messagesOfHiLanguage from './hi.json';\nimport messagesOfIdLanguage from './id.json';\nimport messagesOfItItLanguage from './it_IT.json';\nimport messagesOfPtBrLanguage from './pt_BR.json';\nimport messagesOfPtPtLanguage from './pt_PT.json';\nimport messagesOfRuLanguage from './ru.json';\nimport messagesOfSwLanguage from './sw.json';\nimport messagesOfTeLanguage from './te.json';\nimport messagesOfThLanguage from './th.json';\nimport messagesOfTrTrLanguage from './tr_TR.json';\nimport messagesOfUkLanguage from './uk.json';\nimport messagesOfZhCnLanguage from './zh_CN.json';\n\nexport default {\n 'ar': messagesOfArLanguage,\n 'zh-cn': messagesOfZhCnLanguage,\n 'uk': messagesOfUkLanguage,\n 'tr-tr': messagesOfTrTrLanguage,\n 'th': messagesOfThLanguage,\n 'te': messagesOfTeLanguage,\n 'sw': messagesOfSwLanguage,\n 'ru': messagesOfRuLanguage,\n 'pt-pt': messagesOfPtPtLanguage,\n 'pt-br': messagesOfPtBrLanguage,\n 'it-it': messagesOfItItLanguage,\n 'id': messagesOfIdLanguage,\n 'hi': messagesOfHiLanguage,\n 'he': messagesOfHeLanguage,\n 'fr-ca': messagesOfFrCaLanguage,\n 'fa': messagesOfFaLanguage,\n 'es-es': messagesOfEsEsLanguage,\n 'es-419': messagesOfEs419Language,\n 'el': messagesOfElLanguage,\n 'de-de': messagesOfDeDeLanguage,\n 'de': messagesOfDeLanguage,\n 'da': messagesOfDaLanguage,\n};\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nexport const LOADED = 'LOADED';\n\nconst slice = createSlice({\n name: 'courseDetail',\n initialState: {\n courseId: null,\n status: null,\n canChangeProvider: null,\n },\n reducers: {\n updateStatus: (state, { payload }) => {\n state.courseId = payload.courseId;\n state.status = payload.status;\n },\n updateCanChangeProviders: (state, { payload }) => {\n state.canChangeProviders = payload.canChangeProviders;\n },\n },\n});\n\nexport const {\n updateStatus,\n updateCanChangeProviders,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nexport const LOADING = 'LOADING';\nexport const LOADED = 'LOADED';\nexport const FAILED = 'FAILED';\nexport const DENIED = 'DENIED';\nexport const SAVING = 'SAVING';\nexport const SAVED = 'SAVED';\n\nconst slice = createSlice({\n name: 'discussions',\n initialState: {\n appIds: [],\n featureIds: [],\n // activeAppId is the ID of the app that has been configured for the course.\n activeAppId: null,\n // selectedAppId is the ID of the app that has been selected in the UI. This happens when an\n // activeAppId has been configured but the user is about to configure a different provider\n // instead.\n selectedAppId: null,\n status: LOADING,\n saveStatus: SAVED,\n // ValidationError is the Flag that represents a form validation status.\n hasValidationError: false,\n discussionTopicIds: [],\n divideDiscussionIds: [],\n enableInContext: false,\n enableGradedUnits: false,\n unitLevelVisibility: false,\n postingRestrictions: null,\n enabled: true,\n },\n reducers: {\n loadApps: (state, { payload }) => {\n state.status = LOADED;\n state.saveStatus = SAVED;\n Object.assign(state, payload);\n },\n selectApp: (state, { payload }) => {\n const { appId } = payload;\n state.selectedAppId = appId;\n },\n updateStatus: (state, { payload }) => {\n const { status } = payload;\n state.status = status;\n },\n updateSaveStatus: (state, { payload }) => {\n const { status } = payload;\n state.saveStatus = status;\n },\n updateValidationStatus: (state, { payload }) => {\n const { hasError } = payload;\n state.hasValidationError = hasError;\n },\n updateDiscussionTopicIds: (state, { payload }) => {\n const { updatedDiscussionTopicIds } = payload;\n state.discussionTopicIds = updatedDiscussionTopicIds;\n },\n updateDividedDiscussionsIds: (state, { payload }) => {\n const { divideDiscussionIds } = payload;\n state.divideDiscussionIds = divideDiscussionIds;\n },\n },\n});\n\nexport const {\n loadApps,\n selectApp,\n updateStatus,\n updateSaveStatus,\n updateValidationStatus,\n updateDiscussionTopicIds,\n updateDividedDiscussionsIds,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'customPages',\n initialState: {\n customPagesIds: [],\n loadingStatus: RequestStatus.IN_PROGRESS,\n savingStatus: '',\n addingStatus: 'default',\n deletingStatus: '',\n },\n reducers: {\n setPageIds: (state, { payload }) => {\n state.customPagesIds = payload.customPagesIds;\n },\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n updateAddingStatus: (state, { payload }) => {\n state.addingStatus = payload.status;\n },\n updateDeletingStatus: (state, { payload }) => {\n state.deletingStatus = payload.status;\n },\n deleteCustomPageSuccess: (state, { payload }) => {\n state.customPagesIds = state.customPagesIds.filter(id => id !== payload.customPageId);\n },\n addCustomPageSuccess: (state, { payload }) => {\n state.customPagesIds = [...state.customPagesIds, payload.customPageId];\n },\n },\n});\n\nexport const {\n setPageIds,\n updateLoadingStatus,\n updateSavingStatus,\n updateCustomPagesApiStatus,\n deleteCustomPageSuccess,\n updateDeletingStatus,\n addCustomPageSuccess,\n updateAddingStatus,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'advancedSettings',\n initialState: {\n loadingStatus: RequestStatus.IN_PROGRESS,\n savingStatus: '',\n courseAppSettings: {},\n proctoringErrors: {},\n sendRequestErrors: {},\n },\n reducers: {\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n fetchCourseAppsSettingsSuccess: (state, { payload }) => {\n Object.assign(state.courseAppSettings, payload);\n },\n updateCourseAppsSettingsSuccess: (state, { payload }) => {\n Object.assign(state.courseAppSettings, payload);\n },\n getDataSendErrors: (state, { payload }) => {\n Object.assign(state.sendRequestErrors, payload);\n },\n fetchProctoringExamErrorsSuccess: (state, { payload }) => {\n Object.assign(state.proctoringErrors, payload);\n },\n },\n});\n\nexport const {\n updateLoadingStatus,\n updateSavingStatus,\n getDataSendErrors,\n fetchCourseAppsSettingsSuccess,\n updateCourseAppsSettingsSuccess,\n fetchProctoringExamErrorsSuccess,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'gradingSettings',\n initialState: {\n loadingStatus: RequestStatus.IN_PROGRESS,\n savingStatus: '',\n gradingSettings: {},\n courseSettings: {},\n },\n reducers: {\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n fetchGradingSettingsSuccess: (state, { payload }) => {\n Object.assign(state.gradingSettings, payload);\n },\n sendGradingSettingsSuccess: (state, { payload }) => {\n Object.assign(state.gradingSettings, payload);\n },\n fetchCourseSettingsSuccess: (state, { payload }) => {\n Object.assign(state.courseSettings, payload);\n },\n },\n});\n\nexport const {\n updateLoadingStatus,\n updateSavingStatus,\n fetchGradingSettingsSuccess,\n sendGradingSettingsSuccess,\n fetchCourseSettingsSuccess,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'studioHome',\n initialState: {\n loadingStatuses: {\n studioHomeLoadingStatus: RequestStatus.IN_PROGRESS,\n courseNotificationLoadingStatus: RequestStatus.IN_PROGRESS,\n courseLoadingStatus: RequestStatus.IN_PROGRESS,\n libraryLoadingStatus: RequestStatus.IN_PROGRESS,\n },\n savingStatuses: {\n courseCreatorSavingStatus: '',\n deleteNotificationSavingStatus: '',\n },\n studioHomeData: {},\n studioHomeCoursesRequestParams: {\n currentPage: 1,\n search: undefined,\n order: 'display_name',\n archivedOnly: undefined,\n activeOnly: undefined,\n isFiltered: false,\n cleanFilters: false,\n },\n },\n reducers: {\n updateLoadingStatuses: (state, { payload }) => {\n state.loadingStatuses = { ...state.loadingStatuses, ...payload };\n },\n updateSavingStatuses: (state, { payload }) => {\n state.savingStatuses = { ...state.savingStatuses, ...payload };\n },\n fetchStudioHomeDataSuccess: (state, { payload }) => {\n Object.assign(state.studioHomeData, payload);\n },\n fetchCourseDataSuccess: (state, { payload }) => {\n const { courses, archivedCourses, inProcessCourseActions } = payload;\n state.studioHomeData.courses = courses;\n state.studioHomeData.archivedCourses = archivedCourses;\n state.studioHomeData.inProcessCourseActions = inProcessCourseActions;\n },\n fetchCourseDataSuccessV2: (state, { payload }) => {\n const { courses, archivedCourses = [], inProcessCourseActions } = payload.results;\n const { numPages, count } = payload;\n state.studioHomeData.courses = courses;\n state.studioHomeData.archivedCourses = archivedCourses;\n state.studioHomeData.inProcessCourseActions = inProcessCourseActions;\n state.studioHomeData.numPages = numPages;\n state.studioHomeData.coursesCount = count;\n },\n fetchLibraryDataSuccess: (state, { payload }) => {\n const { libraries } = payload;\n state.studioHomeData.libraries = libraries;\n },\n updateStudioHomeCoursesCustomParams: (state, { payload }) => {\n Object.assign(state.studioHomeCoursesRequestParams, payload);\n },\n },\n});\n\nexport const {\n updateSavingStatuses,\n updateLoadingStatuses,\n fetchStudioHomeDataSuccess,\n fetchCourseDataSuccess,\n fetchCourseDataSuccessV2,\n fetchLibraryDataSuccess,\n updateStudioHomeCoursesCustomParams,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'scheduleAndDetails',\n initialState: {\n loadingDetailsStatus: RequestStatus.IN_PROGRESS,\n loadingSettingsStatus: RequestStatus.IN_PROGRESS,\n savingStatus: '',\n courseDetails: {},\n courseSettings: {},\n },\n reducers: {\n updateLoadingDetailsStatus: (state, { payload }) => {\n state.loadingDetailsStatus = payload.status;\n },\n updateLoadingSettingsStatus: (state, { payload }) => {\n state.loadingSettingsStatus = payload.status;\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n updateCourseDetailsSuccess: (state, { payload }) => {\n Object.assign(state.courseDetails, payload);\n },\n fetchCourseDetailsSuccess: (state, { payload }) => {\n Object.assign(state.courseDetails, payload);\n },\n fetchCourseSettingsSuccess: (state, { payload }) => {\n Object.assign(state.courseSettings, payload);\n },\n },\n});\n\nexport const {\n updateSavingStatus,\n updateLoadingDetailsStatus,\n updateLoadingSettingsStatus,\n updateCourseDetailsSuccess,\n fetchCourseDetailsSuccess,\n fetchCourseSettingsSuccess,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\nimport { isEmpty } from 'lodash';\n\nimport { RequestStatus } from '../../../data/constants';\n\nconst slice = createSlice({\n name: 'assets',\n initialState: {\n assetIds: [],\n loadingStatus: RequestStatus.IN_PROGRESS,\n duplicateFiles: [],\n updatingStatus: '',\n addingStatus: '',\n deletingStatus: '',\n usageStatus: '',\n errors: {\n add: [],\n delete: [],\n lock: [],\n download: [],\n usageMetrics: [],\n loading: '',\n },\n },\n reducers: {\n setAssetIds: (state, { payload }) => {\n if (isEmpty(state.assetIds)) {\n state.assetIds = payload.assetIds;\n } else {\n state.assetIds = [...state.assetIds, ...payload.assetIds];\n }\n },\n setSortedAssetIds: (state, { payload }) => {\n state.assetIds = payload.assetIds;\n },\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n updateEditStatus: (state, { payload }) => {\n const { editType, status } = payload;\n switch (editType) {\n case 'delete':\n state.deletingStatus = status;\n break;\n case 'add':\n state.addingStatus = status;\n break;\n case 'lock':\n state.updatingStatus = status;\n break;\n case 'download':\n state.updatingStatus = status;\n break;\n case 'usageMetrics':\n state.usageStatus = status;\n break;\n default:\n break;\n }\n },\n deleteAssetSuccess: (state, { payload }) => {\n state.assetIds = state.assetIds.filter(id => id !== payload.assetId);\n },\n addAssetSuccess: (state, { payload }) => {\n state.assetIds = [payload.assetId, ...state.assetIds];\n },\n updateDuplicateFiles: (state, { payload }) => {\n state.duplicateFiles = payload.files;\n },\n updateErrors: (state, { payload }) => {\n const { error, message } = payload;\n if (error === 'loading') {\n state.errors.loading = message;\n } else {\n const currentErrorState = state.errors[error];\n state.errors[error] = [...currentErrorState, message];\n }\n },\n clearErrors: (state, { payload }) => {\n const { error } = payload;\n state.errors[error] = [];\n },\n },\n});\n\nexport const {\n setAssetIds,\n setSortedAssetIds,\n updateLoadingStatus,\n deleteAssetSuccess,\n addAssetSuccess,\n updateErrors,\n clearErrors,\n updateEditStatus,\n updateDuplicateFiles,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'courseTeam',\n initialState: {\n loadingCourseTeamStatus: RequestStatus.IN_PROGRESS,\n savingStatus: '',\n users: [],\n showTransferOwnershipHint: false,\n allowActions: false,\n errorMessage: '',\n },\n reducers: {\n fetchCourseTeamSuccess: (state, { payload }) => {\n state.users = payload.users;\n state.showTransferOwnershipHint = payload.showTransferOwnershipHint;\n state.allowActions = payload.allowActions;\n },\n updateLoadingCourseTeamStatus: (state, { payload }) => {\n state.loadingCourseTeamStatus = payload.status;\n },\n deleteCourseTeamUser: (state, { payload }) => {\n state.users = state.users.filter((user) => user.email !== payload);\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n setErrorMessage: (state, { payload }) => {\n state.errorMessage = payload;\n },\n },\n});\n\nexport const {\n fetchCourseTeamSuccess,\n updateLoadingCourseTeamStatus,\n deleteCourseTeamUser,\n updateSavingStatus,\n setErrorMessage,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\nimport { sortBy } from 'lodash';\n\nconst initialState = {\n courseUpdates: [],\n courseHandouts: {},\n savingStatuses: {\n createCourseUpdateQuery: '',\n editCourseUpdateQuery: '',\n deleteCourseUpdateQuery: '',\n editCourseHandoutsQuery: '',\n },\n loadingStatuses: {\n fetchCourseUpdatesQuery: '',\n fetchCourseHandoutsQuery: '',\n },\n};\n\nconst slice = createSlice({\n name: 'courseUpdates',\n initialState,\n reducers: {\n fetchCourseUpdatesSuccess: (state, { payload }) => {\n state.courseUpdates = payload;\n },\n createCourseUpdate: (state, { payload }) => {\n state.courseUpdates = [payload, ...state.courseUpdates];\n },\n editCourseUpdate: (state, { payload }) => {\n state.courseUpdates = state.courseUpdates.map((courseUpdate) => {\n if (courseUpdate.id === payload.id) {\n return payload;\n }\n return courseUpdate;\n });\n },\n deleteCourseUpdate: (state, { payload }) => {\n state.courseUpdates = sortBy(payload, 'id').reverse();\n },\n fetchCourseHandoutsSuccess: (state, { payload }) => {\n state.courseHandouts = payload;\n },\n editCourseHandouts: (state, { payload }) => {\n state.courseHandouts = {\n ...state.courseHandouts,\n ...payload,\n };\n },\n updateSavingStatuses: (state, { payload }) => {\n state.savingStatuses = { ...state.savingStatuses, ...payload };\n },\n updateLoadingStatuses: (state, { payload }) => {\n state.loadingStatuses = { ...state.loadingStatuses, ...payload };\n },\n },\n});\n\nexport const {\n fetchCourseUpdatesSuccess,\n createCourseUpdate,\n editCourseUpdate,\n deleteCourseUpdate,\n fetchCourseHandoutsSuccess,\n editCourseHandouts,\n updateSavingStatuses,\n updateLoadingStatuses,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { NOTIFICATION_MESSAGES } from '../../../constants';\n\nconst initialState = {\n isShow: false,\n title: NOTIFICATION_MESSAGES.empty,\n};\n\nconst slice = createSlice({\n name: 'processingNotification',\n initialState,\n reducers: {\n showProcessingNotification: (state, { payload }) => {\n state.isShow = true;\n state.title = payload;\n },\n hideProcessingNotification: () => initialState,\n },\n});\n\nexport const {\n showProcessingNotification,\n hideProcessingNotification,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nconst initialState = {\n loadingHelpUrlsStatus: '',\n pages: {},\n};\n\nconst slice = createSlice({\n name: 'helpUrls',\n initialState,\n reducers: {\n updatePages: (state, { payload }) => {\n state.pages = payload;\n },\n updateLoadingHelpUrlsStatus: (state, { payload }) => {\n state.loadingHelpUrlsStatus = payload.status;\n },\n },\n});\n\nexport const {\n updatePages,\n updateLoadingHelpUrlsStatus,\n} = slice.actions;\n\nexport const { reducer } = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nconst initialState = {\n exportTriggered: false,\n currentStage: 0,\n error: { msg: null, unitUrl: null },\n downloadPath: null,\n successDate: null,\n isErrorModalOpen: false,\n loadingStatus: '',\n savingStatus: '',\n};\n\nconst slice = createSlice({\n name: 'exportPage',\n initialState,\n reducers: {\n updateExportTriggered: (state, { payload }) => {\n state.exportTriggered = payload;\n },\n updateCurrentStage: (state, { payload }) => {\n if (payload >= state.currentStage) {\n state.currentStage = payload;\n }\n },\n updateDownloadPath: (state, { payload }) => {\n state.downloadPath = payload;\n },\n updateSuccessDate: (state, { payload }) => {\n state.successDate = payload;\n },\n updateError: (state, { payload }) => {\n state.error = payload;\n },\n updateIsErrorModalOpen: (state, { payload }) => {\n state.isErrorModalOpen = payload;\n },\n reset: () => initialState,\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n },\n});\n\nexport const {\n updateExportTriggered,\n updateCurrentStage,\n updateDownloadPath,\n updateSuccessDate,\n updateError,\n updateIsErrorModalOpen,\n reset,\n updateLoadingStatus,\n updateSavingStatus,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'generic',\n initialState: {\n loadingStatuses: {\n organizationLoadingStatus: RequestStatus.IN_PROGRESS,\n courseRerunLoadingStatus: RequestStatus.IN_PROGRESS,\n },\n savingStatus: '',\n organizations: [],\n createOrRerunCourse: {\n courseData: {},\n courseRerunData: {},\n redirectUrlObj: {},\n postErrors: {},\n },\n clipboardData: null,\n },\n reducers: {\n fetchOrganizations: (state, { payload }) => {\n state.organizations = payload;\n },\n updateLoadingStatuses: (state, { payload }) => {\n state.loadingStatuses = { ...state.loadingStatuses, ...payload };\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n updateCourseData: (state, { payload }) => {\n state.createOrRerunCourse.courseData = payload;\n },\n updateCourseRerunData: (state, { payload }) => {\n state.createOrRerunCourse.courseRerunData = payload;\n },\n updateRedirectUrlObj: (state, { payload }) => {\n state.createOrRerunCourse.redirectUrlObj = payload;\n },\n updatePostErrors: (state, { payload }) => {\n state.createOrRerunCourse.postErrors = payload;\n },\n updateClipboardData: (state, { payload }) => {\n state.clipboardData = payload;\n },\n },\n});\n\nexport const {\n fetchOrganizations,\n updatePostErrors,\n updateCourseRerunData,\n updateLoadingStatuses,\n updateSavingStatus,\n updateCourseData,\n updateRedirectUrlObj,\n updateClipboardData,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nconst initialState = {\n currentStage: 0,\n error: { hasError: false, message: '' },\n progress: 0,\n importTriggered: false,\n fileName: null,\n loadingStatus: '',\n savingStatus: '',\n successDate: null,\n};\n\nconst slice = createSlice({\n name: 'importPage',\n initialState,\n reducers: {\n updateCurrentStage: (state, { payload }) => {\n if (payload >= state.currentStage) {\n state.currentStage = payload;\n }\n },\n updateError: (state, { payload }) => {\n state.error = { ...state.error, ...payload };\n },\n updateProgress: (state, { payload }) => {\n state.progress = payload;\n },\n updateImportTriggered: (state, { payload }) => {\n state.importTriggered = payload;\n },\n updateFileName: (state, { payload }) => {\n state.fileName = payload;\n },\n reset: () => initialState,\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload;\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload;\n },\n updateSuccessDate: (state, { payload }) => {\n state.successDate = payload;\n },\n },\n});\n\nexport const {\n updateCurrentStage,\n updateError,\n updateProgress,\n updateImportTriggered,\n updateFileName,\n reset,\n updateLoadingStatus,\n updateSavingStatus,\n updateSuccessDate,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../../data/constants';\n\nconst slice = createSlice({\n name: 'videos',\n initialState: {\n videoIds: [],\n pageSettings: {},\n loadingStatus: RequestStatus.IN_PROGRESS,\n updatingStatus: '',\n addingStatus: '',\n deletingStatus: '',\n usageStatus: '',\n transcriptStatus: '',\n errors: {\n add: [],\n delete: [],\n thumbnail: [],\n download: [],\n usageMetrics: [],\n transcript: [],\n loading: '',\n },\n },\n reducers: {\n setVideoIds: (state, { payload }) => {\n state.videoIds = payload.videoIds;\n },\n setPageSettings: (state, { payload }) => {\n state.pageSettings = payload;\n },\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n updateEditStatus: (state, { payload }) => {\n const { editType, status } = payload;\n switch (editType) {\n case 'delete':\n state.deletingStatus = status;\n break;\n case 'add':\n state.addingStatus = status;\n break;\n case 'thumbnail':\n state.updatingStatus = status;\n break;\n case 'download':\n state.updatingStatus = status;\n break;\n case 'usageMetrics':\n state.usageStatus = status;\n break;\n case 'transcript':\n state.transcriptStatus = status;\n break;\n default:\n break;\n }\n },\n deleteVideoSuccess: (state, { payload }) => {\n state.videoIds = state.videoIds.filter(id => id !== payload.videoId);\n },\n addVideoById: (state, { payload }) => {\n state.videoIds = [payload.videoId, ...state.videoIds];\n },\n updateTranscriptCredentialsSuccess: (state, { payload }) => {\n const { provider } = payload;\n state.pageSettings.transcriptCredentials = {\n ...state.pageSettings.transcriptCredentials,\n [provider]: true,\n };\n },\n updateTranscriptPreferenceSuccess: (state, { payload }) => {\n state.pageSettings.activeTranscriptPreferences = payload;\n },\n updateErrors: (state, { payload }) => {\n const { error, message } = payload;\n if (error === 'loading') {\n state.errors.loading = message;\n } else {\n const currentErrorState = state.errors[error];\n state.errors[error] = [...currentErrorState, message];\n }\n },\n clearErrors: (state, { payload }) => {\n const { error } = payload;\n state.errors[error] = [];\n },\n failAddVideo: (state, { payload }) => {\n const { fileName } = payload;\n const currentErrorState = state.errors.add;\n state.errors.add = [...currentErrorState, `Failed to add ${fileName}.`];\n state.addingStatus = RequestStatus.FAILED;\n },\n },\n});\n\nexport const {\n setVideoIds,\n setPageSettings,\n updateLoadingStatus,\n deleteVideoSuccess,\n addVideoSuccess,\n updateErrors,\n clearErrors,\n updateEditStatus,\n updateTranscriptCredentialsSuccess,\n updateTranscriptPreferenceSuccess,\n updateVideoUploadProgress,\n failAddVideo,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","export const ITEM_BADGE_STATUS = /** @type {const} */ ({\n live: 'live',\n gated: 'gated',\n publishedNotLive: 'published_not_live',\n unpublishedChanges: 'unpublished_changes',\n staffOnly: 'staff_only',\n draft: 'draft',\n unscheduled: 'unscheduled',\n needs_attention: 'needs_attention',\n});\n\nexport const HIGHLIGHTS_FIELD_MAX_LENGTH = 250;\n\nexport const CHECKLIST_FILTERS = /** @type {const} */ ({\n ALL: 'ALL',\n SELF_PACED: 'SELF_PACED',\n INSTRUCTOR_PACED: 'INSTRUCTOR_PACED',\n});\n\nexport const COURSE_BLOCK_NAMES = /** @type {const} */ ({\n chapter: { id: 'chapter', name: 'Section' },\n sequential: { id: 'sequential', name: 'Subsection' },\n vertical: { id: 'vertical', name: 'Unit' },\n});\n\nexport const LAUNCH_CHECKLIST = /** @type {const} */ ({\n data: [\n {\n id: 'welcomeMessage',\n pacingTypeFilter: CHECKLIST_FILTERS.ALL,\n },\n {\n id: 'gradingPolicy',\n pacingTypeFilter: CHECKLIST_FILTERS.ALL,\n },\n {\n id: 'certificate',\n pacingTypeFilter: CHECKLIST_FILTERS.ALL,\n },\n {\n id: 'courseDates',\n pacingTypeFilter: CHECKLIST_FILTERS.ALL,\n },\n {\n id: 'assignmentDeadlines',\n pacingTypeFilter: CHECKLIST_FILTERS.INSTRUCTOR_PACED,\n },\n {\n id: 'proctoringEmail',\n pacingTypeFilter: CHECKLIST_FILTERS.ALL,\n },\n ],\n});\n\nexport const BEST_PRACTICES_CHECKLIST = /** @type {const} */ ({\n data: [\n {\n id: 'videoDuration',\n pacingTypeFilter: CHECKLIST_FILTERS.ALL,\n },\n {\n id: 'mobileFriendlyVideo',\n pacingTypeFilter: CHECKLIST_FILTERS.ALL,\n },\n {\n id: 'diverseSequences',\n pacingTypeFilter: CHECKLIST_FILTERS.ALL,\n },\n {\n id: 'weeklyHighlights',\n pacingTypeFilter: CHECKLIST_FILTERS.SELF_PACED,\n },\n {\n id: 'unitDepth',\n pacingTypeFilter: CHECKLIST_FILTERS.ALL,\n },\n ],\n});\n\nexport const VIDEO_SHARING_OPTIONS = /** @type {const} */ ({\n perVideo: 'per-video',\n allOn: 'all-on',\n allOff: 'all-off',\n});\n\nexport const API_ERROR_TYPES = /** @type {const} */ ({\n networkError: 'networkError',\n serverError: 'serverError',\n unknown: 'unknown',\n});\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { VIDEO_SHARING_OPTIONS } from '../constants';\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'courseOutline',\n initialState: {\n loadingStatus: {\n outlineIndexLoadingStatus: RequestStatus.IN_PROGRESS,\n reIndexLoadingStatus: RequestStatus.IN_PROGRESS,\n fetchSectionLoadingStatus: RequestStatus.IN_PROGRESS,\n courseLaunchQueryStatus: RequestStatus.IN_PROGRESS,\n },\n errors: {\n outlineIndexApi: null,\n reindexApi: null,\n sectionLoadingApi: null,\n courseLaunchApi: null,\n },\n outlineIndexData: {},\n savingStatus: '',\n statusBarData: {\n courseReleaseDate: '',\n highlightsEnabledForMessaging: false,\n isSelfPaced: false,\n checklist: {\n totalCourseLaunchChecks: 0,\n completedCourseLaunchChecks: 0,\n totalCourseBestPracticesChecks: 0,\n completedCourseBestPracticesChecks: 0,\n },\n videoSharingEnabled: false,\n videoSharingOptions: VIDEO_SHARING_OPTIONS.perVideo,\n },\n sectionsList: [],\n isCustomRelativeDatesActive: false,\n currentSection: {},\n currentSubsection: {},\n currentItem: {},\n actions: {\n deletable: true,\n draggable: true,\n childAddable: true,\n duplicable: true,\n },\n enableProctoredExams: false,\n pasteFileNotices: {},\n },\n reducers: {\n fetchOutlineIndexSuccess: (state, { payload }) => {\n state.outlineIndexData = payload;\n state.sectionsList = payload.courseStructure?.childInfo?.children || [];\n state.isCustomRelativeDatesActive = payload.isCustomRelativeDatesActive;\n state.enableProctoredExams = payload.courseStructure?.enableProctoredExams;\n },\n updateOutlineIndexLoadingStatus: (state, { payload }) => {\n state.loadingStatus = {\n ...state.loadingStatus,\n outlineIndexLoadingStatus: payload.status,\n };\n state.errors.outlineIndexApi = payload.errors || null;\n },\n updateReindexLoadingStatus: (state, { payload }) => {\n state.loadingStatus = {\n ...state.loadingStatus,\n reIndexLoadingStatus: payload.status,\n };\n state.errors.reindexApi = payload.errors || null;\n },\n updateFetchSectionLoadingStatus: (state, { payload }) => {\n state.loadingStatus = {\n ...state.loadingStatus,\n fetchSectionLoadingStatus: payload.status,\n };\n state.errors.sectionLoadingApi = payload.errors || null;\n },\n updateCourseLaunchQueryStatus: (state, { payload }) => {\n state.loadingStatus = {\n ...state.loadingStatus,\n courseLaunchQueryStatus: payload.status,\n };\n state.errors.courseLaunchApi = payload.errors || null;\n },\n dismissError: (state, { payload }) => {\n state.errors[payload] = null;\n },\n updateStatusBar: (state, { payload }) => {\n state.statusBarData = {\n ...state.statusBarData,\n ...payload,\n };\n },\n updateCourseActions: (state, { payload }) => {\n state.actions = {\n ...state.actions,\n ...payload,\n };\n },\n fetchStatusBarChecklistSuccess: (state, { payload }) => {\n state.statusBarData.checklist = {\n ...state.statusBarData.checklist,\n ...payload,\n };\n },\n fetchStatusBarSelPacedSuccess: (state, { payload }) => {\n state.statusBarData.isSelfPaced = payload.isSelfPaced;\n },\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n updateSectionList: (state, { payload }) => {\n state.sectionsList = state.sectionsList.map((section) => (section.id in payload ? payload[section.id] : section));\n },\n setCurrentItem: (state, { payload }) => {\n state.currentItem = payload;\n },\n reorderSectionList: (state, { payload }) => {\n const sectionsList = [...state.sectionsList];\n sectionsList.sort((a, b) => payload.indexOf(a.id) - payload.indexOf(b.id));\n\n state.sectionsList = [...sectionsList];\n },\n setCurrentSection: (state, { payload }) => {\n state.currentSection = payload;\n },\n setCurrentSubsection: (state, { payload }) => {\n state.currentSubsection = payload;\n },\n addSection: (state, { payload }) => {\n state.sectionsList = [\n ...state.sectionsList,\n payload,\n ];\n },\n addSubsection: (state, { payload }) => {\n state.sectionsList = state.sectionsList.map((section) => {\n if (section.id === payload.parentLocator) {\n section.childInfo.children = [\n ...section.childInfo.children,\n payload.data,\n ];\n }\n return section;\n });\n },\n deleteSection: (state, { payload }) => {\n state.sectionsList = state.sectionsList.filter(\n ({ id }) => id !== payload.itemId,\n );\n },\n deleteSubsection: (state, { payload }) => {\n state.sectionsList = state.sectionsList.map((section) => {\n if (section.id !== payload.sectionId) {\n return section;\n }\n section.childInfo.children = section.childInfo.children.filter(\n ({ id }) => id !== payload.itemId,\n );\n return section;\n });\n },\n deleteUnit: (state, { payload }) => {\n state.sectionsList = state.sectionsList.map((section) => {\n if (section.id !== payload.sectionId) {\n return section;\n }\n section.childInfo.children = section.childInfo.children.map((subsection) => {\n if (subsection.id !== payload.subsectionId) {\n return subsection;\n }\n subsection.childInfo.children = subsection.childInfo.children.filter(\n ({ id }) => id !== payload.itemId,\n );\n return subsection;\n });\n return section;\n });\n },\n duplicateSection: (state, { payload }) => {\n state.sectionsList = state.sectionsList.reduce((result, currentValue) => {\n if (currentValue.id === payload.id) {\n return [...result, currentValue, payload.duplicatedItem];\n }\n return [...result, currentValue];\n }, []);\n },\n setPasteFileNotices: (state, { payload }) => {\n state.pasteFileNotices = payload;\n },\n removePasteFileNotices: (state, { payload }) => {\n const pasteFileNotices = { ...state.pasteFileNotices };\n payload.forEach((key) => delete pasteFileNotices[key]);\n state.pasteFileNotices = pasteFileNotices;\n },\n },\n});\n\nexport const {\n addSection,\n addSubsection,\n fetchOutlineIndexSuccess,\n updateOutlineIndexLoadingStatus,\n updateReindexLoadingStatus,\n updateStatusBar,\n updateCourseActions,\n fetchStatusBarChecklistSuccess,\n fetchStatusBarSelPacedSuccess,\n updateFetchSectionLoadingStatus,\n updateCourseLaunchQueryStatus,\n updateSavingStatus,\n updateSectionList,\n setCurrentItem,\n setCurrentSection,\n setCurrentSubsection,\n deleteSection,\n deleteSubsection,\n deleteUnit,\n duplicateSection,\n reorderSectionList,\n reorderSubsectionList,\n reorderUnitList,\n setPasteFileNotices,\n removePasteFileNotices,\n dismissError,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'courseUnit',\n initialState: {\n savingStatus: '',\n errorMessage: '',\n isQueryPending: false,\n isTitleEditFormOpen: false,\n canEdit: true,\n loadingStatus: {\n fetchUnitLoadingStatus: RequestStatus.IN_PROGRESS,\n courseSectionVerticalLoadingStatus: RequestStatus.IN_PROGRESS,\n courseVerticalChildrenLoadingStatus: RequestStatus.IN_PROGRESS,\n },\n unit: {},\n courseSectionVertical: {},\n courseVerticalChildren: { children: [], isPublished: true },\n staticFileNotices: {},\n },\n reducers: {\n fetchCourseItemSuccess: (state, { payload }) => {\n state.unit = payload;\n },\n updateLoadingCourseUnitStatus: (state, { payload }) => {\n state.loadingStatus = {\n ...state.loadingStatus,\n fetchUnitLoadingStatus: payload.status,\n };\n },\n updateQueryPendingStatus: (state, { payload }) => {\n state.isQueryPending = payload;\n },\n changeEditTitleFormOpen: (state, { payload }) => {\n state.isTitleEditFormOpen = payload;\n },\n updateSavingStatus: (state, { payload }) => {\n const { status, errorMessage } = payload;\n state.savingStatus = status;\n state.errorMessage = errorMessage;\n },\n fetchSequenceRequest: (state, { payload }) => {\n state.sequenceId = payload.sequenceId;\n state.sequenceStatus = RequestStatus.IN_PROGRESS;\n state.sequenceMightBeUnit = false;\n },\n fetchSequenceSuccess: (state, { payload }) => {\n state.sequenceId = payload.sequenceId;\n state.sequenceStatus = RequestStatus.SUCCESSFUL;\n state.sequenceMightBeUnit = false;\n },\n fetchSequenceFailure: (state, { payload }) => {\n state.sequenceId = payload.sequenceId;\n state.sequenceStatus = RequestStatus.FAILED;\n state.sequenceMightBeUnit = payload.sequenceMightBeUnit || false;\n },\n fetchCourseSectionVerticalDataSuccess: (state, { payload }) => {\n state.courseSectionVertical = payload;\n },\n updateLoadingCourseSectionVerticalDataStatus: (state, { payload }) => {\n state.loadingStatus = {\n ...state.loadingStatus,\n courseSectionVerticalLoadingStatus: payload.status,\n };\n },\n updateLoadingCourseXblockStatus: (state, { payload }) => {\n state.loadingStatus = {\n ...state.loadingStatus,\n createUnitXblockLoadingStatus: payload.status,\n };\n },\n addNewUnitStatus: (state, { payload }) => {\n state.loadingStatus = {\n ...state.loadingStatus,\n fetchUnitLoadingStatus: payload.status,\n };\n },\n updateCourseVerticalChildren: (state, { payload }) => {\n state.courseVerticalChildren = payload;\n },\n updateCourseVerticalChildrenLoadingStatus: (state, { payload }) => {\n state.loadingStatus.courseVerticalChildrenLoadingStatus = payload.status;\n },\n deleteXBlock: (state, { payload }) => {\n state.courseVerticalChildren.children = state.courseVerticalChildren.children.filter(\n (component) => component.id !== payload,\n );\n },\n duplicateXBlock: (state, { payload }) => {\n state.courseVerticalChildren = {\n ...payload.newCourseVerticalChildren,\n children: payload.newCourseVerticalChildren.children.map((component) => {\n if (component.blockId === payload.newId) {\n component.shouldScroll = true;\n }\n return component;\n }),\n };\n },\n fetchStaticFileNoticesSuccess: (state, { payload }) => {\n state.staticFileNotices = payload;\n },\n reorderXBlockList: (state, { payload }) => {\n // Create a map for payload IDs to their index for O(1) lookups\n const indexMap = new Map(payload.map((id, index) => [id, index]));\n\n // Directly sort the children based on the order defined in payload\n // This avoids the need to copy the array beforehand\n state.courseVerticalChildren.children.sort((a, b) => (indexMap.get(a.id) || 0) - (indexMap.get(b.id) || 0));\n },\n },\n});\n\nexport const {\n fetchCourseItemSuccess,\n updateLoadingCourseUnitStatus,\n updateSavingStatus,\n updateModel,\n fetchSequenceRequest,\n fetchSequenceSuccess,\n fetchSequenceFailure,\n fetchCourseSectionVerticalDataSuccess,\n updateLoadingCourseSectionVerticalDataStatus,\n changeEditTitleFormOpen,\n updateQueryPendingStatus,\n updateLoadingCourseXblockStatus,\n updateCourseVerticalChildren,\n updateCourseVerticalChildrenLoadingStatus,\n deleteXBlock,\n duplicateXBlock,\n fetchStaticFileNoticesSuccess,\n reorderXBlockList,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'courseChecklist',\n initialState: {\n loadingStatus: {\n launchChecklistStatus: RequestStatus.IN_PROGRESS,\n bestPracticeChecklistStatus: RequestStatus.IN_PROGRESS,\n },\n launchData: {},\n bestPracticeData: {},\n },\n reducers: {\n fetchLaunchChecklistSuccess: (state, { payload }) => {\n state.launchData = payload.data;\n },\n updateLaunchChecklistStatus: (state, { payload }) => {\n state.loadingStatus.launchChecklistStatus = payload.status;\n },\n fetchBestPracticeChecklistSuccess: (state, { payload }) => {\n state.bestPracticeData = payload.data;\n },\n updateBestPracticeChecklisttStatus: (state, { payload }) => {\n state.loadingStatus.bestPracticeChecklistStatus = payload.status;\n },\n },\n});\n\nexport const {\n fetchLaunchChecklistSuccess,\n updateLaunchChecklistStatus,\n fetchBestPracticeChecklistSuccess,\n updateBestPracticeChecklisttStatus,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nconst slice = createSlice({\n name: 'accessibilityPage',\n initialState: {\n savingStatus: '',\n },\n reducers: {\n updateSavingStatus: (state, { payload }) => {\n state.savingStatus = payload.status;\n },\n },\n});\n\nexport const {\n updateLoadingStatus,\n updateSavingStatus,\n} = slice.actions;\n\nexport const {\n reducer,\n} = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'textbooks',\n initialState: {\n savingStatus: '',\n loadingStatus: RequestStatus.IN_PROGRESS,\n textbooks: [],\n errorMessage: '',\n currentTextbookId: '',\n },\n reducers: {\n fetchTextbooks: (state, { payload }) => {\n state.textbooks = payload.textbooks;\n },\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n updateSavingStatus: (state, { payload }) => {\n const { status, errorMessage } = payload;\n state.savingStatus = status;\n state.errorMessage = errorMessage;\n },\n createTextbookSuccess: (state, { payload }) => {\n state.textbooks = [...state.textbooks, payload];\n },\n editTextbookSuccess: (state, { payload }) => {\n state.currentTextbookId = payload.id;\n state.textbooks = state.textbooks.map((textbook) => {\n if (textbook.id === payload.id) {\n return payload;\n }\n return textbook;\n });\n },\n deleteTextbookSuccess: (state, { payload }) => {\n state.textbooks = state.textbooks.filter(({ id }) => id !== payload);\n },\n },\n});\n\nexport const {\n fetchTextbooks,\n updateLoadingStatus,\n updateSavingStatus,\n createTextbookSuccess,\n editTextbookSuccess,\n deleteTextbookSuccess,\n} = slice.actions;\n\nexport const { reducer } = slice;\n","export const MODE_STATES = {\n noModes: 'no_modes',\n noCertificates: 'no_certificates',\n view: 'view',\n editAll: 'edit_all',\n create: 'create',\n};\n\nexport const ACTIVATION_MESSAGES = {\n activating: 'Activating',\n deactivating: 'Deactivating',\n};\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\nimport { MODE_STATES } from './constants';\n\nconst slice = createSlice({\n name: 'certificates',\n initialState: {\n certificatesData: {},\n componentMode: MODE_STATES.noModes,\n loadingStatus: RequestStatus.PENDING,\n savingStatus: '',\n savingImageStatus: '',\n errorMessage: '',\n },\n reducers: {\n updateSavingStatus: (state, { payload }) => {\n const { status, errorMessage } = payload;\n state.savingStatus = status;\n state.errorMessage = errorMessage;\n },\n updateSavingImageStatus: (state, { payload }) => {\n state.savingImageStatus = payload.status;\n },\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n fetchCertificatesSuccess: (state, { payload }) => {\n Object.assign(state.certificatesData, payload);\n },\n createCertificateSuccess: (state, action) => {\n state.certificatesData.certificates.push(action.payload);\n },\n updateCertificateSuccess: (state, action) => {\n const index = state.certificatesData.certificates.findIndex(c => c.id === action.payload.id);\n\n if (index !== -1) {\n state.certificatesData.certificates[index] = action.payload;\n }\n },\n setMode: (state, action) => {\n state.componentMode = action.payload;\n },\n deleteCertificateSuccess: (state) => {\n state.certificatesData.certificates = [];\n },\n },\n});\n\nexport const {\n setMode,\n updateSavingStatus,\n updateLoadingStatus,\n updateSavingImageStatus,\n fetchCertificatesSuccess,\n createCertificateSuccess,\n updateCertificateSuccess,\n deleteCertificateSuccess,\n} = slice.actions;\n\nexport const { reducer } = slice;\n","/* eslint-disable no-param-reassign */\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { RequestStatus } from '../../data/constants';\n\nconst slice = createSlice({\n name: 'groupConfigurations',\n initialState: {\n savingStatus: '',\n errorMessage: '',\n loadingStatus: RequestStatus.IN_PROGRESS,\n groupConfigurations: {},\n },\n reducers: {\n fetchGroupConfigurations: (state, { payload }) => {\n state.groupConfigurations = payload.groupConfigurations;\n },\n updateGroupConfigurationsSuccess: (state, { payload }) => {\n const groupIndex = state.groupConfigurations.allGroupConfigurations.findIndex(\n group => payload.data.id === group.id,\n );\n\n if (groupIndex !== -1) {\n state.groupConfigurations.allGroupConfigurations[groupIndex] = payload.data;\n }\n },\n deleteGroupConfigurationsSuccess: (state, { payload }) => {\n const { parentGroupId, groupId } = payload;\n const parentGroupIndex = state.groupConfigurations.allGroupConfigurations.findIndex(\n group => parentGroupId === group.id,\n );\n if (parentGroupIndex !== -1) {\n state.groupConfigurations.allGroupConfigurations[parentGroupIndex].groups = state\n .groupConfigurations.allGroupConfigurations[parentGroupIndex].groups.filter(group => group.id !== groupId);\n }\n },\n updateLoadingStatus: (state, { payload }) => {\n state.loadingStatus = payload.status;\n },\n updateSavingStatuses: (state, { payload }) => {\n const { status, errorMessage } = payload;\n state.savingStatus = status;\n state.errorMessage = errorMessage;\n },\n updateExperimentConfigurationSuccess: (state, { payload }) => {\n const { configuration } = payload;\n const experimentConfigurationState = state.groupConfigurations.experimentGroupConfigurations;\n const configurationIdx = experimentConfigurationState.findIndex(\n (conf) => configuration.id === conf.id,\n );\n\n if (configurationIdx !== -1) {\n experimentConfigurationState[configurationIdx] = configuration;\n } else {\n state.groupConfigurations.experimentGroupConfigurations = [\n ...experimentConfigurationState,\n configuration,\n ];\n }\n },\n deleteExperimentConfigurationSuccess: (state, { payload }) => {\n const { configurationId } = payload;\n const filteredGroups = state.groupConfigurations.experimentGroupConfigurations.filter(\n (configuration) => configuration.id !== configurationId,\n );\n state.groupConfigurations.experimentGroupConfigurations = filteredGroups;\n },\n },\n});\n\nexport const {\n fetchGroupConfigurations,\n updateLoadingStatus,\n updateSavingStatuses,\n updateGroupConfigurationsSuccess,\n deleteGroupConfigurationsSuccess,\n updateExperimentConfigurationSuccess,\n deleteExperimentConfigurationSuccess,\n} = slice.actions;\n\nexport const { reducer } = slice;\n","import { configureStore } from '@reduxjs/toolkit';\n\n// FIXME: because the 'live' plugin is using Redux, we have to hard-code a reference to it here.\n// If this app + the plugin were using React-query, there'd be no issues.\nimport { reducer as liveReducer } from '@openedx-plugins/course-app-live/data/slice';\n\nimport { reducer as modelsReducer } from './generic/model-store';\nimport { reducer as courseDetailReducer } from './data/slice';\nimport { reducer as discussionsReducer } from './pages-and-resources/discussions/data/slice';\nimport { reducer as pagesAndResourcesReducer } from './pages-and-resources/data/slice';\nimport { reducer as customPagesReducer } from './custom-pages/data/slice';\nimport { reducer as advancedSettingsReducer } from './advanced-settings/data/slice';\nimport { reducer as gradingSettingsReducer } from './grading-settings/data/slice';\nimport { reducer as studioHomeReducer } from './studio-home/data/slice';\nimport { reducer as scheduleAndDetailsReducer } from './schedule-and-details/data/slice';\nimport { reducer as filesReducer } from './files-and-videos/files-page/data/slice';\nimport { reducer as courseTeamReducer } from './course-team/data/slice';\nimport { reducer as CourseUpdatesReducer } from './course-updates/data/slice';\nimport { reducer as processingNotificationReducer } from './generic/processing-notification/data/slice';\nimport { reducer as helpUrlsReducer } from './help-urls/data/slice';\nimport { reducer as courseExportReducer } from './export-page/data/slice';\nimport { reducer as genericReducer } from './generic/data/slice';\nimport { reducer as courseImportReducer } from './import-page/data/slice';\nimport { reducer as videosReducer } from './files-and-videos/videos-page/data/slice';\nimport { reducer as courseOutlineReducer } from './course-outline/data/slice';\nimport { reducer as courseUnitReducer } from './course-unit/data/slice';\nimport { reducer as courseChecklistReducer } from './course-checklist/data/slice';\nimport { reducer as accessibilityPageReducer } from './accessibility-page/data/slice';\nimport { reducer as textbooksReducer } from './textbooks/data/slice';\nimport { reducer as certificatesReducer } from './certificates/data/slice';\nimport { reducer as groupConfigurationsReducer } from './group-configurations/data/slice';\n\nexport default function initializeStore(preloadedState = undefined) {\n return configureStore({\n reducer: {\n courseDetail: courseDetailReducer,\n customPages: customPagesReducer,\n discussions: discussionsReducer,\n assets: filesReducer,\n pagesAndResources: pagesAndResourcesReducer,\n scheduleAndDetails: scheduleAndDetailsReducer,\n advancedSettings: advancedSettingsReducer,\n gradingSettings: gradingSettingsReducer,\n studioHome: studioHomeReducer,\n models: modelsReducer,\n live: liveReducer,\n courseTeam: courseTeamReducer,\n courseUpdates: CourseUpdatesReducer,\n processingNotification: processingNotificationReducer,\n helpUrls: helpUrlsReducer,\n courseExport: courseExportReducer,\n generic: genericReducer,\n courseImport: courseImportReducer,\n videos: videosReducer,\n courseOutline: courseOutlineReducer,\n courseUnit: courseUnitReducer,\n courseChecklist: courseChecklistReducer,\n accessibilityPage: accessibilityPageReducer,\n certificates: certificatesReducer,\n groupConfigurations: groupConfigurationsReducer,\n textbooks: textbooksReducer,\n },\n preloadedState,\n });\n}\n","import React from 'react';\nimport { Alert } from '@openedx/paragon';\nimport PropTypes from 'prop-types';\n\nconst AlertMessage = ({ title, description, ...props }) => (\n \n {title}\n {description}\n \n);\n\nAlertMessage.propTypes = {\n title: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n description: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n};\n\nAlertMessage.defaultProps = {\n title: undefined,\n description: undefined,\n};\n\nexport default AlertMessage;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n warningTitle: {\n id: 'course-authoring.generic.saving-error-alert.title',\n defaultMessage: 'Studio\\'s having trouble saving your work',\n description: 'Title for an alert indicating saving error in the studio environment',\n },\n warningDescription: {\n id: 'course-authoring.generic.saving-error-alert.description',\n defaultMessage: 'This may be happening because of an error with our server or your internet connection. Try refreshing the page or making sure you are online.',\n description: 'Description providing possible reasons and solutions for saving error in the studio environment',\n },\n warningTitleAriaLabelledBy: {\n id: 'course-authoring.generic.saving-error-alert.title.aria.labelled-by',\n defaultMessage: 'saving-error-alert-title',\n description: 'ARIA label ID for the title of the saving error alert',\n },\n warningDescriptionAriaDescribedBy: {\n id: 'course-authoring.generic.saving-error-alert.aria.described-by',\n defaultMessage: 'saving-error-alert-description',\n description: 'ARIA description ID for the saving error alert',\n },\n});\n\nexport default messages;\n","import { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Warning as WarningIcon } from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { RequestStatus } from '../../data/constants';\nimport AlertMessage from '../alert-message';\nimport messages from './messages';\n\nconst SavingErrorAlert = ({\n savingStatus,\n errorMessage,\n}) => {\n const intl = useIntl();\n const [showAlert, setShowAlert] = useState(false);\n const [isOnline, setIsOnline] = useState(window.navigator.onLine);\n const isQueryFailed = savingStatus === RequestStatus.FAILED;\n\n useEffect(() => {\n const handleOnlineStatus = () => setIsOnline(window.navigator.onLine);\n const events = ['online', 'offline'];\n\n events.forEach((event) => {\n window.addEventListener(event, handleOnlineStatus);\n });\n\n return () => {\n events.forEach((event) => {\n window.removeEventListener(event, handleOnlineStatus);\n });\n };\n }, [isOnline]);\n\n useEffect(() => {\n setShowAlert((!isOnline && isQueryFailed) || isQueryFailed);\n }, [isQueryFailed, isOnline]);\n\n return (\n \n );\n};\n\nSavingErrorAlert.defaultProps = {\n errorMessage: undefined,\n};\n\nSavingErrorAlert.propTypes = {\n savingStatus: PropTypes.string.isRequired,\n errorMessage: PropTypes.string,\n};\n\nexport default SavingErrorAlert;\n","import { RequestStatus } from '../../data/constants';\n\nconst handleResponseErrors = (error, dispatch, savingStatusFunction) => {\n let errorMessage = '';\n\n try {\n const {\n customAttributes: { httpErrorResponseData },\n } = error;\n const parsedData = JSON.parse(httpErrorResponseData);\n errorMessage = parsedData?.error || errorMessage;\n } catch (err) {\n errorMessage = '';\n }\n\n dispatch(\n savingStatusFunction({\n status: RequestStatus.FAILED,\n errorMessage,\n }),\n );\n return false;\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { handleResponseErrors };\n","// eslint-disable-next-line import/prefer-default-export\nexport const getProcessingNotification = (state) => ({\n isShow: state.processingNotification.isShow,\n title: state.processingNotification.title,\n});\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { ActionRow } from '@openedx/paragon';\n\nconst SubHeader = ({\n title,\n subtitle,\n breadcrumbs,\n contentTitle,\n description,\n instruction,\n headerActions,\n titleActions,\n hideBorder,\n withSubHeaderContent,\n}) => (\n
\n
\n

\n {subtitle}\n {breadcrumbs && (\n
{breadcrumbs}
\n )}\n {title}\n {titleActions && (\n \n {titleActions}\n \n )}\n

\n {headerActions && (\n \n {headerActions}\n \n )}\n
\n {contentTitle && withSubHeaderContent && (\n
\n

{contentTitle}

\n {description}\n
\n )}\n {instruction && (\n

{instruction}

\n )}\n
\n);\n\nSubHeader.defaultProps = {\n instruction: '',\n description: '',\n subtitle: '',\n breadcrumbs: '',\n contentTitle: '',\n headerActions: null,\n titleActions: null,\n hideBorder: false,\n withSubHeaderContent: true,\n};\n\nSubHeader.propTypes = {\n title: PropTypes.oneOfType([\n PropTypes.node,\n PropTypes.string,\n ]).isRequired,\n subtitle: PropTypes.string,\n breadcrumbs: PropTypes.oneOfType([\n PropTypes.node,\n PropTypes.string,\n ]),\n contentTitle: PropTypes.string,\n description: PropTypes.string,\n instruction: PropTypes.oneOfType([\n PropTypes.element,\n PropTypes.string,\n ]),\n headerActions: PropTypes.node,\n titleActions: PropTypes.node,\n hideBorder: PropTypes.bool,\n withSubHeaderContent: PropTypes.bool,\n};\nexport default SubHeader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Badge, Icon } from '@openedx/paragon';\nimport { Settings as IconSettings } from '@openedx/paragon/icons';\nimport { capitalize } from 'lodash';\n\nimport { NOTIFICATION_MESSAGES } from '../../constants';\n\nconst ProcessingNotification = ({ isShow, title }) => (\n \n \n

\n {capitalize(title)}\n

\n \n);\n\nProcessingNotification.propTypes = {\n isShow: PropTypes.bool.isRequired,\n title: PropTypes.oneOf(Object.values(NOTIFICATION_MESSAGES)).isRequired,\n};\n\nexport default ProcessingNotification;\n","const descriptions = {\n title: {\n id: 'course-authoring.textbooks.empty-placeholder.title',\n defaultMessage: 'You haven\\'t added any textbooks to this course yet.',\n description: 'Message displayed when no textbooks are added to the course',\n },\n button: {\n id: 'course-authoring.textbooks.empty-placeholder.button.new-textbook',\n defaultMessage: 'Add your first textbook',\n description: 'Text for the button to add the first textbook to the course',\n },\n};\n\nexport default descriptions;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Add as IconAdd } from '@openedx/paragon/icons';\nimport { Button } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst EmptyPlaceholder = ({ onCreateNewTextbook }) => {\n const intl = useIntl();\n\n return (\n
\n

{intl.formatMessage(messages.title)}

\n \n
\n );\n};\n\nEmptyPlaceholder.propTypes = {\n onCreateNewTextbook: PropTypes.func.isRequired,\n};\n\nexport default EmptyPlaceholder;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.course-outline.delete-modal.title',\n defaultMessage: 'Delete this {category}?',\n },\n description: {\n id: 'course-authoring.course-outline.delete-modal.description',\n defaultMessage: 'Deleting this {category} is permanent and cannot be undone.',\n },\n deleteButton: {\n id: 'course-authoring.course-outline.delete-modal.button.delete',\n defaultMessage: 'Delete',\n },\n cancelButton: {\n id: 'course-authoring.course-outline.delete-modal.button.cancel',\n defaultMessage: 'Cancel',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport {\n ActionRow,\n Button,\n AlertModal,\n} from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport messages from './messages';\n\nconst DeleteModal = ({\n category,\n isOpen,\n close,\n onDeleteSubmit,\n title,\n description,\n}) => {\n const intl = useIntl();\n\n const modalTitle = title || intl.formatMessage(messages.title, { category });\n const modalDescription = description || intl.formatMessage(messages.description, { category });\n\n return (\n \n \n {\n e.preventDefault();\n onDeleteSubmit();\n }}\n >\n {intl.formatMessage(messages.deleteButton, { category })}\n \n \n )}\n >\n

{modalDescription}

\n \n );\n};\n\nDeleteModal.defaultProps = {\n category: '',\n title: '',\n description: '',\n};\n\nDeleteModal.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n close: PropTypes.func.isRequired,\n category: PropTypes.string,\n onDeleteSubmit: PropTypes.func.isRequired,\n title: PropTypes.string,\n description: PropTypes.string,\n};\n\nexport default DeleteModal;\n","export const getTextbooksData = (state) => state.textbooks.textbooks;\nexport const getLoadingStatus = (state) => state.textbooks.loadingStatus;\nexport const getSavingStatus = (state) => state.textbooks.savingStatus;\nexport const getErrorMessage = (state) => state.textbooks.errorMessage;\nexport const getCurrentTextbookId = (state) => state.textbooks.currentTextbookId;\n","import { useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nconst PromptIfDirty = ({ dirty }) => {\n useEffect(() => {\n // eslint-disable-next-line consistent-return\n const handleBeforeUnload = (event) => {\n if (dirty) {\n event.preventDefault();\n }\n };\n window.addEventListener('beforeunload', handleBeforeUnload);\n\n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload);\n };\n }, [dirty]);\n\n return null;\n};\nPromptIfDirty.propTypes = {\n dirty: PropTypes.bool.isRequired,\n};\nexport default PromptIfDirty;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n uploadImageDropzoneText: {\n id: 'course-authoring.certificates.modal-dropzone.text',\n defaultMessage: 'Drag and drop your image here or click to upload',\n description: 'Description to drag and drop block',\n },\n uploadImageDropzoneAlt: {\n id: 'course-authoring.certificates.modal-dropzone.dropzone-alt',\n defaultMessage: 'Uploaded image for course certificate',\n description: 'Description for the uploaded image',\n },\n uploadImageValidationText: {\n id: 'course-authoring.certificates.modal-dropzone.validation.text',\n defaultMessage: 'Only {types} files can be uploaded. Please select a file ending in {extensions} to upload.',\n description: 'Error message for when an invalid file type is selected',\n },\n cancelModal: {\n id: 'course-authoring.certificates.modal-dropzone.cancel.modal',\n defaultMessage: 'Cancel',\n description: 'Text for the cancel button in the modal',\n },\n uploadModal: {\n id: 'course-authoring.certificates.modal-dropzone.upload.modal',\n defaultMessage: 'Upload',\n description: 'Text for the upload button in the modal',\n },\n uploadImageDropzoneInvalidSizeMore: {\n id: 'course-authoring.certificates.modal-dropzone.validation.invalid-size-more',\n defaultMessage: 'Image size must be less than {maxSize}MB.',\n description: 'Error message for when the uploaded image size exceeds the limit',\n },\n});\n\nexport default messages;\n","import { useState, useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { RequestStatus } from '../../data/constants';\nimport { uploadAssets } from './data/api';\nimport messages from './messages';\n\nconst useModalDropzone = ({\n onChange, onCancel, onClose, fileTypes, onSavingStatus, onSelectFile,\n}) => {\n const { courseId } = useParams();\n const intl = useIntl();\n const [selectedFile, setSelectedFile] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const [uploadProgress, setUploadProgress] = useState(0);\n const [disabledUploadBtn, setDisabledUploadBtn] = useState(true);\n\n const VALID_IMAGE_TYPES = ['png', 'jpeg'];\n\n const imageValidator = (file) => {\n const fileType = file.name.split('.').pop().toLowerCase();\n\n const extensionsList = fileTypes.map(type => `.${type.toLowerCase()}`).join(', ');\n const typesList = fileTypes.map(type => type.toUpperCase()).join(', ');\n\n if (!fileTypes.map(type => type.toLowerCase()).includes(fileType)) {\n return intl.formatMessage(messages.uploadImageValidationText, {\n types: typesList,\n extensions: extensionsList,\n });\n }\n return null;\n };\n\n /**\n * Constructs an accept object for Dropzone based on provided file types.\n *\n * @param {string[]} types - Array of file extensions.\n * @returns {Object} Accept object for Dropzone.\n *\n * Example:\n * input: ['png', 'jpg', 'pdf', 'docx']\n * output:\n * {\n * \"image/*\": [\".png\", \".jpg\"],\n * \"* /*\": [\".pdf\", \".docx\"]\n * }\n */\n const constructAcceptObject = (types) => types\n .reduce((acc, type) => {\n // eslint-disable-next-line no-nested-ternary\n const mimeType = type === 'pdf' ? 'application/pdf' : VALID_IMAGE_TYPES.includes(type) ? 'image/*' : '*/*';\n if (!acc[mimeType]) {\n acc[mimeType] = [];\n }\n acc[mimeType].push(`.${type}`);\n return acc;\n }, {});\n\n const accept = useMemo(() => constructAcceptObject(fileTypes), [fileTypes]);\n\n const handleSelectFile = ({ fileData }) => {\n const file = fileData.get('file');\n\n if (file) {\n const reader = new FileReader();\n reader.onloadend = () => {\n setPreviewUrl(reader.result);\n setDisabledUploadBtn(false);\n };\n reader.readAsDataURL(file);\n setSelectedFile(fileData);\n\n if (onSelectFile) {\n onSelectFile(file.path);\n }\n }\n };\n\n const handleCancel = () => {\n setPreviewUrl(null);\n setDisabledUploadBtn(true);\n onSavingStatus({ status: RequestStatus.CLEAR });\n setUploadProgress(0);\n onCancel();\n onClose();\n };\n\n const handleUpload = async () => {\n if (!selectedFile) { return; }\n\n onSavingStatus(RequestStatus.PENDING);\n\n const onUploadProgress = (progressEvent) => {\n const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);\n setUploadProgress(percentCompleted);\n };\n\n try {\n const response = await uploadAssets(courseId, selectedFile, onUploadProgress);\n const { url } = response.asset;\n\n if (url) {\n onChange(url);\n onSavingStatus({ status: RequestStatus.SUCCESSFUL });\n onClose();\n }\n } catch (error) {\n onSavingStatus({ status: RequestStatus.FAILED });\n } finally {\n setDisabledUploadBtn(true);\n setUploadProgress(0);\n setPreviewUrl(null);\n }\n };\n\n return {\n intl,\n accept,\n uploadProgress,\n previewUrl,\n disabledUploadBtn,\n handleSelectFile,\n imageValidator,\n handleCancel,\n handleUpload,\n };\n};\n\nexport default useModalDropzone;\n","import { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nexport const getUploadAssetsUrl = (courseId) => new URL(\n `/assets/${courseId}/`,\n getConfig().STUDIO_BASE_URL,\n);\n\n/**\n * Upload assets.\n * @param {string} courseId\n * @param {FormData} fileData\n * @param {function} onUploadProgress\n * @returns {Promise}\n */\nexport async function uploadAssets(courseId, fileData, onUploadProgress) {\n const config = {\n onUploadProgress,\n };\n\n const { data } = await getAuthenticatedHttpClient()\n .post(\n getUploadAssetsUrl(courseId).href,\n fileData,\n config,\n );\n\n return camelCaseObject(data);\n}\n","import PropTypes from 'prop-types';\nimport {\n Form,\n ModalDialog,\n Dropzone,\n ActionRow,\n Image,\n Card,\n Icon,\n Button,\n IconButton,\n Spinner,\n} from '@openedx/paragon';\nimport { FileUpload as FileUploadIcon } from '@openedx/paragon/icons';\n\nimport useModalDropzone from './useModalDropzone';\nimport messages from './messages';\nimport { UPLOAD_FILE_MAX_SIZE } from '../../constants';\n\nconst ModalDropzone = ({\n fileTypes,\n modalTitle,\n imageHelpText,\n previewComponent,\n imageDropzoneText,\n invalidFileSizeMore,\n isOpen,\n onClose,\n onCancel,\n onChange,\n onSavingStatus,\n onSelectFile,\n maxSize = UPLOAD_FILE_MAX_SIZE,\n}) => {\n const {\n intl,\n accept,\n previewUrl,\n uploadProgress,\n disabledUploadBtn,\n imageValidator,\n handleUpload,\n handleCancel,\n handleSelectFile,\n } = useModalDropzone({\n onChange, onCancel, onClose, fileTypes, onSavingStatus, onSelectFile,\n });\n\n const invalidSizeMore = invalidFileSizeMore || intl.formatMessage(\n messages.uploadImageDropzoneInvalidSizeMore,\n { maxSize: maxSize / (1000 * 1000) },\n );\n\n const inputComponent = previewUrl ? (\n
\n {previewComponent || (\n \n )}\n
\n ) : (\n <>\n \n

{imageDropzoneText || intl.formatMessage(messages.uploadImageDropzoneText)}

\n

{imageHelpText}

\n \n );\n\n return (\n \n \n \n {modalTitle}\n \n \n \n \n \n \n {uploadProgress > 0 ? (\n \n ) : (\n \n )}\n \n \n \n \n \n \n \n {intl.formatMessage(messages.cancelModal)}\n \n \n \n \n \n );\n};\n\nModalDropzone.defaultProps = {\n imageHelpText: '',\n previewComponent: null,\n imageDropzoneText: '',\n maxSize: UPLOAD_FILE_MAX_SIZE,\n invalidFileSizeMore: '',\n onSelectFile: null,\n};\n\nModalDropzone.propTypes = {\n imageHelpText: PropTypes.string,\n previewComponent: PropTypes.element,\n imageDropzoneText: PropTypes.string,\n modalTitle: PropTypes.string.isRequired,\n fileTypes: PropTypes.arrayOf(PropTypes.string).isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onSavingStatus: PropTypes.func.isRequired,\n maxSize: PropTypes.number,\n invalidFileSizeMore: PropTypes.string,\n onSelectFile: PropTypes.func,\n};\n\nexport default ModalDropzone;\n","const descriptions = {\n tabTitleLabel: {\n id: 'course-authoring.textbooks.form.tab-title.label',\n defaultMessage: 'Textbook name',\n description: 'Label for the textbook name field in the form',\n },\n tabTitlePlaceholder: {\n id: 'course-authoring.textbooks.form.tab-title.placeholder',\n defaultMessage: 'Introduction to Cookie Baking',\n description: 'Placeholder text for the textbook name field in the form',\n },\n tabTitleHelperText: {\n id: 'course-authoring.textbooks.form.tab-title.helper-text',\n defaultMessage: 'provide the title/name of the textbook as you would like your students to see it',\n description: 'Helper text for the textbook name field in the form',\n },\n tabTitleValidationText: {\n id: 'course-authoring.textbooks.form.tab-title.validation-text',\n defaultMessage: 'Textbook name is required',\n description: 'Validation error message for the textbook name field in the form',\n },\n chapterTitleLabel: {\n id: 'course-authoring.textbooks.form.chapter.title.label',\n defaultMessage: 'Chapter name',\n description: 'Label for the chapter name field in the form',\n },\n chapterTitlePlaceholder: {\n id: 'course-authoring.textbooks.form.chapter.title.placeholder',\n defaultMessage: 'Chapter {value}',\n description: 'Placeholder text for the chapter name field in the form',\n },\n chapterTitleHelperText: {\n id: 'course-authoring.textbooks.form.chapter.title.helper-text',\n defaultMessage: 'provide the title/name of the chapter that will be used in navigating',\n description: 'Helper text for the chapter name field in the form',\n },\n chapterTitleValidationText: {\n id: 'course-authoring.textbooks.form.chapter.title.validation-text',\n defaultMessage: 'Chapter name is required',\n description: 'Validation error message for the chapter name field in the form',\n },\n chapterUrlLabel: {\n id: 'course-authoring.textbooks.form.chapter.url.label',\n defaultMessage: 'Chapter asset',\n description: 'Label for the chapter asset field in the form',\n },\n chapterUrlPlaceholder: {\n id: 'course-authoring.textbooks.form.chapter.url.placeholder',\n defaultMessage: 'path/to/introductionToCookieBaking-CH1.pdf',\n description: 'Placeholder text for the chapter asset field in the form',\n },\n chapterUrlHelperText: {\n id: 'course-authoring.textbooks.form.chapter.url.helper-text',\n defaultMessage: 'upload a PDF file or provide the path to a Studio asset file',\n description: 'Helper text for the chapter asset field in the form',\n },\n chapterUrlValidationText: {\n id: 'course-authoring.textbooks.form.chapter.url.validation-text',\n defaultMessage: 'Chapter asset is required',\n description: 'Validation error message for the chapter asset field in the form',\n },\n addChapterHelperText: {\n id: 'course-authoring.textbooks.form.add-chapter.helper-text',\n defaultMessage: 'Please add at least one chapter',\n description: 'Helper text for adding a new chapter in the form',\n },\n addChapterButton: {\n id: 'course-authoring.textbooks.form.add-chapter.button',\n defaultMessage: 'Add a chapter',\n description: 'Text for the button to add a new chapter in the form',\n },\n uploadButtonTooltip: {\n id: 'course-authoring.textbooks.form.upload-button.tooltip',\n defaultMessage: 'Upload',\n description: 'Tooltip text for the upload button in the form',\n },\n uploadButtonAlt: {\n id: 'course-authoring.textbooks.form.upload-button.alt',\n defaultMessage: 'chapter-upload-button',\n description: 'Alt text for the upload button in the form',\n },\n deleteButtonTooltip: {\n id: 'course-authoring.textbooks.form.delete-button.tooltip',\n defaultMessage: 'Delete',\n description: 'Tooltip text for the delete button in the form',\n },\n deleteButtonAlt: {\n id: 'course-authoring.textbooks.form.delete-button.alt',\n defaultMessage: 'chapter-delete-button',\n description: 'Alt text for the delete button in the form',\n },\n cancelButton: {\n id: 'course-authoring.textbooks.form.button.cancel',\n defaultMessage: 'Cancel',\n description: 'Text for the cancel button in the form',\n },\n saveButton: {\n id: 'course-authoring.textbooks.form.button.save',\n defaultMessage: 'Save',\n description: 'Text for the save button in the form',\n },\n uploadModalTitle: {\n id: 'course-authoring.textbooks.form.upload-modal.title',\n defaultMessage: 'Upload a new PDF to “{courseName}”',\n description: 'Title for the upload modal in the form',\n },\n uploadModalDropzoneText: {\n id: 'course-authoring.textbooks.form.upload-modal.dropzone-text',\n defaultMessage: 'Drag and drop your PDF file here or click to upload',\n description: 'Text for the dropzone in the upload modal',\n },\n uploadModalHelperText: {\n id: 'course-authoring.textbooks.form.upload-modal.help-text',\n defaultMessage: 'File must be in PDF format',\n description: 'Helper text for the upload modal',\n },\n uploadModalFileInvalidSizeText: {\n id: 'course-authoring.textbooks.form.upload-modal.file-size-invalid-text',\n defaultMessage: 'File size must be less than {maxSize}MB.',\n description: 'Error message for invalid file size in the upload modal',\n },\n};\n\nexport default descriptions;\n","import * as Yup from 'yup';\n\nimport messages from './messages';\n\nconst textbookFormValidationSchema = (intl) => Yup.object().shape({\n tab_title: Yup.string().required(intl.formatMessage(messages.tabTitleValidationText)).max(255),\n chapters: Yup.array().of(\n Yup.object({\n title: Yup.string().required((intl.formatMessage(messages.chapterTitleValidationText))).max(255),\n url: Yup.string().required(intl.formatMessage(messages.chapterUrlValidationText)).max(255),\n }),\n ).min(1),\n});\n\nexport default textbookFormValidationSchema;\n","import { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { FieldArray, Formik } from 'formik';\nimport {\n PictureAsPdf as PdfIcon,\n Add as AddIcon,\n DeleteOutline as DeleteIcon,\n Upload as UploadIcon,\n} from '@openedx/paragon/icons';\nimport {\n ActionRow,\n Button,\n Form,\n Icon,\n IconButtonWithTooltip,\n useToggle,\n} from '@openedx/paragon';\n\nimport FormikControl from '../../generic/FormikControl';\nimport PromptIfDirty from '../../generic/promptIfDirty/PromptIfDirty';\nimport ModalDropzone from '../../generic/modal-dropzone/ModalDropzone';\nimport { useModel } from '../../generic/model-store';\nimport { UPLOAD_FILE_MAX_SIZE } from '../../constants';\nimport textbookFormValidationSchema from './validations';\nimport messages from './messages';\n\nconst TextbookForm = ({\n closeTextbookForm,\n initialFormValues,\n onSubmit,\n onSavingStatus,\n courseId,\n}) => {\n const intl = useIntl();\n\n const courseDetail = useModel('courseDetails', courseId);\n const courseTitle = courseDetail ? courseDetail?.name : '';\n\n const [currentTextbookIndex, setCurrentTextbookIndex] = useState(0);\n const [isUploadModalOpen, openUploadModal, closeUploadModal] = useToggle(false);\n const [selectedFile, setSelectedFile] = useState('');\n\n const onCloseUploadModal = () => {\n closeUploadModal();\n setSelectedFile('');\n };\n\n const onUploadButtonClick = (index) => {\n setCurrentTextbookIndex(index);\n openUploadModal();\n };\n\n return (\n
\n \n {({\n values, handleSubmit, isValid, dirty, setFieldValue,\n }) => (\n <>\n \n \n {intl.formatMessage(messages.tabTitleLabel)} *\n \n \n \n {intl.formatMessage(messages.tabTitleHelperText)}\n \n \n (\n <>\n {!!values?.chapters.length && values.chapters.map(({ title, url }, index) => (\n
\n \n \n {intl.formatMessage(messages.chapterTitleLabel)} *\n \n \n \n {intl.formatMessage(messages.chapterTitleHelperText)}\n \n \n \n
\n \n {intl.formatMessage(messages.chapterUrlLabel)} *\n \n onUploadButtonClick(index)}\n />\n arrayHelpers.remove(index)}\n />\n
\n \n \n {intl.formatMessage(messages.chapterUrlHelperText)}\n \n
\n
\n ))}\n
\n {!values.chapters.length && (\n \n {intl.formatMessage(messages.addChapterHelperText)}\n \n )}\n arrayHelpers.push({ title: '', url: '' })}\n >\n {intl.formatMessage(messages.addChapterButton)}\n \n
\n \n )}\n />\n \n \n \n \n setFieldValue(`chapters[${currentTextbookIndex}].url`, value)}\n fileTypes={['pdf']}\n modalTitle={intl.formatMessage(messages.uploadModalTitle, { courseName: courseTitle })}\n imageDropzoneText={intl.formatMessage(messages.uploadModalDropzoneText)}\n imageHelpText={intl.formatMessage(messages.uploadModalHelperText)}\n onSavingStatus={onSavingStatus}\n invalidFileSizeMore={intl.formatMessage(\n messages.uploadModalFileInvalidSizeText,\n { maxSize: UPLOAD_FILE_MAX_SIZE / (1000 * 1000) },\n )}\n onSelectFile={setSelectedFile}\n previewComponent={(\n
\n \n {selectedFile}\n
\n )}\n maxSize={UPLOAD_FILE_MAX_SIZE}\n />\n \n \n )}\n \n
\n );\n};\n\nTextbookForm.propTypes = {\n closeTextbookForm: PropTypes.func.isRequired,\n initialFormValues: PropTypes.shape({}).isRequired,\n onSubmit: PropTypes.func.isRequired,\n onSavingStatus: PropTypes.func.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default TextbookForm;\n","/**\n * Get textbook form initial values\n * @param {boolean} isEditForm - edit or add new form value\n * @param {object} textbook - value from api\n * @returns {object}\n */\nconst getTextbookFormInitialValues = (isEditForm = false, textbook = {}) => (isEditForm\n ? textbook\n : {\n tab_title: '',\n chapters: [\n {\n title: '',\n url: '',\n },\n ],\n });\n\nexport {\n // eslint-disable-next-line import/prefer-default-export\n getTextbookFormInitialValues,\n};\n","const descriptions = {\n chaptersTitle: {\n id: 'course-authoring.textbooks.chapters.title',\n defaultMessage: '{count} PDF chapters',\n description: 'Title for the list of PDF chapters',\n },\n buttonView: {\n id: 'course-authoring.textbooks.button.view',\n defaultMessage: 'View the PDF live',\n description: 'Text for the button to view the PDF live',\n },\n buttonViewAlt: {\n id: 'course-authoring.textbooks.button.view.alt',\n defaultMessage: 'textbook-view-button',\n description: 'Alt text for the view button',\n },\n buttonEdit: {\n id: 'course-authoring.textbooks.button.edit',\n defaultMessage: 'Edit',\n description: 'Text for the edit button',\n },\n buttonEditAlt: {\n id: 'course-authoring.textbooks.button.edit.alt',\n defaultMessage: 'textbook-edit-button',\n description: 'Alt text for the edit button',\n },\n buttonDelete: {\n id: 'course-authoring.textbooks.button.delete',\n defaultMessage: 'Delete',\n description: 'Text for the delete button',\n },\n buttonDeleteAlt: {\n id: 'course-authoring.textbooks.button.delete.alt',\n defaultMessage: 'textbook-delete-button',\n description: 'Alt text for the delete button',\n },\n deleteModalTitle: {\n id: 'course-authoring.textbooks.form.delete-modal.title',\n defaultMessage: 'Delete “{textbookTitle}”?',\n description: 'Title for the delete modal',\n },\n deleteModalDescription: {\n id: 'course-authoring.textbooks.form.delete-modal.description',\n defaultMessage: 'Deleting a textbook cannot be undone and once deleted any reference to it in your courseware\\'s navigation will also be removed.',\n description: 'Description for the delete modal',\n },\n};\n\nexport default descriptions;\n","import PropTypes from 'prop-types';\nimport { useContext, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n Card,\n Collapsible,\n Icon,\n IconButtonWithTooltip,\n useToggle,\n} from '@openedx/paragon';\nimport {\n EditOutline as EditIcon,\n RemoveRedEye as ViewIcon,\n DeleteOutline as DeleteIcon,\n} from '@openedx/paragon/icons';\nimport { AppContext } from '@edx/frontend-platform/react';\n\nimport DeleteModal from '../../generic/delete-modal/DeleteModal';\nimport { RequestStatus } from '../../data/constants';\nimport { getCurrentTextbookId, getSavingStatus } from '../data/selectors';\nimport TextbookForm from '../textbook-form/TextbookForm';\nimport { getTextbookFormInitialValues } from '../utils';\nimport messages from './messages';\n\nconst TextbookCard = ({\n textbook,\n courseId,\n handleSavingStatusDispatch,\n onEditSubmit,\n onDeleteSubmit,\n textbookIndex,\n}) => {\n const intl = useIntl();\n const { config } = useContext(AppContext);\n\n const savingStatus = useSelector(getSavingStatus);\n const currentTextbookId = useSelector(getCurrentTextbookId);\n\n const [isTextbookFormOpen, openTextbookForm, closeTextbookForm] = useToggle(false);\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useToggle(false);\n\n const { tabTitle, chapters, id } = textbook;\n\n const onPreviewTextbookClick = () => {\n window.open(`${config.LMS_BASE_URL}/courses/${courseId}/pdfbook/${textbookIndex}/`, '_blank');\n };\n\n const handleDeleteButtonSubmit = () => {\n closeDeleteModal();\n onDeleteSubmit(id);\n };\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL && currentTextbookId === id) {\n closeTextbookForm();\n }\n }, [savingStatus, currentTextbookId]);\n\n return (\n <>\n {isTextbookFormOpen ? (\n \n ) : (\n (\n \n \n \n \n \n \n )}\n />\n
\n \n {chapters.map(({ title, url }) => (\n
\n {title}\n {url}\n
\n ))}\n \n
\n
\n )\n )}\n \n \n );\n};\n\nTextbookCard.propTypes = {\n textbook: PropTypes.shape({\n tabTitle: PropTypes.string.isRequired,\n chapters: PropTypes.arrayOf(PropTypes.shape({\n title: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n })).isRequired,\n id: PropTypes.string.isRequired,\n }).isRequired,\n courseId: PropTypes.string.isRequired,\n handleSavingStatusDispatch: PropTypes.func.isRequired,\n onEditSubmit: PropTypes.func.isRequired,\n onDeleteSubmit: PropTypes.func.isRequired,\n textbookIndex: PropTypes.string.isRequired,\n};\n\nexport default TextbookCard;\n","// eslint-disable-next-line import/prefer-default-export\nexport const otherLinkURLParams = {\n scheduleAndDetails: 'settings/details',\n grading: 'settings/grading',\n courseTeam: 'course_team',\n advancedSettings: 'settings/advanced',\n groupConfigurations: 'group_configurations',\n proctoredExamSettings: 'proctored-exam-settings',\n studioHome: 'home',\n};\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n sidebarTitleOther: {\n id: 'course-authoring.help-sidebar.other.title',\n defaultMessage: 'Other course settings',\n },\n sidebarLinkToScheduleAndDetails: {\n id: 'course-authoring.help-sidebar.links.schedule-and-details',\n defaultMessage: 'Schedule & details',\n description: 'Link to Studio Schedule & Details page',\n },\n sidebarLinkToGrading: {\n id: 'course-authoring.help-sidebar.links.grading',\n defaultMessage: 'Grading',\n description: 'Link to Studio Grading page',\n },\n sidebarLinkToCourseTeam: {\n id: 'course-authoring.help-sidebar.links.course-team',\n defaultMessage: 'Course team',\n description: 'Link to Studio Course Team page',\n },\n sidebarLinkToGroupConfigurations: {\n id: 'course-authoring.help-sidebar.links.group-configurations',\n defaultMessage: 'Group configurations',\n description: 'Link to Studio Group Configurations page',\n },\n sidebarLinkToProctoredExamSettings: {\n id: 'course-authoring.help-sidebar.links.proctored-exam-settings',\n defaultMessage: 'Proctored exam settings',\n description: 'Link to Proctored exam settings page',\n },\n sidebarLinkToAdvancedSettings: {\n id: 'course-authoring.help-sidebar.links.advanced-settings',\n defaultMessage: 'Advanced settings',\n description: 'Link to Advanced Settings',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Hyperlink } from '@openedx/paragon';\n\nconst HelpSidebarLink = ({ as, pathToPage, title }) => {\n const TagElement = as;\n return (\n \n \n {title}\n \n \n );\n};\n\nHelpSidebarLink.propTypes = {\n pathToPage: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n as: PropTypes.string,\n};\n\nHelpSidebarLink.defaultProps = {\n as: 'li',\n};\n\nexport default HelpSidebarLink;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useLocation } from 'react-router-dom';\nimport classNames from 'classnames';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport { otherLinkURLParams } from './constants';\nimport messages from './messages';\nimport HelpSidebarLink from './HelpSidebarLink';\n\nconst HelpSidebar = ({\n intl,\n courseId,\n showOtherSettings,\n proctoredExamSettingsUrl,\n children,\n className,\n}) => {\n const { pathname } = useLocation();\n const {\n grading,\n courseTeam,\n advancedSettings,\n scheduleAndDetails,\n groupConfigurations,\n } = otherLinkURLParams;\n\n const showOtherLink = (params) => !pathname.includes(params);\n const generateLegacyURL = (urlParameter) => {\n const referObj = new URL(`${urlParameter}/${courseId}`, getConfig().STUDIO_BASE_URL);\n return referObj.href;\n };\n\n const scheduleAndDetailsDestination = generateLegacyURL(scheduleAndDetails);\n const gradingDestination = generateLegacyURL(grading);\n const courseTeamDestination = generateLegacyURL(courseTeam);\n const advancedSettingsDestination = generateLegacyURL(advancedSettings);\n const groupConfigurationsDestination = generateLegacyURL(groupConfigurations);\n\n return (\n \n );\n};\n\nHelpSidebar.defaultProps = {\n proctoredExamSettingsUrl: '',\n className: undefined,\n courseId: undefined,\n showOtherSettings: false,\n};\n\nHelpSidebar.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string,\n showOtherSettings: PropTypes.bool,\n proctoredExamSettingsUrl: PropTypes.string,\n children: PropTypes.node.isRequired,\n className: PropTypes.string,\n};\n\nexport default injectIntl(HelpSidebar);\n","const descriptions = {\n section_1_title: {\n id: 'course-authoring.textbooks.sidebar.section-1.title',\n defaultMessage: 'Why should I break my textbook into chapters?',\n description: 'Title for section 1 in the textbooks sidebar',\n },\n section_1_descriptions: {\n id: 'course-authoring.textbooks.sidebar.section-1.descriptions',\n defaultMessage: 'Breaking your textbook into multiple chapters reduces loading times for students, especially those with slow Internet connections. Breaking up textbooks into chapters can also help students more easily find topic-based information.',\n description: 'Description for section 1 in the textbooks sidebar',\n },\n section_2_title: {\n id: 'course-authoring.textbooks.sidebar.section-2.title',\n defaultMessage: 'What if my book isn\\'t divided into chapters?',\n description: 'Title for section 2 in the textbooks sidebar',\n },\n section_2_descriptions: {\n id: 'course-authoring.textbooks.sidebar.section-2.descriptions',\n defaultMessage: 'If your textbook doesn\\'t have individual chapters, you can upload the entire text as a single chapter and enter a name of your choice in the Chapter Name field.',\n description: 'Description for section 2 in the textbooks sidebar',\n },\n sectionLink: {\n id: 'course-authoring.textbooks.sidebar.section-link',\n defaultMessage: 'Learn more',\n description: 'Text for the link to learn more in the textbooks sidebar',\n },\n};\n\nexport default descriptions;\n","import { RequestStatus } from '../../data/constants';\n\nimport { getHelpUrls } from './api';\nimport { updateLoadingHelpUrlsStatus, updatePages } from './slice';\n\n/* eslint-disable import/prefer-default-export */\nexport function fetchHelpUrls() {\n return async (dispatch) => {\n dispatch(updateLoadingHelpUrlsStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const urls = await getHelpUrls();\n\n dispatch(updatePages(urls));\n\n dispatch(updateLoadingHelpUrlsStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateLoadingHelpUrlsStatus({ status: RequestStatus.FAILED }));\n\n return false;\n }\n };\n}\n","/* eslint-disable import/prefer-default-export */\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nexport const getHelpUrlsApiUrl = () => `${getConfig().STUDIO_BASE_URL}/api/contentstore/v1/help_urls`;\n\nexport async function getHelpUrls() {\n const { data } = await getAuthenticatedHttpClient()\n .get(getHelpUrlsApiUrl());\n return camelCaseObject(data);\n}\n","export const selectHelpUrlsByNames = (names) => (state) => {\n const urlsDictionary = {};\n\n names.forEach(name => {\n urlsDictionary[name] = state.helpUrls.pages[name] || null;\n });\n\n return urlsDictionary;\n};\n\nexport const getPages = (state) => state.helpUrls.pages;\n\nexport const getLoadingHelpUrlsStatus = (state) => state.helpUrls.loadingHelpUrlsStatus;\n","import { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { isEmpty } from 'lodash';\n\nimport { fetchHelpUrls } from './data/thunks';\nimport { getPages, selectHelpUrlsByNames } from './data/selectors';\n\nconst useHelpUrls = (tokenNames) => {\n const dispatch = useDispatch();\n const helpTokens = useSelector(selectHelpUrlsByNames(tokenNames));\n const pages = useSelector(getPages);\n\n useEffect(() => {\n if (isEmpty(pages)) {\n dispatch(fetchHelpUrls());\n }\n }, []);\n\n return helpTokens;\n};\n/* eslint-disable-next-line import/prefer-default-export */\nexport { useHelpUrls };\n","import React from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\n\nimport { Hyperlink } from '@openedx/paragon';\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport messages from './messages';\nimport { useHelpUrls } from '../../help-urls/hooks';\n\nconst TextbookSidebar = ({ courseId }) => {\n const intl = useIntl();\n const { textbooks: textbookUrl } = useHelpUrls(['textbooks']);\n\n return (\n \n

\n {intl.formatMessage(messages.section_1_title)}\n

\n

\n {intl.formatMessage(messages.section_1_descriptions)}\n

\n
\n

\n {intl.formatMessage(messages.section_2_title)}\n

\n

\n {intl.formatMessage(messages.section_2_descriptions)}\n

\n \n {intl.formatMessage(messages.sectionLink)}\n \n
\n );\n};\n\nTextbookSidebar.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default TextbookSidebar;\n","import { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\nimport { omit } from 'lodash';\n\nconst API_PATH_PATTERN = 'textbooks';\nconst getStudioBaseUrl = () => getConfig().STUDIO_BASE_URL;\n\nexport const getTextbooksApiUrl = (courseId) => `${getStudioBaseUrl()}/api/contentstore/v1/${API_PATH_PATTERN}/${courseId}`;\nexport const getUpdateTextbooksApiUrl = (courseId) => `${getStudioBaseUrl()}/${API_PATH_PATTERN}/${courseId}`;\nexport const getEditTextbooksApiUrl = (courseId, textbookId) => `${getStudioBaseUrl()}/${API_PATH_PATTERN}/${courseId}/${textbookId}`;\n\n/**\n * Get textbooks for course.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getTextbooks(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getTextbooksApiUrl(courseId));\n\n return camelCaseObject(data);\n}\n\n/**\n * Create new textbook for course.\n * @param {string} courseId\n * @param {tab_title: string, chapters: Array<[title: string: url: string]>} textbook\n * @returns {Promise}\n */\nexport async function createTextbook(courseId, textbook) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getUpdateTextbooksApiUrl(courseId), textbook);\n\n return camelCaseObject(data);\n}\n\n/**\n * Edit textbook for course.\n * @param {string} courseId\n * @param {tab_title: string, id: string, chapters: Array<[title: string: url: string]>} textbook\n * @param {string} textbookId\n * @returns {Promise}\n */\nexport async function editTextbook(courseId, textbook) {\n const { data } = await getAuthenticatedHttpClient()\n .put(getEditTextbooksApiUrl(courseId, textbook.id), omit(textbook, ['id']));\n\n return camelCaseObject(data);\n}\n\n/**\n * Edit textbook for course.\n * @param {string} courseId\n * @param {string} textbookId\n * @returns {Promise}\n */\nexport async function deleteTextbook(courseId, textbookId) {\n const { data } = await getAuthenticatedHttpClient()\n .delete(getEditTextbooksApiUrl(courseId, textbookId));\n\n return camelCaseObject(data);\n}\n","import {\n hideProcessingNotification,\n showProcessingNotification,\n} from '../../generic/processing-notification/data/slice';\nimport { handleResponseErrors } from '../../generic/saving-error-alert';\nimport { RequestStatus } from '../../data/constants';\nimport { NOTIFICATION_MESSAGES } from '../../constants';\nimport {\n fetchTextbooks,\n updateLoadingStatus,\n updateSavingStatus,\n createTextbookSuccess,\n editTextbookSuccess,\n deleteTextbookSuccess,\n} from './slice';\nimport {\n getTextbooks,\n createTextbook,\n editTextbook,\n deleteTextbook,\n} from './api';\n\nexport function fetchTextbooksQuery(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const { textbooks } = await getTextbooks(courseId);\n dispatch(fetchTextbooks({ textbooks }));\n dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function createTextbookQuery(courseId, textbook) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n const data = await createTextbook(courseId, textbook);\n dispatch(createTextbookSuccess(data));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n handleResponseErrors(error, dispatch, updateSavingStatus);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function editTextbookQuery(courseId, textbook) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n const data = await editTextbook(courseId, textbook);\n dispatch(editTextbookSuccess(data));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n handleResponseErrors(error, dispatch, updateSavingStatus);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function deleteTextbookQuery(courseId, textbookId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.deleting));\n\n try {\n await deleteTextbook(courseId, textbookId);\n dispatch(deleteTextbookSuccess(textbookId));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n handleResponseErrors(error, dispatch, updateSavingStatus);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n","const descriptions = {\n headingTitle: {\n id: 'course-authoring.textbooks.header.title',\n defaultMessage: 'Textbooks',\n description: 'Title for the textbooks section',\n },\n breadcrumbContent: {\n id: 'course-authoring.textbooks.header.breadcrumb.content',\n defaultMessage: 'Content',\n description: 'Breadcrumb for content',\n },\n breadcrumbPagesAndResources: {\n id: 'course-authoring.textbooks.header.breadcrumb.pages-and-resources',\n defaultMessage: 'Pages & resources',\n description: 'Breadcrumb for pages and resources',\n },\n breadcrumbAriaLabel: {\n id: 'course-authoring.textbooks.header.breadcrumb.aria-label',\n defaultMessage: 'Textbook breadcrumb',\n description: 'Aria label for the textbook breadcrumb',\n },\n newTextbookButton: {\n id: 'course-authoring.textbooks.header.new-textbook',\n defaultMessage: 'New textbook',\n description: 'Text for the button to create a new textbook',\n },\n};\n\nexport default descriptions;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Breadcrumb,\n Button,\n Container,\n Layout,\n Row,\n} from '@openedx/paragon';\nimport { Add as AddIcon } from '@openedx/paragon/icons';\nimport { useSelector } from 'react-redux';\nimport { Helmet } from 'react-helmet';\n\nimport { SavingErrorAlert } from '../generic/saving-error-alert';\nimport { getProcessingNotification } from '../generic/processing-notification/data/selectors';\nimport { useModel } from '../generic/model-store';\nimport { LoadingSpinner } from '../generic/Loading';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport ProcessingNotification from '../generic/processing-notification';\nimport EmptyPlaceholder from './empty-placeholder/EmptyPlaceholder';\nimport TextbookCard from './textbook-card/TextbooksCard';\nimport TextbookSidebar from './textbook-sidebar/TextbookSidebar';\nimport TextbookForm from './textbook-form/TextbookForm';\nimport { useTextbooks } from './hooks';\nimport { getTextbookFormInitialValues } from './utils';\nimport messages from './messages';\n\nconst Textbooks = ({ courseId }) => {\n const intl = useIntl();\n\n const courseDetails = useModel('courseDetails', courseId);\n\n const {\n textbooks,\n isLoading,\n breadcrumbs,\n errorMessage,\n savingStatus,\n isTextbookFormOpen,\n openTextbookForm,\n closeTextbookForm,\n handleTextbookFormSubmit,\n handleSavingStatusDispatch,\n handleTextbookEditFormSubmit,\n handleTextbookDeleteSubmit,\n } = useTextbooks(courseId);\n\n const {\n isShow: showProcessingNotification,\n title: processingNotificationTitle,\n } = useSelector(getProcessingNotification);\n\n if (isLoading) {\n return (\n \n \n \n );\n }\n\n return (\n <>\n \n \n {`${courseDetails?.name} | ${intl.formatMessage(messages.headingTitle)}`}\n \n \n \n
\n \n )}\n headerActions={(\n \n {intl.formatMessage(messages.newTextbookButton)}\n \n )}\n />\n \n \n
\n
\n
\n {textbooks.length ? textbooks.map((textbook, index) => (\n \n )) : (\n !isTextbookFormOpen && \n )}\n {isTextbookFormOpen && (\n \n )}\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n
\n \n
\n \n );\n};\n\nTextbooks.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default Textbooks;\n","import { useDispatch, useSelector } from 'react-redux';\nimport { useContext, useEffect } from 'react';\nimport { AppContext } from '@edx/frontend-platform/react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useToggle } from '@openedx/paragon';\n\nimport { updateSavingStatus } from './data/slice';\nimport { RequestStatus } from '../data/constants';\nimport {\n getTextbooksData,\n getLoadingStatus,\n getSavingStatus,\n getErrorMessage,\n} from './data/selectors';\nimport {\n createTextbookQuery,\n fetchTextbooksQuery,\n editTextbookQuery,\n deleteTextbookQuery,\n} from './data/thunk';\nimport messages from './messages';\n\nconst useTextbooks = (courseId) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const { config } = useContext(AppContext);\n\n const textbooks = useSelector(getTextbooksData);\n const loadingStatus = useSelector(getLoadingStatus);\n const savingStatus = useSelector(getSavingStatus);\n const errorMessage = useSelector(getErrorMessage);\n\n const [isTextbookFormOpen, openTextbookForm, closeTextbookForm] = useToggle(false);\n\n const breadcrumbs = [\n {\n label: intl.formatMessage(messages.breadcrumbContent),\n href: `${config.STUDIO_BASE_URL}/course/${courseId}`,\n },\n {\n label: intl.formatMessage(messages.breadcrumbPagesAndResources),\n href: `/course/${courseId}/pages-and-resources`,\n },\n {\n label: '',\n href: `/course/${courseId}/textbooks`,\n },\n ];\n\n const handleTextbookFormSubmit = (formValues) => {\n dispatch(createTextbookQuery(courseId, formValues));\n };\n\n const handleTextbookEditFormSubmit = (formValues) => {\n dispatch(editTextbookQuery(courseId, formValues));\n };\n\n const handleTextbookDeleteSubmit = (textbookId) => {\n dispatch(deleteTextbookQuery(courseId, textbookId));\n };\n\n const handleSavingStatusDispatch = (status) => {\n if (status.status !== RequestStatus.SUCCESSFUL) {\n dispatch(updateSavingStatus(status));\n }\n };\n\n useEffect(() => {\n dispatch(fetchTextbooksQuery(courseId));\n }, [courseId]);\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n closeTextbookForm();\n }\n }, [savingStatus]);\n\n return {\n isLoading: loadingStatus === RequestStatus.IN_PROGRESS,\n savingStatus,\n errorMessage,\n textbooks,\n breadcrumbs,\n isTextbookFormOpen,\n openTextbookForm,\n closeTextbookForm,\n handleTextbookFormSubmit,\n handleSavingStatusDispatch,\n handleTextbookEditFormSubmit,\n handleTextbookDeleteSubmit,\n };\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { useTextbooks };\n","// @ts-check\nimport { defineMessages as _defineMessages } from '@edx/frontend-platform/i18n';\n\n// frontend-platform currently doesn't provide types... do it ourselves.\nconst defineMessages = /** @type {import('react-intl').defineMessages} */(_defineMessages);\n\nconst messages = defineMessages({\n blockTypeFilter: {\n id: 'course-authoring.course-search.blockTypeFilter',\n defaultMessage: 'Type',\n description: 'Label for the filter that allows limiting results to a specific component type',\n },\n 'blockTypeFilter.empty': {\n id: 'course-authoring.course-search.blockTypeFilter.empty',\n defaultMessage: 'No matching components',\n description: 'Label shown when there are no options available to filter by component type',\n },\n blockTagsFilter: {\n id: 'course-authoring.course-search.blockTagsFilter',\n defaultMessage: 'Tags',\n description: 'Label for the filter that allows finding components with specific tags',\n },\n 'blockTagsFilter.empty': {\n id: 'course-authoring.course-search.blockTagsFilter.empty',\n defaultMessage: 'No tags in current results',\n description: 'Label shown when there are no options available to filter by tags',\n },\n 'blockTagsFilter.error': {\n id: 'course-authoring.course-search.blockTagsFilter.error',\n defaultMessage: 'Error loading tags',\n description: 'Label shown when the tags could not be loaded',\n },\n 'blockTagsFilter.incomplete': {\n id: 'course-authoring.course-search.blockTagsFilter.incomplete',\n defaultMessage: 'Sorry, not all tags could be loaded',\n description: 'Label shown when the system is not able to display all of the available tag options.',\n },\n 'blockType.annotatable': {\n id: 'course-authoring.course-search.blockType.annotatable',\n defaultMessage: 'Annotation',\n description: 'Name of the \"Annotation\" component type in Studio',\n },\n 'blockType.chapter': {\n id: 'course-authoring.course-search.blockType.chapter',\n defaultMessage: 'Section',\n description: 'Name of the \"Section\" course outline level in Studio',\n },\n 'blockType.discussion': {\n id: 'course-authoring.course-search.blockType.discussion',\n defaultMessage: 'Discussion',\n description: 'Name of the \"Discussion\" component type in Studio',\n },\n 'blockType.drag-and-drop-v2': {\n id: 'course-authoring.course-search.blockType.drag-and-drop-v2',\n defaultMessage: 'Drag and Drop',\n description: 'Name of the \"Drag and Drop\" component type in Studio',\n },\n 'blockType.html': {\n id: 'course-authoring.course-search.blockType.html',\n defaultMessage: 'Text',\n description: 'Name of the \"Text\" component type in Studio',\n },\n 'blockType.library_content': {\n id: 'course-authoring.course-search.blockType.library_content',\n defaultMessage: 'Library Content',\n description: 'Name of the \"Library Content\" component type in Studio',\n },\n 'blockType.openassessment': {\n id: 'course-authoring.course-search.blockType.openassessment',\n defaultMessage: 'Open Response Assessment',\n description: 'Name of the \"Open Response Assessment\" component type in Studio',\n },\n 'blockType.problem': {\n id: 'course-authoring.course-search.blockType.problem',\n defaultMessage: 'Problem',\n description: 'Name of the \"Problem\" component type in Studio',\n },\n 'blockType.sequential': {\n id: 'course-authoring.course-search.blockType.sequential',\n defaultMessage: 'Subsection',\n description: 'Name of the \"Subsection\" course outline level in Studio',\n },\n 'blockType.vertical': {\n id: 'course-authoring.course-search.blockType.vertical',\n defaultMessage: 'Unit',\n description: 'Name of the \"Unit\" course outline level in Studio',\n },\n 'blockType.video': {\n id: 'course-authoring.course-search.blockType.video',\n defaultMessage: 'Video',\n description: 'Name of the \"Video\" component type in Studio',\n },\n childTagsExpand: {\n id: 'course-authoring.course-search.child-tags-expand',\n defaultMessage: 'Expand to show child tags of \"{tagName}\"',\n description: 'This text describes the ▼ expand toggle button to non-visual users.',\n },\n childTagsCollapse: {\n id: 'course-authoring.course-search.child-tags-collapse',\n defaultMessage: 'Collapse to hide child tags of \"{tagName}\"',\n description: 'This text describes the ▲ collapse toggle button to non-visual users.',\n },\n clearFilters: {\n id: 'course-authoring.course-search.clearFilters',\n defaultMessage: 'Clear Filters',\n description: 'Label for the button that removes all applied search filters',\n },\n numResults: {\n id: 'course-authoring.course-search.num-results',\n defaultMessage: '{numResults, plural, one {# result} other {# results}} found',\n description: 'This count displays how many matching results were found from the user\\'s search',\n },\n searchAllCourses: {\n id: 'course-authoring.course-search.searchAllCourses',\n defaultMessage: 'All courses',\n description: 'Option to get search results from all courses.',\n },\n searchThisCourse: {\n id: 'course-authoring.course-search.searchThisCourse',\n defaultMessage: 'This course',\n description: 'Option to limit search results to the current course only.',\n },\n title: {\n id: 'course-authoring.course-search.title',\n defaultMessage: 'Search',\n description: 'Title for the course search dialog',\n },\n inputPlaceholder: {\n id: 'course-authoring.course-search.inputPlaceholder',\n defaultMessage: 'Search',\n description: 'Placeholder text shown in the keyword input field when the user has not yet entered a keyword',\n },\n searchTagsByKeywordPlaceholder: {\n id: 'course-authoring.course-search.searchTagsByKeywordPlaceholder',\n defaultMessage: 'Search tags',\n description: 'Placeholder text shown in the input field that allows searching through the available tags',\n },\n submitSearchTagsByKeyword: {\n id: 'course-authoring.course-search.submitSearchTagsByKeyword',\n defaultMessage: 'Submit tag keyword search',\n description: 'Text shown to screen reader users for the search button on the tags keyword search',\n },\n showMore: {\n id: 'course-authoring.course-search.showMore',\n defaultMessage: 'Show more',\n description: 'Show more tags / filter options',\n },\n showMoreResults: {\n id: 'course-authoring.course-search.showMoreResults',\n defaultMessage: 'Show more results',\n description: 'Show more results - a button to add to the list of results by loading more from the server',\n },\n loadingMoreResults: {\n id: 'course-authoring.course-search.loadingMoreResults',\n defaultMessage: 'Loading more results',\n description: 'Loading more results - the button displays this message while more results are loading',\n },\n emptySearchTitle: {\n id: 'course-authoring.course-search.emptySearchTitle',\n defaultMessage: 'Start searching to find content',\n description: 'Title shown when the user has not yet entered a keyword',\n },\n emptySearchSubtitle: {\n id: 'course-authoring.course-search.emptySearchSubtitle',\n defaultMessage: 'Find sections, subsections, units and components',\n description: 'Subtitle shown when the user has not yet entered a keyword',\n },\n noResultsTitle: {\n id: 'course-authoring.course-search.noResultsTitle',\n defaultMessage: 'We didn\\'t find anything matching your search',\n description: 'Title shown when the search returned no results',\n },\n noResultsSubtitle: {\n id: 'course-authoring.course-search.noResultsSubtitle',\n defaultMessage: 'Please try a different search term or filter',\n description: 'Subtitle shown when the search returned no results',\n },\n openInNewWindow: {\n id: 'course-authoring.course-search.openInNewWindow',\n defaultMessage: 'Open in new window',\n description: 'Alt text for the button that opens the search result in a new window',\n },\n searchError: {\n id: 'course-authoring.course-search.searchError',\n defaultMessage: 'An error occurred. Unable to load search results.',\n description: 'Error message shown when search is not working.',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nexport const getContentSearchConfigUrl = () => new URL(\n 'api/content_search/v2/studio/',\n getConfig().STUDIO_BASE_URL,\n).href;\n\n/** The separator used for hierarchical tags in the search index, e.g. tags.level1 = \"Subject > Math > Calculus\" */\nexport const TAG_SEP = ' > ';\n\nexport const highlightPreTag = '__meili-highlight__'; // Indicate the start of a highlighted (matching) term\nexport const highlightPostTag = '__/meili-highlight__'; // Indicate the end of a highlighted (matching) term\n\n/**\n * Get the content search configuration from the CMS.\n *\n * @returns {Promise<{url: string, indexName: string, apiKey: string}>}\n */\nexport const getContentSearchConfig = async () => {\n const url = getContentSearchConfigUrl();\n const response = await getAuthenticatedHttpClient().get(url);\n return {\n url: response.data.url,\n indexName: response.data.index_name,\n apiKey: response.data.api_key,\n };\n};\n\n/**\n * Detailed \"content\" of an XBlock/component, from the block's index_dictionary function. Contents depends on the type.\n * @typedef {{htmlContent?: string, capaContent?: string, [k: string]: any}} ContentDetails\n */\n\n/**\n * Meilisearch filters can be expressed as strings or arrays.\n * This helper method converts from any supported input format to an array, for consistency.\n * @param {import('meilisearch').Filter} [filter] A filter expression, e.g. 'foo = bar' or [['a = b', 'a = c'], 'd = e']\n * @returns {(string | string[])[]}\n */\nfunction forceArray(filter) {\n if (typeof filter === 'string') {\n return [filter];\n }\n if (filter === undefined) {\n return [];\n }\n return filter;\n}\n\n/**\n * Given tag paths like [\"Difficulty > Hard\", \"Subject > Math\"], convert them to an array of Meilisearch\n * filter conditions. The tag filters are all AND conditions (not OR).\n * @param {string[]} [tagsFilter] e.g. [\"Difficulty > Hard\", \"Subject > Math\"]\n * @returns {string[]}\n */\nfunction formatTagsFilter(tagsFilter) {\n /** @type {string[]} */\n const filters = [];\n\n tagsFilter?.forEach((tagPath) => {\n const parts = tagPath.split(TAG_SEP);\n if (parts.length === 1) {\n filters.push(`tags.taxonomy = \"${tagPath}\"`);\n } else {\n filters.push(`tags.level${parts.length - 2} = \"${tagPath}\"`);\n }\n });\n\n return filters;\n}\n\n/**\n * Information about a single XBlock returned in the search results\n * Defined in edx-platform/openedx/core/djangoapps/content/search/documents.py\n * @typedef {Object} ContentHit\n * @property {string} id\n * @property {string} usageKey\n * @property {\"course_block\"|\"library_block\"} type\n * @property {string} blockId\n * @property {string} displayName\n * @property {string} blockType The block_type part of the usage key. What type of XBlock this is.\n * @property {string} contextKey The course or library ID\n * @property {string} org\n * @property {[{displayName: string}, ...Array<{displayName: string, usageKey: string}>]} breadcrumbs\n * First one is the name of the course/library itself.\n * After that is the name and usage key of any parent Section/Subsection/Unit/etc.\n * @property {Record<'taxonomy'|'level0'|'level1'|'level2'|'level3', string[]>} tags\n * @property {ContentDetails} [content]\n * @property {{displayName: string, content: ContentDetails}} formatted Same fields with ... highlights\n */\n\n/**\n * Convert search hits to camelCase\n * @param {Record} hit A search result directly from Meilisearch\n * @returns {ContentHit}\n */\nfunction formatSearchHit(hit) {\n const { _formatted, ...newHit } = hit;\n newHit.formatted = {\n displayName: _formatted.display_name,\n content: _formatted.content ?? {},\n };\n return camelCaseObject(newHit);\n}\n\n/**\n * @param {{\n * client: import('meilisearch').MeiliSearch,\n * indexName: string,\n * searchKeywords: string,\n * blockTypesFilter?: string[],\n * tagsFilter?: string[],\n * extraFilter?: import('meilisearch').Filter,\n * offset?: number,\n * }} context\n * @returns {Promise<{\n * hits: ContentHit[],\n * nextOffset: number|undefined,\n * totalHits: number,\n * blockTypes: Record,\n * }>}\n */\nexport async function fetchSearchResults({\n client,\n indexName,\n searchKeywords,\n blockTypesFilter,\n /** The full path of tags that each result MUST have, e.g. [\"Difficulty > Hard\", \"Subject > Math\"] */\n tagsFilter,\n extraFilter,\n /** How many results to skip, e.g. if limit=20 then passing offset=20 gets the second page. */\n offset = 0,\n}) {\n /** @type {import('meilisearch').MultiSearchQuery[]} */\n const queries = [];\n\n // Convert 'extraFilter' into an array\n const extraFilterFormatted = forceArray(extraFilter);\n\n const blockTypesFilterFormatted = blockTypesFilter?.length ? [blockTypesFilter.map(bt => `block_type = ${bt}`)] : [];\n\n const tagsFilterFormatted = formatTagsFilter(tagsFilter);\n\n const limit = 20; // How many results to retrieve per page.\n\n // First query is always to get the hits, with all the filters applied.\n queries.push({\n indexUid: indexName,\n q: searchKeywords,\n filter: [\n // top-level entries in the array are AND conditions and must all match\n // Inner arrays are OR conditions, where only one needs to match.\n ...extraFilterFormatted,\n ...blockTypesFilterFormatted,\n ...tagsFilterFormatted,\n ],\n attributesToHighlight: ['display_name', 'content'],\n highlightPreTag,\n highlightPostTag,\n attributesToCrop: ['content'],\n cropLength: 20,\n offset,\n limit,\n });\n\n // The second query is to get the possible values for the \"block types\" filter\n queries.push({\n indexUid: indexName,\n q: searchKeywords,\n facets: ['block_type'],\n filter: [\n ...extraFilterFormatted,\n // We exclude the block type filter here so we get all the other available options for it.\n ...tagsFilterFormatted,\n ],\n limit: 0, // We don't need any \"hits\" for this - just the facetDistribution\n });\n\n const { results } = await client.multiSearch(({ queries }));\n return {\n hits: results[0].hits.map(formatSearchHit),\n totalHits: results[0].totalHits ?? results[0].estimatedTotalHits ?? results[0].hits.length,\n blockTypes: results[1].facetDistribution?.block_type ?? {},\n nextOffset: results[0].hits.length === limit ? offset + limit : undefined,\n };\n}\n\n/**\n * In the context of a particular search (which may already be filtered to a specific course, specific block types,\n * and/or have a keyword search applied), get the tree of tags that can be used to further filter/refine the search.\n *\n * @param {object} context\n * @param {import('meilisearch').MeiliSearch} context.client The Meilisearch client instance\n * @param {string} context.indexName Which index to search\n * @param {string} context.searchKeywords Overall query string for the search; may be empty\n * @param {string[]} [context.blockTypesFilter] Filter to only include these block types e.g. [\"problem\", \"html\"]\n * @param {import('meilisearch').Filter} [context.extraFilter] Any other filters to apply, e.g. course ID.\n * @param {string} [context.parentTagPath] Only fetch tags below this parent tag/taxonomy e.g. \"Places > North America\"\n * @returns {Promise<{\n * tags: {tagName: string, tagPath: string, tagCount: number, hasChildren: boolean}[];\n * mayBeMissingResults: boolean;\n * }>}\n */\nexport async function fetchAvailableTagOptions({\n client,\n indexName,\n searchKeywords,\n blockTypesFilter,\n extraFilter,\n parentTagPath,\n // Ideally this would include 'tagSearchKeywords' to filter the tag tree by keyword search but that's not possible yet\n}) {\n const meilisearchFacetLimit = 100; // The 'maxValuesPerFacet' on the index. For Open edX we leave the default, 100.\n\n // Convert 'extraFilter' into an array\n const extraFilterFormatted = forceArray(extraFilter);\n\n const blockTypesFilterFormatted = blockTypesFilter?.length ? [blockTypesFilter.map(bt => `block_type = ${bt}`)] : [];\n\n // Figure out which \"facet\" (attribute of the documents in the search index) holds the tags at the level we want.\n // e.g. \"tags.taxonomy\" is the facet/attribute that holds the root tags, and \"tags.level0\" has its child tags.\n let facetName;\n let depth;\n /** @type {string[]} */\n let parentFilter = [];\n if (!parentTagPath) {\n facetName = 'tags.taxonomy';\n depth = 0;\n } else {\n const parentParts = parentTagPath.split(TAG_SEP);\n depth = parentParts.length;\n facetName = `tags.level${depth - 1}`;\n const parentFacetName = parentParts.length === 1 ? 'tags.taxonomy' : `tags.level${parentParts.length - 2}`;\n parentFilter = [`${parentFacetName} = \"${parentTagPath}\"`];\n }\n\n // As an optimization, start pre-loading the data about \"has child tags\", if we will need it later.\n // Notice we don't 'await' the result of this request, so it can happen in parallel with the main request that follows\n const maybeHasChildren = depth > 0 && depth < 4; // If depth=0, it definitely has children; we don't support depth > 4\n const nextLevelFacet = `tags.level${depth}`; // This will give the children of the current tags.\n const preloadChildTagsData = maybeHasChildren ? client.index(indexName).searchForFacetValues({\n facetName: nextLevelFacet,\n facetQuery: parentTagPath,\n q: searchKeywords,\n filter: [...extraFilterFormatted, ...blockTypesFilterFormatted, ...parentFilter],\n }) : undefined;\n\n // Now load the facet values. Doing it with this API gives us much more flexibility in loading than if we just\n // requested the facets by passing { facets: [\"tags\"] } into the main search request; that works fine for loading the\n // root tags but can't load specific child tags like we can using this approach.\n /** @type {{tagName: string, tagPath: string, tagCount: number, hasChildren: boolean}[]} */\n const tags = [];\n const { facetHits } = await client.index(indexName).searchForFacetValues({\n facetName,\n // It's not super clear in the documentation, but facetQuery is basically a \"startsWith\" query, which is what we\n // need here to return just the tags below the selected parent tag. However, it's a fuzzy query that may match\n // more tags than we want it to, so we have to explicitly post-process and reduce the set of results using an\n // exact match.\n facetQuery: parentTagPath,\n q: searchKeywords,\n filter: [...extraFilterFormatted, ...blockTypesFilterFormatted, ...parentFilter],\n });\n facetHits.forEach(({ value: tagPath, count: tagCount }) => {\n if (!parentTagPath) {\n tags.push({\n tagName: tagPath,\n tagPath,\n tagCount,\n hasChildren: true, // You can't tag something with just a taxonomy, so this definitely has child tags.\n });\n } else {\n const parts = tagPath.split(TAG_SEP);\n const tagName = parts[parts.length - 1];\n if (tagPath === `${parentTagPath}${TAG_SEP}${tagName}`) {\n tags.push({\n tagName,\n tagPath,\n tagCount,\n hasChildren: false, // We'll set this later\n });\n } // Else this is a tag from another taxonomy/parent that was included because this search is \"fuzzy\". Ignore it.\n }\n });\n\n // Figure out if [some of] the tags at this level have children:\n if (maybeHasChildren) {\n if (preloadChildTagsData === undefined) { throw new Error('Child tags data unexpectedly not pre-loaded'); }\n // Retrieve the children of the current tags:\n const { facetHits: childFacetHits } = await preloadChildTagsData;\n if (childFacetHits.length >= meilisearchFacetLimit) {\n // Assume they all have child tags; we can't retrieve more than 100 facet values (per Meilisearch docs) so\n // we can't say for sure on a tag-by-tag basis, but we know that at least some of them have children, so\n // it's a safe bet that most/all of them have children. And it's not a huge problem if we say they have children\n // but they don't.\n // eslint-disable-next-line no-param-reassign\n tags.forEach((t) => { t.hasChildren = true; });\n } else if (childFacetHits.length > 0) {\n // Some (or maybe all) of these tags have child tags. Let's figure out which ones exactly.\n /** @type {Set} */\n const tagsWithChildren = new Set();\n childFacetHits.forEach(({ value }) => {\n // Trim the child tag off: 'Places > North America > New York' becomes 'Places > North America'\n const tagPath = value.split(TAG_SEP).slice(0, -1).join(TAG_SEP);\n tagsWithChildren.add(tagPath);\n });\n // eslint-disable-next-line no-param-reassign\n tags.forEach((t) => { t.hasChildren = tagsWithChildren.has(t.tagPath); });\n }\n }\n\n // If we hit the limit of facetHits, there are probably even more tags, but there is no API to retrieve\n // them (no pagination etc.), so just tell the user that not all tags could be displayed. This should be pretty rare.\n return { tags, mayBeMissingResults: facetHits.length >= meilisearchFacetLimit };\n}\n\n/**\n * Best-effort search for *all* tags among the search results (with filters applied) that contain the given keyword.\n *\n * Unfortunately there is no good Meilisearch API for this, so we just have to do the best we can. If more than 1,000\n * objects are tagged with matching tags, this will be an incomplete result. For example, if 1,000 XBlocks/components\n * are tagged with \"Tag Alpha 1\" and 10 XBlocks are tagged with \"Tag Alpha 2\", a search for \"Alpha\" may only return\n * [\"Tag Alpha 1\"] instead of the correct result [\"Tag Alpha 1\", \"Tag Alpha 2\"] because we are limited to 1,000 matches,\n * which may all have the same tags.\n *\n * @param {object} context\n * @param {import('meilisearch').MeiliSearch} context.client The Meilisearch client instance\n * @param {string} context.indexName Which index to search\n * @param {string[]} [context.blockTypesFilter] Filter to only include these block types e.g. [\"problem\", \"html\"]\n * @param {import('meilisearch').Filter} [context.extraFilter] Any other filters to apply to the overall search.\n * @param {string} [context.tagSearchKeywords] Only show taxonomies/tags that match these keywords\n * @returns {Promise<{ mayBeMissingResults: boolean; matches: {tagPath: string}[] }>}\n */\nexport async function fetchTagsThatMatchKeyword({\n client,\n indexName,\n blockTypesFilter,\n extraFilter,\n tagSearchKeywords,\n}) {\n if (!tagSearchKeywords || tagSearchKeywords.trim() === '') {\n // This data isn't needed if there is no tag keyword search. Don't bother making a search query.\n return { matches: [], mayBeMissingResults: false };\n }\n // Convert 'extraFilter' into an array\n const extraFilterFormatted = forceArray(extraFilter);\n\n const blockTypesFilterFormatted = blockTypesFilter?.length ? [blockTypesFilter.map(bt => `block_type = ${bt}`)] : [];\n\n const limit = 1000; // This is the most results we can retrieve in a single query.\n\n // We search for any matches of the keyword in the \"tags\" field, respecting the current filters like block type filter\n // or current course filter. (Unfortunately we cannot also include the overall `searchKeywords` so this will match\n // against more content than it should.)\n const { hits } = await client.index(indexName).search(tagSearchKeywords, {\n filter: [...extraFilterFormatted, ...blockTypesFilterFormatted],\n attributesToSearchOn: ['tags.taxonomy', 'tags.level0', 'tags.level1', 'tags.level2', 'tags.level3'],\n attributesToRetrieve: ['tags'],\n limit,\n // We'd like to use 'showMatchesPosition: true' to know exaclty which tags match, but it doesn't provide the\n // detail we need; it's impossible to tell which tag at a given level matched based on the returned _matchesPosition\n // data - https://github.com/orgs/meilisearch/discussions/550\n });\n\n const tagSearchKeywordsLower = tagSearchKeywords.toLocaleLowerCase();\n\n /** @type {Set} */\n const matches = new Set();\n\n // We have data like this:\n // hits: [\n // {\n // tags: { taxonomy: \"Competency\", \"level0\": \"Competency > Abilities\", \"level1\": \"Competency > Abilities > ...\" },\n // }, ...\n // ]\n hits.forEach((hit) => {\n Object.values(hit.tags).forEach((tagPathList) => {\n tagPathList.forEach((tagPath) => {\n if (tagPath.toLocaleLowerCase().includes(tagSearchKeywordsLower)) {\n matches.add(tagPath);\n }\n });\n });\n });\n\n return { matches: Array.from(matches).map((tagPath) => ({ tagPath })), mayBeMissingResults: hits.length === limit };\n}\n","/* eslint-disable react/prop-types */\n// @ts-check\n/**\n * This is a search manager that provides search functionality similar to the\n * Instantsearch library. We use it because Instantsearch doesn't support\n * multiple selections of hierarchical tags.\n * https://github.com/algolia/instantsearch/issues/1658\n */\nimport React from 'react';\nimport { MeiliSearch } from 'meilisearch';\n\nimport { useContentSearchConnection, useContentSearchResults } from '../data/apiHooks';\n\n/**\n * @type {React.Context>,\n * blockTypesFilter: string[],\n * setBlockTypesFilter: React.Dispatch>,\n * tagsFilter: string[],\n * setTagsFilter: React.Dispatch>,\n * blockTypes: Record,\n * extraFilter?: import('meilisearch').Filter,\n * canClearFilters: boolean,\n * clearFilters: () => void,\n * hits: import('../data/api').ContentHit[],\n * totalHits: number,\n * isFetching: boolean,\n * hasNextPage: boolean | undefined,\n * isFetchingNextPage: boolean,\n * fetchNextPage: () => void,\n * closeSearchModal: () => void,\n * hasError: boolean,\n * }>}\n */\nconst SearchContext = /** @type {any} */(React.createContext(undefined));\n\n/**\n * @type {React.FC<{\n* extraFilter?: import('meilisearch').Filter,\n* children: React.ReactNode,\n* closeSearchModal?: () => void,\n* }>}\n*/\nexport const SearchContextProvider = ({ extraFilter, children, closeSearchModal }) => {\n const [searchKeywords, setSearchKeywords] = React.useState('');\n const [blockTypesFilter, setBlockTypesFilter] = React.useState(/** type {string[]} */([]));\n const [tagsFilter, setTagsFilter] = React.useState(/** type {string[]} */([]));\n\n const canClearFilters = blockTypesFilter.length > 0 || tagsFilter.length > 0;\n const clearFilters = React.useCallback(() => {\n setBlockTypesFilter([]);\n setTagsFilter([]);\n }, []);\n\n // Initialize a connection to Meilisearch:\n const { data: connectionDetails, isError: hasConnectionError } = useContentSearchConnection();\n const indexName = connectionDetails?.indexName;\n const client = React.useMemo(() => {\n if (connectionDetails?.apiKey === undefined || connectionDetails?.url === undefined) {\n return undefined;\n }\n return new MeiliSearch({ host: connectionDetails.url, apiKey: connectionDetails.apiKey });\n }, [connectionDetails?.apiKey, connectionDetails?.url]);\n\n // Run the search\n const result = useContentSearchResults({\n client,\n indexName,\n extraFilter,\n searchKeywords,\n blockTypesFilter,\n tagsFilter,\n });\n\n return React.createElement(SearchContext.Provider, {\n value: {\n client,\n indexName,\n searchKeywords,\n setSearchKeywords,\n blockTypesFilter,\n setBlockTypesFilter,\n tagsFilter,\n setTagsFilter,\n extraFilter,\n canClearFilters,\n clearFilters,\n closeSearchModal: closeSearchModal ?? (() => {}),\n hasError: hasConnectionError || result.isError,\n ...result,\n },\n }, children);\n};\n\nexport const useSearchContext = () => {\n const ctx = React.useContext(SearchContext);\n if (ctx === undefined) {\n throw new Error('Cannot use search components outside of ');\n }\n return ctx;\n};\n","// @ts-check\nimport React from 'react';\nimport { useInfiniteQuery, useQuery } from '@tanstack/react-query';\n\nimport {\n TAG_SEP,\n fetchAvailableTagOptions,\n fetchSearchResults,\n fetchTagsThatMatchKeyword,\n getContentSearchConfig,\n} from './api';\n\n/**\n * Load the Meilisearch connection details from the CMS: the URL to use, the index name, and an API key specific\n * to the current user that allows it to search all content he have permission to view.\n *\n */\nexport const useContentSearchConnection = () => (\n useQuery({\n queryKey: ['content_search'],\n queryFn: getContentSearchConfig,\n cacheTime: 60 * 60_000, // Even if we're not actively using the search modal, keep it in memory up to an hour\n staleTime: 60 * 60_000, // If cache is up to one hour old, no need to re-fetch\n refetchInterval: 60 * 60_000,\n refetchOnWindowFocus: false, // This doesn't need to be refreshed when the user switches back to this tab.\n refetchOnMount: false,\n })\n);\n\n/**\n * Get the results of a search\n * @param {object} context\n * @param {import('meilisearch').MeiliSearch} [context.client] The Meilisearch API client\n * @param {string} [context.indexName] Which search index contains the content data\n * @param {import('meilisearch').Filter} [context.extraFilter] Other filters to apply to the search, e.g. course ID\n * @param {string} context.searchKeywords The keywords that the user is searching for, if any\n * @param {string[]} context.blockTypesFilter Only search for these block types (e.g. [\"html\", \"problem\"])\n * @param {string[]} context.tagsFilter Required tags (all must match), e.g. [\"Difficulty > Hard\", \"Subject > Math\"]\n */\nexport const useContentSearchResults = ({\n client,\n indexName,\n extraFilter,\n searchKeywords,\n blockTypesFilter,\n tagsFilter,\n}) => {\n const query = useInfiniteQuery({\n enabled: client !== undefined && indexName !== undefined,\n queryKey: [\n 'content_search',\n 'results',\n client?.config.apiKey,\n client?.config.host,\n indexName,\n extraFilter,\n searchKeywords,\n blockTypesFilter,\n tagsFilter,\n ],\n queryFn: ({ pageParam = 0 }) => {\n if (client === undefined || indexName === undefined) {\n throw new Error('Required data unexpectedly undefined. Check \"enable\" condition of useQuery.');\n }\n return fetchSearchResults({\n client,\n extraFilter,\n indexName,\n searchKeywords,\n blockTypesFilter,\n tagsFilter,\n // For infinite pagination of results, we can retrieve additional pages if requested.\n // Note that if there are 20 results per page, the \"second page\" has offset=20, not 2.\n offset: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextOffset,\n // Avoid flickering results when user is typing... keep old results until new is available.\n keepPreviousData: true,\n refetchOnWindowFocus: false, // This doesn't need to be refreshed when the user switches back to this tab.\n });\n\n const pages = query.data?.pages;\n const hits = React.useMemo(\n () => pages?.reduce((allHits, page) => [...allHits, ...page.hits], []) ?? [],\n [pages],\n );\n\n return {\n hits,\n // The distribution of block type filter options\n blockTypes: pages?.[0]?.blockTypes ?? {},\n status: query.status,\n isFetching: query.isFetching,\n isError: query.isError,\n isFetchingNextPage: query.isFetchingNextPage,\n // Call this to load more pages. We include some \"safety\" features recommended by the docs: this should never be\n // called while already fetching a page, and parameters (like 'event') should not be passed into fetchNextPage().\n // See https://tanstack.com/query/v4/docs/framework/react/guides/infinite-queries\n fetchNextPage: () => { if (!query.isFetching && !query.isFetchingNextPage) { query.fetchNextPage(); } },\n hasNextPage: query.hasNextPage,\n // The last page has the most accurate count of total hits\n totalHits: pages?.[pages.length - 1]?.totalHits ?? 0,\n };\n};\n\n/**\n * Get the available tags that can be used to refine a search, based on the search filters applied so far.\n * Also the user can use a keyword search to find specific tags.\n * @param {object} args\n * @param {import('meilisearch').MeiliSearch} [args.client] The Meilisearch client instance\n * @param {string} [args.indexName] Which index to search\n * @param {string} args.searchKeywords Overall query string for the search; may be empty\n * @param {string[]} [args.blockTypesFilter] Filter to only include these block types e.g. [\"problem\", \"html\"]\n * @param {import('meilisearch').Filter} [args.extraFilter] Any other filters to apply to the overall search.\n * @param {string} [args.tagSearchKeywords] Only show taxonomies/tags that match these keywords\n * @param {string} [args.parentTagPath] Only fetch tags below this parent tag/taxonomy e.g. \"Places > North America\"\n */\nexport const useTagFilterOptions = (args) => {\n const mainQuery = useQuery({\n enabled: args.client !== undefined && args.indexName !== undefined,\n queryKey: [\n 'content_search',\n 'tag_filter_options',\n args.client?.config.apiKey,\n args.client?.config.host,\n args.indexName,\n args.extraFilter,\n args.searchKeywords,\n args.blockTypesFilter,\n args.parentTagPath,\n ],\n queryFn: () => {\n const { client, indexName } = args;\n if (client === undefined || indexName === undefined) {\n throw new Error('Required data unexpectedly undefined. Check \"enable\" condition of useQuery.');\n }\n return fetchAvailableTagOptions({ ...args, client, indexName });\n },\n // Avoid flickering results when user is typing... keep old results until new is available.\n keepPreviousData: true,\n refetchOnWindowFocus: false, // This doesn't need to be refreshed when the user switches back to this tab.\n });\n\n const tagKeywordSearchData = useQuery({\n enabled: args.client !== undefined && args.indexName !== undefined,\n queryKey: [\n 'content_search',\n 'tags_keyword_search_data',\n args.client?.config.apiKey,\n args.client?.config.host,\n args.indexName,\n args.extraFilter,\n args.blockTypesFilter,\n args.tagSearchKeywords,\n ],\n queryFn: () => {\n const { client, indexName } = args;\n if (client === undefined || indexName === undefined) {\n throw new Error('Required data unexpectedly undefined. Check \"enable\" condition of useQuery.');\n }\n return fetchTagsThatMatchKeyword({ ...args, client, indexName });\n },\n // Avoid flickering results when user is typing... keep old results until new is available.\n keepPreviousData: true,\n refetchOnWindowFocus: false, // This doesn't need to be refreshed when the user switches back to this tab.\n });\n\n const data = React.useMemo(() => {\n if (!args.tagSearchKeywords || !tagKeywordSearchData.data) {\n // If there's no keyword search being used to filter the list of available tags, just use the results of the\n // main query.\n return { tags: mainQuery.data?.tags, mayBeMissingResults: mainQuery.data?.mayBeMissingResults ?? false };\n }\n if (mainQuery.data === undefined) {\n return { tags: undefined, mayBeMissingResults: false };\n }\n // Combine these two queries to filter the list of tags based on the keyword search.\n const tags = mainQuery.data.tags.filter(\n ({ tagPath }) => tagKeywordSearchData.data.matches.some(\n (matchingTag) => matchingTag.tagPath === tagPath || matchingTag.tagPath.startsWith(tagPath + TAG_SEP),\n ),\n );\n return {\n tags,\n mayBeMissingResults: mainQuery.data.mayBeMissingResults || tagKeywordSearchData.data.mayBeMissingResults,\n };\n }, [mainQuery.data, tagKeywordSearchData.data]);\n\n return { ...mainQuery, data };\n};\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Button } from '@openedx/paragon';\nimport messages from './messages';\nimport { useSearchContext } from './manager/SearchManager';\n\n/**\n * A button that appears when at least one filter is active, and will clear the filters when clicked.\n * @type {React.FC>}\n */\nconst ClearFiltersButton = () => {\n const { canClearFilters, clearFilters } = useSearchContext();\n if (canClearFilters) {\n return (\n \n );\n }\n return null;\n};\n\nexport default ClearFiltersButton;\n","var _path, _path2, _path3, _path4, _path5, _path6, _path7, _path8, _path9, _path10, _path11, _path12, _path13, _path14, _path15, _path16, _path17, _path18, _path19, _path20, _path21, _path22, _path23, _path24, _path25, _path26, _path27, _path28, _path29, _path30, _path31, _path32, _path33, _path34, _path35, _path36, _path37, _path38, _path39, _path40;\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nconst SvgEmptySearch = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 140,\n height: 138,\n fill: \"none\"\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M120.224 67.106h11.929c1.149-2.363 1.381-5.103 1.448-7.765.061-2.412 0-4.87-.732-7.165a12.14 12.14 0 0 0-14.592-8.01 5.5 5.5 0 0 0-2.84-1.752c-1.059-.227-4.204.078-4.237 1.16.014.338.117.668.3.953 1.081 2.03 2.773 3.672 4.104 5.547 3.133 4.309 3.666 11.109 4.62 17.032\"\n})), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M132.154 67.383h-11.929a.284.284 0 0 1-.278-.233c-.144-.927-.282-1.875-.427-2.829-.754-5.163-1.536-10.504-4.143-14.087-.471-.65-.998-1.287-1.503-1.908a22.6 22.6 0 0 1-2.617-3.65 2.2 2.2 0 0 1-.333-1.109.96.96 0 0 1 .421-.743c.921-.726 3.245-.876 4.154-.682a5.75 5.75 0 0 1 2.868 1.714 12.67 12.67 0 0 1 8.446.931 12.5 12.5 0 0 1 6.318 7.305c.759 2.335.809 4.87.748 7.26-.066 2.645-.294 5.43-1.475 7.858a.28.28 0 0 1-.25.172m-11.696-.555h11.524c1.071-2.296 1.276-4.947 1.343-7.476.072-2.707 0-4.942-.721-7.072a11.864 11.864 0 0 0-14.259-7.809.28.28 0 0 1-.272-.077 5.17 5.17 0 0 0-2.69-1.664c-.788-.172-2.951 0-3.699.555-.2.16-.206.282-.206.321.021.29.113.57.267.816a22.7 22.7 0 0 0 2.556 3.56c.511.621 1.043 1.27 1.526 1.936 2.684 3.688 3.477 9.095 4.242 14.325.128.871.256 1.736.389 2.585\"\n})), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M133.303 43.152c1.492-1.182 2.923-2.502 4.67-3.245a.83.83 0 0 1 .466-.1.7.7 0 0 1 .383.25 2.18 2.18 0 0 1 .382 1.958 5.4 5.4 0 0 1-.965 1.825 21.4 21.4 0 0 1-3.921 4.081 8.2 8.2 0 0 1-3.372 1.78c-1.708.35-5.635-1.33-3.882-3.62.499-.655 1.664-.556 2.351-.739a11.4 11.4 0 0 0 3.888-2.19\"\n})), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M130.434 50.017c-1.309 0-3.106-.72-3.799-1.819a1.9 1.9 0 0 1 .194-2.296c.422-.554 1.154-.638 1.797-.72q.354-.035.699-.117a11.35 11.35 0 0 0 3.805-2.141l.837-.671a16.9 16.9 0 0 1 3.883-2.601c.191-.099.407-.139.621-.117a.94.94 0 0 1 .554.339 2.44 2.44 0 0 1 .444 2.218 5.7 5.7 0 0 1-1.015 1.925 21.4 21.4 0 0 1-3.971 4.131 8.5 8.5 0 0 1-3.489 1.836 2.6 2.6 0 0 1-.56.033m3.04-6.655a11.8 11.8 0 0 1-3.999 2.218 5 5 0 0 1-.777.134c-.554.072-1.148.144-1.425.504a1.366 1.366 0 0 0-.166 1.664c.654 1.048 2.69 1.742 3.782 1.52a7.95 7.95 0 0 0 3.256-1.725 21.2 21.2 0 0 0 3.882-4.032c.414-.51.727-1.096.921-1.725a1.9 1.9 0 0 0-.322-1.708.44.44 0 0 0-.222-.155.64.64 0 0 0-.31.077 16.5 16.5 0 0 0-3.788 2.54l-.821.666z\"\n})), _path5 || (_path5 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M47.193 31.16c-.887-3.981-2.069-7.925-2.424-11.99s.2-8.375 2.507-11.736a7.3 7.3 0 0 1 3.744-3.028c1.364-.416 3.704.35 3.704.35a39 39 0 0 1 3.522-2.296c2.59-1.293 5.546-1.764 8.392-2.041 4.087-.394 8.823-.183 11.42 2.994 1.907 2.335 2.073 5.591 2.151 8.603l.205 7.72\"\n})), _path6 || (_path6 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M47.194 31.438a.29.29 0 0 1-.278-.227c-.233-1.038-.482-2.08-.737-3.117a59.6 59.6 0 0 1-1.692-8.913c-.288-3.328-.083-8.08 2.557-11.924a7.6 7.6 0 0 1 3.882-3.14c1.248-.376 3.195.15 3.733.311a37 37 0 0 1 3.45-2.218C60.842.85 63.936.402 66.598.147c5.696-.555 9.512.46 11.647 3.1 2.053 2.507 2.147 6.128 2.219 8.768l.26 7.704a.288.288 0 0 1-.482.217.28.28 0 0 1-.089-.2l-.205-7.726c-.083-3.195-.305-6.245-2.085-8.425C75.839 1.106 72.184.158 66.694.69c-2.612.255-5.64.693-8.32 2.013a39 39 0 0 0-3.482 2.274.28.28 0 0 1-.256.04s-2.273-.733-3.532-.35a7.17 7.17 0 0 0-3.589 2.917c-2.545 3.705-2.74 8.32-2.457 11.547.33 2.981.886 5.933 1.664 8.83.25 1.042.505 2.08.738 3.128a.28.28 0 0 1-.217.338z\"\n})), _path7 || (_path7 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#68E1FD\",\n d: \"M91.518 137.491c-2.773-51.08 1.62-70.103-.555-75.36-5.152-12.38-35.345-16.434-35.345-16.434s-32.673-.166-39.932 17.132c-1.82 4.348-14.42 34.53-15.657 53.154-.627 9.312 9.057 7.432 17.487 8.214v13.311z\"\n})), _path8 || (_path8 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"m71.18 68.737-2.48 3.405 9.679 40.609-5.73 11.53-8.407-11.53 1.181-40.304-3.61-4.154 5.196-4.115z\"\n})), _path9 || (_path9 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M72.65 124.563a.3.3 0 0 1-.233-.116l-8.403-11.531a.25.25 0 0 1-.055-.177l1.176-40.193-3.539-4.071a.29.29 0 0 1-.072-.21c.01-.079.05-.15.111-.2l5.197-4.11a.283.283 0 0 1 .388.028l4.17 4.559a.28.28 0 0 1 0 .36l-2.379 3.3 9.645 40.487a.26.26 0 0 1 0 .194l-5.751 11.525a.28.28 0 0 1-.233.155zm-8.12-11.874 8.07 11.092 5.474-11.015-9.65-40.486a.29.29 0 0 1 .05-.233l2.34-3.217-3.838-4.193-4.753 3.683 3.416 3.926a.27.27 0 0 1 .072.194z\"\n})), _path10 || (_path10 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"m74.275 48.216 1.315 8.54s-1.942 9.274-11.342 7.094a18.76 18.76 0 0 1-12.679-10.205l-1.053-19.86s6.916-3.777 4.73-18.857c0 0 10.472 5.063 24.403 3.161 0 0 3.328 15.53 2.285 22.8s-7.659 7.327-7.659 7.327\"\n})), _path11 || (_path11 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M66.976 64.465a12.3 12.3 0 0 1-2.773-.338A19.22 19.22 0 0 1 51.33 53.75a.3.3 0 0 1 0-.094l-1.109-19.861a.28.28 0 0 1 .15-.26c.066-.04 6.716-3.883 4.587-18.564a.3.3 0 0 1 .116-.271.3.3 0 0 1 .294 0 46.6 46.6 0 0 0 24.248 3.11.29.29 0 0 1 .321.223c.133.638 3.328 15.657 2.285 22.9-.943 6.483-6.24 7.42-7.598 7.548l1.27 8.23a.3.3 0 0 1 0 .106c-.039.172-.92 4.21-4.293 6.361a8.36 8.36 0 0 1-4.625 1.287M51.852 53.578a18.6 18.6 0 0 0 12.462 9.983c2.717.632 5.063.338 6.955-.865 2.978-1.897 3.92-5.496 4.032-5.957l-1.31-8.485a.283.283 0 0 1 .278-.333c.26 0 6.361-.139 7.376-7.077.971-6.655-1.796-20.382-2.218-22.434a47.9 47.9 0 0 1-23.815-3.012c1.819 13.61-3.727 17.87-4.803 18.536z\"\n})), _path12 || (_path12 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M69.456 27.184s4.437 8.186 3.111 9.428c-1.325 1.242-4.709 0-4.709 0\"\n})), _path13 || (_path13 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M70.703 37.427a10 10 0 0 1-2.94-.554.273.273 0 0 1-.023-.508.28.28 0 0 1 .212-.014c.034 0 3.217 1.11 4.437.034.821-.75-1.359-5.763-3.167-9.08a.277.277 0 1 1 .488-.266c.76 1.398 4.493 8.442 3.056 9.75-.585.46-1.32.687-2.063.638M62.629 27.281c.508-.021.88-.984.83-2.15-.048-1.166-.5-2.093-1.008-2.072s-.88.984-.83 2.15c.048 1.166.5 2.094 1.008 2.072M76.294 28.13c.508-.02.883-.982.836-2.15-.047-1.166-.497-2.096-1.005-2.075-.509.02-.883.982-.836 2.15.046 1.166.496 2.096 1.005 2.076\"\n})), _path14 || (_path14 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M56.538 29.9a12.9 12.9 0 0 0-3.228-3.67 4.37 4.37 0 0 0-2.407-1.06 3.9 3.9 0 0 0-2.063.615 7.65 7.65 0 0 0-3.61 5.07 6.06 6.06 0 0 0 .11 2.94 6.75 6.75 0 0 0 2.929 3.52c1.349.78 2.784 1.4 4.276 1.848\"\n})), _path15 || (_path15 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M52.535 39.481h-.094a20.5 20.5 0 0 1-4.337-1.88 6.98 6.98 0 0 1-3.045-3.672 6.3 6.3 0 0 1-.117-3.083 7.91 7.91 0 0 1 3.755-5.264 4.1 4.1 0 0 1 2.218-.648 4.7 4.7 0 0 1 2.568 1.109 13.2 13.2 0 0 1 3.328 3.755.288.288 0 0 1-.488.255 12.6 12.6 0 0 0-3.161-3.589 4.2 4.2 0 0 0-2.219-.998 3.54 3.54 0 0 0-1.908.555 7.35 7.35 0 0 0-3.483 4.88 5.7 5.7 0 0 0 .106 2.773 6.42 6.42 0 0 0 2.773 3.361c1.321.791 2.73 1.426 4.198 1.892a.28.28 0 0 1 .178.36.29.29 0 0 1-.272.194M74.276 48.214a25.7 25.7 0 0 1-15.768-2.6s8.036 12.356 17.004 10.615z\"\n})), _path16 || (_path16 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M73.78 56.673c-3.272 0-6.805-1.664-10.321-4.892a35.6 35.6 0 0 1-5.186-6.017.28.28 0 0 1 0-.333.27.27 0 0 1 .333-.061 25.66 25.66 0 0 0 15.58 2.573.27.27 0 0 1 .215.045.27.27 0 0 1 .117.183l1.237 8.014a.277.277 0 0 1-.222.316 9.5 9.5 0 0 1-1.753.172M59.36 46.329c2.002 2.724 8.647 10.843 15.846 9.673l-1.137-7.465a26.46 26.46 0 0 1-14.72-2.208z\"\n})), _path17 || (_path17 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"m118.239 41.629-.127.201a1.93 1.93 0 0 1-2.662.603l-12.957-8.172 2.186-3.466 12.952 8.169a1.93 1.93 0 0 1 .603 2.662z\"\n})), _path18 || (_path18 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M116.464 43.006c-.415 0-.822-.12-1.171-.344l-12.939-8.175a.25.25 0 0 1-.122-.177.27.27 0 0 1 .034-.205l2.185-3.472a.274.274 0 0 1 .382-.083l12.94 8.175a2.22 2.22 0 0 1 .693 3.044l-.128.206a2.22 2.22 0 0 1-1.874 1.031m-13.599-8.835 12.722 8.02a1.62 1.62 0 0 0 1.248.216c.43-.089.806-.344 1.048-.71l.128-.2a1.666 1.666 0 0 0-.516-2.279l-12.739-8.058z\"\n})), _path19 || (_path19 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"m103.243 36.81 3.51-5.628-3.163-1.973-3.51 5.629z\"\n})), _path20 || (_path20 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M102.91 36.29a.3.3 0 0 1-.15-.044l-3.145-1.986a.276.276 0 0 1-.088-.382l3.532-5.596a.273.273 0 0 1 .383-.09l3.145 1.986a.26.26 0 0 1 .122.172.28.28 0 0 1-.033.211l-3.539 5.59a.28.28 0 0 1-.172.123zm-2.773-2.357 2.678 1.664 3.239-5.13-2.678-1.664z\"\n})), _path21 || (_path21 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"m134.967 53.482 1.041-1.652a2.334 2.334 0 0 0-.729-3.22l-18.084-11.406a2.334 2.334 0 0 0-3.22.73l-1.042 1.65a2.335 2.335 0 0 0 .729 3.221l18.084 11.406a2.335 2.335 0 0 0 3.221-.73\"\n})), _path22 || (_path22 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M132.98 54.842c-.491 0-.972-.141-1.387-.405l-18.08-11.408a2.62 2.62 0 0 1-1.181-2.653c.058-.339.182-.662.366-.952l1.037-1.664a2.624 2.624 0 0 1 3.605-.815l18.08 11.408a2.6 2.6 0 0 1 1.155 1.633 2.611 2.611 0 0 1-.339 1.971l-1.038 1.665a2.6 2.6 0 0 1-1.663 1.153 2.6 2.6 0 0 1-.555.067m-17.032-17.748a2.06 2.06 0 0 0-1.747.96l-1.037 1.664a2.03 2.03 0 0 0-.267 1.553 2.07 2.07 0 0 0 .91 1.286l18.08 11.403a2.07 2.07 0 0 0 2.846-.643l1.037-1.664a2.07 2.07 0 0 0 .267-1.553 2.05 2.05 0 0 0-.911-1.287l-18.08-11.403a2.05 2.05 0 0 0-1.098-.293z\"\n})), _path23 || (_path23 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M73.893 13.796A17.575 17.575 0 1 0 98.14 8.311a17.587 17.587 0 0 0-24.248 5.485\"\n})), _path24 || (_path24 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M88.728 41.028A17.842 17.842 0 0 1 73.66 13.653a17.853 17.853 0 1 1 15.07 27.375m-14.603-27.06a17.304 17.304 0 1 0 29.267 18.47 17.304 17.304 0 0 0-29.267-18.47\"\n})), _path25 || (_path25 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M96.177 11.415a13.9 13.9 0 0 1 6.29 14.113 13.91 13.91 0 0 1-10.633 11.21 13.905 13.905 0 1 1 4.343-25.323\"\n})), _path26 || (_path26 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#D1D3D4\",\n d: \"M88.74 37.355a14.182 14.182 0 1 1 7.587-26.161 14.17 14.17 0 0 1 6.062 15.943 14.17 14.17 0 0 1-13.65 10.23zm.044-27.825c-1.02 0-2.038.114-3.034.338a13.632 13.632 0 1 0 10.283 1.77 13.54 13.54 0 0 0-7.249-2.108\"\n})), _path27 || (_path27 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M74.559 39.164s-9.6 7.448-13.383-6.994z\"\n})), _path28 || (_path28 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M69.167 41.365a6.5 6.5 0 0 1-2.085-.338c-2.823-.96-4.897-3.916-6.173-8.791a.286.286 0 1 1 .555-.139c1.22 4.681 3.177 7.51 5.812 8.403 3.51 1.198 7.093-1.525 7.127-1.553a.28.28 0 0 1 .39.047.28.28 0 0 1 .024.309.3.3 0 0 1-.07.082 10.1 10.1 0 0 1-5.58 1.98\"\n})), _path29 || (_path29 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M123.541 46.829c.599-.278.765-1.043.787-1.709a9.4 9.4 0 0 0-.626-3.671l2.185 4.809a7.9 7.9 0 0 0 1.614 2.595 2.7 2.7 0 0 0 2.823.671c1.358-.61 1.586-2.44 1.397-3.915a14.7 14.7 0 0 0-1.081-4.005 6.04 6.04 0 0 0-2.18-2.856c-1.037-.643-2.512-.693-3.383.15-.954-1.459-2.923-4.082-5.03-3.56-1.381.337-1.22 1.108-.943 2.379.382 1.713 2.008 10.249 4.437 9.112\"\n})), _path30 || (_path30 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M129.497 49.972a3.33 3.33 0 0 1-2.185-.92 8.3 8.3 0 0 1-1.664-2.685l-1.053-2.324q.043.555.027 1.11c-.033 1.004-.36 1.663-.948 1.952a1.27 1.27 0 0 1-1.148 0c-1.664-.832-2.773-5.17-3.577-8.874l-.1-.444c-.261-1.187-.51-2.307 1.148-2.712s3.378.788 5.152 3.422a3.25 3.25 0 0 1 3.472 0 6.26 6.26 0 0 1 2.291 2.984 15.3 15.3 0 0 1 1.109 4.076c.1.782.277 3.39-1.558 4.204-.303.14-.632.212-.966.211m-5.795-8.802a.27.27 0 0 1 .249.161l2.186 4.809a7.9 7.9 0 0 0 1.552 2.507 2.43 2.43 0 0 0 2.524.62c1.486-.665 1.32-2.944 1.237-3.626a14.7 14.7 0 0 0-1.065-3.932 5.72 5.72 0 0 0-2.069-2.73c-.865-.554-2.218-.676-3.05.117a.26.26 0 0 1-.222.078.28.28 0 0 1-.2-.122c-1.181-1.814-2.961-3.882-4.731-3.45-1.076.266-1.031.732-.737 2.052l.094.45c.405 1.89 1.636 7.642 3.289 8.468a.72.72 0 0 0 .665 0c.483-.227.611-.92.627-1.464a9.1 9.1 0 0 0-.61-3.566.3.3 0 0 1-.02-.104.27.27 0 0 1 .081-.193.3.3 0 0 1 .089-.058.3.3 0 0 1 .111-.017\"\n})), _path31 || (_path31 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M116.22 44.775s6.655 2.468 7.393 9.795z\"\n})), _path32 || (_path32 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M123.58 54.848a.274.274 0 0 1-.272-.25c-.704-7.06-7.149-9.54-7.21-9.562a.3.3 0 0 1-.154-.147.276.276 0 0 1 .348-.374c.072 0 6.833 2.612 7.571 10.028a.28.28 0 0 1-.061.204.28.28 0 0 1-.189.1z\"\n})), _path33 || (_path33 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#68E1FD\",\n d: \"M86.305 56.397s27.763 26.066 28.052 24.358a1888 1888 0 0 0 3.294-19.827l18.114.737s0 51.025-12.202 52.261c-9.239.932-41.446-29.222-41.446-29.222z\"\n})), _path34 || (_path34 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M90.946 126.693a.29.29 0 0 1-.283-.266l-5.158-60.714a.288.288 0 0 1 .555-.044l5.202 60.713a.28.28 0 0 1-.067.207.3.3 0 0 1-.087.069.3.3 0 0 1-.107.029zM48.557 125.405l-35.905-1.17a.288.288 0 0 1-.277-.299.3.3 0 0 1 .299-.278l35.623 1.165 1.015-19.079-24.842-2.939a.3.3 0 0 1-.2-.122.3.3 0 0 1-.044-.228c3.234-13.66 8.031-34.336 7.976-35.306a.283.283 0 0 1 .21-.338.3.3 0 0 1 .35.221c.21.843-6.378 28.801-7.903 35.24l24.785 2.94a.28.28 0 0 1 .25.299l-1.043 19.623a.29.29 0 0 1-.294.271\"\n})), _path35 || (_path35 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"m72.86 85.84 33.848 6.195-9.65 45.456-35.246-4.088z\"\n})), _path36 || (_path36 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M97.065 137.767h-.034l-35.25-4.081a.3.3 0 0 1-.195-.117.3.3 0 0 1-.044-.222L72.59 85.778a.277.277 0 0 1 .321-.21l33.832 6.2a.26.26 0 0 1 .177.116.3.3 0 0 1 .045.217l-9.65 45.45a.28.28 0 0 1-.09.15.28.28 0 0 1-.16.066m-34.913-4.603 34.691 4.021 9.534-44.924-33.305-6.1z\"\n})), _path37 || (_path37 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M77.048 106.916c-.26-2.968-9.889 1.07-9.889 1.07s2.718-6.189 1.26-7.315c-1.46-1.126-6.362 6.317-6.362 6.317a85 85 0 0 1-12.44.998l-.865 13.81c13.81-.998 22.767-1.392 23.194-2.28.843-1.769 5.363-9.633 5.102-12.6\"\n})), _path38 || (_path38 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M48.752 122.046a.24.24 0 0 1-.178-.072.24.24 0 0 1-.078-.194l.866-13.81a.26.26 0 0 1 .255-.239 84 84 0 0 0 12.29-.976c.644-.959 4.154-6.134 5.979-6.439a.86.86 0 0 1 .688.155c1.347 1.043-.272 5.413-.943 7.049 1.797-.704 7.265-2.701 9.051-1.625a1.25 1.25 0 0 1 .621.999c.217 2.518-2.773 8.225-4.387 11.292-.332.626-.593 1.109-.743 1.436-.383.804-4.326 1.109-15.668 1.886-2.362.161-4.947.338-7.764.554zm1.11-13.805-.833 13.278 7.449-.516c8.274-.555 14.808-1.009 15.252-1.603.144-.31.41-.815.743-1.447 1.47-2.807 4.536-8.641 4.331-11.015a.76.76 0 0 0-.377-.61c-1.564-.943-7.149 1.043-9.162 1.891a.255.255 0 0 1-.333-.338c1.02-2.318 2.285-6.278 1.337-7.01a.36.36 0 0 0-.294-.056c-1.42.239-4.592 4.637-5.696 6.317a.28.28 0 0 1-.172.111c-4.056.618-8.15.955-12.251 1.01zM112.277 89.71h-.055a.285.285 0 0 1-.224-.226.3.3 0 0 1 .002-.112l4.991-23.731a.279.279 0 0 1 .227-.224.29.29 0 0 1 .333.34l-4.991 23.732a.28.28 0 0 1-.102.161.28.28 0 0 1-.181.06M80.593 23.325q.165-.218.355-.41l1.342-1.182a.555.555 0 0 1 .91 0l3.432 3.494a.555.555 0 0 0 .965 0l8.037-7.997a.554.554 0 0 1 .97 0l1.41 1.42a.555.555 0 0 1 0 .903l-10.46 10.444a.556.556 0 0 1-.872 0q-2.944-3.04-5.884-6.101a2 2 0 0 1-.205-.31z\"\n})), _path39 || (_path39 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M87.12 30.484a.88.88 0 0 1-.632-.3l-5.885-6.1a2 2 0 0 1-.183-.266l-.055-.09a.3.3 0 0 1-.045-.149v-.277a.26.26 0 0 1 .067-.178l.105-.127q.125-.162.272-.305c.316-.294.643-.588.965-.877l.383-.338a.832.832 0 0 1 1.292.033l3.428 3.494c.075.091.178.155.293.183a.5.5 0 0 0 .256-.127l8.03-7.998a1 1 0 0 1 .688-.344c.263.024.506.15.677.35l1.408 1.42a.843.843 0 0 1 0 1.292L87.747 30.196a.88.88 0 0 1-.627.288m-6.25-6.96v.038q.045.082.105.156 2.939 3.045 5.884 6.1a.36.36 0 0 0 .233.134.4.4 0 0 0 .239-.128l10.46-10.443c.183-.183.183-.317 0-.51l-1.41-1.415a.8.8 0 0 0-.287-.188.55.55 0 0 0-.289.183l-8.014 7.975a.98.98 0 0 1-.671.338.98.98 0 0 1-.682-.35l-3.428-3.493c-.205-.211-.305-.211-.554 0l-.377.344c-.322.288-.644.554-.96.865q-.12.117-.222.25l-.044.055zM82.134 88.8l1.575-3.632 14.68 2.596v3.832z\"\n})), _path40 || (_path40 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M98.389 91.873h-.045L82.09 89.1a.265.265 0 0 1-.206-.382l1.57-3.633a.28.28 0 0 1 .305-.167l14.68 2.596a.28.28 0 0 1 .228.277v3.822a.27.27 0 0 1-.1.21.3.3 0 0 1-.177.05M82.532 88.59l15.58 2.673v-3.272L83.88 85.479zM51.885 75.48a.98.98 0 0 1-.599-.238c-2.629-2.03-7.16-19.91-6.9-21.98.29-2.273 4.022-5.362 4.182-5.496a.288.288 0 0 1 .437.358.3.3 0 0 1-.07.086c-.04.033-3.722 3.078-3.977 5.125-.25 1.957 4.237 19.566 6.655 21.458.128.094.228.133.305.105 2.219-.898 8.242-9.29 8.32-9.373a.288.288 0 0 1 .516.12.28.28 0 0 1-.05.213c-.25.35-6.168 8.613-8.558 9.567a.6.6 0 0 1-.26.055M77.88 72.28h-.105c-1.853-.205-4.876-6.434-5.214-7.138a.288.288 0 0 1 .355-.394c.07.025.129.077.16.144 1.227 2.568 3.6 6.69 4.76 6.817a.32.32 0 0 0 .316-.156c1.408-1.802 3.327-11.918 1.985-16.899a.29.29 0 0 1 .2-.355.28.28 0 0 1 .35.206c1.408 5.224-.583 15.479-2.08 17.403a.9.9 0 0 1-.727.372\"\n})));\nexport { SvgEmptySearch as ReactComponent };\nexport default __webpack_public_path__ + \"54c2ffb7717f21032023b707a1599e50.svg\";","var _path, _path2, _path3, _path4, _path5, _path6, _path7, _path8, _path9, _path10, _path11, _path12, _path13, _path14, _path15, _path16, _path17, _path18, _path19, _path20, _path21, _path22, _path23, _path24, _path25, _path26, _path27, _path28, _path29, _path30;\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nconst SvgNoResults = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 189,\n height: 155,\n fill: \"none\"\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#D1D3D4\",\n d: \"M188.261 130.592H8.404a.32.32 0 0 1-.228-.095.32.32 0 0 1 0-.455.32.32 0 0 1 .228-.095h179.857a.323.323 0 0 1 0 .645\"\n})), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M46.57 71.119c25.557 0 46.275-15.85 46.275-35.402C92.845 16.166 72.127.316 46.571.316S.297 16.166.297 35.717 21.015 71.12 46.57 71.12\"\n})), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#D1D3D4\",\n d: \"M46.59 71.441C20.9 71.441 0 55.42 0 35.717S20.881 0 46.59 0c25.708 0 46.596 16.022 46.596 35.717 0 19.696-20.92 35.724-46.596 35.724m0-70.797C21.255.644.644 16.376.644 35.717s20.624 35.08 45.946 35.08 45.952-15.732 45.952-35.08S71.912.644 46.59.644\"\n})), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M97.993 20.488a3 3 0 0 0-.644.09c-2.417.645-3.094 3.957-.38 4.847a2.758 2.758 0 0 0 3.448-2.243 2.394 2.394 0 0 0-2.424-2.694\"\n})), _path5 || (_path5 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#D1D3D4\",\n d: \"M97.685 25.863c-.28 0-.558-.044-.825-.129a2.62 2.62 0 0 1-1.978-2.616 3.12 3.12 0 0 1 2.378-2.855q.361-.093.735-.09a2.7 2.7 0 0 1 2.732 3.041 2.91 2.91 0 0 1-1.366 2.134c-.497.33-1.079.509-1.676.515m.31-5.046a2.2 2.2 0 0 0-.574.07 2.47 2.47 0 0 0-1.895 2.25 1.99 1.99 0 0 0 1.534 1.985 2.436 2.436 0 0 0 3.023-1.972 2.07 2.07 0 0 0-.506-1.644 2.06 2.06 0 0 0-1.576-.69z\"\n})), _path6 || (_path6 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#68E1FD\",\n d: \"m154.297 86.503 13.321-3.378c-.503-.953-8.597-25.244-16.022-29.968-6.374-5.298-19.173-5.8-33.668-6.38a44.7 44.7 0 0 0-13.792 1.346c-16.905 4.673-28.782 28.648-28.782 28.648l16.653 3.293s-2.649 24.761-4.969 54.949c0 0 26.54 5.974 68.006 3.648 0 0-1.141-47.866-.747-52.158\"\n})), _path7 || (_path7 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"m113.76 55.2-13.78 82.745 28.003 2.024 6.071-89.506z\"\n})), _path8 || (_path8 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"m127.981 140.291-27.996-2.023a.34.34 0 0 1-.232-.123.35.35 0 0 1-.064-.251l13.779-82.746a.31.31 0 0 1 .238-.258l20.301-4.743a.3.3 0 0 1 .278.071.32.32 0 0 1 .116.264l-6.072 89.506a.323.323 0 0 1-.109.22.3.3 0 0 1-.111.065.3.3 0 0 1-.128.018m-27.622-2.61 27.326 1.979 6.019-88.759-19.669 4.595z\"\n})), _path9 || (_path9 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"m115.601 43.11-2.578 10.807s2.211 7.29 9.539 6.729a14.64 14.64 0 0 0 10.859-6.342l3.152-19.915s-4.776-3.64-1.392-14.745a35.45 35.45 0 0 1-18.742-.432s-5.201 11.794-5.24 17.401c-.038 5.607 4.402 6.496 4.402 6.496\"\n})), _path10 || (_path10 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M121.795 60.988c-6.864 0-9.023-6.916-9.068-6.993a.4.4 0 0 1 0-.168l2.501-10.511c-1.064-.342-4.364-1.824-4.331-6.722.038-5.607 5.052-17.04 5.272-17.524a.314.314 0 0 1 .38-.18 35.45 35.45 0 0 0 18.561.432.34.34 0 0 1 .322.083.32.32 0 0 1 .078.323c-1.708 5.613-1.289 9.235-.593 11.285a6.86 6.86 0 0 0 1.901 3.125.32.32 0 0 1 .122.303l-3.158 19.915a.22.22 0 0 1-.045.116 15.05 15.05 0 0 1-11.136 6.516zm-8.423-7.09c.27.819 2.519 6.922 9.183 6.445a14.44 14.44 0 0 0 10.57-6.135l3.119-19.67c-.812-.735-4.331-4.621-1.521-14.417a36.7 36.7 0 0 1-18.084-.503c-.76 1.76-5.072 11.994-5.104 17.015-.039 5.252 3.963 6.141 4.131 6.18a.28.28 0 0 1 .206.142.3.3 0 0 1 .045.245z\"\n})), _path11 || (_path11 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M132.513 33.372a4.67 4.67 0 0 1 1.934-2.211 8.2 8.2 0 0 1 2.674-.838 3.4 3.4 0 0 1 1.534 0c.346.112.666.292.941.529a3.58 3.58 0 0 1 1.411 2.062 4.2 4.2 0 0 1-.238 2.024A8.5 8.5 0 0 1 139.88 37a5.67 5.67 0 0 1-5.808 2.536 5.7 5.7 0 0 1-2.068-.828\"\n})), _path12 || (_path12 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M135.134 39.92a6 6 0 0 1-3.28-.967.32.32 0 0 1-.09-.445.3.3 0 0 1 .202-.143.31.31 0 0 1 .243.046 5.33 5.33 0 0 0 4.049.747 5.35 5.35 0 0 0 3.375-2.358c.371-.619.66-1.284.857-1.978a4 4 0 0 0 .226-1.876 3.33 3.33 0 0 0-1.289-1.869 2.5 2.5 0 0 0-.832-.47 3.2 3.2 0 0 0-1.385 0 8 8 0 0 0-2.578.805 4.3 4.3 0 0 0-1.824 2.056.32.32 0 0 1-.425.168.322.322 0 0 1-.168-.425 4.98 4.98 0 0 1 2.101-2.36 8.4 8.4 0 0 1 2.778-.876 3.6 3.6 0 0 1 1.675 0c.386.123.744.323 1.051.587a3.87 3.87 0 0 1 1.508 2.262 4.55 4.55 0 0 1-.245 2.185 8.5 8.5 0 0 1-.909 2.133 6.02 6.02 0 0 1-3.783 2.649 6 6 0 0 1-1.257.129M114.582 48.517a9.3 9.3 0 0 0 7.605-1.173c3.596-2.488 3.609-4.273 3.609-4.273s-5.459 1.934-9.931.252z\"\n})), _path13 || (_path13 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M117.162 49.193a9.4 9.4 0 0 1-2.681-.367.322.322 0 0 1-.213-.38l1.289-5.201a.35.35 0 0 1 .168-.207.33.33 0 0 1 .258 0c4.311 1.618 9.667-.238 9.712-.257a.33.33 0 0 1 .396.16.3.3 0 0 1 .03.149c0 .077-.058 1.972-3.745 4.511a9.02 9.02 0 0 1-5.214 1.592m-2.191-.902a8.97 8.97 0 0 0 7.025-1.212c2.294-1.585 3.074-2.868 3.338-3.525-1.482.432-5.594 1.411-9.248.193z\"\n})), _path14 || (_path14 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M123.367 27.475s-4.762 4.75-4.079 5.877c.683 1.128 3.222.98 3.222.98\"\n})), _path15 || (_path15 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M122.207 34.628c-.78 0-2.578-.116-3.222-1.14-.754-1.25 2.971-5.118 4.131-6.278a.323.323 0 1 1 .457.458c-2.487 2.481-4.337 4.988-4.034 5.484.477.787 2.294.864 2.952.825a.33.33 0 0 1 .233.08.3.3 0 0 1 .076.101q.029.058.032.122a.312.312 0 0 1-.303.342zM128.779 28.034c.08-.715-.268-1.34-.778-1.397-.509-.057-.987.476-1.067 1.19-.08.715.268 1.34.777 1.397.51.057.988-.476 1.068-1.19M120.126 26.65c.287-.659.139-1.36-.331-1.564-.47-.205-1.084.164-1.371.823-.287.66-.139 1.36.331 1.564.47.205 1.084-.164 1.371-.823M126.964 40.17a.34.34 0 0 1-.226-.09c-2.861-2.745-10.595-4.433-10.673-4.453a.32.32 0 0 1-.248-.255.3.3 0 0 1 .004-.125.33.33 0 0 1 .138-.205.32.32 0 0 1 .242-.047c.322.071 7.985 1.747 10.956 4.622a.3.3 0 0 1 .091.163.317.317 0 0 1-.132.334.3.3 0 0 1-.178.057zM166.981 109.459a.3.3 0 0 1-.194-.064l-9.506-7.296a.333.333 0 0 1-.064-.457.33.33 0 0 1 .451-.058l9.513 7.302a.33.33 0 0 1 .108.162.325.325 0 0 1-.308.411\"\n})), _path16 || (_path16 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M140.794 29.324h-.084a.32.32 0 0 1-.193-.15.32.32 0 0 1-.032-.243c.96-3.57 1.894-7.206 2.777-10.815l.097-.38c.445-1.517.691-3.086.735-4.666-.039-1.134-.554-1.29-2.179-1.29a.317.317 0 0 1-.328-.315 5.21 5.21 0 0 0-2.088-4.08c-2.153-1.578-5.305-1.933-8.656-.882l-.167.051c-3.339 1.018-6.22 1.895-9.867 2.03h-2.134a21.5 21.5 0 0 0-4.737.316q-1.464.363-2.868.915a7 7 0 0 0-2.223 1.128 6.4 6.4 0 0 0-1.515 2.3 9.2 9.2 0 0 0-.805 2.398c-.374 2.578 1.289 4.84 2.339 5.981.645.71 1.624 1.502 2.578 1.244a.33.33 0 0 1 .409.235.336.336 0 0 1-.118.351.3.3 0 0 1-.117.058c-1.005.278-2.12-.219-3.222-1.43-1.102-1.212-2.913-3.693-2.494-6.51a9.7 9.7 0 0 1 .857-2.578 7.2 7.2 0 0 1 1.701-2.532 7.8 7.8 0 0 1 2.417-1.244q1.443-.57 2.952-.935a21.8 21.8 0 0 1 4.885-.335h2.107c3.558-.135 6.407-.999 9.7-2.004l.167-.052c3.545-1.076 6.903-.715 9.223.98a5.9 5.9 0 0 1 2.34 4.273c1.16 0 2.461.129 2.519 1.933a18.8 18.8 0 0 1-.754 4.84l-.096.38c-.883 3.61-1.824 7.251-2.784 10.828a.325.325 0 0 1-.342.2\"\n})), _path17 || (_path17 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M130.186 56.16s-3.641-3.493-4.608-7.765c-.966-4.274-.593-5.195-1.256-5.343-.664-.149-1.786.303-2.617 1.76-.831 1.456-.606 6.58.748 8.642 1.353 2.062 7.733 2.706 7.733 2.706\"\n})), _path18 || (_path18 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M130.186 56.476h-.033c-.264-.032-6.548-.69-7.972-2.855s-1.669-7.392-.754-8.977c.915-1.586 2.127-2.095 2.958-1.934.6.129.645.645.819 1.734.109.799.27 2.01.689 3.867.935 4.124 4.479 7.572 4.512 7.605a.35.35 0 0 1 .071.367.33.33 0 0 1-.29.193m-6.11-13.128c-.522 0-1.399.4-2.095 1.611-.696 1.212-.58 6.303.741 8.308.89 1.36 4.512 2.146 6.606 2.455-1.108-1.224-3.325-4.002-4.06-7.263a41 41 0 0 1-.702-3.912c-.129-.935-.174-1.154-.316-1.186a.7.7 0 0 0-.174-.006z\"\n})), _path19 || (_path19 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M76.365 77.222s-16.19 39.836-10.118 51.952c6.071 12.116 65.783 17.53 65.783 17.53s7.592 3.223 9.95 3.712c2.359.49 11.305 1.012 11.305 1.012s-3.377.645-2.198 1.682c1.179 1.038 7.734 1.012 8.436-1.347.703-2.358-1.179-11.807-3.222-13.328s-24.967-7.089-26.65-7.25-39.468-13.27-39.468-13.27l4.892-36.994\"\n})), _path20 || (_path20 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M154.316 154.09c-1.502 0-2.887-.251-3.435-.722a.82.82 0 0 1-.342-.851 1.629 1.629 0 0 1 .967-.863c-2.739-.174-7.856-.542-9.59-.915-2.294-.49-9.268-3.416-9.964-3.706-3.08-.284-59.937-5.62-65.995-17.717-2.578-5.111-1.624-15.468 2.765-30.761 3.222-11.356 7.308-21.352 7.347-21.455a.324.324 0 1 1 .6.245c-.162.4-16.068 39.809-10.132 51.687s64.926 17.311 65.525 17.363a.2.2 0 0 1 .09 0c.077.032 7.592 3.222 9.899 3.693 2.308.47 11.163.999 11.253 1.005a.323.323 0 0 1 .303.297.33.33 0 0 1-.258.341c-.973.193-2.107.645-2.185.928 0 .045.058.129.136.194.644.554 3.738.863 6.045.174.735-.226 1.663-.645 1.869-1.367.683-2.384-1.289-11.601-3.087-12.98s-24.445-6.986-26.488-7.186c-1.708-.174-38.025-12.754-39.546-13.289a.315.315 0 0 1-.213-.342l4.892-37a.326.326 0 0 1 .364-.28.326.326 0 0 1 .28.364l-4.859 36.736c13.128 4.55 37.857 13.038 39.153 13.167s24.6 5.658 26.81 7.315c2.211 1.656 4.009 11.259 3.319 13.676-.225.792-1.025 1.418-2.301 1.804a11.7 11.7 0 0 1-3.222.445\"\n})), _path21 || (_path21 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M144.848 88.862S133.975 61.02 130.92 56.438s-16.46-15.771-18.129-14.656-1.18 2.359-.484 3.222c.697.864 4.583 3.539 4.583 3.539s-4.376-2.011-4.512.644 3.223 4.24 3.223 4.24-3.68-2.712-3.822.207a4.3 4.3 0 0 0 2.578 4.028s-3.919-3.325-3.545.142c.645 5.697 12.091 12.503 12.091 12.503l4.859 47.35s1.74 27.462 19.264 26.63c22.486-1.069 29.002-33.513 17.762-60.949\"\n})), _path22 || (_path22 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M146.215 144.584c-16.912 0-18.794-26.682-18.813-26.953l-4.84-47.176c-1.379-.838-11.498-7.154-12.103-12.664-.104-.941.09-1.547.573-1.805.294-.14.629-.167.941-.077a4.2 4.2 0 0 1-.548-2.333 1.63 1.63 0 0 1 .806-1.528c.286-.123.601-.163.909-.116a3.95 3.95 0 0 1-1.09-2.803 1.64 1.64 0 0 1 .748-1.386 3.22 3.22 0 0 1 2.204-.174 24.7 24.7 0 0 1-2.945-2.384 2.24 2.24 0 0 1-.693-1.983 2.26 2.26 0 0 1 1.247-1.69c1.225-.82 6.123 2.912 8.926 5.213 3.616 2.958 7.998 7.057 9.668 9.532 3.035 4.563 13.534 31.348 13.959 32.489a.324.324 0 0 1-.187.412.31.31 0 0 1-.412-.18c-.11-.278-10.899-27.855-13.902-32.36-1.398-2.101-5.22-5.878-9.519-9.397-5.201-4.26-7.734-5.44-8.159-5.155a1.94 1.94 0 0 0-.973 1.256 2 2 0 0 0 .554 1.463c.548.645 3.448 2.733 4.511 3.48a.32.32 0 0 1 .091.426.32.32 0 0 1-.413.135c-.709-.329-2.739-1.05-3.622-.516a.99.99 0 0 0-.438.864c-.077 1.495 1.096 2.642 2.004 3.306q.557.282 1.064.645a.323.323 0 0 1-.329.548 8 8 0 0 1-1.089-.645c-.645-.341-1.412-.573-1.837-.374-.264.123-.412.451-.438.973a3.6 3.6 0 0 0 .225 1.493c.178.477.455.91.812 1.272q.755.44 1.425 1a.323.323 0 0 1-.112.55.32.32 0 0 1-.223-.01 4.9 4.9 0 0 1-1.431-.985c-.587-.329-1.141-.529-1.431-.374-.29.154-.309.535-.238 1.166.599 5.472 11.819 12.194 11.929 12.246a.33.33 0 0 1 .161.245l4.86 47.35c0 .283 1.894 27.165 18.922 26.34 7.057-.335 12.922-3.867 16.975-10.234 7.683-12.059 7.889-32.263.51-50.27a.32.32 0 0 1 .003-.245.33.33 0 0 1 .171-.174.335.335 0 0 1 .425.174c7.45 18.194 7.225 38.63-.567 50.863-4.164 6.541-10.215 10.182-17.485 10.53z\"\n})), _path23 || (_path23 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M144.287 87.792s8.772 23.846 11.021 31.709z\"\n})), _path24 || (_path24 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M155.309 119.823a.315.315 0 0 1-.309-.232c-2.224-7.766-10.924-31.451-11.015-31.69a.34.34 0 0 1 .006-.25.325.325 0 0 1 .537-.08q.043.049.063.111c.084.239 8.797 23.943 11.027 31.735a.325.325 0 0 1-.219.399zM96.5 64.855c0 .676-1.353 13.27-1.353 13.27z\"\n})), _path25 || (_path25 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#231F20\",\n d: \"M95.146 78.44h-.032a.32.32 0 0 1-.284-.354c.374-3.493 1.347-12.69 1.347-13.231a.322.322 0 0 1 .644 0c0 .683-1.289 12.786-1.347 13.302a.32.32 0 0 1-.328.283\"\n})), _path26 || (_path26 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#000\",\n d: \"M38.52 40.97c-.374-4.814 1.52-7.979 6.863-11.807 4.815-3.39 6.188-5.156 5.981-7.843-.251-3.223-3.164-4.995-7.508-4.66-5.369.419-8.41 4.144-8.327 10.312l-11.749.038c-.515-11.787 7.173-20.088 19.335-21.029 10.814-.838 19.212 5.098 19.902 14.018.425 5.445-1.934 9.519-7.973 13.875-4.878 3.635-5.955 5.066-5.742 7.83l.213 2.766-10.66.844zm0 9.848 12.58-.98.947 12.245-12.612.967z\"\n})), _path27 || (_path27 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M104.496 28.422c1.85.374 2.05-2.79.097-2.436a1.237 1.237 0 0 0-.097 2.436\"\n})), _path28 || (_path28 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#D1D3D4\",\n d: \"M104.793 28.764q-.183 0-.361-.039a1.47 1.47 0 0 1-1.244-1.489 1.61 1.61 0 0 1 1.347-1.579 1.4 1.4 0 0 1 1.508.567 1.76 1.76 0 0 1-.052 1.934 1.4 1.4 0 0 1-1.198.606m-.2-.645a.81.81 0 0 0 .902-.328 1.15 1.15 0 0 0 .039-1.192.78.78 0 0 0-.851-.284.99.99 0 0 0-.818.953.827.827 0 0 0 .728.851M41.382 110.613a5.2 5.2 0 0 0-.747-3.106 25 25 0 0 1-1.573-1.972c-.644-1.289-.2-2.752-.354-4.138a4.96 4.96 0 0 0-1.644-3.087c-.818-.735-1.869-1.237-2.655-2.005-1.289-1.25-1.65-3.016-2.378-4.582a11.96 11.96 0 0 0-5.156-5.349c1.398 2.494-1.785 5.665-.342 8.14.458.78 1.328 1.353 1.663 2.185.812 2.004-1.882 4.176-1.024 6.167.431.993 1.636 1.567 2.19 2.507.755 1.289.162 2.81.226 4.248.084 1.978 1.444 3.744 3.055 5.117 1.005.851 2.12 1.592 3.223 2.359 1.288.921 1.85 1.894 2.99.412a11.77 11.77 0 0 0 2.526-6.896M44.282 111.548c-.419-1.534-.715-3.191 0-4.634.8-1.637 2.778-2.791 3.01-4.557.154-1.16-.51-2.333-.252-3.474.258-1.14 1.29-1.933 2.185-2.764a10.96 10.96 0 0 0 3.37-7.09 17.5 17.5 0 0 1 3.223 4.705 5.44 5.44 0 0 1-.47 5.31c-.327.352-.6.75-.812 1.18-.393 1.128.696 2.178 1.289 3.222a3.39 3.39 0 0 1-.393 3.835c-1.141 1.289-3.339 1.753-3.867 3.287a7 7 0 0 0-.2 1.747 5.34 5.34 0 0 1-4.15 4.395c-1.354.284-1.29-.187-1.567-1.192-.412-1.315-.992-2.623-1.366-3.97M39.99 100.54c-.961-2.94-1.348-6.014-2.353-8.94a46.5 46.5 0 0 0-3.139-6.663l4.112 1.533c1.289.497 2.745 1.077 3.37 2.217 1.083 1.992-.863 4.544.271 6.51q.747.968 1.63 1.81c1.212 1.509 1.026 3.584.362 5.337-.284.754-1.534 4.66-2.65 3.577-.444-.438-.483-2.056-.644-2.649-.309-.915-.663-1.817-.96-2.732\"\n})), _path29 || (_path29 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#D1D3D4\",\n d: \"M39.396 127.737c-.721-5.317-1.347-9.932-1.353-10.009l-.645.084c0 .077.645 4.64 1.341 9.925zM44.953 127.737c.883-6.87 1.798-11.968 2.314-12.535l-.477-.432c-.715.786-1.682 6.748-2.481 12.967zM44.166 127.737c-.703-12.419-1.934-24.742-1.934-24.903l-.644.064c0 .162 1.289 12.452 1.933 24.839z\"\n})), _path30 || (_path30 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#D1D3D4\",\n d: \"M33.004 120.357H51.23l-1.289 13.702c-.22 2.372-2.874 4.215-6.071 4.215h-3.525c-3.223 0-5.852-1.843-6.078-4.215z\"\n})));\nexport { SvgNoResults as ReactComponent };\nexport default __webpack_public_path__ + \"ed7056d288478ea8a9e4f94e04cc20f5.svg\";","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Alert, Stack } from '@openedx/paragon';\n\nimport { useSearchContext } from './manager/SearchManager';\nimport EmptySearchImage from './images/empty-search.svg';\nimport NoResultImage from './images/no-results.svg';\nimport messages from './messages';\n\nconst InfoMessage = ({ title, subtitle, image }) => (\n \n

\n

\n \"\"\n
\n);\n\n/**\n * If the user hasn't put any keywords/filters yet, display an \"empty state\".\n * Likewise, if the results are empty (0 results), display a special message.\n * Otherwise, display the results, which are assumed to be the children prop.\n * @type {React.FC<{children: React.ReactElement}>}\n */\nconst EmptyStates = ({ children }) => {\n const {\n canClearFilters: hasFiltersApplied,\n totalHits,\n searchKeywords,\n hasError,\n } = useSearchContext();\n const hasQuery = !!searchKeywords;\n\n if (hasError) {\n return (\n \n \n \n );\n }\n if (!hasQuery && !hasFiltersApplied) {\n // We haven't started the search yet. Display the \"start your search\" empty state\n return (\n \n );\n }\n if (totalHits === 0) {\n return (\n \n );\n }\n\n return children;\n};\n\nexport default EmptyStates;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n sidebarTitleDraftNeverPublished: {\n id: 'course-authoring.course-unit.sidebar.title.draft.never-published',\n defaultMessage: 'Draft (never published)',\n },\n sidebarTitleVisibleToStaffOnly: {\n id: 'course-authoring.course-unit.sidebar.title.visible.to-staff-only',\n defaultMessage: 'Visible to staff only',\n },\n sidebarTitlePublishedAndLive: {\n id: 'course-authoring.course-unit.sidebar.title.published.live',\n defaultMessage: 'Published and live',\n },\n sidebarTitleDraftUnpublishedChanges: {\n id: 'course-authoring.course-unit.sidebar.title.draft.unpublished',\n defaultMessage: 'Draft (unpublished changes)',\n },\n sidebarTitlePublishedNotYetReleased: {\n id: 'course-authoring.course-unit.sidebar.title.published.not-yet-released',\n defaultMessage: 'Published (not yet released)',\n },\n sidebarHeaderUnitLocationTitle: {\n id: 'course-authoring.course-unit.sidebar.header.unit-location.title',\n defaultMessage: 'Unit location',\n },\n sidebarBodyNote: {\n id: 'course-authoring.course-unit.sidebar.body.note',\n defaultMessage: 'Note: Do not hide graded assignments after they have been released.',\n },\n publishInfoPreviouslyPublished: {\n id: 'course-authoring.course-unit.publish.info.previously-published',\n defaultMessage: 'Previously published',\n },\n publishInfoDraftSaved: {\n id: 'course-authoring.course-unit.publish.info.draft.saved',\n defaultMessage: 'Draft saved on {editedOn} by {editedBy}',\n },\n publishLastPublished: {\n id: 'course-authoring.course-unit.publish.info.last.published',\n defaultMessage: 'Last published {publishedOn} by {publishedBy}',\n },\n releaseInfoUnscheduled: {\n id: 'course-authoring.course-unit.release.info.unscheduled',\n defaultMessage: 'Unscheduled',\n },\n releaseInfoWithSection: {\n id: 'course-authoring.course-unit.release.info.with-unit',\n defaultMessage: 'with {sectionName}',\n },\n visibilityIsVisibleToTitle: {\n id: 'course-authoring.course-unit.visibility.is-visible-to.title',\n defaultMessage: 'IS VISIBLE TO',\n },\n visibilityWillBeVisibleToTitle: {\n id: 'course-authoring.course-unit.visibility.will-be-visible-to.title',\n defaultMessage: 'WILL BE VISIBLE TO',\n },\n unitLocationTitle: {\n id: 'course-authoring.course-unit.unit-location.title',\n defaultMessage: 'LOCATION ID',\n },\n unitLocationDescription: {\n id: 'course-authoring.course-unit.unit-location.description',\n defaultMessage: 'To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value',\n },\n visibilityCheckboxTitle: {\n id: 'course-authoring.course-unit.visibility.checkbox.title',\n defaultMessage: 'Hide from learners',\n },\n visibilityStaffOnlyTitle: {\n id: 'course-authoring.course-unit.visibility.staff-only.title',\n defaultMessage: 'Staff only',\n },\n visibilityStaffAndLearnersTitle: {\n id: 'course-authoring.course-unit.visibility.staff-and-learners.title',\n defaultMessage: 'Staff and learners',\n },\n visibilityHasExplicitStaffLockText: {\n id: 'course-authoring.course-unit.visibility.has-explicit-staff-lock.text',\n defaultMessage: 'with {sectionName}',\n },\n actionButtonPublishTitle: {\n id: 'course-authoring.course-unit.action-buttons.publish.title',\n defaultMessage: 'Publish',\n },\n actionButtonDiscardChangesTitle: {\n id: 'course-authoring.course-unit.action-button.discard-changes.title',\n defaultMessage: 'Discard changes',\n },\n actionButtonCopyUnitTitle: {\n id: 'course-authoring.course-unit.action-button.copy-unit.title',\n defaultMessage: 'Copy unit',\n },\n releaseStatusTitle: {\n id: 'course-authoring.course-unit.status.release.title',\n defaultMessage: 'RELEASE',\n },\n releasedStatusTitle: {\n id: 'course-authoring.course-unit.status.released.title',\n defaultMessage: 'RELEASED',\n },\n scheduledStatusTitle: {\n id: 'course-authoring.course-unit.status.scheduled.title',\n defaultMessage: 'SCHEDULED',\n },\n modalDiscardUnitChangesTitle: {\n id: 'course-authoring.course-unit.modal.discard-unit-changes.title',\n defaultMessage: 'Discard changes',\n },\n modalDiscardUnitChangesActionButtonText: {\n id: 'course-authoring.course-unit.modal.discard-unit-changes.btn.action.text',\n defaultMessage: 'Discard changes',\n },\n modalDiscardUnitChangesCancelButtonText: {\n id: 'course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text',\n defaultMessage: 'Cancel',\n },\n modalDiscardUnitChangesDescription: {\n id: 'course-authoring.course-unit.modal.discard-unit-changes.description',\n defaultMessage: 'Are you sure you want to revert to the last published version of the unit? You cannot undo this action.',\n },\n modalMakeVisibilityTitle: {\n id: 'course-authoring.course-unit.modal.make-visibility.title',\n defaultMessage: 'Make visible to students',\n },\n modalMakeVisibilityActionButtonText: {\n id: 'course-authoring.course-unit.modal.make-visibility.btn.action.text',\n defaultMessage: 'Make visible to students',\n },\n modalMakeVisibilityCancelButtonText: {\n id: 'course-authoring.course-unit.modal.make-visibility.btn.cancel.text',\n defaultMessage: 'Cancel',\n },\n modalMakeVisibilityDescription: {\n id: 'course-authoring.course-unit.modal.make-visibility.description',\n defaultMessage: 'If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?',\n },\n});\n\nexport default messages;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.course-unit.add.component.title',\n defaultMessage: 'Add a new component',\n },\n buttonText: {\n id: 'course-authoring.course-unit.add.component.button.text',\n defaultMessage: 'Add Component:',\n },\n modalBtnText: {\n id: 'course-authoring.course-unit.modal.button.text',\n defaultMessage: 'Select',\n },\n modalContainerTitle: {\n id: 'course-authoring.course-unit.modal.container.title',\n defaultMessage: 'Add {componentTitle} component',\n },\n modalContainerCancelBtnText: {\n id: 'course-authoring.course-unit.modal.container.cancel.button.text',\n defaultMessage: 'Cancel',\n },\n modalComponentSupportLabelFullySupported: {\n id: 'course-authoring.course-unit.modal.component.support.label.fully-supported',\n defaultMessage: 'Fully supported',\n description: 'Label for advance problem type\\'s support status with full platform support',\n },\n modalComponentSupportLabelProvisionallySupported: {\n id: 'course-authoring.course-unit.modal.component.support.label.provisionally-support',\n defaultMessage: 'Provisionally supported',\n description: 'Label for advance problem type\\'s support status with provisional platform support',\n },\n modalComponentSupportLabelNotSupported: {\n id: 'course-authoring.course-unit.modal.component.support.label.not-supported',\n defaultMessage: 'Not supported',\n description: 'Label for advance problem type\\'s support status with no platform support',\n },\n modalComponentSupportTooltipFullySupported: {\n id: 'course-authoring.course-unit.modal.component.support.tooltip.fully-supported',\n defaultMessage: 'Fully supported tools and features are available on edX, are '\n + 'fully tested, have user interfaces where applicable, and are documented in the '\n + 'official edX guides that are available on docs.edx.org.',\n description: 'Message for support status tooltip for modules with full platform support',\n },\n modalComponentSupportTooltipNotSupported: {\n id: 'course-authoring.course-unit.modal.component.support.tooltip.not-supported',\n defaultMessage: 'Tools with no support are not maintained by edX, and might be '\n + 'deprecated in the future. They are not recommended for use in courses due to '\n + 'non-compliance with one or more of the base requirements, such as testing, '\n + 'accessibility, internationalization, and documentation.',\n description: 'Message for support status tooltip for modules which is not supported',\n },\n modalComponentSupportTooltipProvisionallySupported: {\n id: 'course-authoring.course-unit.modal.component.support.tooltip.provisionally-support',\n defaultMessage: 'Provisionally supported tools might lack the robustness of functionality '\n + 'that your courses require. edX does not have control over the quality of the software, '\n + 'or of the content that can be provided using these tools. Test these tools thoroughly '\n + 'before using them in your course, especially in graded sections. Complete documentation '\n + 'might not be available for provisionally supported tools, or documentation might be '\n + 'available from sources other than edX.',\n description: 'Message for support status tooltip for modules with provisional platform support',\n },\n});\n\nexport default messages;\n","import {\n BackHand as BackHandIcon,\n BookOpen as BookOpenIcon,\n Edit as EditIcon,\n EditNote as EditNoteIcon,\n FormatListBulleted as FormatListBulletedIcon,\n HelpOutline as HelpOutlineIcon,\n LibraryAdd as LibraryIcon,\n Lock as LockIcon,\n QuestionAnswerOutline as QuestionAnswerOutlineIcon,\n Science as ScienceIcon,\n TextFields as TextFieldsIcon,\n VideoCamera as VideoCameraIcon,\n} from '@openedx/paragon/icons';\n\nimport messages from './sidebar/messages';\nimport addComponentMessages from './add-component/messages';\n\nexport const UNIT_ICON_TYPES = ['video', 'other', 'vertical', 'problem', 'lock'];\n\nexport const COMPONENT_TYPES = {\n advanced: 'advanced',\n discussion: 'discussion',\n library: 'library',\n html: 'html',\n openassessment: 'openassessment',\n problem: 'problem',\n video: 'video',\n dragAndDrop: 'drag-and-drop-v2',\n};\n\nexport const TYPE_ICONS_MAP = {\n video: VideoCameraIcon,\n other: BookOpenIcon,\n vertical: FormatListBulletedIcon,\n problem: EditIcon,\n lock: LockIcon,\n};\n\nexport const COMPONENT_TYPE_ICON_MAP = {\n [COMPONENT_TYPES.advanced]: ScienceIcon,\n [COMPONENT_TYPES.discussion]: QuestionAnswerOutlineIcon,\n [COMPONENT_TYPES.library]: LibraryIcon,\n [COMPONENT_TYPES.html]: TextFieldsIcon,\n [COMPONENT_TYPES.openassessment]: EditNoteIcon,\n [COMPONENT_TYPES.problem]: HelpOutlineIcon,\n [COMPONENT_TYPES.video]: VideoCameraIcon,\n [COMPONENT_TYPES.dragAndDrop]: BackHandIcon,\n};\n\nexport const getUnitReleaseStatus = (intl) => ({\n release: intl.formatMessage(messages.releaseStatusTitle),\n released: intl.formatMessage(messages.releasedStatusTitle),\n scheduled: intl.formatMessage(messages.scheduledStatusTitle),\n});\n\nexport const UNIT_VISIBILITY_STATES = {\n staffOnly: 'staff_only',\n live: 'live',\n ready: 'ready',\n};\n\nexport const ICON_COLOR_VARIANTS = {\n BLACK: '#000',\n GREEN: '#0D7D4D',\n};\n\nexport const PUBLISH_TYPES = {\n republish: 'republish',\n discardChanges: 'discard_changes',\n makePublic: 'make_public',\n};\n\nexport const getXBlockSupportMessages = (intl) => ({\n fs: { // Fully supported\n label: intl.formatMessage(addComponentMessages.modalComponentSupportLabelFullySupported),\n tooltip: intl.formatMessage(addComponentMessages.modalComponentSupportTooltipFullySupported),\n },\n ps: { // Provisionally supported\n label: intl.formatMessage(addComponentMessages.modalComponentSupportLabelProvisionallySupported),\n tooltip: intl.formatMessage(addComponentMessages.modalComponentSupportTooltipProvisionallySupported),\n },\n us: { // Not supported\n label: intl.formatMessage(addComponentMessages.modalComponentSupportLabelNotSupported),\n tooltip: intl.formatMessage(addComponentMessages.modalComponentSupportTooltipNotSupported),\n },\n});\n","export const getStudioHomeData = state => state.studioHome.studioHomeData;\nexport const getLoadingStatuses = (state) => state.studioHome.loadingStatuses;\nexport const getSavingStatuses = (state) => state.studioHome.savingStatuses;\nexport const getStudioHomeCoursesParams = (state) => state.studioHome.studioHomeCoursesRequestParams;\n","/* eslint-disable react/no-array-index-key */\n/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\n\nimport { highlightPostTag, highlightPreTag } from './data/api';\n\n/**\n * Render some text that contains matching words which should be highlighted\n * @type {React.FC<{text: string}>}\n */\nconst Highlight = ({ text }) => {\n const parts = text.split(highlightPreTag);\n return (\n \n {parts.map((part, idx) => {\n if (idx === 0) { return {part}; }\n const endIdx = part.indexOf(highlightPostTag);\n if (endIdx === -1) { return {part}; }\n const highLightPart = part.substring(0, endIdx);\n const otherPart = part.substring(endIdx + highlightPostTag.length);\n return {highLightPart}{otherPart};\n })}\n \n );\n};\n\nexport default Highlight;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { getConfig, getPath } from '@edx/frontend-platform';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Icon,\n IconButton,\n Stack,\n} from '@openedx/paragon';\nimport {\n Article,\n Folder,\n OpenInNew,\n} from '@openedx/paragon/icons';\nimport { useSelector } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\n\nimport { COMPONENT_TYPE_ICON_MAP, TYPE_ICONS_MAP } from '../course-unit/constants';\nimport { getStudioHomeData } from '../studio-home/data/selectors';\nimport { useSearchContext } from './manager/SearchManager';\nimport Highlight from './Highlight';\nimport messages from './messages';\n\nconst STRUCTURAL_TYPE_ICONS = {\n vertical: TYPE_ICONS_MAP.vertical,\n sequential: Folder,\n chapter: Folder,\n};\n\n/** @param {string} blockType */\nfunction getItemIcon(blockType) {\n return STRUCTURAL_TYPE_ICONS[blockType] ?? COMPONENT_TYPE_ICON_MAP[blockType] ?? Article;\n}\n\n/**\n * Returns the URL Suffix for library/library component hit\n * @param {import('./data/api').ContentHit} hit\n * @param {string} libraryAuthoringMfeUrl\n * @returns string\n*/\nfunction getLibraryHitUrl(hit, libraryAuthoringMfeUrl) {\n const { contextKey } = hit;\n return `${libraryAuthoringMfeUrl}library/${contextKey}`;\n}\n\n/**\n * Returns the URL Suffix for a unit hit\n * @param {import('./data/api').ContentHit} hit\n * @returns string\n*/\nfunction getUnitUrlSuffix(hit) {\n const { contextKey, usageKey } = hit;\n return `course/${contextKey}/container/${usageKey}`;\n}\n\n/**\n * Returns the URL Suffix for a unit component hit\n * @param {import('./data/api').ContentHit} hit\n * @returns string\n*/\nfunction getUnitComponentUrlSuffix(hit) {\n const { breadcrumbs, contextKey, usageKey } = hit;\n if (breadcrumbs.length > 1) {\n let parent = breadcrumbs[breadcrumbs.length - 1];\n\n if ('usageKey' in parent) {\n // Handle case for library component in unit\n let libComponentUsageKey;\n if (parent.usageKey.includes('type@library_content') && breadcrumbs.length > 2) {\n libComponentUsageKey = parent.usageKey;\n parent = breadcrumbs[breadcrumbs.length - 2];\n }\n\n if ('usageKey' in parent) {\n const encodedUsageKey = encodeURIComponent(libComponentUsageKey || usageKey);\n return `course/${contextKey}/container/${parent.usageKey}?show=${encodedUsageKey}`;\n }\n }\n }\n\n // istanbul ignore next - This case should never be reached\n return `course/${contextKey}`;\n}\n\n/**\n * Returns the URL Suffix for a course component hit\n * @param {import('./data/api').ContentHit} hit\n * @returns string\n*/\nfunction getCourseComponentUrlSuffix(hit) {\n const { contextKey, usageKey } = hit;\n return `course/${contextKey}?show=${encodeURIComponent(usageKey)}`;\n}\n\n/**\n * Returns the URL Suffix for the search hit param\n * @param {import('./data/api').ContentHit} hit\n * @returns string\n*/\nfunction getUrlSuffix(hit) {\n const { blockType, breadcrumbs } = hit;\n\n // Check if is a unit\n if (blockType === 'vertical') {\n return getUnitUrlSuffix(hit);\n }\n\n // Check if the parent is a unit or a library component in a unit\n if (breadcrumbs.length > 1) {\n const parent = breadcrumbs[breadcrumbs.length - 1];\n\n if ('usageKey' in parent && (\n parent.usageKey.includes('type@vertical') || parent.usageKey.includes('type@library_content'))\n ) {\n return getUnitComponentUrlSuffix(hit);\n }\n }\n\n return getCourseComponentUrlSuffix(hit);\n}\n\n/**\n * A single search result (row), usually represents an XBlock/Component\n * @type {React.FC<{hit: import('./data/api').ContentHit}>}\n */\nconst SearchResult = ({ hit }) => {\n const intl = useIntl();\n const navigate = useNavigate();\n const { closeSearchModal } = useSearchContext();\n const { libraryAuthoringMfeUrl, redirectToLibraryAuthoringMfe } = useSelector(getStudioHomeData);\n\n const { usageKey } = hit;\n\n const noRedirectUrl = usageKey.startsWith('lb:') && !redirectToLibraryAuthoringMfe;\n\n /**\n * Returns the URL for the context of the hit\n */\n const getContextUrl = React.useCallback((newWindow = false) => {\n const { contextKey } = hit;\n\n if (contextKey.startsWith('course-v1:')) {\n const urlSuffix = getUrlSuffix(hit);\n\n if (newWindow) {\n return `${getPath(getConfig().PUBLIC_PATH)}${urlSuffix}`;\n }\n return `/${urlSuffix}`;\n }\n\n if (usageKey.startsWith('lb:')) {\n if (redirectToLibraryAuthoringMfe) {\n return getLibraryHitUrl(hit, libraryAuthoringMfeUrl);\n }\n }\n\n // No context URL for this hit (e.g. a library without library authoring mfe)\n return undefined;\n }, [libraryAuthoringMfeUrl, redirectToLibraryAuthoringMfe, hit]);\n\n /**\n * Opens the context of the hit in a new window\n * @param {React.MouseEvent} e\n * @returns {void}\n */\n const openContextInNewWindow = (e) => {\n e.stopPropagation();\n const newWindowUrl = getContextUrl(true);\n /* istanbul ignore next */\n if (!newWindowUrl) {\n return;\n }\n window.open(newWindowUrl, '_blank');\n };\n\n /**\n * Navigates to the context of the hit\n * @param {(React.MouseEvent | React.KeyboardEvent)} e\n * @returns {void}\n */\n const navigateToContext = React.useCallback((e) => {\n e.stopPropagation();\n const redirectUrl = getContextUrl();\n\n /* istanbul ignore next */\n if (!redirectUrl) {\n // This case is for the library authoring MFE\n return;\n }\n\n if ('key' in e && e.key !== 'Enter' && e.key !== ' ') {\n return;\n }\n\n /* istanbul ignore next */\n if (redirectUrl.startsWith('http')) {\n // This case is for the library authoring MFE\n window.location.href = redirectUrl;\n return;\n }\n\n navigate(redirectUrl);\n closeSearchModal();\n }, [getContextUrl]);\n\n return (\n \n \n \n
\n \n
\n
\n \n \n
\n
\n {hit.breadcrumbs.map(bc => bc.displayName).join(' / ')}\n
\n
\n \n \n );\n};\n\nexport default SearchResult;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { StatefulButton } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { useSearchContext } from './manager/SearchManager';\nimport SearchResult from './SearchResult';\nimport messages from './messages';\n\n/**\n * All of the single results (\"hits\"), based on the user's search.\n *\n * Uses \"infinite pagination\" to load more pages as needed (if users click the\n * \"Show more results\" button).\n *\n * @type {React.FC>}\n */\nconst SearchResults = () => {\n const intl = useIntl();\n const {\n hits,\n hasNextPage,\n isFetchingNextPage,\n fetchNextPage,\n } = useSearchContext();\n\n const labels = {\n default: intl.formatMessage(messages.showMoreResults),\n pending: intl.formatMessage(messages.loadingMoreResults),\n };\n\n return (\n <>\n {hits.map((hit) => )}\n {hasNextPage\n ? (\n \n ) : null}\n \n );\n};\n\nexport default SearchResults;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { SearchField } from '@openedx/paragon';\nimport messages from './messages';\nimport { useSearchContext } from './manager/SearchManager';\n\n/**\n * The \"main\" input field where users type in search keywords. The search happens as they type (no need to press enter).\n * @type {React.FC<{className?: string}>}\n */\nconst SearchKeywordsField = (props) => {\n const intl = useIntl();\n const { searchKeywords, setSearchKeywords } = useSearchContext();\n\n return (\n setSearchKeywords('')}\n value={searchKeywords}\n className={props.className}\n >\n \n \n \n \n \n );\n};\n\nexport default SearchKeywordsField;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { ArrowDropDown } from '@openedx/paragon/icons';\nimport {\n Badge,\n Button,\n ModalPopup,\n useToggle,\n} from '@openedx/paragon';\n\n/**\n * A button that represents a filter on the search.\n * If the filter is active, the button displays the currently applied values.\n * So when no filter is active it may look like:\n * [ Type ▼ ]\n * Or when a filter is active and limited to two values, it may look like:\n * [ Type: HTML, +1 ▼ ]\n *\n * When clicked, the button will display a dropdown menu containing this\n * element's `children`. So use this to wrap a etc.\n *\n * @type {React.FC<{appliedFilters: {label: React.ReactNode}[], label: React.ReactNode, children: React.ReactNode}>}\n */\nconst SearchFilterWidget = ({ appliedFilters, ...props }) => {\n const [isOpen, open, close] = useToggle(false);\n const [target, setTarget] = React.useState(null);\n\n return (\n <>\n
\n \n {props.label}\n {appliedFilters.length >= 1 ? <>: {appliedFilters[0].label} : null}\n {appliedFilters.length > 1 ? <>, +{appliedFilters.length - 1} : null}\n \n
\n \n \n {props.children}\n \n \n \n );\n};\n\nexport default SearchFilterWidget;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport messages from './messages';\n\n/**\n * Displays a friendly, localized text name for the given XBlock/component type\n * e.g. `vertical` becomes `\"Unit\"`\n * @type {React.FC<{type: string}>}\n */\nconst BlockTypeLabel = ({ type }) => {\n // TODO: Load the localized list of Component names from Studio REST API?\n const msg = messages[`blockType.${type}`];\n\n if (msg) {\n return ;\n }\n // Replace underscores and hypens with spaces, then let the browser capitalize this\n // in a locale-aware way to get a reasonable display value.\n // e.g. 'drag-and-drop-v2' -> \"Drag And Drop V2\"\n return {type.replace(/[_-]/g, ' ')};\n};\n\nexport default BlockTypeLabel;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport {\n Badge,\n Form,\n Menu,\n MenuItem,\n} from '@openedx/paragon';\nimport SearchFilterWidget from './SearchFilterWidget';\nimport messages from './messages';\nimport BlockTypeLabel from './BlockTypeLabel';\nimport { useSearchContext } from './manager/SearchManager';\n\n/**\n * A button with a dropdown that allows filtering the current search by component type (XBlock type)\n * e.g. Limit results to \"Text\" (html) and \"Problem\" (problem) components.\n * The button displays the first type selected, and a count of how many other types are selected, if more than one.\n * @type {React.FC>}\n */\nconst FilterByBlockType = () => {\n const {\n blockTypes,\n blockTypesFilter,\n setBlockTypesFilter,\n } = useSearchContext();\n\n // Sort blocktypes in order of hierarchy followed by alphabetically for components\n const sortedBlockTypeKeys = Object.keys(blockTypes).sort((a, b) => {\n const order = {\n chapter: 1,\n sequential: 2,\n vertical: 3,\n };\n\n // If both blocktypes are in the order dictionary, sort them based on the order defined\n if (order[a] && order[b]) {\n return order[a] - order[b];\n }\n\n // If only blocktype 'a' is in the order dictionary, place it before 'b'\n if (order[a]) {\n return -1;\n }\n\n // If only blocktype 'b' is in the order dictionary, place it before 'a'\n if (order[b]) {\n return 1;\n }\n\n // If neither blocktype is in the order dictionary, sort alphabetically\n return a.localeCompare(b);\n });\n\n // Rebuild sorted blocktypes dictionary\n const sortedBlockTypes = {};\n sortedBlockTypeKeys.forEach(key => {\n sortedBlockTypes[key] = blockTypes[key];\n });\n\n const handleCheckboxChange = React.useCallback((e) => {\n setBlockTypesFilter(currentFilters => {\n if (currentFilters.includes(e.target.value)) {\n return currentFilters.filter(x => x !== e.target.value);\n }\n return [...currentFilters, e.target.value];\n });\n }, [setBlockTypesFilter]);\n\n return (\n ({ label: }))}\n label={}\n >\n \n \n \n {\n Object.entries(sortedBlockTypes).map(([blockType, count]) => (\n \n {' '}\n {count}\n \n ))\n }\n {\n // Show a message if there are no options at all to avoid the impression that the dropdown isn't working\n sortedBlockTypes.length === 0 ? (\n \n ) : null\n }\n \n \n \n \n );\n};\n\nexport default FilterByBlockType;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Badge,\n Form,\n Icon,\n IconButton,\n Menu,\n MenuItem,\n SearchField,\n} from '@openedx/paragon';\nimport { ArrowDropDown, ArrowDropUp, Warning } from '@openedx/paragon/icons';\nimport SearchFilterWidget from './SearchFilterWidget';\nimport messages from './messages';\nimport { useSearchContext } from './manager/SearchManager';\nimport { useTagFilterOptions } from './data/apiHooks';\nimport { LoadingSpinner } from '../generic/Loading';\nimport { TAG_SEP } from './data/api';\n\n/**\n * A menu item with a checkbox and an optional ▼ button (to show/hide children)\n * @type {React.FC<{\n * label: string;\n * tagPath: string;\n * isChecked: boolean;\n * onClickCheckbox: () => void;\n * tagCount: number;\n * hasChildren?: boolean;\n * isExpanded?: boolean;\n * onToggleChildren?: (tagPath: string) => void;\n * }>}\n */\nconst TagMenuItem = ({\n label,\n tagPath,\n tagCount,\n isChecked,\n onClickCheckbox,\n hasChildren,\n isExpanded,\n onToggleChildren,\n}) => {\n const intl = useIntl();\n const randomNumber = React.useMemo(() => Math.floor(Math.random() * 1000), []);\n const checkboxId = tagPath.replace(/[\\W]/g, '_') + randomNumber;\n\n return (\n
\n \n \n {\n hasChildren\n ? (\n onToggleChildren?.(tagPath)}\n variant=\"primary\"\n size=\"sm\"\n />\n ) : null\n }\n
\n );\n};\n\n/**\n * A list of menu items with all of the options for tags at one level of the hierarchy.\n * @type {React.FC<{\n * tagSearchKeywords: string;\n * parentTagPath?: string;\n * toggleTagChildren?: (tagPath: string) => void;\n * expandedTags: string[],\n * }>}\n */\nconst TagOptions = ({\n parentTagPath = '',\n tagSearchKeywords,\n expandedTags,\n toggleTagChildren,\n}) => {\n const searchContext = useSearchContext();\n const { data, isLoading, isError } = useTagFilterOptions({\n ...searchContext,\n parentTagPath,\n tagSearchKeywords,\n });\n\n if (isError) {\n return ;\n }\n if (isLoading || data.tags === undefined) {\n return ;\n }\n\n // Show a message if there are no options at all to avoid the impression that the dropdown isn't working\n if (data.tags.length === 0 && !parentTagPath) {\n return ;\n }\n\n return (\n
\n {\n data.tags.map(({ tagName, tagPath, ...t }) => {\n const isExpanded = expandedTags.includes(tagPath);\n return (\n \n {\n searchContext.setTagsFilter((tf) => (\n tf.includes(tagPath) ? tf.filter(tp => tp !== tagPath) : [...tf, tagPath]\n ));\n }}\n hasChildren={t.hasChildren}\n isExpanded={isExpanded}\n onToggleChildren={toggleTagChildren}\n />\n {isExpanded ? (\n
\n \n
\n ) : null}\n
\n );\n })\n }\n {\n // Sometimes, due to limitations of how the search index/API works, we aren't able to retrieve all the options:\n data.mayBeMissingResults\n ? (\n \n \n \n ) : null\n }\n
\n );\n};\n\n/** @type {React.FC} */\nconst FilterByTags = () => {\n const intl = useIntl();\n const { tagsFilter } = useSearchContext();\n const [tagSearchKeywords, setTagSearchKeywords] = React.useState('');\n\n // e.g. {\"Location\", \"Location > North America\"} if those two paths of the tag tree are expanded\n const [expandedTags, setExpandedTags] = React.useState(/** @type {string[]} */([]));\n const toggleTagChildren = React.useCallback(tagWithLineage => {\n setExpandedTags(currentList => {\n if (currentList.includes(tagWithLineage)) {\n return currentList.filter(x => x !== tagWithLineage);\n }\n return [...currentList, tagWithLineage];\n });\n }, [setExpandedTags]);\n\n return (\n ({ label: tf.split(TAG_SEP).pop() }))}\n label={}\n >\n \n setTagSearchKeywords('')}\n value={tagSearchKeywords}\n screenReaderText={{\n label: intl.formatMessage(messages.searchTagsByKeywordPlaceholder),\n submitButton: intl.formatMessage(messages.submitSearchTagsByKeyword),\n }}\n placeholder={intl.formatMessage(messages.searchTagsByKeywordPlaceholder)}\n className=\"mx-3 mb-1\"\n />\n \n \n \n \n \n );\n};\n\nexport default FilterByTags;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport messages from './messages';\nimport { useSearchContext } from './manager/SearchManager';\n\n/**\n * Simple component that displays the # of matching results\n * @type {React.FC>}\n */\nconst Stats = () => {\n const { totalHits, searchKeywords, canClearFilters } = useSearchContext();\n\n if (!searchKeywords && !canClearFilters) {\n // We haven't started the search yet.\n return null;\n }\n\n return (\n \n );\n};\n\nexport default Stats;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport {\n MenuItem,\n ModalDialog,\n SelectMenu,\n} from '@openedx/paragon';\nimport { Check } from '@openedx/paragon/icons';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\n\nimport ClearFiltersButton from './ClearFiltersButton';\nimport EmptyStates from './EmptyStates';\nimport SearchResults from './SearchResults';\nimport SearchKeywordsField from './SearchKeywordsField';\nimport FilterByBlockType from './FilterByBlockType';\nimport FilterByTags from './FilterByTags';\nimport Stats from './Stats';\nimport { SearchContextProvider } from './manager/SearchManager';\nimport messages from './messages';\n\n/** @type {React.FC<{courseId: string, closeSearchModal?: () => void}>} */\nconst SearchUI = (props) => {\n const hasCourseId = Boolean(props.courseId);\n const [_searchThisCourseEnabled, setSearchThisCourse] = React.useState(hasCourseId);\n const switchToThisCourse = React.useCallback(() => setSearchThisCourse(true), []);\n const switchToAllCourses = React.useCallback(() => setSearchThisCourse(false), []);\n const searchThisCourse = hasCourseId && _searchThisCourseEnabled;\n\n return (\n \n {/* We need to override z-index here or the appears behind the \n * But it can't be more then 9 because the close button has z-index 10. */}\n \n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n
\n
\n
\n \n \n {/* If there are no results (yet), EmptyStates displays a friendly messages. Otherwise we see the results. */}\n \n \n \n \n \n );\n};\n\nexport default SearchUI;\n","/* eslint-disable react/prop-types */\n// @ts-check\nimport React from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { ModalDialog } from '@openedx/paragon';\n\nimport messages from './messages';\nimport SearchUI from './SearchUI';\n\n/** @type {React.FC<{courseId: string, isOpen: boolean, onClose: () => void}>} */\nconst SearchModal = ({ courseId, ...props }) => {\n const intl = useIntl();\n const title = intl.formatMessage(messages.title);\n\n return (\n \n \n \n );\n};\n\nexport default SearchModal;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n 'header.links.content': {\n id: 'header.links.content',\n defaultMessage: 'Content',\n description: 'Label for Content menu trigger',\n },\n 'header.links.settings': {\n id: 'header.links.settings',\n defaultMessage: 'Settings',\n description: 'Label for Settings menu trigger',\n },\n 'header.links.tools': {\n id: 'header.links.content.tools',\n defaultMessage: 'Tools',\n description: 'Label for Tools menu trigger',\n },\n 'header.links.outline': {\n id: 'header.links.outline',\n defaultMessage: 'Outline',\n description: 'Link to Studio Outline page',\n },\n 'header.links.updates': {\n id: 'header.links.updates',\n defaultMessage: 'Updates',\n description: 'Link to Studio Updates page',\n },\n 'header.links.pages': {\n id: 'header.links.pages',\n defaultMessage: 'Pages & Resources',\n description: 'Link to Studio Pages page',\n },\n 'header.links.filesAndUploads': {\n id: 'header.links.filesAndUploads',\n defaultMessage: 'Files',\n description: 'Link to Studio Files page',\n },\n 'header.links.textbooks': {\n id: 'header.links.textbooks',\n defaultMessage: 'Textbooks',\n description: 'Link to Studio Textbooks page',\n },\n 'header.links.videoUploads': {\n id: 'header.links.videoUploads',\n defaultMessage: 'Videos',\n description: 'Link to Studio Video Uploads page',\n },\n 'header.links.scheduleAndDetails': {\n id: 'header.links.scheduleAndDetails',\n defaultMessage: 'Schedule & Details',\n description: 'Link to Studio Schedule & Details page',\n },\n 'header.links.grading': {\n id: 'header.links.grading',\n defaultMessage: 'Grading',\n description: 'Link to Studio Grading page',\n },\n 'header.links.courseTeam': {\n id: 'header.links.courseTeam',\n defaultMessage: 'Course Team',\n description: 'Link to Studio Course Team page',\n },\n 'header.links.groupConfigurations': {\n id: 'header.links.groupConfigurations',\n defaultMessage: 'Group Configurations',\n description: 'Link to Studio Group Configurations page',\n },\n 'header.links.proctoredExamSettings': {\n id: 'header.links.proctoredExamSettings',\n defaultMessage: 'Proctored Exam Settings',\n description: 'Link to Studio Proctored Exam Settings page',\n },\n 'header.links.advancedSettings': {\n id: 'header.links.advancedSettings',\n defaultMessage: 'Advanced Settings',\n description: 'Link to Studio Advanced Settings page',\n },\n 'header.links.certificates': {\n id: 'header.links.certificates',\n defaultMessage: 'Certificates',\n description: 'Link to Studio Certificates page',\n },\n 'header.links.publisher': {\n id: 'header.links.publisher',\n defaultMessage: 'Publisher',\n description: 'Link to Publisher',\n },\n 'header.links.import': {\n id: 'header.links.import',\n defaultMessage: 'Import',\n description: 'Link to Studio Import page',\n },\n 'header.links.exportCourse': {\n id: 'header.links.exportCourse',\n defaultMessage: 'Export Course',\n description: 'Link to Studio Export page',\n },\n 'header.links.exportTags': {\n id: 'header.links.exportTags',\n defaultMessage: 'Export Tags',\n description: 'Download course content tags as CSV',\n },\n 'header.links.checklists': {\n id: 'header.links.checklists',\n defaultMessage: 'Checklists',\n description: 'Link to Studio Checklists page',\n },\n 'header.user.menu.studio': {\n id: 'header.user.menu.studio',\n defaultMessage: 'Studio Home',\n description: 'Link to Studio Home',\n },\n 'header.user.menu.maintenance': {\n id: 'header.user.menu.maintenance',\n defaultMessage: 'Maintenance',\n description: 'Link to the Studio maintenance page',\n },\n 'header.user.menu.logout': {\n id: 'header.user.menu.logout',\n defaultMessage: 'Logout',\n description: 'Logout link',\n },\n 'header.label.account.menu': {\n id: 'header.label.account.menu',\n defaultMessage: 'Account Menu',\n description: 'The aria label for the account menu trigger',\n },\n 'header.label.account.menu.for': {\n id: 'header.label.account.menu.for',\n defaultMessage: 'Account menu for {username}',\n description: 'The aria label for the account menu trigger when the username is displayed in it',\n },\n 'header.label.main.nav': {\n id: 'header.label.main.nav',\n defaultMessage: 'Main',\n description: 'The aria label for the main menu nav',\n },\n 'header.label.main.menu': {\n id: 'header.label.main.menu',\n defaultMessage: 'Main Menu',\n description: 'The aria label for the main menu trigger',\n },\n 'header.label.main.header': {\n id: 'header.label.main.header',\n defaultMessage: 'Main',\n description: 'The aria label for the main header',\n },\n 'header.label.secondary.nav': {\n id: 'header.label.secondary.nav',\n defaultMessage: 'Secondary',\n description: 'The aria label for the secondary nav',\n },\n 'header.label.courseOutline': {\n id: 'header.label.courseOutline',\n defaultMessage: 'Back to course outline in Studio',\n description: 'The aria label for the link back to the Studio Course Outline',\n },\n});\n\nexport default messages;\n","import { getConfig } from '@edx/frontend-platform';\nimport { getPagePath } from '../utils';\nimport messages from './messages';\n\nexport const getContentMenuItems = ({ studioBaseUrl, courseId, intl }) => {\n const items = [\n {\n href: `${studioBaseUrl}/course/${courseId}`,\n title: intl.formatMessage(messages['header.links.outline']),\n },\n {\n href: `${studioBaseUrl}/course_info/${courseId}`,\n title: intl.formatMessage(messages['header.links.updates']),\n },\n {\n href: getPagePath(courseId, 'true', 'tabs'),\n title: intl.formatMessage(messages['header.links.pages']),\n },\n {\n href: `${studioBaseUrl}/assets/${courseId}`,\n title: intl.formatMessage(messages['header.links.filesAndUploads']),\n },\n ];\n if (getConfig().ENABLE_VIDEO_UPLOAD_PAGE_LINK_IN_CONTENT_DROPDOWN === 'true') {\n items.push({\n href: `${studioBaseUrl}/videos/${courseId}`,\n title: intl.formatMessage(messages['header.links.videoUploads']),\n });\n }\n\n return items;\n};\n\nexport const getSettingMenuItems = ({ studioBaseUrl, courseId, intl }) => ([\n {\n href: `${studioBaseUrl}/settings/details/${courseId}`,\n title: intl.formatMessage(messages['header.links.scheduleAndDetails']),\n },\n {\n href: `${studioBaseUrl}/settings/grading/${courseId}`,\n title: intl.formatMessage(messages['header.links.grading']),\n },\n {\n href: `${studioBaseUrl}/course_team/${courseId}`,\n title: intl.formatMessage(messages['header.links.courseTeam']),\n },\n {\n href: `${studioBaseUrl}/group_configurations/${courseId}`,\n title: intl.formatMessage(messages['header.links.groupConfigurations']),\n },\n {\n href: `${studioBaseUrl}/settings/advanced/${courseId}`,\n title: intl.formatMessage(messages['header.links.advancedSettings']),\n },\n {\n href: `${studioBaseUrl}/certificates/${courseId}`,\n title: intl.formatMessage(messages['header.links.certificates']),\n },\n]);\n\nexport const getToolsMenuItems = ({ studioBaseUrl, courseId, intl }) => ([\n {\n href: `${studioBaseUrl}/import/${courseId}`,\n title: intl.formatMessage(messages['header.links.import']),\n },\n {\n href: `${studioBaseUrl}/export/${courseId}`,\n title: intl.formatMessage(messages['header.links.exportCourse']),\n },\n ...(getConfig().ENABLE_TAGGING_TAXONOMY_PAGES === 'true'\n ? [{\n href: '#export-tags',\n title: intl.formatMessage(messages['header.links.exportTags']),\n }] : []\n ),\n {\n href: `${studioBaseUrl}/checklists/${courseId}`,\n title: intl.formatMessage(messages['header.links.checklists']),\n },\n]);\n","// @ts-check\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { getConfig } from '@edx/frontend-platform';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { StudioHeader } from '@edx/frontend-component-header';\nimport { useToggle } from '@openedx/paragon';\n\nimport SearchModal from '../search-modal/SearchModal';\nimport { getContentMenuItems, getSettingMenuItems, getToolsMenuItems } from './utils';\nimport messages from './messages';\n\nconst Header = ({\n courseId,\n courseOrg,\n courseNumber,\n courseTitle,\n isHiddenMainMenu,\n}) => {\n const intl = useIntl();\n\n const [isShowSearchModalOpen, openSearchModal, closeSearchModal] = useToggle(false);\n\n const studioBaseUrl = getConfig().STUDIO_BASE_URL;\n const meiliSearchEnabled = [true, 'true'].includes(getConfig().MEILISEARCH_ENABLED);\n const mainMenuDropdowns = [\n {\n id: `${intl.formatMessage(messages['header.links.content'])}-dropdown-menu`,\n buttonTitle: intl.formatMessage(messages['header.links.content']),\n items: getContentMenuItems({ studioBaseUrl, courseId, intl }),\n },\n {\n id: `${intl.formatMessage(messages['header.links.settings'])}-dropdown-menu`,\n buttonTitle: intl.formatMessage(messages['header.links.settings']),\n items: getSettingMenuItems({ studioBaseUrl, courseId, intl }),\n },\n {\n id: `${intl.formatMessage(messages['header.links.tools'])}-dropdown-menu`,\n buttonTitle: intl.formatMessage(messages['header.links.tools']),\n items: getToolsMenuItems({ studioBaseUrl, courseId, intl }),\n },\n ];\n const outlineLink = `${studioBaseUrl}/course/${courseId}`;\n\n return (\n <>\n \n { meiliSearchEnabled && (\n \n )}\n \n );\n};\n\nHeader.propTypes = {\n courseId: PropTypes.string,\n courseNumber: PropTypes.string,\n courseOrg: PropTypes.string,\n courseTitle: PropTypes.string,\n isHiddenMainMenu: PropTypes.bool,\n};\n\nHeader.defaultProps = {\n courseId: '',\n courseNumber: '',\n courseOrg: '',\n courseTitle: '',\n isHiddenMainMenu: false,\n};\n\nexport default Header;\n","import { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { addModel } from '../generic/model-store';\nimport { getCourseDetail } from './api';\nimport {\n updateStatus,\n updateCanChangeProviders,\n} from './slice';\nimport { RequestStatus } from './constants';\n\n/* eslint-disable import/prefer-default-export */\nexport function fetchCourseDetail(courseId) {\n return async (dispatch) => {\n dispatch(updateStatus({ courseId, status: RequestStatus.IN_PROGRESS }));\n\n try {\n const courseDetail = await getCourseDetail(courseId, getAuthenticatedUser().username);\n dispatch(updateStatus({ courseId, status: RequestStatus.SUCCESSFUL }));\n\n dispatch(addModel({ modelType: 'courseDetails', model: courseDetail }));\n dispatch(updateCanChangeProviders({\n canChangeProviders: getAuthenticatedUser().administrator || new Date(courseDetail.start) > new Date(),\n }));\n } catch (error) {\n if (error.response && error.response.status === 404) {\n dispatch(updateStatus({ courseId, status: RequestStatus.NOT_FOUND }));\n } else {\n dispatch(updateStatus({ courseId, status: RequestStatus.FAILED }));\n }\n }\n };\n}\n","/* eslint-disable import/prefer-default-export */\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nfunction normalizeCourseDetail(data) {\n return {\n id: data.course_id,\n ...camelCaseObject(data),\n };\n}\n\nexport async function getCourseDetail(courseId, username) {\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getConfig().LMS_BASE_URL}/api/courses/v1/courses/${courseId}?username=${username}`);\n\n return normalizeCourseDetail(data);\n}\n","import React from 'react';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Alert } from '@openedx/paragon';\n\nconst NotFoundAlert = () => (\n \n \n \n);\n\nexport default NotFoundAlert;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport {\n useLocation,\n} from 'react-router-dom';\nimport { StudioFooter } from '@edx/frontend-component-footer';\nimport Header from './header';\nimport { fetchCourseDetail } from './data/thunks';\nimport { useModel } from './generic/model-store';\nimport NotFoundAlert from './generic/NotFoundAlert';\nimport PermissionDeniedAlert from './generic/PermissionDeniedAlert';\nimport { getCourseAppsApiStatus } from './pages-and-resources/data/selectors';\nimport { RequestStatus } from './data/constants';\nimport Loading from './generic/Loading';\n\nconst AppHeader = ({\n courseNumber, courseOrg, courseTitle, courseId,\n}) => (\n \n);\n\nAppHeader.propTypes = {\n courseId: PropTypes.string.isRequired,\n courseNumber: PropTypes.string,\n courseOrg: PropTypes.string,\n courseTitle: PropTypes.string.isRequired,\n};\n\nAppHeader.defaultProps = {\n courseNumber: null,\n courseOrg: null,\n};\n\nconst CourseAuthoringPage = ({ courseId, children }) => {\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(fetchCourseDetail(courseId));\n }, [courseId]);\n\n const courseDetail = useModel('courseDetails', courseId);\n\n const courseNumber = courseDetail ? courseDetail.number : null;\n const courseOrg = courseDetail ? courseDetail.org : null;\n const courseTitle = courseDetail ? courseDetail.name : courseId;\n const courseAppsApiStatus = useSelector(getCourseAppsApiStatus);\n const courseDetailStatus = useSelector(state => state.courseDetail.status);\n const inProgress = courseDetailStatus === RequestStatus.IN_PROGRESS;\n const { pathname } = useLocation();\n const isEditor = pathname.includes('/editor');\n\n if (courseDetailStatus === RequestStatus.NOT_FOUND && !isEditor) {\n return (\n \n );\n }\n if (courseAppsApiStatus === RequestStatus.DENIED) {\n return (\n \n );\n }\n return (\n
\n {/* While V2 Editors are temporarily served from their own pages\n using url pattern containing /editor/,\n we shouldn't have the header and footer on these pages.\n This functionality will be removed in TNL-9591 */}\n {inProgress ? !isEditor && \n : (!isEditor && (\n \n )\n )}\n {children}\n {!inProgress && !isEditor && }\n
\n );\n};\n\nCourseAuthoringPage.propTypes = {\n children: PropTypes.node,\n courseId: PropTypes.string.isRequired,\n};\n\nCourseAuthoringPage.defaultProps = {\n children: null,\n};\n\nexport default CourseAuthoringPage;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n heading: {\n id: 'course-authoring.pages-resources.heading',\n defaultMessage: 'Pages & Resources',\n },\n settings: {\n id: 'course-authoring.pages-resources.resources.settings.button',\n defaultMessage: 'settings',\n },\n viewLiveButton: {\n id: 'course-authoring.pages-resources.viewLive.button',\n defaultMessage: 'View live',\n },\n errorShowingConfiguration: {\n id: 'course-authoring.pages-resources.courseAppPlugin.errorMessage',\n defaultMessage: 'An error occurred when loading the configuration UI for that app.',\n },\n enabled: {\n id: 'course-authoring.badge.enabled',\n defaultMessage: 'Enabled',\n },\n contentPermissions: {\n id: 'course-authoring.pages-resources.content-permissions.heading',\n defaultMessage: 'Content permissions',\n },\n});\n\nexport default messages;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n settings: {\n id: 'authoring.discussions.settings',\n defaultMessage: 'Settings',\n description: 'A label for the second step of the app configuration stepper.',\n },\n configure: {\n id: 'authoring.discussions.configure',\n defaultMessage: 'Configure discussions',\n },\n configureApp: {\n id: 'authoring.discussions.configure.app',\n defaultMessage: 'Configure {name}',\n },\n backButton: {\n id: 'authoring.discussions.backButton',\n defaultMessage: 'Back',\n description: 'Button allowing the user to return to discussion app selection.',\n },\n applyButton: {\n id: 'authoring.discussions.applyButton',\n defaultMessage: 'Apply',\n description: 'Button allowing the user to submit their discussion configuration.',\n },\n applyingButton: {\n id: 'authoring.discussions.applyingButton',\n defaultMessage: 'Applying',\n description: 'Button label when the discussion configuration is being submitted.',\n },\n appliedButton: {\n id: 'authoring.discussions.appliedButton',\n defaultMessage: 'Applied',\n description: 'Button label when the discussion configuration has been successfully submitted.',\n },\n noProviderSwitchAfterCourseStarted: {\n id: 'authoring.discussions.noProviderSwitchAfterCourseStarted',\n defaultMessage: \"Discussion provider can't be changed after course has started, please reach out to partner support.\",\n description: \"Informs the user that the provider can't be changed after the course has started.\",\n },\n providerSelection: {\n id: 'authoring.discussions.providerSelection',\n defaultMessage: 'Provider selection',\n description: 'A label for the first step of a wizard where the user chooses a discussion tool to configure.',\n },\n Incomplete: {\n id: 'authoring.discussions.Incomplete',\n defaultMessage: 'Incomplete',\n description: 'A description for the second step of the app configuration stepper.',\n },\n});\n\nexport default messages;\n","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nexport const DiscussionsContext = React.createContext({});\n\nconst DiscussionsProvider = ({ children, path }) => {\n const contextValue = useMemo(() => ({ path }), []);\n return (\n \n {children}\n \n );\n};\n\nDiscussionsProvider.propTypes = {\n children: PropTypes.node.isRequired,\n path: PropTypes.string.isRequired,\n};\n\nexport default DiscussionsProvider;\n","import { camelCaseObject, ensureConfig, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\nimport { v4 as uuid } from 'uuid';\nimport { DivisionSchemes } from '../../../data/constants';\n\nimport {\n checkStatus,\n endOfDayTime,\n getTime,\n mergeDateTime,\n normalizeDate,\n normalizeTime,\n sortRestrictedDatesByStatus,\n startOfDayTime,\n} from '../app-config-form/utils';\nimport { restrictedDatesStatus as constants } from './constants';\n\nensureConfig([\n 'STUDIO_BASE_URL',\n], 'Course Apps API service');\n\nfunction normalizeLtiConfig(data) {\n if (!data || Object.keys(data).length < 1) {\n return {};\n }\n\n return {\n consumerKey: data.lti_1p1_client_key,\n consumerSecret: data.lti_1p1_client_secret,\n launchUrl: data.lti_1p1_launch_url,\n };\n}\n\nexport function normalizeRestrictedDates(data) {\n if (!data || Object.keys(data).length < 1) {\n return [];\n }\n\n const normalizeData = data.map(([startDate, endDate]) => ({\n id: uuid(),\n startDate: normalizeDate(startDate),\n startTime: getTime(startDate),\n endDate: normalizeDate(endDate),\n endTime: getTime(endDate),\n status: checkStatus([startDate, endDate]),\n }));\n\n return [\n ...sortRestrictedDatesByStatus(normalizeData, constants.ACTIVE, 'desc'),\n ...sortRestrictedDatesByStatus(normalizeData, constants.UPCOMING, 'asc'),\n ...sortRestrictedDatesByStatus(normalizeData, constants.COMPLETE, 'desc'),\n ];\n}\n\nfunction normalizePluginConfig(data) {\n if (!data || Object.keys(data).length < 1) {\n return {};\n }\n\n const enableDivideByCohorts = data.always_divide_inline_discussions && data.division_scheme === 'cohort';\n const enableDivideCourseTopicsByCohorts = enableDivideByCohorts && data.divided_course_wide_discussions.length > 0;\n return {\n allowAnonymousPosts: data.allow_anonymous,\n allowAnonymousPostsPeers: data.allow_anonymous_to_peers,\n reportedContentEmailNotifications: data.reported_content_email_notifications,\n divisionScheme: data.division_scheme,\n alwaysDivideInlineDiscussions: data.always_divide_inline_discussions,\n restrictedDates: normalizeRestrictedDates(data.discussion_blackouts),\n allowDivisionByUnit: false,\n divideByCohorts: enableDivideByCohorts,\n divideCourseTopicsByCohorts: enableDivideCourseTopicsByCohorts,\n cohortsEnabled: data.available_division_schemes?.includes('cohort') || false,\n groupAtSubsection: data.group_at_subsection,\n };\n}\n\nfunction normalizePiiSharing(data) {\n return {\n piiSharing: data.pii_sharing_allowed,\n piiShareUsername: data.pii_sharing_allowed,\n piiShareEmail: data.pii_sharing_allowed,\n };\n}\n\nfunction normalizeAppConfig(data) {\n return {\n id: data.provider_type,\n ...normalizePluginConfig(data.plugin_configuration),\n ...normalizeLtiConfig(data.lti_configuration),\n };\n}\n\nfunction normalizeDiscussionTopic(data) {\n return Object.entries(data).map(([key, value]) => ({\n name: key,\n id: value.id,\n }));\n}\n\nfunction extractDiscussionTopicIds(data) {\n return Object.entries(\n data,\n // eslint-disable-next-line no-unused-vars\n ).map(([key, value]) => value.id);\n}\n\nfunction normalizeFeatures(data, apps) {\n if (!data || data.length < 1) {\n return [];\n }\n\n return camelCaseObject(\n data.filter((feature) => apps.map((app) => app.featureIds.includes(feature.id)).some((supported) => supported)),\n );\n}\n\nfunction normalizeProviders(data) {\n const apps = Object.entries(data.available).map(([key, app]) => ({\n id: key,\n messages: app.messages,\n featureIds: app.features,\n externalLinks: {\n learnMore: app.external_links.learn_more,\n configuration: app.external_links.configuration,\n general: app.external_links.general,\n accessibility: app.external_links.accessibility,\n contactEmail: app.external_links.contact_email,\n },\n hasFullSupport: app.has_full_support,\n adminOnlyConfig: !!app.admin_only_config,\n }));\n return {\n features: normalizeFeatures(data.features, apps),\n activeAppId: data.active,\n apps,\n };\n}\n\nfunction normalizeSettings(data) {\n return {\n enabled: data.enabled,\n enableInContext: data.enable_in_context,\n enableGradedUnits: data.enable_graded_units,\n unitLevelVisibility: data.unit_level_visibility,\n postingRestrictions: data.posting_restrictions,\n appConfig: normalizeAppConfig(data),\n piiConfig: normalizePiiSharing(data.lti_configuration),\n discussionTopicIds: data.plugin_configuration.discussion_topics\n ? extractDiscussionTopicIds(data.plugin_configuration.discussion_topics)\n : [],\n discussionTopics: data.plugin_configuration.discussion_topics\n ? normalizeDiscussionTopic(data.plugin_configuration.discussion_topics)\n : [],\n divideDiscussionIds: data.plugin_configuration.divided_course_wide_discussions,\n };\n}\n\nexport function denormalizeRestrictedDate(restrictedPeriod) {\n return [\n mergeDateTime(\n normalizeDate(restrictedPeriod.startDate),\n normalizeTime(startOfDayTime(restrictedPeriod.startTime)),\n ),\n mergeDateTime(\n normalizeDate(restrictedPeriod.endDate),\n normalizeTime(endOfDayTime(restrictedPeriod.endTime)),\n ),\n ];\n}\n\nfunction denormalizeData(courseId, appId, data) {\n const pluginConfiguration = {};\n\n if ('allowAnonymousPosts' in data) {\n pluginConfiguration.allow_anonymous = data.allowAnonymousPosts;\n }\n if ('allowAnonymousPostsPeers' in data) {\n pluginConfiguration.allow_anonymous_to_peers = data.allowAnonymousPostsPeers;\n }\n if ('reportedContentEmailNotifications' in data) {\n pluginConfiguration.reported_content_email_notifications = data.reportedContentEmailNotifications;\n }\n if ('divideByCohorts' in data) {\n pluginConfiguration.division_scheme = data.divideByCohorts ? DivisionSchemes.COHORT : DivisionSchemes.NONE;\n pluginConfiguration.always_divide_inline_discussions = data.divideByCohorts;\n }\n if ('groupAtSubsection' in data) {\n pluginConfiguration.group_at_subsection = data.groupAtSubsection;\n }\n if (data.restrictedDates?.length) {\n pluginConfiguration.discussion_blackouts = data.restrictedDates.map((restrictedDates) => (\n denormalizeRestrictedDate(restrictedDates)\n ));\n } else if (data.restrictedDates?.length === 0) {\n pluginConfiguration.discussion_blackouts = [];\n }\n if (data.discussionTopics?.length) {\n pluginConfiguration.discussion_topics = data.discussionTopics.reduce((topics, currentTopic) => {\n const newTopics = { ...topics };\n newTopics[currentTopic.name] = { id: currentTopic.id };\n return newTopics;\n }, {});\n }\n if ('divideCourseTopicsByCohorts' in data) {\n pluginConfiguration.divided_course_wide_discussions = data.divideCourseTopicsByCohorts\n ? data.divideDiscussionIds : [];\n }\n\n const ltiConfiguration = {};\n\n if (data.consumerKey) {\n ltiConfiguration.lti_1p1_client_key = data.consumerKey;\n }\n if (data.consumerSecret) {\n ltiConfiguration.lti_1p1_client_secret = data.consumerSecret;\n }\n if (data.launchUrl) {\n ltiConfiguration.lti_1p1_launch_url = data.launchUrl;\n }\n if ('piiShareUsername' in data) {\n ltiConfiguration.pii_share_username = data.piiShareUsername;\n }\n if ('piiShareEmail' in data) {\n ltiConfiguration.pii_share_email = data.piiShareEmail;\n }\n\n if (Object.keys(ltiConfiguration).length > 0) {\n // Only add this in if we're sending LTI fields.\n // TODO: Eventually support LTI v1.3 here.\n ltiConfiguration.version = 'lti_1p1';\n }\n\n const apiData = {\n context_key: courseId,\n enabled: data.enabled,\n lti_configuration: ltiConfiguration,\n plugin_configuration: pluginConfiguration,\n provider_type: appId,\n };\n if ('enableInContext' in data) {\n apiData.enable_in_context = data.enableInContext;\n }\n if ('enableGradedUnits' in data) {\n apiData.enable_graded_units = data.enableGradedUnits;\n }\n if ('unitLevelVisibility' in data) {\n apiData.unit_level_visibility = data.unitLevelVisibility;\n }\n if ('postingRestrictions' in data) {\n apiData.posting_restrictions = data.postingRestrictions;\n }\n return apiData;\n}\n\nexport function getDiscussionsProvidersUrl(courseId) {\n return `${getConfig().STUDIO_BASE_URL}/api/discussions/v0/course/${courseId}/providers`;\n}\n\nexport function getDiscussionsSettingsUrl(courseId) {\n return `${getConfig().STUDIO_BASE_URL}/api/discussions/v0/course/${courseId}/settings`;\n}\n\nexport async function getDiscussionsProviders(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getDiscussionsProvidersUrl(courseId));\n\n return normalizeProviders(data);\n}\n\nexport async function getDiscussionsSettings(courseId, providerId = null) {\n const params = {};\n if (providerId) {\n params.params = { provider_id: providerId };\n }\n const url = getDiscussionsSettingsUrl(courseId);\n const { data } = await getAuthenticatedHttpClient()\n .get(url, params);\n return normalizeSettings(data);\n}\n\nexport async function postDiscussionsSettings(courseId, appId, values) {\n const { data } = await getAuthenticatedHttpClient().post(\n getDiscussionsSettingsUrl(courseId),\n denormalizeData(courseId, appId, values),\n );\n\n return normalizeSettings(data);\n}\n","import { addModel, addModels } from '../../../generic/model-store';\nimport { getDiscussionsProviders, getDiscussionsSettings, postDiscussionsSettings } from './api';\nimport {\n DENIED, FAILED, loadApps, LOADING, SAVED, SAVING, updateSaveStatus, updateStatus,\n} from './slice';\n\nfunction updateDiscussionSettingsState({\n appConfig,\n discussionTopics,\n ...discussionSettings\n}) {\n return async (dispatch) => {\n dispatch(addModel({ modelType: 'appConfigs', model: appConfig }));\n dispatch(addModels({ modelType: 'discussionTopics', models: discussionTopics }));\n dispatch(loadApps(discussionSettings));\n };\n}\n\nfunction updateProviderState({\n apps,\n features,\n activeAppId,\n}) {\n return async (dispatch) => {\n dispatch(addModels({ modelType: 'apps', models: apps }));\n dispatch(addModels({ modelType: 'features', models: features }));\n\n dispatch(\n loadApps({\n activeAppId,\n appIds: apps.map((app) => app.id),\n featureIds: features.map((feature) => feature.id),\n }),\n );\n };\n}\n\nexport function fetchProviders(courseId) {\n return async (dispatch) => {\n dispatch(updateStatus({ status: LOADING }));\n try {\n const apps = await getDiscussionsProviders(courseId);\n dispatch(updateProviderState(apps));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateStatus({ status: DENIED }));\n } else {\n dispatch(updateStatus({ status: FAILED }));\n }\n }\n };\n}\n\nexport function fetchDiscussionSettings(courseId, providerId = null) {\n return async (dispatch) => {\n dispatch(updateStatus({ status: LOADING }));\n try {\n const apps = await getDiscussionsSettings(courseId, providerId);\n dispatch(updateDiscussionSettingsState(apps));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateStatus({ status: DENIED }));\n } else {\n dispatch(updateStatus({ status: FAILED }));\n }\n }\n };\n}\n\nexport function saveProviderConfig(courseId, appId, drafts, successPath, navigate) {\n return async (dispatch) => {\n dispatch(updateSaveStatus({ status: SAVING }));\n\n try {\n const apps = await postDiscussionsSettings(courseId, appId, drafts);\n dispatch(updateDiscussionSettingsState(apps));\n\n dispatch(updateSaveStatus({ status: SAVED }));\n // Note that we redirect here to avoid having to work with the promise over in AppConfigForm.\n navigate(successPath);\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateSaveStatus({ status: DENIED }));\n // This second one will remove the interface as well and hide it from the user.\n dispatch(updateStatus({ status: DENIED }));\n } else {\n dispatch(updateSaveStatus({ status: FAILED }));\n }\n }\n };\n}\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n heading: {\n id: 'authoring.discussions.heading',\n defaultMessage: 'Select a discussion tool for this course',\n },\n supportedFeatures: {\n id: 'authoring.discussions.supportedFeatures',\n defaultMessage: 'Supported features',\n },\n 'supportedFeatureList-mobile-show': {\n id: 'authoring.discussions.supportedFeatureList-mobile-show',\n defaultMessage: 'Show supported features',\n description: 'This is used in mobile view as supported feature list heading when close',\n },\n 'supportedFeatureList-mobile-hide': {\n id: 'authoring.discussions.supportedFeatureList-mobile-hide',\n defaultMessage: 'Hide supported features',\n description: 'This is used in mobile view as supported feature list heading when opened',\n },\n noApps: {\n id: 'authoring.discussions.noApps',\n defaultMessage: 'There are no discussions providers available for your course.',\n description: 'A message shown when there are no discussions providers available to be displayed.',\n },\n nextButton: {\n id: 'authoring.discussions.nextButton',\n defaultMessage: 'Next',\n description: 'Button allowing the user to advance to the second step of discussion configuration.',\n },\n appFullSupport: {\n id: 'authoring.discussions.appFullSupport',\n defaultMessage: 'Full support',\n description: 'A label indicating that an app supports the full set of possible features for a discussions app.',\n },\n appBasicSupport: {\n id: 'authoring.discussions.appBasicSupport',\n defaultMessage: 'Basic support',\n description: 'A label indicating that an app only supports a subset of the possible features of a discussions app.',\n },\n selectApp: {\n id: 'authoring.discussions.selectApp',\n defaultMessage: 'Select {appName}',\n description: 'A label for the checkbox that allows a user to select the discussions app they want to configure.',\n },\n\n // Legacy\n 'appName-legacy': {\n id: 'authoring.discussions.appList.appName-legacy',\n defaultMessage: 'edX',\n description: 'The name of the Legacy edX Discussions app.',\n },\n 'appDescription-legacy': {\n id: 'authoring.discussions.appList.appDescription-legacy',\n defaultMessage: 'Start conversations with other learners, ask questions, and interact with other learners in the course.',\n description: 'A description of the Legacy edX Discussions app.',\n },\n // New provider\n 'appName-openedx': {\n id: 'authoring.discussions.appList.appName-openedx',\n defaultMessage: 'edX',\n description: 'The name of the new edX Discussions app.',\n },\n 'appDescription-openedx': {\n id: 'authoring.discussions.appList.appDescription-openedx',\n defaultMessage: 'Enable participation in discussion topics alongside course content.',\n description: 'A description of the new edX Discussions app.',\n },\n // Piazza\n 'appName-piazza': {\n id: 'authoring.discussions.appList.appName-piazza',\n defaultMessage: 'Piazza',\n description: 'The name of the Piazza app.',\n },\n 'appDescription-piazza': {\n id: 'authoring.discussions.appList.appDescription-piazza',\n defaultMessage: 'Piazza is designed to connect students, TAs, and professors so every student can get the help they need when they need it.',\n description: 'A description of the Piazza app.',\n },\n 'appDescription-yellowdig': {\n id: 'authoring.discussions.appList.appDescription-yellowdig',\n defaultMessage: 'Yellowdig offers educators a gameful learning digital solution to improve student engagement by building learning communities for any course modality.',\n description: 'A description of the Yellowdig app.',\n },\n 'appDescription-inscribe': {\n id: 'authoring.discussions.appList.appDescription-inscribe',\n defaultMessage: 'InScribe leverages the power of community + artificial intelligence to connect individuals to the answers, resources, and people they need to succeed.',\n description: 'A description of the inscibe app.',\n },\n 'appDescription-discourse': {\n id: 'authoring.discussions.appList.appDescription-discourse',\n defaultMessage: 'Discourse is modern forum software for your community. Use it as a mailing list, discussion forum, long-form chat room, and more!',\n description: 'A description of the discourse app.',\n },\n 'appDescription-ed-discuss': {\n id: 'authoring.discussions.appList.appDescription-ed-discus',\n defaultMessage: 'Ed Discussion helps scale class communication in a beautiful and intuitive interface. Questions reach and benefit the whole class. Less emails, more time saved.',\n description: 'A description of the Ed discus app.',\n },\n // Features\n 'featureName-discussion-page': {\n id: 'authoring.discussions.featureName-discussion-page',\n defaultMessage: 'Discussion page',\n description: 'The name of a discussions feature.',\n },\n 'featureName-embedded-course-sections': {\n id: 'authoring.discussions.featureName-embedded-course-sections',\n defaultMessage: 'Embedded course sections',\n description: 'The name of a discussions feature.',\n },\n 'featureName-advanced-in-context-discussion': {\n id: 'authoring.discussions.featureName-advanced-in-context-discussion',\n defaultMessage: 'Advanced in context discussion',\n description: 'The name of a discussions feature.',\n },\n 'featureName-anonymous-posting': {\n id: 'authoring.discussions.featureName-anonymous-posting',\n defaultMessage: 'Anonymous posting',\n description: 'The name of a discussions feature.',\n },\n 'featureName-automatic-learner-enrollment': {\n id: 'authoring.discussions.featureName-automatic-learner-enrollment',\n defaultMessage: 'Automatic learner enrollment',\n description: 'The name of a discussions feature.',\n },\n 'featureName-blackout-discussion-dates': {\n id: 'authoring.discussions.featureName-blackout-discussion-dates',\n defaultMessage: 'Blackout discussion dates',\n description: 'The name of a discussions feature.',\n },\n 'featureName-community-ta-support': {\n id: 'authoring.discussions.featureName-community-ta-support',\n defaultMessage: 'Community TA support',\n description: 'The name of a discussions feature.',\n },\n 'featureName-course-cohort-support': {\n id: 'authoring.discussions.featureName-course-cohort-support',\n defaultMessage: 'Course cohort support',\n description: 'The name of a discussions feature.',\n },\n 'featureName-direct-messages-from-instructors': {\n id: 'authoring.discussions.featureName-direct-messages-from-instructors',\n defaultMessage: 'Direct messages from instructors',\n description: 'The name of a discussions feature.',\n },\n 'featureName-discussion-content-prompts': {\n id: 'authoring.discussions.featureName-discussion-content-prompts',\n defaultMessage: 'Discussion content prompts',\n description: 'The name of a discussions feature.',\n },\n 'featureName-email-notifications': {\n id: 'authoring.discussions.featureName-email-notifications',\n defaultMessage: 'Email notifications',\n description: 'The name of a discussions feature.',\n },\n 'featureName-graded-discussions': {\n id: 'authoring.discussions.featureName-graded-discussions',\n defaultMessage: 'Graded discussions',\n description: 'The name of a discussions feature.',\n },\n 'featureName-in-platform-notifications': {\n id: 'authoring.discussions.featureName-in-platform-notifications',\n defaultMessage: 'In-platform notifications',\n description: 'The name of a discussions feature.',\n },\n 'featureName-internationalization-support': {\n id: 'authoring.discussions.featureName-internationalization-support',\n defaultMessage: 'Internationalization support',\n description: 'The name of a discussions feature.',\n },\n 'featureName-lti-advanced-sharing-mode': {\n id: 'authoring.discussions.featureName-lti-advanced-sharing-mode',\n defaultMessage: 'LTI advanced sharing',\n description: 'The name of a discussions feature.',\n },\n 'featureName-basic-configuration': {\n id: 'authoring.discussions.featureName-basic-configuration',\n defaultMessage: 'Basic configuration',\n description: 'The name of a discussions feature.',\n },\n 'featureName-primary-discussion-app-experience': {\n id: 'authoring.discussions.featureName-primary-discussion-app-experience',\n defaultMessage: 'Primary discussion app experience',\n description: 'The name of a discussions feature.',\n },\n 'featureName-question-discussion-support': {\n id: 'authoring.discussions.featureName-question-&-discussion-support',\n defaultMessage: 'Question & discussion support',\n description: 'The name of a discussions feature.',\n },\n 'featureName-report/flag-content-to-moderators': {\n id: 'authoring.discussions.featureName-report/flag-content-to-moderators',\n defaultMessage: 'Report content to moderators',\n description: 'The name of a discussions feature.',\n },\n 'featureName-research-data-events': {\n id: 'authoring.discussions.featureName-research-data-events',\n defaultMessage: 'Research data events',\n description: 'The name of a discussions feature.',\n },\n 'featureName-simplified-in-context-discussion': {\n id: 'authoring.discussions.featureName-simplified-in-context-discussion',\n defaultMessage: 'Simplified in-context discussion',\n description: 'The name of a discussions feature.',\n },\n 'featureName-user-mentions': {\n id: 'authoring.discussions.featureName-user-mentions',\n defaultMessage: 'User mentions',\n description: 'The name of a discussions feature.',\n },\n 'featureName-wcag-2.1': {\n id: 'authoring.discussions.featureName-wcag-2.1',\n defaultMessage: 'WCAG 2.1 support',\n description: 'The name of a discussions feature.',\n },\n 'featureName-wcag-2.0-support': {\n id: 'authoring.discussions.wcag-2.0-support',\n defaultMessage: 'WCAG 2.0 support',\n description: 'The name of a discussions feature.',\n },\n 'featureType-basic': {\n id: 'authoring.discussions.basic-support',\n defaultMessage: 'Basic support',\n description: 'The type of a discussions feature.',\n },\n 'featureType-partial': {\n id: 'authoring.discussions.partial-support',\n defaultMessage: 'Partial support',\n description: 'The type of a discussions feature.',\n },\n 'featureType-full': {\n id: 'authoring.discussions.full-support',\n defaultMessage: 'Full support',\n description: 'The type of a discussions feature.',\n },\n 'featureType-common': {\n id: 'authoring.discussions.common-support',\n defaultMessage: 'Commonly requested',\n description: 'The type of a discussions feature.',\n },\n hideDiscussionTab: {\n id: 'authoring.discussions.hide-discussion-tab',\n defaultMessage: 'Hide discussion tab',\n description: 'Title message to hide discussion tab',\n },\n hideDiscussionTabTitle: {\n id: 'authoring.discussions.hide-tab-title',\n defaultMessage: 'Hide the discussion tab?',\n description: 'Title message to hide discussion tab',\n },\n hideDiscussionTabMessage: {\n id: 'authoring.discussions.hide-tab-message',\n defaultMessage: 'The discussion tab will no longer be visible to learners in the LMS. Additionally, posting to the discussion forums will be disabled. Are you sure you want to proceed?',\n description: 'Help message to hide discussion tab',\n },\n hideDiscussionOkButton: {\n id: 'authoring.discussions.hide-ok-button',\n defaultMessage: 'Ok',\n description: 'Ok button title',\n },\n hideDiscussionCancelButton: {\n id: 'authoring.discussions.hide-cancel-button',\n defaultMessage: 'Cancel',\n description: 'Cancel button title',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Check } from '@openedx/paragon/icons';\n\nconst SupportedFeature = ({ name }) => (\n <>\n \n \n \n {name}\n \n);\n\nSupportedFeature.propTypes = {\n name: PropTypes.string.isRequired,\n};\n\nexport default SupportedFeature;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Collapsible } from '@openedx/paragon';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\n\nimport SupportedFeature from './SupportedFeature';\nimport messages from './messages';\n\nconst FeaturesList = ({ app, intl }) => (\n event.stopPropagation()}\n title={(\n <>\n \n {intl.formatMessage(messages['supportedFeatureList-mobile-show'])}\n \n \n {intl.formatMessage(messages['supportedFeatureList-mobile-hide'])}\n \n \n )}\n styling=\"basic\"\n >\n {app.featureIds.map((id) => (\n
\n \n
\n ))}\n \n);\n\nexport default injectIntl(FeaturesList);\n\nFeaturesList.propTypes = {\n app: PropTypes.shape({\n id: PropTypes.string.isRequired,\n featureIds: PropTypes.shape([]).isRequired,\n }).isRequired,\n intl: intlShape.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { useSelector } from 'react-redux';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport Responsive from 'react-responsive';\nimport {\n Card, CheckboxControl, breakpoints,\n} from '@openedx/paragon';\nimport messages from './messages';\nimport appMessages from '../app-config-form/messages';\nimport FeaturesList from './FeaturesList';\n\nconst AppCard = ({\n app, onClick, intl, selected, features,\n}) => {\n const { canChangeProviders } = useSelector(state => state.courseDetail);\n const supportText = app.hasFullSupport\n ? intl.formatMessage(messages.appFullSupport)\n : intl.formatMessage(messages.appBasicSupport);\n\n return (\n canChangeProviders && onClick(app.id)}\n onKeyPress={() => canChangeProviders && onClick(app.id)}\n role=\"radio\"\n aria-checked={selected}\n className={classNames({\n 'border-primary': selected,\n }, 'w-100')}\n >\n {intl.formatMessage(appMessages[`appName-${app.id}`])}
}\n subtitle={
{supportText}
}\n actions={(\n
\n \n
\n )}\n size=\"sm\"\n />\n \n
\n \n {intl.formatMessage(messages[`appDescription-${app.id}`])}\n \n \n \n \n
\n
\n \n );\n};\n\nAppCard.propTypes = {\n app: PropTypes.shape({\n id: PropTypes.string.isRequired,\n featureIds: PropTypes.arrayOf(PropTypes.string).isRequired,\n hasFullSupport: PropTypes.bool.isRequired,\n }).isRequired,\n onClick: PropTypes.func.isRequired,\n selected: PropTypes.bool.isRequired,\n intl: intlShape.isRequired,\n features: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n};\n\nexport default injectIntl(AppCard);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Remove, Check } from '@openedx/paragon/icons';\nimport { DataTable } from '@openedx/paragon';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport _ from 'lodash';\n\nimport messages from './messages';\nimport appMessages from '../app-config-form/messages';\nimport { FEATURE_TYPES } from '../data/constants';\nimport './FeaturesTable.scss';\n\nconst FeaturesTable = ({ apps, features, intl }) => {\n const {\n basic, partial, full, common,\n } = _.groupBy(features, (feature) => feature.featureSupportType);\n\n const createRow = (feature) => {\n const appCheckmarkCells = {};\n // DataTable wants 'data' to be an array of objects where each property of an object\n // represents a cell in that row, identified by its key.\n apps.forEach(app => {\n // If our app's set of feature Ids includes this feature, return a checkmark.\n // i.e, if this app has the current feature, check it!\n if (FEATURE_TYPES.includes(feature)) {\n appCheckmarkCells[app.id] =
;\n } else {\n appCheckmarkCells[app.id] = (\n \n {\n app.featureIds.includes(feature.id)\n ? \n : \n }\n
\n );\n }\n });\n\n return {\n feature: FEATURE_TYPES.includes(feature) ? (\n \n {intl.formatMessage(messages[`featureType-${feature}`])}\n \n )\n : intl.formatMessage(messages[`featureName-${feature.id}`]),\n // 'feature' is the identifier for cells in the first column.\n // This is spreading the app IDs from appCheckmarkCells into the return array, creating\n // one object with 'feature' and the app.id keys from above. The values are the JSX\n // above with the font awesome checkmarks in 'em\n ...appCheckmarkCells,\n };\n };\n\n return (\n createRow(feature)),\n { ...createRow('partial') },\n ...partial.map((feature) => createRow(feature)),\n { ...createRow('full') },\n ...full.map((feature) => createRow(feature)),\n { ...createRow('common') },\n ...common.map((feature) => createRow(feature)),\n ]\n }\n columns={[\n {\n Header: '',\n accessor: 'feature',\n },\n // We're converting our apps array into a bunch of objects with \"Header\" and \"accessor\"\n // keys, like DataTable expects.\n ...apps.map(app => ({\n Header: intl.formatMessage(appMessages[`appName-${app.id}`]),\n accessor: app.id,\n })),\n ]}\n >\n \n \n );\n};\n\nexport default injectIntl(FeaturesTable);\n\nFeaturesTable.propTypes = {\n apps: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n features: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n intl: intlShape.isRequired,\n};\n","import React, { useCallback, useContext } from 'react';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Button } from '@openedx/paragon';\nimport { useSelector } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\n\nimport { DiscussionsContext } from '../DiscussionsProvider';\n\nimport messages from './messages';\n\nconst AppListNextButton = ({ intl }) => {\n const { selectedAppId } = useSelector(state => state.discussions);\n const { path: discussionsPath } = useContext(DiscussionsContext);\n const navigate = useNavigate();\n\n const handleStartConfig = useCallback(() => {\n navigate(`${discussionsPath}/configure/${selectedAppId}`);\n }, [discussionsPath, selectedAppId]);\n\n return (\n \n {intl.formatMessage(messages.nextButton)}\n \n );\n};\n\nAppListNextButton.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(AppListNextButton);\n","import React, {\n useCallback, useEffect, useMemo, useState, useContext,\n} from 'react';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n CardGrid, Container, breakpoints, Form, ActionRow, AlertModal, Button, StatefulButton,\n} from '@openedx/paragon';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Responsive from 'react-responsive';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { useModels } from '../../../generic/model-store';\nimport {\n selectApp, LOADED, LOADING, SAVING, updateValidationStatus,\n} from '../data/slice';\nimport AppCard from './AppCard';\nimport messages from './messages';\nimport FeaturesTable from './FeaturesTable';\nimport AppListNextButton from './AppListNextButton';\nimport Loading from '../../../generic/Loading';\nimport useIsOnSmallScreen from '../data/hook';\nimport { saveProviderConfig, fetchDiscussionSettings } from '../data/thunks';\nimport { PagesAndResourcesContext } from '../../PagesAndResourcesProvider';\nimport { discussionRestriction } from '../data/constants';\n\nconst AppList = ({ intl }) => {\n const dispatch = useDispatch();\n const { courseId } = useContext(PagesAndResourcesContext);\n const {\n appIds, featureIds, status, saveStatus, activeAppId, selectedAppId, enabled, postingRestrictions,\n } = useSelector(state => state.discussions);\n const [discussionTabToggle, setDiscussionTabToggle] = useState(enabled);\n const apps = useModels('apps', appIds);\n const features = useModels('features', featureIds);\n const isGlobalStaff = getAuthenticatedUser().administrator;\n const ltiProvider = !['openedx', 'legacy'].includes(activeAppId);\n const isOnSmallScreen = useIsOnSmallScreen();\n\n const showOneEdxProvider = useMemo(() => apps.filter(app => (\n activeAppId === 'openedx' ? app.id !== 'legacy' : app.id !== 'openedx'\n )), [activeAppId]);\n\n // This could be a bit confusing. activeAppId is the ID of the app that is currently configured\n // according to the server. selectedAppId is the ID of the app that we _want_ to configure here\n // in the UI. The two don't always agree, and a selectedAppId may not yet be set when the app is\n // loaded. This effect is responsible for setting a selected app based on the active app -\n // effectively defaulting to it - if a selected app hasn't been set yet.\n useEffect(() => {\n // If selectedAppId is not set, use activeAppId\n if (!selectedAppId) {\n dispatch(selectApp({ appId: activeAppId }));\n }\n dispatch(updateValidationStatus({ hasError: false }));\n }, [selectedAppId, activeAppId]);\n\n useEffect(() => {\n setDiscussionTabToggle(enabled);\n }, [enabled]);\n\n useEffect(() => {\n if (!postingRestrictions) {\n dispatch(fetchDiscussionSettings(courseId, selectedAppId));\n }\n }, [courseId]);\n\n const handleSelectApp = useCallback((appId) => {\n dispatch(selectApp({ appId }));\n }, []);\n\n const updateSettings = useCallback((enabledDiscussion) => {\n dispatch(saveProviderConfig(\n courseId,\n selectedAppId,\n {\n enabled: enabledDiscussion,\n postingRestrictions:\n enabledDiscussion ? postingRestrictions : discussionRestriction.ENABLED,\n },\n ));\n }, [courseId, selectedAppId, postingRestrictions]);\n\n const handleClose = useCallback(() => {\n setDiscussionTabToggle(enabled);\n }, [enabled]);\n\n const handleOk = useCallback(() => {\n setDiscussionTabToggle(false);\n updateSettings(false);\n }, [updateSettings]);\n\n const handleChange = useCallback((e) => {\n const toggleVal = e.target.checked;\n if (!toggleVal) {\n updateSettings(!toggleVal);\n } else {\n setDiscussionTabToggle(!toggleVal);\n }\n }, [updateSettings]);\n\n if (!selectedAppId || status === LOADING) {\n return (\n \n );\n }\n\n if (status === LOADED && apps.length === 0) {\n return (\n \n

{intl.formatMessage(messages.noApps)}

\n
\n );\n }\n\n const showAppCard = (filteredApps) => filteredApps.map(app => (\n \n ));\n\n return (\n
\n
\n

\n {intl.formatMessage(messages.heading)}\n

\n \n {intl.formatMessage(messages.hideDiscussionTab)}\n \n
\n \n {(isGlobalStaff || ltiProvider) ? showAppCard(apps) : showAppCard(showOneEdxProvider)}\n \n \n

\n {intl.formatMessage(messages.supportedFeatures)}\n

\n
\n \n
\n
\n \n \n \n \n )}\n >\n

\n {intl.formatMessage(messages.hideDiscussionTabMessage)}\n

\n \n
\n );\n};\n\nAppList.propTypes = {\n intl: intlShape.isRequired,\n};\n\nconst IntlAppList = injectIntl(AppList);\n\nIntlAppList.NextButton = AppListNextButton;\n\nexport default IntlAppList;\n","import { breakpoints, useWindowSize } from '@openedx/paragon';\n\nexport default function useIsOnSmallScreen() {\n const windowSize = useWindowSize();\n return windowSize.width < breakpoints.medium.minWidth;\n}\n","import React from 'react';\nimport { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Alert } from '@openedx/paragon';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport messages from '../messages';\n\nconst SaveFormConnectionErrorAlert = ({ intl }) => (\n \n \n {intl.formatMessage(messages.supportText)}\n \n ),\n }}\n />\n \n);\n\nSaveFormConnectionErrorAlert.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(SaveFormConnectionErrorAlert);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport FormSwitchGroup from '../../../../../generic/FormSwitchGroup';\nimport messages from '../../messages';\nimport AppConfigFormDivider from './AppConfigFormDivider';\n\nconst AnonymousPostingFields = ({\n onBlur,\n onChange,\n intl,\n values,\n}) => (\n <>\n
{intl.formatMessage(messages.anonymousPosting)}
\n \n \n \n);\n\nAnonymousPostingFields.propTypes = {\n onBlur: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n intl: intlShape.isRequired,\n values: PropTypes.shape({\n allowAnonymousPostsPeers: PropTypes.bool,\n }).isRequired,\n};\n\nexport default injectIntl(AnonymousPostingFields);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Card } from '@openedx/paragon';\n\nconst ConfirmationPopup = ({\n label,\n bodyText,\n onConfirm,\n confirmLabel,\n onCancel,\n cancelLabel,\n confirmVariant,\n confirmButtonClass,\n cancelButtonClass,\n sectionClasses,\n}) => (\n \n \n \n {bodyText}\n \n \n \n \n \n \n);\n\nConfirmationPopup.propTypes = {\n label: PropTypes.string.isRequired,\n bodyText: PropTypes.string.isRequired,\n onConfirm: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n confirmLabel: PropTypes.string.isRequired,\n cancelLabel: PropTypes.string.isRequired,\n confirmButtonClass: PropTypes.string,\n cancelButtonClass: PropTypes.string,\n confirmVariant: PropTypes.string,\n sectionClasses: PropTypes.string,\n};\nConfirmationPopup.defaultProps = {\n confirmVariant: 'outline-brand',\n confirmButtonClass: '',\n cancelButtonClass: '',\n sectionClasses: '',\n};\n\nexport default React.memo(ConfirmationPopup);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Form, TransitionReplace } from '@openedx/paragon';\n\nconst FieldFeedback = ({\n feedbackClasses,\n transitionClasses,\n errorCondition,\n feedbackCondition,\n feedbackMessage,\n errorMessage,\n}) => (\n <>\n \n {feedbackCondition ? (\n \n \n
{feedbackMessage}
\n
\n
\n ) : }\n
\n\n \n {errorCondition ? (\n \n \n
{errorMessage}
\n
\n
\n ) : }\n
\n \n);\n\nFieldFeedback.propTypes = {\n errorCondition: PropTypes.bool.isRequired,\n errorMessage: PropTypes.string,\n feedbackMessage: PropTypes.string,\n feedbackCondition: PropTypes.bool,\n feedbackClasses: PropTypes.string,\n transitionClasses: PropTypes.string,\n};\n\nFieldFeedback.defaultProps = {\n feedbackClasses: '',\n transitionClasses: '',\n feedbackMessage: '',\n feedbackCondition: false,\n errorMessage: '',\n};\n\nexport default React.memo(FieldFeedback);\n","import React, { useState, useCallback } from 'react';\nimport { Form } from '@openedx/paragon';\nimport { useFormikContext, getIn } from 'formik';\nimport PropTypes from 'prop-types';\n\nimport FieldFeedback from '../../../../../../generic/FieldFeedback';\n\nconst RestrictDatesInput = ({\n value,\n type,\n label,\n fieldName,\n helpText,\n fieldClasses,\n feedbackClasses,\n formGroupClasses,\n fieldNameCommonBase,\n dataTestId,\n}) => {\n const {\n handleChange, handleBlur, errors, touched,\n } = useFormikContext();\n\n const [inFocus, setInFocus] = useState(false);\n const fieldError = getIn(errors, `${fieldNameCommonBase}.${fieldName}`);\n const fieldTouched = getIn(touched, `${fieldNameCommonBase}.${fieldName}`);\n const isInvalidInput = Boolean(!inFocus && fieldError && fieldTouched);\n\n const handleFocusOut = useCallback((event) => {\n handleBlur(event);\n setInFocus(false);\n }, [handleBlur, setInFocus]);\n\n const handleSetFocus = useCallback(() => {\n setInFocus(true);\n }, [setInFocus]);\n\n return (\n \n \n \n \n );\n};\n\nRestrictDatesInput.propTypes = {\n value: PropTypes.string.isRequired,\n fieldName: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired,\n helpText: PropTypes.string,\n feedbackClasses: PropTypes.string,\n fieldClasses: PropTypes.string,\n formGroupClasses: PropTypes.string,\n fieldNameCommonBase: PropTypes.string.isRequired,\n dataTestId: PropTypes.string,\n};\n\nRestrictDatesInput.defaultProps = {\n fieldClasses: '',\n helpText: '',\n feedbackClasses: '',\n formGroupClasses: '',\n dataTestId: null,\n};\n\nexport default React.memo(RestrictDatesInput);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Badge } from '@openedx/paragon';\n\nconst CollapseCardHeading = ({\n isOpen,\n expandHeadingText,\n collapseHeadingText,\n badgeVariant,\n badgeStatus,\n}) => {\n if (isOpen) {\n return {expandHeadingText};\n }\n\n return (\n
\n {badgeStatus && {badgeStatus}}\n
{collapseHeadingText}
\n
\n );\n};\n\nCollapseCardHeading.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n collapseHeadingText: PropTypes.string.isRequired,\n expandHeadingText: PropTypes.string.isRequired,\n badgeVariant: PropTypes.string,\n badgeStatus: PropTypes.string,\n};\n\nCollapseCardHeading.defaultProps = {\n badgeVariant: 'primary',\n badgeStatus: '',\n};\n\nexport default React.memo(CollapseCardHeading);\n","import React, { useState, useCallback } from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Form } from '@openedx/paragon';\nimport { useFormikContext } from 'formik';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\n\nimport messages from '../../../messages';\nimport RestrictDatesInput from './RestrictDatesInput';\nimport { formatRestrictedDates } from '../../../utils';\nimport {\n restrictedDatesStatus as constants,\n deleteRestrictedDatesHelperText,\n badgeVariant,\n} from '../../../../data/constants';\nimport CollapsableEditor from '../../../../../../generic/CollapsableEditor';\nimport ConfirmationPopup from '../../../../../../generic/ConfirmationPopup';\nimport CollapseCardHeading from './CollapseCardHeading';\n\nconst DiscussionRestrictionItem = ({\n restrictedDate,\n onDelete,\n hasError,\n onClose,\n fieldNameCommonBase,\n}) => {\n const restrictedDateError = !restrictedDate.startDate || !restrictedDate.endDate || hasError;\n const [showDeletePopup, setShowDeletePopup] = useState(false);\n const [collapseIsOpen, setCollapseOpen] = useState(restrictedDateError);\n const { setFieldTouched } = useFormikContext();\n const intl = useIntl();\n\n const handleToggle = useCallback((isOpen) => {\n if (!isOpen && hasError) {\n return setCollapseOpen(true);\n }\n return setCollapseOpen(isOpen);\n }, [hasError]);\n\n const handleOnClose = useCallback(() => {\n ['startDate', 'startTime', 'endDate', 'endTime'].forEach(field => (\n setFieldTouched(`${fieldNameCommonBase}.${field}`, true)\n ));\n if (!hasError) {\n onClose();\n }\n }, [hasError, onClose]);\n\n const getHeading = useCallback((isOpen) => (\n \n ), [restrictedDate]);\n\n const handleShowDeletePopup = useCallback(() => {\n setShowDeletePopup(true);\n }, []);\n\n const handleCancelDeletePopup = useCallback(() => {\n setShowDeletePopup(false);\n }, []);\n\n if (showDeletePopup) {\n return (\n \n );\n }\n\n return (\n \n \n \n \n \n
\n \n \n \n \n \n );\n};\n\nDiscussionRestrictionItem.propTypes = {\n onDelete: PropTypes.func.isRequired,\n hasError: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n fieldNameCommonBase: PropTypes.string.isRequired,\n restrictedDate: PropTypes.shape({\n id: PropTypes.string,\n startDate: PropTypes.string,\n endDate: PropTypes.string,\n startTime: PropTypes.string,\n endTime: PropTypes.string,\n status: PropTypes.string,\n }).isRequired,\n};\n\nexport default React.memo(DiscussionRestrictionItem);\n","import React, { useCallback } from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Button } from '@openedx/paragon';\nimport { Add } from '@openedx/paragon/icons';\n\nimport { FieldArray, useFormikContext } from 'formik';\nimport { v4 as uuid } from 'uuid';\n\nimport messages from '../../../messages';\nimport DiscussionRestrictionItem from './DiscussionRestrictionItem';\nimport { checkStatus } from '../../../utils';\nimport { denormalizeRestrictedDate } from '../../../../data/api';\nimport { restrictedDatesStatus as STATUS } from '../../../../data/constants';\n\nconst RestrictionSchedules = () => {\n const intl = useIntl();\n const {\n values: appConfig,\n setFieldValue,\n errors,\n validateForm,\n } = useFormikContext();\n\n const { restrictedDates } = appConfig;\n\n const handleOnClose = useCallback((index) => {\n const updatedRestrictedDates = [...restrictedDates];\n updatedRestrictedDates[index] = {\n ...updatedRestrictedDates[index],\n status: checkStatus(denormalizeRestrictedDate(updatedRestrictedDates[index])),\n };\n setFieldValue('restrictedDates', updatedRestrictedDates);\n }, [restrictedDates]);\n\n const newRestrictedDateItem = {\n id: uuid(),\n startDate: '',\n startTime: '',\n endDate: '',\n endTime: '',\n status: STATUS.UPCOMING,\n };\n\n const onAddNewItem = useCallback(async (push) => {\n await push(newRestrictedDateItem);\n validateForm();\n }, []);\n\n return (\n
\n (\n
\n {restrictedDates.map((restrictedDate, index) => (\n remove(index)}\n onClose={() => handleOnClose(index)}\n hasError={Boolean(errors?.restrictedDates?.[index])}\n />\n ))}\n
\n onAddNewItem(push)}\n variant=\"link\"\n iconBefore={Add}\n className=\"text-primary-500 p-0\"\n style={{ height: 28 }}\n >\n {intl.formatMessage(messages.addRestrictedDatesButton)}\n \n
\n
\n )}\n />\n
\n );\n};\n\nexport default React.memo(RestrictionSchedules);\n","import React, { useCallback, useState, useMemo } from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Button, ButtonGroup } from '@openedx/paragon';\nimport classNames from 'classnames';\n\nimport { useFormikContext } from 'formik';\nimport ConfirmationPopup from '../../../../../generic/ConfirmationPopup';\n\nimport messages from '../../messages';\nimport { discussionRestrictionOptions, discussionRestriction } from '../../../data/constants';\nimport RestrictionSchedules from './discussion-restrictions/RestrictionSchedules';\n\nconst DiscussionRestriction = () => {\n const intl = useIntl();\n const {\n values: appConfig,\n setFieldValue,\n } = useFormikContext();\n\n const { postingRestrictions } = appConfig;\n const [selectedRestrictionOption, setSelectedRestrictionOption] = useState(postingRestrictions);\n\n const handleClick = useCallback((value) => {\n setSelectedRestrictionOption(value);\n\n if (value !== discussionRestriction.ENABLED) {\n setFieldValue('postingRestrictions', value);\n }\n }, []);\n\n const handleConfirmation = useCallback(() => {\n setSelectedRestrictionOption(discussionRestriction.ENABLED);\n setFieldValue('postingRestrictions', discussionRestriction.ENABLED);\n }, []);\n\n const handleCancel = useCallback(() => {\n setSelectedRestrictionOption(postingRestrictions);\n }, [postingRestrictions]);\n\n const discussionRestrictionButtons = useMemo(() => discussionRestrictionOptions.map((restriction) => (\n handleClick(restriction.value)}\n >\n {restriction.label}\n \n )), [selectedRestrictionOption]);\n\n const selectedRestrictionMessage = useMemo(() => (\n discussionRestrictionOptions.find(option => option.value === selectedRestrictionOption).message\n ), [selectedRestrictionOption]);\n\n return (\n
\n
\n {intl.formatMessage(messages.discussionRestrictionLabel)}\n
\n \n {discussionRestrictionButtons}\n \n
\n {intl.formatMessage(selectedRestrictionMessage)}\n
\n {(postingRestrictions !== discussionRestriction.ENABLED\n && selectedRestrictionOption === discussionRestriction.ENABLED\n ) && (\n \n )}\n {selectedRestrictionOption === discussionRestriction.SCHEDULED && }\n
\n );\n};\n\nexport default React.memo(DiscussionRestriction);\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useFormikContext } from 'formik';\n\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Button, Card, Form,\n} from '@openedx/paragon';\n\nimport CollapsableEditor from '../../../../../../generic/CollapsableEditor';\nimport messages from '../../../messages';\nimport FieldFeedback from '../../../../../../generic/FieldFeedback';\n\nconst TopicItem = ({\n intl,\n index,\n id,\n name,\n onDelete,\n hasError,\n onFocus,\n}) => {\n const {\n handleChange, handleBlur, errors,\n } = useFormikContext();\n const [inFocus, setInFocus] = useState(false);\n const [showDeletePopup, setShowDeletePopup] = useState(false);\n const [collapseIsOpen, setCollapseOpen] = useState(!name || hasError);\n const isGeneralTopic = id === 'course';\n\n useEffect(() => {\n onFocus(hasError);\n }, [inFocus, hasError]);\n\n const getHeading = (isOpen) => {\n if (isGeneralTopic && isOpen) {\n return (\n
\n {intl.formatMessage(messages.renameGeneralTopic)}\n
\n {intl.formatMessage(messages.generalTopicHelp)}\n
\n
\n );\n } if (isOpen) {\n return (\n \n {intl.formatMessage(messages.configureAdditionalTopic)}\n \n );\n }\n return {name};\n };\n\n const handleToggle = (isOpen) => {\n if (!isOpen && (!name.length || hasError)) {\n return setCollapseOpen(true);\n }\n return setCollapseOpen(isOpen);\n };\n\n const deleteDiscussionTopic = () => {\n setShowDeletePopup(true);\n };\n\n const handleFocusOut = (event) => {\n handleBlur(event);\n setInFocus(false);\n };\n\n const deleteTopicPopup = (\n \n \n \n \n {intl.formatMessage(messages.discussionTopicDeletionHelp)}\n \n \n \n \n {intl.formatMessage(messages.deleteButton)}\n \n \n \n \n );\n\n return showDeletePopup\n ? deleteTopicPopup\n : (\n \n \n handleFocusOut(event)}\n value={name}\n controlClassName=\"bg-white\"\n onFocus={() => setInFocus(true)}\n />\n \n \n \n );\n};\n\nTopicItem.propTypes = {\n name: PropTypes.string.isRequired,\n id: PropTypes.string.isRequired,\n index: PropTypes.number.isRequired,\n onDelete: PropTypes.func.isRequired,\n intl: intlShape.isRequired,\n hasError: PropTypes.bool.isRequired,\n onFocus: PropTypes.func.isRequired,\n};\n\nexport default injectIntl(TopicItem);\n","import React, { createContext, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport { updateValidationStatus } from '../../../data/slice';\n\nexport const OpenedXConfigFormContext = createContext({});\n\nconst OpenedXConfigFormProvider = ({ children, value }) => {\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(updateValidationStatus({ hasError: value.isFormInvalid }));\n }, [value.isFormInvalid]);\n\n return (\n \n {children}\n \n );\n};\n\nOpenedXConfigFormProvider.propTypes = {\n children: PropTypes.node.isRequired,\n value: PropTypes.shape({\n discussionTopicErrors: PropTypes.arrayOf(PropTypes.bool),\n validDiscussionTopics: PropTypes.arrayOf(PropTypes.shape({\n validTopics: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.string,\n id: PropTypes.string,\n })),\n setValidDiscussionTopics: PropTypes.func,\n })),\n isFormInvalid: PropTypes.bool,\n }).isRequired,\n};\n\nexport default OpenedXConfigFormProvider;\n","import React, { useContext, useCallback } from 'react';\nimport { Add } from '@openedx/paragon/icons';\nimport { Button } from '@openedx/paragon';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { FieldArray, useFormikContext } from 'formik';\nimport { v4 as uuid } from 'uuid';\nimport _ from 'lodash';\nimport messages from '../../../messages';\nimport TopicItem from './TopicItem';\nimport { OpenedXConfigFormContext } from '../../openedx/OpenedXConfigFormProvider';\nimport { filterItemFromObject } from '../../../utils';\n\nconst DiscussionTopics = ({ intl }) => {\n const {\n values: appConfig,\n validateForm,\n setFieldValue,\n } = useFormikContext();\n const { discussionTopics, divideDiscussionIds } = appConfig;\n const {\n discussionTopicErrors,\n validDiscussionTopics,\n setValidDiscussionTopics,\n } = useContext(OpenedXConfigFormContext);\n\n const handleTopicDelete = async (topicIndex, topicId, remove) => {\n await remove(topicIndex);\n validateForm();\n setValidDiscussionTopics(filterItemFromObject(validDiscussionTopics, 'id', topicId));\n };\n\n const handleOnFocus = useCallback((id, hasError) => {\n if (hasError) {\n setValidDiscussionTopics(currentValidTopics => filterItemFromObject(currentValidTopics, 'id', id));\n setFieldValue('divideDiscussionIds', filterItemFromObject(divideDiscussionIds, 'id', id));\n } else {\n setValidDiscussionTopics(currentValidTopics => {\n const allDiscussionTopics = [...currentValidTopics, ...discussionTopics.filter(topic => topic.id === id)];\n const allValidTopics = _.remove(allDiscussionTopics, topic => topic.name !== '');\n return _.uniqBy(allValidTopics, 'id');\n });\n setFieldValue('divideDiscussionIds', _.uniq([...divideDiscussionIds, id]));\n }\n }, [divideDiscussionIds, discussionTopics]);\n\n const addNewTopic = (push) => {\n const payload = { name: '', id: uuid() };\n push(payload);\n };\n\n return (\n <>\n
\n {intl.formatMessage(messages.discussionTopics)}\n
\n \n
\n {intl.formatMessage(messages.discussionTopicsHelp)}\n
\n
\n (\n
\n {discussionTopics.map((topic, index) => (\n handleTopicDelete(index, topic.id, remove)}\n onFocus={(hasError) => handleOnFocus(topic.id, hasError)}\n hasError={discussionTopicErrors[index]}\n />\n ))}\n
\n addNewTopic(push)}\n variant=\"link\"\n iconBefore={Add}\n className=\"text-primary-500 p-0\"\n >\n {intl.formatMessage(messages.addTopicButton)}\n \n
\n
\n )}\n />\n
\n \n );\n};\n\nDiscussionTopics.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(DiscussionTopics);\n","import React, { useEffect, useContext } from 'react';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Form, TransitionReplace, Hyperlink, Alert,\n} from '@openedx/paragon';\nimport { AppContext } from '@edx/frontend-platform/react';\nimport { FieldArray, useFormikContext } from 'formik';\nimport _ from 'lodash';\nimport { useParams } from 'react-router-dom';\nimport FormSwitchGroup from '../../../../../generic/FormSwitchGroup';\nimport messages from '../../messages';\nimport AppConfigFormDivider from './AppConfigFormDivider';\nimport { OpenedXConfigFormContext } from '../openedx/OpenedXConfigFormProvider';\n\nconst DivisionByGroupFields = ({ intl }) => {\n const { validDiscussionTopics } = useContext(OpenedXConfigFormContext);\n const {\n handleChange,\n handleBlur,\n values: appConfig,\n setFieldValue,\n } = useFormikContext();\n const {\n divideDiscussionIds,\n discussionTopics,\n divideByCohorts,\n divideCourseTopicsByCohorts,\n cohortsEnabled,\n } = appConfig;\n\n const { courseId } = useParams();\n const { config } = useContext(AppContext);\n const learningCourseURL = `${config.LMS_BASE_URL}/courses/${courseId}/instructor`;\n\n useEffect(() => {\n if (divideByCohorts) {\n if (!divideCourseTopicsByCohorts && _.size(discussionTopics) !== _.size(divideDiscussionIds)) {\n setFieldValue('divideDiscussionIds', discussionTopics.map(topic => topic.id));\n }\n } else {\n setFieldValue('divideDiscussionIds', []);\n setFieldValue('divideCourseTopicsByCohorts', false);\n }\n }, [\n divideByCohorts,\n divideCourseTopicsByCohorts,\n ]);\n\n const handleCheckBoxToggle = (event, push, remove) => {\n const { checked, value } = event.target;\n if (checked) {\n push(value);\n } else {\n remove(divideDiscussionIds.indexOf(value));\n }\n };\n\n const handleDivideCourseTopicsByCohortsToggle = (event) => {\n const { checked } = event.target;\n if (!checked) {\n setFieldValue('divideDiscussionIds', []);\n }\n handleChange(event);\n };\n\n return (\n <>\n
\n {intl.formatMessage(messages.divisionByGroup)}\n
\n {!cohortsEnabled\n && (\n \n {intl.formatMessage(messages.cohortsEnabled)}\n \n {intl.formatMessage(messages.instructorDashboard)}\n \n \n )}\n \n \n {(divideByCohorts && cohortsEnabled) ? (\n \n \n handleDivideCourseTopicsByCohortsToggle(event)}\n onBlur={handleBlur}\n className=\"ml-4 mt-3\"\n id=\"divideCourseTopicsByCohorts\"\n checked={divideCourseTopicsByCohorts}\n label={intl.formatMessage(messages.divideCourseTopicsByCohortsLabel)}\n helpText={intl.formatMessage(messages.divideCourseTopicsByCohortsHelp)}\n />\n \n {divideCourseTopicsByCohorts ? (\n \n (\n \n handleCheckBoxToggle(event, push, remove)}\n onBlur={handleBlur}\n defaultValue={divideDiscussionIds}\n >\n {validDiscussionTopics.map((topic) => (\n topic.name ? (\n \n {topic.name}\n \n ) : null\n ))}\n \n \n )}\n />\n \n ) : (\n \n )}\n \n \n ) : (\n \n )}\n \n \n );\n};\n\nDivisionByGroupFields.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(DivisionByGroupFields);\n","import React from 'react';\nimport { useFormikContext } from 'formik';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport FormSwitchGroup from '../../../../../generic/FormSwitchGroup';\nimport AppConfigFormDivider from './AppConfigFormDivider';\nimport messages from '../../messages';\n\nconst ReportedContentEmailNotifications = ({ intl }) => {\n const {\n handleChange,\n handleBlur,\n values,\n } = useFormikContext();\n\n return (\n
\n
{intl.formatMessage(messages.reportedContentEmailNotifications)}
\n \n \n
\n );\n};\n\nReportedContentEmailNotifications.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(ReportedContentEmailNotifications);\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { useFormikContext } from 'formik';\nimport FormSwitchGroup from '../../../../../generic/FormSwitchGroup';\nimport messages from '../../messages';\nimport AppConfigFormDivider from './AppConfigFormDivider';\nimport ConfirmationPopup from '../../../../../generic/ConfirmationPopup';\n\nconst InContextDiscussionFields = ({\n onBlur,\n onChange,\n intl,\n values,\n}) => {\n const {\n setFieldValue,\n } = useFormikContext();\n\n const [showPopup, setShowPopup] = useState(false);\n const handleConfirmation = () => {\n setFieldValue('enableGradedUnits', !values.enableGradedUnits);\n setShowPopup(false);\n };\n\n return (\n <>\n
{intl.formatMessage(messages.visibilityInContext)}
\n {showPopup\n ? (\n setShowPopup(false)}\n cancelLabel={intl.formatMessage(messages.cancelButton)}\n />\n )\n : (\n setShowPopup(true)}\n onBlur={onBlur}\n id=\"enableGradedUnits\"\n checked={values.enableGradedUnits}\n label={intl.formatMessage(messages.gradedUnitPagesLabel)}\n helpText={intl.formatMessage(messages.gradedUnitPagesHelp)}\n />\n )}\n \n \n \n );\n};\n\nInContextDiscussionFields.propTypes = {\n onBlur: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n intl: intlShape.isRequired,\n values: PropTypes.shape({\n enableGradedUnits: PropTypes.bool,\n groupAtSubsection: PropTypes.bool,\n }).isRequired,\n};\n\nexport default injectIntl(InContextDiscussionFields);\n","import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Card, Form } from '@openedx/paragon';\nimport { Formik } from 'formik';\nimport PropTypes from 'prop-types';\nimport React, { useState } from 'react';\n\nimport { useSelector } from 'react-redux';\nimport * as Yup from 'yup';\nimport { useModel, useModels } from 'CourseAuthoring/generic/model-store';\nimport { setupYupExtensions } from 'CourseAuthoring/utils';\nimport messages from '../../messages';\nimport { checkFieldErrors } from '../../utils';\nimport AnonymousPostingFields from '../shared/AnonymousPostingFields';\nimport AppConfigFormDivider from '../shared/AppConfigFormDivider';\nimport DiscussionRestriction from '../shared/DiscussionRestriction';\nimport DiscussionTopics from '../shared/discussion-topics/DiscussionTopics';\nimport DivisionByGroupFields from '../shared/DivisionByGroupFields';\nimport ReportedContentEmailNotifications from '../shared/ReportedContentEmailNotifications';\nimport InContextDiscussionFields from '../shared/InContextDiscussionFields';\nimport OpenedXConfigFormProvider from './OpenedXConfigFormProvider';\n\nsetupYupExtensions();\n\nconst OpenedXConfigForm = ({\n onSubmit, formRef, intl, legacy,\n}) => {\n const {\n selectedAppId, enableGradedUnits, discussionTopicIds, divideDiscussionIds, postingRestrictions,\n } = useSelector(state => state.discussions);\n const appConfigObj = useModel('appConfigs', selectedAppId);\n const discussionTopicsModel = useModels('discussionTopics', discussionTopicIds);\n const legacyAppConfig = {\n ...(appConfigObj || {}),\n divideDiscussionIds,\n enableInContext: true,\n enableGradedUnits,\n postingRestrictions,\n unitLevelVisibility: true,\n allowAnonymousPostsPeers: appConfigObj?.allowAnonymousPostsPeers || false,\n reportedContentEmailNotifications: appConfigObj?.reportedContentEmailNotifications || false,\n restrictedDates: appConfigObj?.restrictedDates || [],\n discussionTopics: discussionTopicsModel || [],\n divideByCohorts: appConfigObj?.divideByCohorts || false,\n divideCourseTopicsByCohorts: appConfigObj?.divideCourseTopicsByCohorts || false,\n groupAtSubsection: appConfigObj?.groupAtSubsection || false,\n };\n\n const [validDiscussionTopics, setValidDiscussionTopics] = useState(discussionTopicsModel);\n // These fields are only used for the new provider and aren't supported for legacy.\n const additionalFields = legacy ? {} : {\n enabledGradedUnits: Yup.bool().default(false),\n groupAtSubsection: Yup.bool().default(false),\n };\n const validationSchema = Yup.object().shape({\n // eslint-disable-next-line react/forbid-prop-types\n restrictedDates: Yup.array(\n Yup.object().shape({\n startDate: Yup.string()\n .checkFormat(intl.formatMessage(messages.restrictedStartDateInValidFormat), 'date')\n .required(intl.formatMessage(messages.restrictedStartDateRequired)),\n endDate: Yup.string()\n .checkFormat(intl.formatMessage(messages.restrictedEndDateInValidFormat), 'date')\n .required(intl.formatMessage(messages.restrictedEndDateRequired))\n .when('startDate', {\n is: (startDate) => startDate,\n then: Yup.string().compare(intl.formatMessage(messages.restrictedEndDateInPast), 'date'),\n }),\n startTime: Yup.string().checkFormat(\n intl.formatMessage(messages.restrictedStartTimeInValidFormat),\n 'time',\n ),\n endTime: Yup.string()\n .checkFormat(intl.formatMessage(messages.restrictedEndTimeInValidFormat), 'time')\n .when('startTime', {\n is: (startTime) => startTime,\n then: Yup.string().compare(intl.formatMessage(messages.restrictedEndTimeInPast), 'time'),\n }),\n }),\n ),\n // eslint-disable-next-line react/forbid-prop-types\n discussionTopics: Yup.array(\n Yup.object({\n name: Yup.string().required(intl.formatMessage(messages.discussionTopicRequired)),\n }).uniqueObjectProperty('name', intl.formatMessage(messages.discussionTopicNameAlreadyExist)),\n ),\n ...additionalFields,\n });\n\n return (\n onSubmit(values)}\n >\n {({\n handleSubmit, handleChange, handleBlur, values, errors, touched,\n }) => {\n const { discussionTopics, restrictedDates } = values;\n const discussionTopicErrors = discussionTopics.map((value, index) => checkFieldErrors(touched, errors, `discussionTopics.${index}`, 'name'));\n const restrictedDatesErrors = restrictedDates.map(\n (value, index) => checkFieldErrors(touched, errors, `restrictedDates.${index}`, 'startDate')\n || checkFieldErrors(touched, errors, `restrictedDates.${index}`, 'endDate')\n || checkFieldErrors(touched, errors, `restrictedDates.${index}`, 'startTime')\n || checkFieldErrors(touched, errors, `restrictedDates.${index}`, 'endTime'),\n );\n\n const contextValue = {\n validDiscussionTopics,\n setValidDiscussionTopics,\n discussionTopicErrors,\n postingRestrictions,\n restrictedDatesErrors,\n isFormInvalid:\n discussionTopicErrors.some((error) => error)\n || restrictedDatesErrors.some((error) => error),\n };\n\n return (\n \n \n
\n

{intl.formatMessage(messages[`appName-${selectedAppId}`])}

\n \n {!legacy\n && (\n <>\n \n \n \n )}\n \n \n \n \n \n \n \n \n \n
\n
\n );\n }}\n \n );\n};\n\nOpenedXConfigForm.propTypes = {\n legacy: PropTypes.bool.isRequired,\n onSubmit: PropTypes.func.isRequired,\n // eslint-disable-next-line react/forbid-prop-types\n formRef: PropTypes.object.isRequired,\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(OpenedXConfigForm);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n documentationPage: {\n id: 'authoring.discussions.documentationPage',\n defaultMessage: 'Visit the {name} documentation page',\n },\n formInstructions: {\n id: 'authoring.discussions.formInstructions',\n defaultMessage: 'Complete the fields below to set up your discussion tool.',\n },\n consumerKey: {\n id: 'authoring.discussions.consumerKey',\n defaultMessage: 'Consumer Key',\n description: 'Label for the Consumer Key field.',\n },\n consumerKeyRequired: {\n id: 'authoring.discussions.consumerKey.required',\n defaultMessage: 'Consumer key is a required field',\n description: 'Tells the user that the Consumer Key field is required and must have a value.',\n },\n consumerSecret: {\n id: 'authoring.discussions.consumerSecret',\n defaultMessage: 'Consumer Secret',\n description: 'Label for the Consumer Secret field.',\n },\n consumerSecretRequired: {\n id: 'authoring.discussions.consumerSecret.required',\n defaultMessage: 'Consumer secret is a required field',\n description: 'Tells the user that the Consumer Secret field is required and must have a value.',\n },\n launchUrl: {\n id: 'authoring.discussions.launchUrl',\n defaultMessage: 'Launch URL',\n description: 'Label for the Launch URL field.',\n },\n launchUrlRequired: {\n id: 'authoring.discussions.launchUrl.required',\n defaultMessage: 'Launch URL is a required field',\n description: 'Tells the user that the Launch URL field is required and must have a value.',\n },\n staffOnlyConfigInfo: {\n id: 'authoring.discussions.stuffOnlyConfigInfo',\n defaultMessage: 'To enable {providerName} for your course, please contact their support team at {supportEmail} to learn more about pricing and usage.',\n },\n staffOnlyConfigGuide: {\n id: 'authoring.discussions.stuffOnlyConfigGuide',\n defaultMessage: 'To fully configure {providerName} will also require sharing usernames and emails for learners and course team. Please contact your edX project coordinator to enable PII sharing for this course.',\n },\n piiSharing: {\n id: 'authoring.discussions.piiSharing',\n defaultMessage: 'Optionally share a user\\'s username and/or email with the LTI provider:',\n },\n piiShareUsername: {\n id: 'authoring.discussions.piiShareUsername',\n defaultMessage: 'Share username',\n description: 'Label for the Share Username field.',\n },\n piiShareEmail: {\n id: 'authoring.discussions.piiShareEmail',\n defaultMessage: 'Share email',\n description: 'Label for the Share Email field.',\n },\n contact: {\n id: 'authoring.discussions.appDocInstructions.contact',\n defaultMessage: 'Contact: {link}',\n description: 'Contact',\n },\n general: {\n id: 'authoring.discussions.appDocInstructions.documentationLink',\n defaultMessage: 'General documentation',\n description: 'Application Document Instructions message for documentation link',\n },\n accessibility: {\n id: 'authoring.discussions.appDocInstructions.accessibilityDocumentationLink',\n defaultMessage: 'Accessibility documentation',\n description: 'Application Document Instructions message for accessibility link',\n },\n configuration: {\n id: 'authoring.discussions.appDocInstructions.configurationLink',\n defaultMessage: 'Configuration documentation',\n description: 'Application Document Instructions message for configurations link',\n },\n learnMore: {\n id: 'authoring.discussions.appDocInstructions.learnMoreLink',\n defaultMessage: 'Learn more about {providerName}',\n description: 'Application Document Instructions message for learn more links',\n },\n linkTextHeading: {\n id: 'authoring.discussions.appDocInstructions.linkTextHeading',\n defaultMessage: 'External help and documentation',\n description: 'External help and documentation heading',\n },\n linkText: {\n id: 'authoring.discussions.appDocInstructions.linkText',\n defaultMessage: '{link}',\n description: 'link',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Hyperlink, MailtoLink,\n} from '@openedx/paragon';\n\nimport AppConfigFormDivider from './AppConfigFormDivider';\n\nimport messages from '../lti/messages';\n\nconst AppExternalLinks = ({\n externalLinks,\n intl,\n providerName,\n showLaunchIcon,\n customClasses,\n}) => {\n const { contactEmail, ...links } = externalLinks;\n const linkTypes = Object.keys(links).filter(key => links[key]);\n return (\n
\n {linkTypes.length\n ? (\n <>\n \n

{intl.formatMessage(messages.linkTextHeading)}

\n {linkTypes.map((type) => (\n
\n \n { intl.formatMessage(messages[type], { providerName }) }\n \n
\n ))}\n \n ) : null}\n {contactEmail && (\n
\n
\n \n { contactEmail }\n \n ),\n }}\n />\n
\n )}\n
\n );\n};\n\nAppExternalLinks.propTypes = {\n externalLinks: PropTypes.shape({\n learnMore: PropTypes.string,\n configuration: PropTypes.string,\n general: PropTypes.string,\n accessibility: PropTypes.string,\n contactEmail: PropTypes.string,\n }).isRequired,\n providerName: PropTypes.string.isRequired,\n intl: intlShape.isRequired,\n showLaunchIcon: PropTypes.bool,\n customClasses: PropTypes.string,\n};\n\nAppExternalLinks.defaultProps = {\n showLaunchIcon: false,\n customClasses: '',\n};\n\nexport default injectIntl(AppExternalLinks);\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { ensureConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Card, Form, MailtoLink } from '@openedx/paragon';\n\nimport { useFormik } from 'formik';\nimport { useDispatch, useSelector } from 'react-redux';\nimport * as Yup from 'yup';\n\nimport { updateValidationStatus } from '../../../data/slice';\nimport AppExternalLinks from '../shared/AppExternalLinks';\nimport messages from './messages';\nimport appMessages from '../../messages';\nimport { useModel } from '../../../../../generic/model-store';\n\nensureConfig(['SITE_NAME', 'SUPPORT_EMAIL'], 'LTI Config Form');\n\nconst LtiConfigForm = ({ onSubmit, intl, formRef }) => {\n const dispatch = useDispatch();\n\n const { selectedAppId, piiConfig } = useSelector((state) => state.discussions);\n const appConfig = useModel('appConfigs', selectedAppId);\n const app = useModel('apps', selectedAppId);\n const providerName = intl.formatMessage(appMessages[`appName-${app?.id}`]);\n const ltiAppConfig = {\n consumerKey: appConfig?.consumerKey || '',\n consumerSecret: appConfig?.consumerSecret || '',\n launchUrl: appConfig?.launchUrl || '',\n piiShareUsername: piiConfig.piiSharing ? piiConfig.piiShareUsername : undefined,\n piiShareEmail: piiConfig.piiSharing ? piiConfig.piiShareEmail : undefined,\n };\n const user = getAuthenticatedUser();\n const { externalLinks } = app;\n const {\n handleSubmit, handleChange, handleBlur, values, touched, errors,\n } = useFormik({\n initialValues: ltiAppConfig,\n validationSchema: Yup.object().shape({\n consumerKey: Yup.string().required(intl.formatMessage(messages.consumerKeyRequired)),\n consumerSecret: Yup.string().required(intl.formatMessage(messages.consumerSecretRequired)),\n launchUrl: Yup.string().required(intl.formatMessage(messages.launchUrlRequired)),\n piiShareUsername: Yup.bool(),\n piiShareEmail: Yup.bool(),\n }),\n onSubmit,\n });\n const isInvalidConsumerKey = Boolean(touched.consumerKey && errors.consumerKey);\n const isInvalidConsumerSecret = Boolean(touched.consumerSecret && errors.consumerSecret);\n const isInvalidLaunchUrl = Boolean(touched.launchUrl && errors.launchUrl);\n const showLTIConfig = user.administrator;\n const enablePIISharing = false;\n const supportEmails = {\n Yellowdig: 'learnmore@yellowdig.com',\n 'Ed Discussion': 'team@edstem.org',\n InScribe: 'hello@inscribeapp.com',\n Piazza: 'team@piazza.com',\n };\n\n useEffect(() => {\n dispatch(updateValidationStatus({ hasError: Object.keys(errors).length > 0 }));\n }, [errors]);\n\n return (\n \n
\n

{providerName}

\n

\n {supportEmails[providerName]}\n ) : (\n 'support'\n ),\n }}\n />\n

\n

\n {supportEmails[providerName]}\n ) : (\n 'support'\n ),\n }}\n />\n

\n {(showLTIConfig && piiConfig.piiSharing) && (\n <>\n

{intl.formatMessage(messages.formInstructions)}

\n \n \n {isInvalidConsumerKey && (\n \n {errors.consumerKey}\n \n )}\n \n \n \n {isInvalidConsumerSecret && (\n \n {errors.consumerSecret}\n \n )}\n \n \n \n {isInvalidLaunchUrl && (\n \n {errors.launchUrl}\n \n )}\n \n \n )}\n {(enablePIISharing) && (\n
\n {intl.formatMessage(messages.piiSharing)}\n \n \n \n \n
\n )}\n \n \n
\n );\n};\n\nLtiConfigForm.propTypes = {\n intl: intlShape.isRequired,\n onSubmit: PropTypes.func.isRequired,\n // eslint-disable-next-line react/forbid-prop-types\n formRef: PropTypes.object.isRequired,\n};\n\nexport default injectIntl(LtiConfigForm);\n","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nexport const AppConfigFormContext = React.createContext({});\n\nconst AppConfigFormProvider = ({ children }) => {\n const formRef = React.createRef();\n const contextValue = useMemo(() => ({ formRef }), []);\n\n return (\n \n {children}\n \n );\n};\n\nAppConfigFormProvider.propTypes = {\n children: PropTypes.node.isRequired,\n};\n\nexport default AppConfigFormProvider;\n","import React, { useCallback, useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { StatefulButton } from '@openedx/paragon';\n\nimport messages from './messages';\nimport { SAVING } from '../data/slice';\nimport { AppConfigFormContext } from './AppConfigFormProvider';\nimport { useModel } from '../../../generic/model-store';\n\nconst AppConfigFormSaveButton = ({ intl, labelText }) => {\n const saveStatus = useSelector(state => state.discussions.saveStatus);\n const { selectedAppId } = useSelector((state) => state.discussions);\n\n const app = useModel('apps', selectedAppId);\n const canSubmit = getAuthenticatedUser().administrator || !app?.adminOnlyConfig;\n\n const { formRef } = useContext(AppConfigFormContext);\n\n const submitButtonState = saveStatus === SAVING ? 'pending' : 'default';\n\n // This causes the form to be submitted from a button outside the form.\n const handleSave = useCallback(() => {\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/Event\n // cancelable: (optional) a Boolean indicating whether the event can be canceled. The default is false.\n // cancelable: true cancels the untrusted event and safari, chrome cancel the untrusted event by default\n formRef.current.dispatchEvent(new Event('submit', {\n cancelable: true, bubbles: true,\n }));\n }, [formRef]);\n\n return (\n canSubmit && (\n \n )\n );\n};\n\nAppConfigFormSaveButton.propTypes = {\n intl: intlShape.isRequired,\n labelText: PropTypes.string,\n};\n\nAppConfigFormSaveButton.defaultProps = {\n labelText: '',\n};\n\nexport default injectIntl(AppConfigFormSaveButton);\n","import React, {\n useCallback, useContext, useEffect, useState,\n} from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useNavigate, useParams } from 'react-router-dom';\n\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n Container,\n ModalDialog,\n} from '@openedx/paragon';\n\nimport Loading from '../../../generic/Loading';\nimport PermissionDeniedAlert from '../../../generic/PermissionDeniedAlert';\nimport SaveFormConnectionErrorAlert from '../../../generic/SaveFormConnectionErrorAlert';\nimport { PagesAndResourcesContext } from '../../PagesAndResourcesProvider';\nimport {\n DENIED,\n FAILED, LOADED, LOADING, selectApp,\n} from '../data/slice';\nimport { fetchDiscussionSettings, saveProviderConfig } from '../data/thunks';\nimport OpenedXConfigForm from './apps/openedx';\nimport LtiConfigForm from './apps/lti';\nimport AppConfigFormProvider, { AppConfigFormContext } from './AppConfigFormProvider';\nimport AppConfigFormSaveButton from './AppConfigFormSaveButton';\nimport messages from './messages';\n\nconst AppConfigForm = ({\n courseId, intl,\n}) => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n\n const { formRef } = useContext(AppConfigFormContext);\n const { path: pagesAndResourcesPath } = useContext(PagesAndResourcesContext);\n const { appId: routeAppId } = useParams();\n const [isLoading, setLoading] = useState(true);\n const {\n activeAppId, selectedAppId, status, saveStatus,\n } = useSelector(state => state.discussions);\n\n const [confirmationDialogVisible, setConfirmationDialogVisible] = useState(false);\n\n useEffect(() => {\n (async () => {\n await dispatch(fetchDiscussionSettings(courseId, selectedAppId));\n setLoading(false);\n })();\n }, [courseId, selectedAppId]);\n\n useEffect(() => {\n if (status === LOADED) {\n if (routeAppId !== selectedAppId) {\n dispatch(selectApp({ appId: routeAppId }));\n }\n }\n }, [selectedAppId, routeAppId, status]);\n\n // This is a callback that gets called after the form has been submitted successfully.\n const handleSubmit = useCallback((values) => {\n const needsConfirmation = (activeAppId !== selectedAppId);\n if (needsConfirmation && !confirmationDialogVisible) {\n setConfirmationDialogVisible(true);\n } else {\n setConfirmationDialogVisible(false);\n // Note that when this action succeeds, we redirect to pagesAndResourcesPath in the thunk.\n dispatch(saveProviderConfig(courseId, selectedAppId, values, pagesAndResourcesPath, navigate));\n }\n }, [activeAppId, confirmationDialogVisible, courseId, selectedAppId]);\n\n if (!selectedAppId || status === LOADING || isLoading) {\n return (\n \n );\n }\n\n let alert = null;\n if (saveStatus === FAILED) {\n alert = (\n \n );\n }\n if (saveStatus === DENIED) {\n alert = ;\n }\n\n let form;\n if (selectedAppId === 'legacy') {\n form = (\n \n );\n } else if (selectedAppId === 'openedx') {\n form = (\n \n );\n } else {\n form = (\n \n );\n }\n\n return (\n \n {alert}\n {form}\n setConfirmationDialogVisible(false)}\n title={intl.formatMessage(messages.ok)}\n >\n \n \n {intl.formatMessage(messages.confirmConfigurationChange)}\n \n \n \n {intl.formatMessage(messages.configurationChangeConsequence)}\n \n \n \n \n {intl.formatMessage(messages.cancel)}\n \n \n \n \n \n \n );\n};\n\nAppConfigForm.propTypes = {\n courseId: PropTypes.string.isRequired,\n intl: intlShape.isRequired,\n};\n\nconst IntlAppConfigForm = injectIntl(AppConfigForm);\n\nIntlAppConfigForm.Provider = AppConfigFormProvider;\nIntlAppConfigForm.SaveButton = AppConfigFormSaveButton;\n\nexport default IntlAppConfigForm;\n","import React, {\n useCallback, useContext, useEffect, useState,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Alert, Button, FullscreenModal, Stepper,\n} from '@openedx/paragon';\n\nimport { PagesAndResourcesContext } from '../PagesAndResourcesProvider';\n\nimport messages from './messages';\nimport DiscussionsProvider from './DiscussionsProvider';\nimport { fetchProviders } from './data/thunks';\nimport AppList from './app-list';\nimport AppConfigForm from './app-config-form';\nimport { DENIED, FAILED } from './data/slice';\nimport ConnectionErrorAlert from '../../generic/ConnectionErrorAlert';\nimport { useModel } from '../../generic/model-store';\nimport PermissionDeniedAlert from '../../generic/PermissionDeniedAlert';\nimport Loading from '../../generic/Loading';\n\nconst SELECTION_STEP = 'selection';\nconst SETTINGS_STEP = 'settings';\n\nconst DiscussionsSettings = ({ courseId, intl }) => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const { path: pagesAndResourcesPath } = useContext(PagesAndResourcesContext);\n const { status, hasValidationError } = useSelector(state => state.discussions);\n const { canChangeProviders } = useSelector(state => state.courseDetail);\n const courseDetail = useModel('courseDetails', courseId);\n\n useEffect(() => {\n dispatch(fetchProviders(courseId));\n }, [courseId]);\n\n const discussionsPath = `${pagesAndResourcesPath}/discussion`;\n const { appId } = useParams();\n\n const startStep = appId ? SETTINGS_STEP : SELECTION_STEP;\n const [currentStep, setCurrentStep] = useState(startStep);\n\n useEffect(() => {\n setCurrentStep(appId ? SETTINGS_STEP : SELECTION_STEP);\n }, [appId]);\n\n const handleClose = useCallback(() => {\n navigate(pagesAndResourcesPath);\n }, [pagesAndResourcesPath]);\n\n const handleBack = useCallback(() => {\n navigate(discussionsPath);\n }, [discussionsPath]);\n\n if (!courseDetail) {\n return ;\n }\n\n if (status === FAILED) {\n return (\n \n \n \n );\n }\n\n if (status === DENIED) {\n return (\n \n \n \n );\n }\n\n return (\n \n \n \n }\n isOverflowVisible={false}\n footerNode={(\n <>\n \n \n \n \n
\n \n {intl.formatMessage(messages.backButton)}\n \n \n
\n
\n \n )}\n >\n \n {\n !canChangeProviders && (\n \n {intl.formatMessage(messages.noProviderSwitchAfterCourseStarted)}\n \n )\n }\n \n \n \n \n \n \n
\n
\n
\n );\n};\n\nDiscussionsSettings.propTypes = {\n courseId: PropTypes.string.isRequired,\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(DiscussionsSettings);\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Icon, IconButton, Hyperlink } from '@openedx/paragon';\nimport { ArrowForward, Settings } from '@openedx/paragon/icons';\nimport { useNavigate } from 'react-router-dom';\nimport messages from '../messages';\nimport { PagesAndResourcesContext } from '../PagesAndResourcesProvider';\n\nconst PageSettingButton = ({\n id,\n legacyLink,\n allowedOperations,\n}) => {\n const { formatMessage } = useIntl();\n const { path: pagesAndResourcesPath } = useContext(PagesAndResourcesContext);\n const navigate = useNavigate();\n\n if (legacyLink) {\n return (\n \n \n \n );\n } if (!(allowedOperations?.configure || allowedOperations?.enable)) {\n return null;\n }\n return (\n navigate(`${pagesAndResourcesPath}/${id}/settings`)}\n />\n );\n};\n\nPageSettingButton.defaultProps = {\n legacyLink: null,\n allowedOperations: null,\n};\n\nPageSettingButton.propTypes = {\n id: PropTypes.string.isRequired,\n legacyLink: PropTypes.string,\n allowedOperations: PropTypes.shape({\n configure: PropTypes.bool,\n enable: PropTypes.bool,\n }),\n};\n\nexport default PageSettingButton;\n","import classNames from 'classnames';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Badge, Card } from '@openedx/paragon';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport messages from '../messages';\nimport { useIsDesktop } from '../../utils';\nimport PageSettingButton from './PageSettingButton';\nimport './PageCard.scss';\n\nconst CoursePageShape = PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n description: PropTypes.string.isRequired,\n enabled: PropTypes.bool.isRequired,\n legacyLink: PropTypes.string,\n allowedOperations: PropTypes.shape({\n enable: PropTypes.bool,\n configure: PropTypes.bool,\n }),\n});\n\nexport { CoursePageShape };\n\nconst PageCard = ({\n page,\n settingButton,\n}) => {\n const { formatMessage } = useIntl();\n const isDesktop = useIsDesktop();\n\n const SettingButton = settingButton || ;\n\n return (\n \n \n {formatMessage(messages.enabled)}\n \n )}\n actions={
{SettingButton}
}\n size=\"sm\"\n />\n \n \n {page.description}\n \n \n \n );\n};\n\nPageCard.defaultProps = {\n settingButton: null,\n};\n\nPageCard.propTypes = {\n page: CoursePageShape.isRequired,\n settingButton: PropTypes.node,\n};\n\nexport default PageCard;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { injectIntl } from '@edx/frontend-platform/i18n';\nimport { CardGrid } from '@openedx/paragon';\nimport { PluginSlot } from '@openedx/frontend-plugin-framework';\nimport PageCard, { CoursePageShape } from './PageCard';\n\nconst PageGrid = ({ pages }) => (\n \n {pages.map((page) => (\n \n ))}\n \n \n);\n\nPageGrid.propTypes = {\n pages: PropTypes.arrayOf(CoursePageShape.isRequired).isRequired,\n};\n\nexport default injectIntl(PageGrid);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { ErrorAlert } from '@edx/frontend-lib-content-components';\n\nimport messages from './messages';\n\nconst PluginLoadFailedError = () => {\n const intl = useIntl();\n return {intl.formatMessage(messages.errorShowingConfiguration)};\n};\n\nconst SettingsComponent = ({ url }) => {\n const { appId } = useParams();\n const navigate = useNavigate();\n\n const LazyLoadedComponent = React.useMemo(\n () => React.lazy(() =>\n import(`@openedx-plugins/course-app-${appId}/Settings.jsx`).catch((err) => { // eslint-disable-line\n // If we couldn't load this plugin, log the details to the console.\n console.trace(err); // eslint-disable-line no-console\n return { default: PluginLoadFailedError };\n })),\n [appId],\n );\n\n return navigate(url)} />;\n};\n\nSettingsComponent.propTypes = {\n url: PropTypes.string.isRequired,\n};\n\nexport default SettingsComponent;\n","import { isEmpty } from 'lodash';\n\n/**\n * Generate the string for the page \n * @param {string} courseOrSectionName The name of the course, or the section of the MFE that the user is in currently\n * @param {string} pageName The name of the current page\n * @returns {string} The combined title\n */\nconst getPageHeadTitle = (courseOrSectionName, pageName) => {\n if (isEmpty(courseOrSectionName)) {\n return `${pageName} | ${process.env.SITE_NAME}`;\n }\n return `${pageName} | ${courseOrSectionName} | ${process.env.SITE_NAME}`;\n};\n\nexport default getPageHeadTitle;\n","import React, { useContext, useEffect, Suspense } from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { PageWrap, AppContext } from '@edx/frontend-platform/react';\n\nimport { Routes, Route } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { Button, Hyperlink } from '@openedx/paragon';\nimport messages from './messages';\nimport DiscussionsSettings from './discussions';\n\nimport PageGrid from './pages/PageGrid';\nimport { fetchCourseApps } from './data/thunks';\nimport { useModels, useModel } from '../generic/model-store';\nimport { getCourseAppsApiStatus, getLoadingStatus } from './data/selectors';\nimport PagesAndResourcesProvider from './PagesAndResourcesProvider';\nimport { RequestStatus } from '../data/constants';\nimport SettingsComponent from './SettingsComponent';\nimport PermissionDeniedAlert from '../generic/PermissionDeniedAlert';\nimport getPageHeadTitle from '../generic/utils';\n\nconst PagesAndResources = ({ courseId, intl }) => {\n const courseDetails = useModel('courseDetails', courseId);\n document.title = getPageHeadTitle(courseDetails?.name, intl.formatMessage(messages.heading));\n\n const dispatch = useDispatch();\n useEffect(() => {\n dispatch(fetchCourseApps(courseId));\n }, [courseId]);\n\n const courseAppIds = useSelector(state => state.pagesAndResources.courseAppIds);\n const loadingStatus = useSelector(getLoadingStatus);\n const courseAppsApiStatus = useSelector(getCourseAppsApiStatus);\n\n const { config } = useContext(AppContext);\n const learningCourseURL = `${config.LEARNING_BASE_URL}/course/${courseId}`;\n const redirectUrl = `/course/${courseId}/pages-and-resources`;\n\n // The pages here are driven by course apps. The list of course app IDs comes from the LMS API.\n // We display all enabled course apps regardless of whether or not the corresponding frontend plugin is available.\n const pages = useModels('courseApps', courseAppIds);\n\n // We want the Xpert learning assistant and unit summaries to appear in the \"Content Permissions\" section instead,\n // so we remove them from pages and add them to contentPermissionsPages.\n const contentPermissionsPages = [];\n\n ['xpert_unit_summary', 'learning_assistant'].forEach(separateAppId => {\n const index = pages.findIndex(app => app.id === separateAppId);\n if (index !== -1) {\n const [page] = pages.splice(index, 1);\n contentPermissionsPages.push(page);\n }\n });\n\n if (loadingStatus === RequestStatus.IN_PROGRESS) {\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return <></>;\n }\n\n if (courseAppsApiStatus === RequestStatus.DENIED) {\n return (\n <PermissionDeniedAlert />\n );\n }\n\n return (\n <PagesAndResourcesProvider courseId={courseId}>\n <main className=\"container container-mw-md px-3\">\n <div className=\"d-flex justify-content-between my-4 my-md-5 align-items-center\">\n <h3 className=\"m-0\">{intl.formatMessage(messages.heading)}</h3>\n <Hyperlink\n destination={learningCourseURL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n showLaunchIcon={false}\n >\n <Button variant=\"outline-primary\" className=\"p-2\"> {intl.formatMessage(messages.viewLiveButton)}</Button>\n </Hyperlink>\n </div>\n\n <Routes>\n <Route path=\"discussion/configure/:appId\" element={<PageWrap><DiscussionsSettings courseId={courseId} /></PageWrap>} />\n <Route path=\"discussion\" element={<PageWrap><DiscussionsSettings courseId={courseId} /></PageWrap>} />\n <Route path=\"discussion/settings\" element={<PageWrap><DiscussionsSettings courseId={courseId} /></PageWrap>} />\n <Route path=\":appId/settings\" element={<PageWrap><Suspense fallback=\"...\"><SettingsComponent url={redirectUrl} /></Suspense></PageWrap>} />\n </Routes>\n\n <PageGrid pages={pages} />\n {\n (contentPermissionsPages.length > 0) && (\n <>\n <div className=\"d-flex justify-content-between my-4 my-md-5 align-items-center\">\n <h3 className=\"m-0\">{intl.formatMessage(messages.contentPermissions)}</h3>\n </div>\n <PageGrid pages={contentPermissionsPages} />\n </>\n )\n }\n </main>\n </PagesAndResourcesProvider>\n );\n};\n\nPagesAndResources.propTypes = {\n courseId: PropTypes.string.isRequired,\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(PagesAndResources);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useParams } from 'react-router-dom';\nimport { EditorPage } from '@edx/frontend-lib-content-components';\nimport { getConfig } from '@edx/frontend-platform';\n\nconst EditorContainer = ({\n courseId,\n}) => {\n const { blockType, blockId } = useParams();\n return (\n <div className=\"editor-page\">\n <EditorPage\n courseId={courseId}\n blockType={blockType}\n blockId={blockId}\n studioEndpointUrl={getConfig().STUDIO_BASE_URL}\n lmsEndpointUrl={getConfig().LMS_BASE_URL}\n />\n </div>\n );\n};\nEditorContainer.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default EditorContainer;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useParams } from 'react-router-dom';\nimport { VideoSelectorPage } from '@edx/frontend-lib-content-components';\nimport { getConfig } from '@edx/frontend-platform';\n\nconst VideoSelectorContainer = ({\n courseId,\n}) => {\n const { blockId } = useParams();\n return (\n <div className=\"selector-page\">\n <VideoSelectorPage\n blockId={blockId}\n courseId={courseId}\n studioEndpointUrl={getConfig().STUDIO_BASE_URL}\n lmsEndpointUrl={getConfig().LMS_BASE_URL}\n />\n </div>\n );\n};\n\nVideoSelectorContainer.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default VideoSelectorContainer;\n","/* eslint-disable import/prefer-default-export */\n\nexport const getLoadingStatus = (state) => state.customPages.loadingStatus;\nexport const getSavingStatus = (state) => state.customPages.savingStatus;\nexport const getCustomPagesApiStatus = (state) => state.customPages.customPagesApiStatus;\n// export const getCourseAppSettingValue = (setting) => (state) => (\n// state.pagesAndResources.courseAppSettings[setting]?.value\n// );\n","/* eslint-disable import/prefer-default-export */\nimport { camelCaseObject, ensureConfig, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nensureConfig([\n 'STUDIO_BASE_URL',\n], 'Course Apps API service');\n\nexport const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getTabHandlerUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v0/tabs/${courseId}`;\n\n/**\n * Fetches the course custom pages for provided course\n * @param {string} courseId\n * @returns {Promise<[{}]>}\n */\nexport async function getCustomPages(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getTabHandlerUrl(courseId)}`);\n return camelCaseObject(data);\n}\n\n/**\n * Delete custom page for provided block.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function deleteCustomPage(blockId) {\n await getAuthenticatedHttpClient()\n .delete(`${getApiBaseUrl()}/xblock/${blockId}`);\n}\n\n/**\n * Add custom page for provided block.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function addCustomPage(courseId) {\n const v1CourseId = courseId.substring(7);\n const courseBlockId = `block-${v1CourseId}+type@course+block@course`;\n const { data } = await getAuthenticatedHttpClient()\n .put(`${getApiBaseUrl()}/xblock/`, {\n category: 'static_tab',\n parent_locator: courseBlockId,\n });\n return camelCaseObject(data);\n}\n\n/**\n * Update custom page html for provided block.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function updateCustomPage({ blockId, htmlString, metadata }) {\n const { data } = await getAuthenticatedHttpClient()\n .put(`${getApiBaseUrl()}/xblock/${blockId}`, {\n id: blockId,\n data: htmlString,\n metadata,\n });\n return camelCaseObject(data);\n}\n\n/**\n * Update order of custom pages.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function updateCustomPageOrder(courseId, tabs) {\n await getAuthenticatedHttpClient()\n .post(`${getTabHandlerUrl(courseId)}/reorder`, tabs);\n}\n","import { RequestStatus } from '../../data/constants';\nimport {\n addModel,\n addModels,\n removeModel,\n updateModel,\n updateModels,\n} from '../../generic/model-store';\nimport {\n getCustomPages,\n deleteCustomPage,\n addCustomPage,\n updateCustomPage,\n updateCustomPageOrder,\n} from './api';\nimport {\n setPageIds,\n updateCustomPagesApiStatus,\n updateLoadingStatus,\n updateSavingStatus,\n updateAddingStatus,\n updateDeletingStatus,\n deleteCustomPageSuccess,\n addCustomPageSuccess,\n} from './slice';\n\nexport function fetchCustomPages(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.IN_PROGRESS }));\n\n try {\n const customPages = await getCustomPages(courseId);\n\n dispatch(addModels({ modelType: 'customPages', models: customPages }));\n dispatch(setPageIds({\n customPagesIds: customPages.map(page => page.id),\n }));\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.DENIED }));\n } else {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.FAILED }));\n }\n }\n };\n}\n\nexport function deleteSingleCustomPage({ blockId, closeConfirmation }) {\n return async (dispatch) => {\n dispatch(updateDeletingStatus({ status: RequestStatus.PENDING }));\n\n try {\n await deleteCustomPage(blockId);\n dispatch(removeModel({ modelType: 'customPages', model: blockId }));\n dispatch(deleteCustomPageSuccess({\n customPageId: blockId,\n }));\n dispatch(updateDeletingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateDeletingStatus({ status: RequestStatus.DENIED }));\n }\n dispatch(updateDeletingStatus({ status: RequestStatus.FAILED }));\n }\n closeConfirmation();\n };\n}\n\nexport function addSingleCustomPage(courseId) {\n return async (dispatch) => {\n dispatch(updateAddingStatus({ status: RequestStatus.PENDING }));\n\n try {\n const pageData = await addCustomPage(courseId);\n dispatch(addModel({\n modelType: 'customPages',\n model: {\n id: pageData.locator,\n courseStaffOnly: false,\n ...pageData,\n },\n }));\n dispatch(addCustomPageSuccess({\n customPageId: pageData.locator,\n }));\n dispatch(updateAddingStatus({ courseId, status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateAddingStatus({ status: RequestStatus.DENIED }));\n }\n dispatch(updateAddingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function updatePageOrder(courseId, pages) {\n const tabs = [];\n pages.forEach(page => {\n const currentTab = {};\n currentTab.tab_locator = page.id;\n tabs.push(currentTab);\n });\n return async (dispatch) => {\n try {\n await updateCustomPageOrder(courseId, tabs);\n dispatch(updateModels({ modelType: 'customPages', models: pages }));\n dispatch(setPageIds({\n customPagesIds: pages.map(page => page.id),\n }));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateCustomPagesApiStatus({ status: RequestStatus.DENIED }));\n }\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function updateCustomPageVisibility({ blockId, metadata }) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const pageData = await updateCustomPage({ blockId, metadata });\n dispatch(updateModel({\n modelType: 'customPages',\n model: {\n id: blockId,\n courseStaffOnly: pageData.metadata.courseStaffOnly,\n },\n }));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport const updateSingleCustomPage = ({\n blockId,\n metadata,\n setCurrentPage,\n}) => (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n try {\n dispatch(updateModel({\n modelType: 'customPages',\n model: {\n id: blockId,\n name: metadata.displayName,\n },\n }));\n setCurrentPage(null);\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n};\n","export default __webpack_public_path__ + \"fce053f854c92005feaa93744ba079de.png\";","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n heading: {\n id: 'course-authoring.custom-pages.heading',\n defaultMessage: 'Custom Pages',\n },\n errorAlertMessage: {\n id: 'course-authoring.custom-pages.errorAlert.message',\n defaultMessage: 'Unable to {actionName} page. Please try again.',\n },\n note: {\n id: 'course-authoring.custom-pages.note',\n defaultMessage: `Note: Pages are publicly visible. If users know the URL\n of a page, they can view the page even if they are not registered for\n or logged in to your course.`,\n },\n addPageHeaderLabel: {\n id: 'course-authoring.custom-pages.header.addPage.label',\n defaultMessage: 'New page',\n },\n viewLiveLabel: {\n id: 'course-authoring.custom-pages.header.viewLive.label',\n defaultMessage: 'View live',\n },\n pageExplanationHeader: {\n id: 'course-authoring.custom-pages.pageExplanation.header',\n defaultMessage: 'What are pages?',\n },\n pageExplanationBody: {\n id: 'course-authoring.custom-pages.pageExplanation.body',\n defaultMessage: `Pages are listed horizontally at the top of your course. Default pages (Home, Course, Discussion, Wiki, and Progress)\n are followed by textbooks and custom pages that you create.`,\n },\n customPagesExplanationHeader: {\n id: 'course-authoring.custom-pages.customPagesExplanation.header',\n defaultMessage: 'Custom pages',\n },\n customPagesExplanationBody: {\n id: 'course-authoring.custom-pages.customPagesExplanation.body',\n defaultMessage: `You can create and edit custom pages to probide students with additional course content. For example, you can create\n pages for the grading policy, course slide, and a course calendar.`,\n },\n studentViewExplanationHeader: {\n id: 'course-authoring.custom-pages.studentViewExplanation.header',\n defaultMessage: 'How do pages look to students in my course?',\n },\n studentViewExplanationBody: {\n id: 'course-authoring.custom-pages.studentViewExplanation.body',\n defaultMessage: 'Students see the default and custom pages at the top of your course and use the links to navigate.',\n },\n studentViewExampleButton: {\n id: 'course-authoring.custom-pages.studentViewExampleButton.label',\n defaultMessage: 'See an example',\n },\n studentViewModalTitle: {\n id: 'course-authoring.custom-pages.studentViewModal.title',\n defaultMessage: 'Pages in Your Course',\n },\n studentViewModalBody: {\n id: 'course-authoring.custom-pages.studentViewModal.Body',\n defaultMessage: \"Pages appear in your course's top navigation bar. The default pages (Home, Course, Discussion, Wiki, and Progress) are followed by textbooks and custom pages.\",\n },\n newPageTitle: {\n id: 'course-authoring.custom-pages.page.newPage.title',\n defaultMessage: 'Empty',\n },\n editTooltipContent: {\n id: 'course-authoring.custom-pages.editTooltip.content',\n defaultMessage: 'Edit',\n },\n deleteTooltipContent: {\n id: 'course-authoring.custom-pages.deleteTooltip.content',\n defaultMessage: 'Delete',\n },\n visibilityTooltipContent: {\n id: 'course-authoring.custom-pages.visibilityTooltip.content',\n defaultMessage: 'Hide/show page from learners',\n },\n addPageBodyLabel: {\n id: 'course-authoring.custom-pages.body.addPage.label',\n defaultMessage: 'Add a new page',\n },\n addingPageBodyLabel: {\n id: 'course-authoring.custom-pages.body.addingPage.label',\n defaultMessage: 'Adding a new page',\n },\n deleteConfirmationTitle: {\n id: 'course-authoring.custom-pages..deleteConfirmation.title',\n defaultMessage: 'Delete Page Confirmation',\n },\n deleteConfirmationMessage: {\n id: 'course-authoring.custom-pages..deleteConfirmation.message',\n defaultMessage: 'Are you sure you want to delete this page? This action cannot be undone.',\n },\n deletePageLabel: {\n id: 'course-authoring.custom-pages.deleteConfirmation.deletePage.label',\n defaultMessage: 'Delete',\n },\n deletingPageBodyLabel: {\n id: 'course-authoring.custom-pages.deleteConfirmation.deletingPage.label',\n defaultMessage: 'Deleting',\n },\n cancelButtonLabel: {\n id: 'course-authoring.custom-pages.deleteConfirmation.cancelButton.label',\n defaultMessage: 'Cancel',\n },\n});\n\nexport default messages;\n","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nexport const CustomPagesContext = React.createContext({});\n\nconst CustomPagesProvider = ({ courseId, children }) => {\n const contextValue = useMemo(() => ({\n courseId,\n path: `/course/${courseId}/custom-pages`,\n }), []);\n return (\n <CustomPagesContext.Provider\n value={contextValue}\n >\n {children}\n </CustomPagesContext.Provider>\n );\n};\n\nCustomPagesProvider.propTypes = {\n courseId: PropTypes.string.isRequired,\n children: PropTypes.node.isRequired,\n};\n\nexport default CustomPagesProvider;\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { intlShape, injectIntl } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n IconButtonWithTooltip,\n Icon,\n AlertModal,\n Button,\n StatefulButton,\n useToggle,\n} from '@openedx/paragon';\nimport {\n DeleteOutline,\n EditOutline,\n SpinnerSimple,\n Visibility,\n VisibilityOff,\n} from '@openedx/paragon/icons';\nimport { useNavigate } from 'react-router-dom';\nimport { deleteSingleCustomPage, updateCustomPageVisibility } from './data/thunks';\nimport messages from './messages';\nimport { CustomPagesContext } from './CustomPagesProvider';\n\nconst CustomPageCard = ({\n page,\n dispatch,\n deletePageStatus,\n setCurrentPage,\n // injected\n intl,\n}) => {\n const [isDeleteConfirmationOpen, openDeleteConfirmation, closeDeleteConfirmation] = useToggle(false);\n const { path: customPagesPath } = useContext(CustomPagesContext);\n const navigate = useNavigate();\n\n const handleDelete = () => {\n dispatch(deleteSingleCustomPage({\n blockId: page.id,\n closeConfirmation: closeDeleteConfirmation,\n }));\n };\n\n const toggleVisibility = () => {\n dispatch(updateCustomPageVisibility({\n blockId: page.id,\n metadata: { course_staff_only: !page.courseStaffOnly },\n }));\n };\n const handleEditOpen = () => {\n setCurrentPage(page.id);\n navigate(`${customPagesPath}/editor`);\n };\n\n const deletePageStateProps = {\n labels: {\n default: intl.formatMessage(messages.deletePageLabel),\n pending: intl.formatMessage(messages.deletingPageBodyLabel),\n },\n icons: {\n pending: <Icon src={SpinnerSimple} className=\"icon-spin\" />,\n },\n disabledStates: ['pending'],\n };\n\n return (\n <>\n <ActionRow>\n <div className=\"h4\" data-testid=\"card-title\">\n {page?.name || intl.formatMessage(messages.newPageTitle)}\n </div>\n <ActionRow.Spacer />\n <IconButtonWithTooltip\n key={intl.formatMessage(messages.editTooltipContent)}\n tooltipPlacement=\"top\"\n tooltipContent={intl.formatMessage(messages.editTooltipContent)}\n src={EditOutline}\n iconAs={Icon}\n alt={intl.formatMessage(messages.editTooltipContent)}\n onClick={handleEditOpen}\n data-testid=\"edit-modal-icon\"\n />\n <IconButtonWithTooltip\n key={intl.formatMessage(messages.visibilityTooltipContent)}\n tooltipPlacement=\"top\"\n tooltipContent={intl.formatMessage(messages.visibilityTooltipContent)}\n src={page.courseStaffOnly ? VisibilityOff : Visibility}\n iconAs={Icon}\n alt={intl.formatMessage(messages.visibilityTooltipContent)}\n onClick={toggleVisibility}\n data-testid=\"visibility-toggle-icon\"\n />\n <IconButtonWithTooltip\n key={intl.formatMessage(messages.deleteTooltipContent)}\n tooltipPlacement=\"top\"\n tooltipContent={intl.formatMessage(messages.deleteTooltipContent)}\n src={DeleteOutline}\n iconAs={Icon}\n alt={intl.formatMessage(messages.deleteTooltipContent)}\n onClick={openDeleteConfirmation}\n data-testid=\"delete-modal-icon\"\n />\n </ActionRow>\n <AlertModal\n title={intl.formatMessage(messages.deleteConfirmationTitle)}\n isOpen={isDeleteConfirmationOpen}\n onClose={closeDeleteConfirmation}\n footerNode={(\n <ActionRow>\n <Button variant=\"tertiary\" onClick={closeDeleteConfirmation}>\n {intl.formatMessage(messages.cancelButtonLabel)}\n </Button>\n <StatefulButton onClick={handleDelete} state={deletePageStatus} {...deletePageStateProps} />\n </ActionRow>\n )}\n >\n {intl.formatMessage(messages.deleteConfirmationMessage)}\n </AlertModal>\n </>\n );\n};\n\nCustomPageCard.propTypes = {\n page: PropTypes.shape({\n name: PropTypes.string,\n id: PropTypes.string.isRequired,\n courseStaffOnly: PropTypes.bool.isRequired,\n }).isRequired,\n dispatch: PropTypes.func.isRequired,\n deletePageStatus: PropTypes.string.isRequired,\n setCurrentPage: PropTypes.func.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(CustomPageCard);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport { EditorPage } from '@edx/frontend-lib-content-components';\n\nconst EditModal = ({\n pageId,\n courseId,\n onClose,\n}) => (\n <div\n style={{\n position: 'fixed',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n 'overflow-y': 'scroll',\n 'background-color': 'white',\n 'z-index': 100,\n }}\n >\n <EditorPage\n courseId={courseId}\n blockType=\"html\"\n blockId={pageId}\n studioEndpointUrl={getConfig().STUDIO_BASE_URL}\n lmsEndpointUrl={getConfig().LMS_BASE_URL}\n returnFunction={onClose}\n />\n </div>\n);\n\nEditModal.propTypes = {\n pageId: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default EditModal;\n","import React, { useEffect, useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Routes, Route, useNavigate } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { AppContext, PageWrap } from '@edx/frontend-platform/react';\nimport { injectIntl, FormattedMessage, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n Breadcrumb,\n Button,\n Layout,\n Hyperlink,\n StatefulButton,\n Icon,\n useToggle,\n Image,\n ModalDialog,\n Container,\n} from '@openedx/paragon';\nimport { Add, SpinnerSimple } from '@openedx/paragon/icons';\nimport Placeholder, {\n DraggableList,\n SortableItem,\n ErrorAlert,\n} from '@edx/frontend-lib-content-components';\n\nimport { RequestStatus } from '../data/constants';\nimport { useModels, useModel } from '../generic/model-store';\nimport { getLoadingStatus, getSavingStatus } from './data/selectors';\nimport {\n addSingleCustomPage,\n fetchCustomPages,\n updatePageOrder,\n updateSingleCustomPage,\n} from './data/thunks';\n\nimport previewLmsStaticPages from './data/images/previewLmsStaticPages.png';\nimport CustomPageCard from './CustomPageCard';\nimport messages from './messages';\nimport CustomPagesProvider from './CustomPagesProvider';\nimport EditModal from './EditModal';\nimport getPageHeadTitle from '../generic/utils';\nimport { getPagePath } from '../utils';\n\nconst CustomPages = ({\n courseId,\n // injected\n intl,\n}) => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const [orderedPages, setOrderedPages] = useState([]);\n const [currentPage, setCurrentPage] = useState();\n const [isOpen, open, close] = useToggle(false);\n\n const courseDetails = useModel('courseDetails', courseId);\n document.title = getPageHeadTitle(courseDetails?.name, intl.formatMessage(messages.heading));\n\n const { config } = useContext(AppContext);\n const learningCourseURL = `${config.LEARNING_BASE_URL}/course/${courseId}`;\n\n useEffect(() => {\n dispatch(fetchCustomPages(courseId));\n }, [courseId]);\n\n const customPagesIds = useSelector(state => state.customPages.customPagesIds);\n const addPageStatus = useSelector(state => state.customPages.addingStatus);\n const deletePageStatus = useSelector(state => state.customPages.deletingStatus);\n const savingStatus = useSelector(getSavingStatus);\n const loadingStatus = useSelector(getLoadingStatus);\n\n const pages = useModels('customPages', customPagesIds);\n\n const handleAddPage = () => { dispatch(addSingleCustomPage(courseId)); };\n const handleReorder = () => (newPageOrder) => {\n dispatch(updatePageOrder(courseId, newPageOrder));\n };\n const handleEditClose = () => (content) => {\n navigate(`/course/${courseId}/custom-pages`);\n if (!content?.metadata) {\n setCurrentPage(null);\n return;\n }\n dispatch(updateSingleCustomPage({\n blockId: currentPage,\n metadata: { displayName: content.metadata.display_name },\n setCurrentPage,\n }));\n };\n\n const addPageStateProps = {\n labels: {\n default: intl.formatMessage(messages.addPageBodyLabel),\n pending: intl.formatMessage(messages.addingPageBodyLabel),\n },\n icons: {\n default: <Icon src={Add} />,\n pending: <Icon src={SpinnerSimple} className=\"icon-spin\" />,\n },\n disabledStates: ['pending'],\n };\n useEffect(() => { setOrderedPages(pages); }, [customPagesIds, savingStatus]);\n if (loadingStatus === RequestStatus.IN_PROGRESS) {\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return (<></>);\n }\n if (loadingStatus === RequestStatus.DENIED) {\n return (\n <div data-testid=\"under-construction-placeholder\" className=\"row justify-content-center m-6\">\n <Placeholder />\n </div>\n );\n }\n return (\n <CustomPagesProvider courseId={courseId}>\n <Container size=\"xl\" className=\"p-4 pt-5\">\n <div className=\"small gray-700\">\n <Breadcrumb\n ariaLabel=\"Custom Page breadcrumbs\"\n links={[\n { label: 'Content', href: `${config.STUDIO_BASE_URL}/course/${courseId}` },\n { label: 'Pages and Resources', href: getPagePath(courseId, 'true', 'tabs') },\n ]}\n />\n </div>\n <ActionRow>\n <div className=\"h2\">\n <FormattedMessage {...messages.heading} />\n </div>\n <ActionRow.Spacer />\n <Button\n iconBefore={Add}\n onClick={handleAddPage}\n data-testid=\"header-add-button\"\n >\n <FormattedMessage {...messages.addPageHeaderLabel} />\n </Button>\n <Hyperlink\n destination={learningCourseURL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n showLaunchIcon={false}\n data-testid=\"header-view-live-button\"\n >\n <Button>\n <FormattedMessage {...messages.viewLiveLabel} />\n </Button>\n </Hyperlink>\n </ActionRow>\n <hr />\n <Layout\n lg={[{ span: 9, offset: 0 }, { span: 3, offset: 0 }]}\n md={[{ span: 9, offset: 0 }, { span: 3, offset: 0 }]}\n sm={[{ span: 9, offset: 0 }, { span: 3, offset: 0 }]}\n xs={[{ span: 9, offset: 0 }, { span: 3, offset: 0 }]}\n xl={[{ span: 9, offset: 0 }, { span: 3, offset: 0 }]}\n >\n <Layout.Element>\n <ErrorAlert hideHeading isError={deletePageStatus === RequestStatus.FAILED}>\n {intl.formatMessage(messages.errorAlertMessage, { actionName: 'delete' })}\n </ErrorAlert>\n <ErrorAlert hideHeading isError={addPageStatus === RequestStatus.FAILED}>\n {intl.formatMessage(messages.errorAlertMessage, { actionName: 'add' })}\n </ErrorAlert>\n <ErrorAlert hideHeading isError={savingStatus === RequestStatus.FAILED}>\n {intl.formatMessage(messages.errorAlertMessage, { actionName: 'save' })}\n </ErrorAlert>\n <div className=\"small gray-700 mb-4\">\n <FormattedMessage {...messages.note} />\n </div>\n <DraggableList itemList={orderedPages} setState={setOrderedPages} updateOrder={handleReorder}>\n {orderedPages.map((page) => (\n <SortableItem\n id={page.id}\n key={page.id}\n componentStyle={{\n background: 'white',\n borderRadius: '6px',\n padding: '24px',\n marginBottom: '16px',\n boxShadow: '0px 1px 5px #ADADAD',\n }}\n >\n <CustomPageCard\n {...{\n page,\n dispatch,\n deletePageStatus,\n courseId,\n setCurrentPage,\n }}\n />\n </SortableItem>\n ))}\n </DraggableList>\n <StatefulButton\n data-testid=\"body-add-button\"\n onClick={handleAddPage}\n state={addPageStatus}\n {...addPageStateProps}\n />\n </Layout.Element>\n <Layout.Element>\n <div className=\"h4\">\n <FormattedMessage {...messages.pageExplanationHeader} />\n </div>\n <div className=\"small gray-700\">\n <FormattedMessage {...messages.pageExplanationBody} />\n </div>\n <hr />\n <div className=\"h4\">\n <FormattedMessage {...messages.customPagesExplanationHeader} />\n </div>\n <div className=\"small gray-700\">\n <FormattedMessage {...messages.customPagesExplanationBody} />\n </div>\n <hr />\n <div className=\"h4\">\n <FormattedMessage {...messages.studentViewExplanationHeader} />\n </div>\n <div className=\"small gray-700\">\n <FormattedMessage {...messages.studentViewExplanationBody} />\n </div>\n <Button\n data-testid=\"student-view-example-button\"\n variant=\"link\"\n size=\"sm\"\n onClick={open}\n className=\"pl-0\"\n >\n <FormattedMessage {...messages.studentViewExampleButton} />\n </Button>\n </Layout.Element>\n </Layout>\n <ModalDialog\n isOpen={isOpen}\n onClose={close}\n size=\"lg\"\n title={intl.formatMessage(messages.studentViewModalTitle)}\n >\n <ModalDialog.Header>\n <ModalDialog.Title>\n <FormattedMessage {...messages.studentViewModalTitle} />\n </ModalDialog.Title>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <Image src={previewLmsStaticPages} fluid className=\"mb-3\" />\n <div className=\"small\">\n <FormattedMessage {...messages.studentViewModalBody} />\n </div>\n </ModalDialog.Body>\n </ModalDialog>\n <Routes>\n <Route\n path=\"/editor\"\n element={currentPage && (\n <PageWrap>\n <EditModal\n courseId={courseId}\n pageId={currentPage}\n onClose={handleEditClose}\n />\n </PageWrap>\n )}\n />\n </Routes>\n </Container>\n </CustomPagesProvider>\n );\n};\n\nCustomPages.propTypes = {\n courseId: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(CustomPages);\n","/* eslint-disable import/prefer-default-export */\nimport { camelCaseObject, ensureConfig, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nimport JSZip from 'jszip';\nimport saveAs from 'file-saver';\n\nensureConfig([\n 'STUDIO_BASE_URL',\n], 'Course Apps API service');\n\nexport const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getAssetsUrl = (courseId) => `${getApiBaseUrl()}/assets/${courseId}/`;\n\n/**\n * Fetches the course custom pages for provided course\n * @param {string} courseId\n * @returns {Promise<[{}]>}\n */\nexport async function getAssets(courseId, page) {\n const nextPage = page || 0;\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getAssetsUrl(courseId)}?page=${nextPage}`);\n return camelCaseObject(data);\n}\n\n/**\n * Fetches the course custom pages for provided course\n * @param {string} courseId\n * @returns {Promise<[{}]>}\n */\nexport async function getAssetDetails({ courseId, filenames, fileCount }) {\n const params = new URLSearchParams(filenames.map(filename => ['display_name', filename]));\n params.append('page_size', fileCount);\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getAssetsUrl(courseId)}?${params}`);\n return camelCaseObject(data);\n}\n\n/**\n * Fetch asset file.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function getDownload(selectedRows, courseId) {\n const downloadErrors = [];\n if (selectedRows?.length > 1) {\n const zip = new JSZip();\n const date = new Date().toString();\n const folder = zip.folder(`${courseId}-assets-${date}`);\n const assetNames = [];\n const assetFetcher = await Promise.allSettled(\n selectedRows.map(async (row) => {\n const asset = row?.original;\n try {\n assetNames.push(asset.displayName);\n const res = await fetch(`${getApiBaseUrl()}/${asset.id}`);\n if (!res.ok) {\n throw new Error();\n }\n return res.blob();\n } catch (error) {\n downloadErrors.push(`Failed to download ${asset?.displayName}.`);\n return null;\n }\n }),\n );\n const definedAssets = assetFetcher.filter(asset => asset.value !== null);\n if (definedAssets.length > 0) {\n definedAssets.forEach((assetBlob, index) => {\n folder.file(assetNames[index], assetBlob.value, { blob: true });\n });\n zip.generateAsync({ type: 'blob' }).then(content => {\n saveAs(content, `${courseId}-assets-${date}.zip`);\n });\n }\n } else if (selectedRows?.length === 1) {\n const asset = selectedRows[0].original;\n try {\n saveAs(`${getApiBaseUrl()}/${asset.id}`, asset.displayName);\n } catch (error) {\n downloadErrors.push(`Failed to download ${asset?.displayName}.`);\n }\n } else {\n downloadErrors.push('No files were selected to download');\n }\n return downloadErrors;\n}\n\n/**\n * Fetch where asset is used in a course.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function getAssetUsagePaths({ courseId, assetId }) {\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getAssetsUrl(courseId)}${assetId}/usage`);\n const { usage_locations: usageLocations } = data;\n return { usageLocations };\n}\n\n/**\n * Delete asset to course.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function deleteAsset(courseId, assetId) {\n await getAuthenticatedHttpClient()\n .delete(`${getAssetsUrl(courseId)}${assetId}`);\n}\n\n/**\n * Add asset to course.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function addAsset(courseId, file) {\n const formData = new FormData();\n formData.append('file', file);\n const { data } = await getAuthenticatedHttpClient()\n .post(getAssetsUrl(courseId), formData);\n return camelCaseObject(data);\n}\n\n/**\n * Update locked attribute for provided asset.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function updateLockStatus({ assetId, courseId, locked }) {\n const { data } = await getAuthenticatedHttpClient()\n .put(`${getAssetsUrl(courseId)}${assetId}`, {\n locked,\n });\n return camelCaseObject(data);\n}\n","const FILES_AND_UPLOAD_TYPE_FILTERS = {\n images: ['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/tiff', 'image/tif', 'image/x-icon',\n 'image/svg+xml', 'image/bmp', 'image/x-ms-bmp', 'image/vnd.microsoft.icon'],\n documents: [\n 'application/pdf',\n 'text/plain',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n 'application/vnd.openxmlformats-officedocument.presentationml.template',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n 'application/msword',\n 'application/vnd.ms-excel',\n 'application/vnd.ms-powerpoint',\n 'application/csv',\n 'application/vnd.ms-excel.sheet.macroEnabled.12',\n 'text/x-tex',\n 'application/x-pdf',\n 'application/vnd.ms-excel.sheet.macroenabled.12',\n 'file/pdf',\n 'image/pdf',\n 'text/csv',\n 'text/pdf',\n 'text/x-sh',\n 'application/pdf',\n ],\n audio: ['audio/mpeg', 'audio/mp3', 'audio/x-wav', 'audio/ogg', 'audio/wav', 'audio/aac', 'audio/x-m4a',\n 'audio/mp4', 'audio/x-ms-wma'],\n code: ['application/json', 'text/html', 'text/javascript', 'application/javascript', 'text/css', 'text/x-python',\n 'application/x-java-jnlp-file', 'application/xml', 'application/postscript', 'application/x-javascript',\n 'application/java-vm', 'text/x-c++src', 'text/xml', 'text/x-scss', 'application/x-python-code',\n 'application/java-archive', 'text/x-python-script', 'application/x-ruby', 'application/mathematica',\n 'text/coffeescript', 'text/x-matlab', 'application/sql', 'text/php'],\n video: ['.mp4', '.mov'],\n};\n\nexport default FILES_AND_UPLOAD_TYPE_FILTERS;\n","import {\n InsertDriveFile,\n Terminal,\n AudioFile,\n} from '@openedx/paragon/icons';\nimport { ensureConfig, getConfig } from '@edx/frontend-platform';\nimport FILES_AND_UPLOAD_TYPE_FILTERS from '../../generic/constants';\n\nensureConfig([\n 'STUDIO_BASE_URL',\n], 'Course Apps API service');\n\nexport const updateFileValues = (files) => {\n const updatedFiles = [];\n files.forEach(file => {\n let wrapperType = 'other';\n if (FILES_AND_UPLOAD_TYPE_FILTERS.images.includes(file.contentType)) {\n wrapperType = 'image';\n } else if (FILES_AND_UPLOAD_TYPE_FILTERS.documents.includes(file.contentType)) {\n wrapperType = 'document';\n } else if (FILES_AND_UPLOAD_TYPE_FILTERS.code.includes(file.contentType)) {\n wrapperType = 'code';\n } else if (FILES_AND_UPLOAD_TYPE_FILTERS.audio.includes(file.contentType)) {\n wrapperType = 'audio';\n }\n\n const { dateAdded, locked, usageLocations } = file;\n const utcDateString = dateAdded.replace(/\\bat\\b/g, '');\n const utcDateTime = new Date(utcDateString).toString();\n const lockStatus = locked ? 'locked' : 'public';\n const activeStatus = usageLocations?.length > 0 ? 'active' : 'inactive';\n\n updatedFiles.push({\n ...file,\n wrapperType,\n lockStatus,\n activeStatus,\n dateAdded: utcDateTime,\n });\n });\n\n return updatedFiles;\n};\n\nexport const getSrc = ({ thumbnail, wrapperType, externalUrl }) => {\n if (thumbnail) {\n return externalUrl || `${getConfig().STUDIO_BASE_URL}${thumbnail}`;\n }\n switch (wrapperType) {\n case 'document':\n return InsertDriveFile;\n case 'code':\n return Terminal;\n case 'audio':\n return AudioFile;\n default:\n return InsertDriveFile;\n }\n};\n\nexport const getUploadConflicts = (filesToUpload, assets) => {\n const filesFound = assets.map(item => item.displayName);\n const conflicts = {};\n const newFiles = [];\n filesToUpload.forEach(file => {\n if (filesFound.includes(file.name)) {\n conflicts[file.name] = file;\n } else {\n newFiles.push(file);\n }\n });\n return [conflicts, newFiles];\n};\n","import { isEmpty } from 'lodash';\nimport { camelCaseObject } from '@edx/frontend-platform';\n\nimport { RequestStatus } from '../../../data/constants';\nimport {\n addModel,\n addModels,\n removeModel,\n updateModel,\n} from '../../../generic/model-store';\nimport {\n getAssets,\n getAssetUsagePaths,\n addAsset,\n deleteAsset,\n updateLockStatus,\n getDownload,\n getAssetDetails,\n} from './api';\nimport {\n setAssetIds,\n setSortedAssetIds,\n updateLoadingStatus,\n deleteAssetSuccess,\n addAssetSuccess,\n updateErrors,\n clearErrors,\n updateEditStatus,\n updateDuplicateFiles,\n} from './slice';\n\nimport { getUploadConflicts, updateFileValues } from './utils';\n\nexport function fetchAdditionalAssets(courseId, totalCount) {\n return async (dispatch) => {\n let remainingAssetCount = totalCount;\n let page = 1;\n\n /* eslint-disable no-await-in-loop */\n while (remainingAssetCount > 0) {\n try {\n const { assets } = await getAssets(courseId, page);\n const parsedAssets = updateFileValues(assets);\n dispatch(addModels({ modelType: 'assets', models: parsedAssets }));\n dispatch(setAssetIds({\n assetIds: assets.map(asset => asset.id),\n }));\n remainingAssetCount -= 50;\n page += 1;\n } catch (error) {\n remainingAssetCount = 0;\n dispatch(updateErrors({ error: 'loading', message: 'Failed to load remaining files.' }));\n dispatch(updateLoadingStatus({ status: RequestStatus.PARTIAL_FAILURE }));\n }\n }\n };\n}\n\nexport function fetchAssets(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.IN_PROGRESS }));\n\n try {\n const { assets, totalCount } = await getAssets(courseId);\n const parsedAssets = updateFileValues(assets);\n dispatch(addModels({ modelType: 'assets', models: parsedAssets }));\n dispatch(setAssetIds({\n assetIds: assets.map(asset => asset.id),\n }));\n if (totalCount > 50) {\n dispatch(fetchAdditionalAssets(courseId, totalCount - 50));\n }\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateLoadingStatus({ status: RequestStatus.DENIED }));\n } else {\n dispatch(updateErrors({ error: 'loading', message: 'Failed to load all files.' }));\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.FAILED }));\n }\n }\n };\n}\n\nexport function updateAssetOrder(courseId, assetIds) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.IN_PROGRESS }));\n dispatch(setSortedAssetIds({ assetIds }));\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.SUCCESSFUL }));\n };\n}\n\nexport function deleteAssetFile(courseId, id) {\n return async (dispatch) => {\n dispatch(updateEditStatus({ editType: 'delete', status: RequestStatus.IN_PROGRESS }));\n\n try {\n await deleteAsset(courseId, id);\n dispatch(deleteAssetSuccess({ assetId: id }));\n dispatch(removeModel({ modelType: 'assets', id }));\n dispatch(updateEditStatus({ editType: 'delete', status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateErrors({ error: 'delete', message: `Failed to delete file id ${id}.` }));\n dispatch(updateEditStatus({ editType: 'delete', status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function addAssetFile(courseId, file, isOverwrite) {\n return async (dispatch) => {\n dispatch(updateEditStatus({ editType: 'add', status: RequestStatus.IN_PROGRESS }));\n\n try {\n const { asset } = await addAsset(courseId, file);\n const [parsedAssets] = updateFileValues([asset]);\n dispatch(addModel({\n modelType: 'assets',\n model: { ...parsedAssets },\n }));\n if (!isOverwrite) {\n dispatch(addAssetSuccess({\n assetId: asset.id,\n }));\n }\n dispatch(updateEditStatus({ editType: 'add', status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 413) {\n const message = error.response.data.error;\n dispatch(updateErrors({ error: 'add', message }));\n } else {\n dispatch(updateErrors({ error: 'add', message: `Failed to add ${file.name}.` }));\n }\n dispatch(updateEditStatus({ editType: 'add', status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function validateAssetFiles(courseId, files) {\n return async (dispatch) => {\n dispatch(updateEditStatus({ editType: 'add', status: RequestStatus.IN_PROGRESS }));\n dispatch(updateDuplicateFiles({ files: {} }));\n\n try {\n const filenames = [];\n files.forEach(file => filenames.push(file.name));\n await getAssetDetails({ courseId, filenames, fileCount: filenames.length }).then(({ assets }) => {\n const [conflicts, newFiles] = getUploadConflicts(files, assets);\n if (!isEmpty(newFiles)) {\n newFiles.forEach(file => dispatch(addAssetFile(courseId, file)));\n }\n if (!isEmpty(conflicts)) {\n dispatch(updateDuplicateFiles({ files: conflicts }));\n }\n });\n } catch (error) {\n files.forEach(file => dispatch(updateErrors({ error: 'add', message: `Failed to validate ${file.name}.` })));\n dispatch(updateEditStatus({ editType: 'add', status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function updateAssetLock({ assetId, courseId, locked }) {\n return async (dispatch) => {\n dispatch(updateEditStatus({ editType: 'lock', status: RequestStatus.IN_PROGRESS }));\n\n try {\n await updateLockStatus({ assetId, courseId, locked });\n const lockStatus = locked ? 'locked' : 'public';\n dispatch(updateModel({\n modelType: 'assets',\n model: {\n id: assetId,\n locked,\n lockStatus,\n },\n }));\n dispatch(updateEditStatus({ editType: 'lock', status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n const lockStatus = locked ? 'lock' : 'unlock';\n dispatch(updateErrors({ error: 'lock', message: `Failed to ${lockStatus} file id ${assetId}.` }));\n dispatch(updateEditStatus({ editType: 'lock', status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function resetErrors({ errorType }) {\n return (dispatch) => { dispatch(clearErrors({ error: errorType })); };\n}\n\nexport function getUsagePaths({ asset, courseId }) {\n return async (dispatch) => {\n dispatch(updateEditStatus({ editType: 'usageMetrics', status: RequestStatus.IN_PROGRESS }));\n try {\n const { usageLocations } = await getAssetUsagePaths({ assetId: asset.id, courseId });\n const assetLocations = usageLocations[asset.id];\n const activeStatus = assetLocations?.length > 0 ? 'active' : 'inactive';\n dispatch(updateModel({\n modelType: 'assets',\n model: {\n id: asset.id,\n usageLocations: camelCaseObject(assetLocations),\n activeStatus,\n },\n }));\n dispatch(updateEditStatus({ editType: 'usageMetrics', status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateErrors({ error: 'usageMetrics', message: `Failed to get usage metrics for ${asset.displayName}.` }));\n dispatch(updateEditStatus({ editType: 'usageMetrics', status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function fetchAssetDownload({ selectedRows, courseId }) {\n return async (dispatch) => {\n dispatch(updateEditStatus({ editType: 'download', status: RequestStatus.IN_PROGRESS }));\n const errors = await getDownload(selectedRows, courseId);\n if (isEmpty(errors)) {\n dispatch(updateEditStatus({ editType: 'download', status: RequestStatus.SUCCESSFUL }));\n } else {\n errors.forEach(error => {\n dispatch(updateErrors({ error: 'download', message: error }));\n });\n dispatch(updateEditStatus({ editType: 'download', status: RequestStatus.FAILED }));\n }\n };\n}\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n heading: {\n id: 'course-authoring.files-and-uploads.heading',\n defaultMessage: 'Files',\n description: 'Title for the page',\n },\n thumbnailAltMessage: {\n id: 'course-authoring.files-and-uploads.thumbnail.alt',\n defaultMessage: '{displayName} file preview',\n description: 'Alternative text for thumbnail',\n },\n copyStudioUrlTitle: {\n id: 'course-authoring.files-and-uploads.file-info.copyStudioUrl.title',\n defaultMessage: 'Copy Studio Url',\n description: 'Label for Copy Studio URL button in info modal',\n },\n copyWebUrlTitle: {\n id: 'course-authoring.files-and-uploads.file-info.copyWebUrl.title',\n defaultMessage: 'Copy Web Url',\n description: 'Label for Copy Web URL button in info modal',\n },\n dateAddedTitle: {\n id: 'course-authoring.files-and-uploads.file-info.dateAdded.title',\n defaultMessage: 'Date added',\n description: 'Title for date added section in info modal',\n },\n fileSizeTitle: {\n id: 'course-authoring.files-and-uploads.file-info.fileSize.title',\n defaultMessage: 'File size',\n description: 'Title for file size section in info modal',\n },\n studioUrlTitle: {\n id: 'course-authoring.files-and-uploads.file-info.studioUrl.title',\n defaultMessage: 'Studio URL',\n description: 'Title for studio url section in info modal',\n },\n webUrlTitle: {\n id: 'course-authoring.files-and-uploads.file-info.webUrl.title',\n defaultMessage: 'Web URL',\n description: 'Title for web url section in info modal',\n },\n lockFileTitle: {\n id: 'course-authoring.files-and-uploads.file-info.lockFile.title',\n defaultMessage: 'Lock file',\n description: 'Label for lock file checkbox in info modal',\n },\n activeCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.activeCheckbox.label',\n defaultMessage: 'Active',\n description: 'Label for active checkbox in filter section of sort and filter modal',\n },\n inactiveCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.inactiveCheckbox.label',\n defaultMessage: 'Inactive',\n description: 'Label for inactive checkbox in filter section of sort and filter modal',\n },\n lockedCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.lockedCheckbox.label',\n defaultMessage: 'Locked',\n description: 'Label for locked checkbox in filter section of sort and filter modal',\n },\n publicCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.publicCheckbox.label',\n defaultMessage: 'Public',\n description: 'Label for public checkbox in filter section of sort and filter modal',\n },\n codeCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.codeCheckbox.label',\n defaultMessage: 'Code',\n description: 'Label for code checkbox in filter section of sort and filter modal',\n },\n imageCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.imageCheckbox.label',\n defaultMessage: 'Images',\n description: 'Label for images checkbox in filter section of sort and filter modal',\n },\n documentCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.documentCheckbox.label',\n defaultMessage: 'Documents',\n description: 'Label for documents checkbox in filter section of sort and filter modal',\n },\n audioCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.audioCheckbox.label',\n defaultMessage: 'Audio',\n description: 'Label for audio checkbox in filter section of sort and filter modal',\n },\n otherCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.otherCheckbox.label',\n defaultMessage: 'Other',\n description: 'Label for other checkbox in filter section of sort and filter modal',\n },\n overwriteConfirmMessage: {\n id: 'course-authoring.files-and-videos.overwrite.modal.confirmation-message',\n defaultMessage: 'Some of the uploaded files already exist in this course. Do you want to overwrite the following files?',\n description: 'The message displayed in the modal shown when uploading files with pre-existing names',\n },\n overwriteModalTitle: {\n id: 'course-authoring.files-and-videos.overwrite.modal.title',\n defaultMessage: 'Overwrite files',\n description: 'The title of the modal to confirm overwriting the files',\n },\n confirmOverwriteButtonLabel: {\n id: 'course-authoring.files-and-videos.overwrite.modal.overwrite-button.label',\n defaultMessage: 'Overwrite',\n description: 'The message displayed in the button to confirm overwriting the files',\n },\n cancelOverwriteButtonLabel: {\n id: 'course-authoring.files-and-videos.overwrite.modal.cancel-button.label',\n defaultMessage: 'Cancel',\n description: 'The message displayed in the button to confirm cancelling the upload',\n },\n});\n\nexport default messages;\n","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nexport const FilesPageContext = React.createContext({});\n\nconst FilesPageProvider = ({ courseId, children }) => {\n const contextValue = useMemo(() => ({\n courseId,\n path: `/course/${courseId}/assets`,\n }), []);\n return (\n <FilesPageContext.Provider\n value={contextValue}\n >\n {children}\n </FilesPageContext.Provider>\n );\n};\n\nFilesPageProvider.propTypes = {\n courseId: PropTypes.string.isRequired,\n children: PropTypes.node.isRequired,\n};\n\nexport default FilesPageProvider;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n rowStatusMessage: {\n id: 'course-authoring.files-and-upload.rowStatus.message',\n defaultMessage: 'Showing {fileCount} of {rowCount}',\n description: 'This message is showed to notify user of the number of files being shown',\n },\n apiStatusToastMessage: {\n id: 'course-authoring.files-and-upload.apiStatus.message',\n defaultMessage: '{actionType} {selectedRowCount} {selectedRowCount, plural, one {{fileType}} other {{fileType}s}}',\n description: 'This message is showed in the toast when action is applied to files',\n },\n apiStatusAddingAction: {\n id: 'course-authoring.files-and-upload.apiStatus.addingAction.message',\n defaultMessage: 'Adding',\n description: 'This message is used in the toast when files are added',\n },\n apiStatusDeletingAction: {\n id: 'course-authoring.files-and-upload.apiStatus.deletingAction.message',\n defaultMessage: 'Deleting',\n description: 'This message is used in the toast when files are deleted',\n },\n apiStatusDownloadingAction: {\n id: 'course-authoring.files-and-upload.apiStatus.downloadingAction.message',\n defaultMessage: 'Downloading',\n description: 'This message is used in the toast when files are downloaded',\n },\n fileSizeError: {\n id: 'course-authoring.files-and-upload.addFiles.error.fileSize',\n defaultMessage: 'Uploaded file(s) must be 20 MB or less. Please resize file(s) and try again.',\n description: 'This error message is shown when user tries to upload a file larger than 20 MB',\n },\n noResultsFoundMessage: {\n id: 'course-authoring.files-and-upload.table.noResultsFound.message',\n defaultMessage: 'No results found',\n description: 'This message is shown when no files are found based on name search',\n },\n addFilesButtonLabel: {\n id: 'course-authoring.files-and-upload.addFiles.button.label',\n defaultMessage: 'Add {fileType}s',\n description: 'Label for add files button, name changes based on page',\n },\n actionsButtonLabel: {\n id: 'course-authoring.files-and-upload.action.button.label',\n defaultMessage: 'Actions',\n description: 'Label for actions dropdown button',\n },\n errorAlertMessage: {\n id: 'course-authoring.files-and-upload.errorAlert.message',\n defaultMessage: '{message}',\n description: 'Message shell for error alert',\n },\n transcriptionErrorMessage: {\n id: 'course-authoring.files-and-uploads.file-info.transcripts.error.alert',\n defaultMessage: 'Transcript failed: \"{error}\"',\n description: 'Message for transcript error in info modal',\n },\n usageTitle: {\n id: 'course-authoring.files-and-uploads.file-info.usage.title',\n defaultMessage: 'Usage',\n description: 'Title for usage information section in info modal',\n },\n usageLoadingMessage: {\n id: 'course-authoring.files-and-uploads.file-info.usage.loading.message',\n defaultMessage: 'Loading',\n description: 'Screen reader text for loading spinner in usage information section',\n },\n usageNotInUseMessage: {\n id: 'course-authoring.files-and-uploads.file-info.usage.notInUse.message',\n defaultMessage: 'Currently not in use',\n description: 'Message for usage information section when file is not used in course',\n },\n copyVideoIdTitle: {\n id: 'course-authoring.files-and-uploads.cardMenu.copyVideoIdTitle',\n defaultMessage: 'Copy video ID',\n description: 'Label for copy video id button in card menu dropdown',\n },\n copyStudioUrlTitle: {\n id: 'course-authoring.files-and-uploads.cardMenu.copyStudioUrlTitle',\n defaultMessage: 'Copy Studio Url',\n description: 'Label for copy studio url button in card menu dropdown',\n },\n copyWebUrlTitle: {\n id: 'course-authoring.files-and-uploads.cardMenu.copyWebUrlTitle',\n defaultMessage: 'Copy Web Url',\n description: 'Label for copy web url button in card menu dropdown',\n },\n downloadTitle: {\n id: 'course-authoring.files-and-uploads.cardMenu.downloadTitle',\n defaultMessage: 'Download',\n description: 'Label for download button in card menu dropdown',\n },\n lockMenuTitle: {\n id: 'course-authoring.files-and-uploads.cardMenu.lockTitle',\n defaultMessage: 'Lock',\n description: 'Label for lock button in card menu dropdown',\n },\n lockFileTooltipContent: {\n id: 'course-authoring.files-and-uploads.file-info.lockFile.tooltip.content',\n defaultMessage: `By default, anyone can access a file you upload if\n they know the web URL, even if they are not enrolled in your course.\n You can prevent outside access to a file by locking the file. When\n you lock a file, the web URL only allows learners who are enrolled\n in your course and signed in to access the file.`,\n description: 'Tooltip message for the lock icon in the table view of files',\n },\n unlockMenuTitle: {\n id: 'course-authoring.files-and-uploads.cardMenu.unlockTitle',\n defaultMessage: 'Unlock',\n description: 'Label for unlock button in card menu dropdown',\n },\n infoTitle: {\n id: 'course-authoring.files-and-uploads.cardMenu.infoTitle',\n defaultMessage: 'Info',\n description: 'Label for info button in card menu dropdown',\n },\n downloadEncodingsTitle: {\n id: 'course-authoring.files-and-uploads.cardMenu.downloadEncodingsTitle',\n defaultMessage: 'Download video list (.csv)',\n description: 'Label for download video list button in actions dropdown',\n },\n deleteTitle: {\n id: 'course-authoring.files-and-uploads.cardMenu.deleteTitle',\n defaultMessage: 'Delete',\n description: 'Label for delete button in card menu dropdown',\n },\n deleteConfirmationTitle: {\n id: 'course-authoring.files-and-uploads..deleteConfirmation.title',\n defaultMessage: 'Delete {fileNumber, plural, one {{fileName}} other {{fileNumber} {fileType}s}}',\n description: 'Title for delete confirmation modal',\n },\n deleteConfirmationMessage: {\n id: 'course-authoring.files-and-uploads..deleteConfirmation.message',\n defaultMessage: `\n Are you sure you want to delete {fileNumber, plural, one {{fileName}} other {{fileNumber} {fileType}s}}?\n This action cannot be undone and may break your course if the {fileNumber, plural, one {{fileType} is} other {{fileType}s are}}\n used in the course content, advanced settings, updates, or schedule and details.\n `,\n description: 'Message presented to user listing the number of files they are attempting to delete in the delete confirmation modal',\n },\n deleteConfirmationUsageMessage: {\n id: 'course-authoring.files-and-uploads..deleteConfirmation.message',\n defaultMessage: 'The following {fileNumber, plural, one {{fileType} is} other {{fileType}s are}} used in course content. Consider updating the content before deleting.',\n description: 'Message listing where the files the user is attempting to delete are used in the course',\n },\n deleteFileButtonLabel: {\n id: 'course-authoring.files-and-uploads.deleteConfirmation.deleteFile.label',\n defaultMessage: 'Delete',\n description: 'Label for delete button in delete confirmation modal modal',\n },\n cancelButtonLabel: {\n id: 'course-authoring.files-and-uploads.cancelButton.label',\n defaultMessage: 'Cancel',\n description: 'Label for cancel button in modals',\n },\n sortButtonLabel: {\n id: 'course-authoring.files-and-uploads.sortButton.label',\n defaultMessage: 'Sort and filter',\n description: 'Label for button that opens the sort and filter modal',\n },\n sortModalTitleLabel: {\n id: 'course-authoring.files-and-uploads.sortModal.title',\n defaultMessage: 'Sort by',\n description: 'Title for Sort By secition in sort and filter modal',\n },\n sortByNameAscending: {\n id: 'course-authoring.files-and-uploads.sortByNameAscendingButton.label',\n defaultMessage: 'Name (A-Z)',\n description: 'Label for ascending name radio button in sort and filter modal',\n },\n sortByNewest: {\n id: 'course-authoring.files-and-uploads.sortByNewestButton.label',\n defaultMessage: 'Newest',\n description: 'Label for descending date added radio button in sort and filter modal',\n },\n sortBySizeDescending: {\n id: 'course-authoring.files-and-uploads.sortBySizeDescendingButton.label',\n defaultMessage: 'File size (High to low)',\n description: 'Label for descending file size radio button in sort and filter modal',\n },\n sortByNameDescending: {\n id: 'course-authoring.files-and-uploads.sortByNameDescendingButton.label',\n defaultMessage: 'Name (Z-A)',\n description: 'Label for descending name radio button in sort and filter modal',\n },\n sortByOldest: {\n id: 'course-authoring.files-and-uploads.sortByOldestButton.label',\n defaultMessage: 'Oldest',\n description: 'Label for ascending date added radio button in sort and filter modal',\n },\n sortBySizeAscending: {\n id: 'course-authoring.files-and-uploads.sortBySizeAscendingButton.label',\n defaultMessage: 'File size(Low to high)',\n description: 'Label for ascending file size radio button in sort and filter modal',\n },\n applySortButton: {\n id: 'course-authoring.files-and-uploads.applyySortButton.label',\n defaultMessage: 'Apply',\n description: 'Label for apply sort button in sort and filter modal',\n },\n failedLabel: {\n id: 'course-authoring.files-and-uploads.filter.failed.label',\n defaultMessage: 'Failed',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Dropdown,\n IconButton,\n Icon,\n} from '@openedx/paragon';\nimport { MoreHoriz } from '@openedx/paragon/icons';\nimport messages from './messages';\n\nconst FileMenu = ({\n externalUrl,\n handleLock,\n locked,\n onDownload,\n openAssetInfo,\n openDeleteConfirmation,\n portableUrl,\n id,\n fileType,\n // injected\n intl,\n}) => (\n <Dropdown data-testid={`file-menu-dropdown-${id}`}>\n <Dropdown.Toggle\n id={`file-menu-dropdown-${id}`}\n as={IconButton}\n src={MoreHoriz}\n iconAs={Icon}\n variant=\"primary\"\n alt=\"file-menu-toggle\"\n />\n <Dropdown.Menu>\n {fileType === 'video' ? (\n <Dropdown.Item\n onClick={() => navigator.clipboard.writeText(id)}\n >\n {intl.formatMessage(messages.copyVideoIdTitle)}\n </Dropdown.Item>\n ) : (\n <>\n <Dropdown.Item\n onClick={() => navigator.clipboard.writeText(portableUrl)}\n >\n {intl.formatMessage(messages.copyStudioUrlTitle)}\n </Dropdown.Item>\n <Dropdown.Item\n onClick={() => navigator.clipboard.writeText(externalUrl)}\n >\n {intl.formatMessage(messages.copyWebUrlTitle)}\n </Dropdown.Item>\n <Dropdown.Item onClick={handleLock}>\n {locked ? intl.formatMessage(messages.unlockMenuTitle) : intl.formatMessage(messages.lockMenuTitle)}\n </Dropdown.Item>\n </>\n )}\n <Dropdown.Item onClick={onDownload}>\n {intl.formatMessage(messages.downloadTitle)}\n </Dropdown.Item>\n <Dropdown.Item onClick={openAssetInfo}>\n {intl.formatMessage(messages.infoTitle)}\n </Dropdown.Item>\n <Dropdown.Divider />\n <Dropdown.Item\n data-testid=\"open-delete-confirmation-button\"\n onClick={openDeleteConfirmation}\n >\n {intl.formatMessage(messages.deleteTitle)}\n </Dropdown.Item>\n </Dropdown.Menu>\n </Dropdown>\n);\n\nFileMenu.propTypes = {\n externalUrl: PropTypes.string,\n handleLock: PropTypes.func,\n locked: PropTypes.bool,\n onDownload: PropTypes.func.isRequired,\n openAssetInfo: PropTypes.func.isRequired,\n openDeleteConfirmation: PropTypes.func.isRequired,\n portableUrl: PropTypes.string,\n id: PropTypes.string.isRequired,\n fileType: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nFileMenu.defaultProps = {\n externalUrl: null,\n handleLock: null,\n locked: null,\n portableUrl: null,\n};\n\nexport default injectIntl(FileMenu);\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst ThumbnailPreview = ({\n thumbnail,\n wrapperType,\n externalUrl,\n displayName,\n imageSize,\n id,\n status,\n thumbnailPreview,\n}) => (\n <>\n {thumbnailPreview({\n thumbnail,\n wrapperType,\n externalUrl,\n displayName,\n imageSize,\n id,\n status,\n })}\n </>\n);\nThumbnailPreview.defaultProps = {\n thumbnail: null,\n wrapperType: null,\n externalUrl: null,\n displayName: null,\n id: null,\n status: null,\n};\nThumbnailPreview.propTypes = {\n thumbnail: PropTypes.string,\n wrapperType: PropTypes.string,\n externalUrl: PropTypes.string,\n displayName: PropTypes.string,\n id: PropTypes.string,\n status: PropTypes.string,\n thumbnailPreview: PropTypes.func.isRequired,\n imageSize: PropTypes.shape({\n height: PropTypes.string.isRequired,\n width: PropTypes.string.isRequired,\n }).isRequired,\n};\n\nexport default ThumbnailPreview;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n ActionRow,\n Icon,\n Card,\n Chip,\n Truncate,\n} from '@openedx/paragon';\nimport { ClosedCaption } from '@openedx/paragon/icons';\nimport FileMenu from '../FileMenu';\nimport FileThumbnail from '../ThumbnailPreview';\n\nconst GalleryCard = ({\n className,\n original,\n handleBulkDownload,\n handleLockFile,\n handleOpenDeleteConfirmation,\n handleOpenFileInfo,\n thumbnailPreview,\n fileType,\n}) => {\n const lockFile = () => {\n const { locked, id } = original;\n handleLockFile(id, !locked);\n };\n\n return (\n <Card className={`${className} w-100 gallery-card`} data-testid={`grid-card-${original.id}`}>\n <Card.Header\n className=\"pr-0 pt-2 pb-2\"\n actions={(\n <ActionRow>\n <FileMenu\n externalUrl={original.externalUrl}\n handleLock={lockFile}\n locked={original.locked}\n openAssetInfo={() => handleOpenFileInfo(original)}\n portableUrl={original.portableUrl}\n id={original.id}\n fileType={fileType}\n onDownload={() => handleBulkDownload([{\n original: {\n id: original.id,\n displayName:\n original.displayName,\n downloadLink: original?.downloadLink,\n },\n }])}\n openDeleteConfirmation={() => handleOpenDeleteConfirmation([{ original }])}\n />\n </ActionRow>\n )}\n />\n <Card.Section className=\"pr-3 pl-3 pt-0 pb-0\">\n <div className=\"row align-items-center justify-content-center m-0\">\n <FileThumbnail\n thumbnail={original.thumbnail}\n wrapperType={original.wrapperType}\n externalUrl={original.externalUrl}\n displayName={original.displayName}\n id={original.id}\n status={original.status}\n imageSize={{ height: '76px', width: '135.71px' }}\n thumbnailPreview={thumbnailPreview}\n />\n </div>\n <div style={{ wordBreak: 'break-word' }}>\n <Truncate lines={1} className=\"font-weight-bold mt-2 picture-title\">\n {original.displayName}\n </Truncate>\n </div>\n </Card.Section>\n <Card.Footer className=\"p-3 pt-4 row m-0 flex-row-reverse justify-content-between align-items-center\">\n <Chip>\n {original.wrapperType}\n </Chip>\n {original.transcripts?.length > 0 && <Icon size=\"lg\" src={ClosedCaption} className=\"m-0 text-primary-500\" />}\n </Card.Footer>\n </Card>\n );\n};\n\nGalleryCard.defaultProps = {\n className: null,\n};\nGalleryCard.propTypes = {\n className: PropTypes.string,\n original: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n wrapperType: PropTypes.string.isRequired,\n locked: PropTypes.bool,\n externalUrl: PropTypes.string,\n thumbnail: PropTypes.string,\n id: PropTypes.string.isRequired,\n portableUrl: PropTypes.string,\n status: PropTypes.string,\n transcripts: PropTypes.arrayOf(PropTypes.string),\n downloadLink: PropTypes.string,\n }).isRequired,\n handleBulkDownload: PropTypes.func.isRequired,\n handleLockFile: PropTypes.func.isRequired,\n handleOpenDeleteConfirmation: PropTypes.func.isRequired,\n handleOpenFileInfo: PropTypes.func.isRequired,\n thumbnailPreview: PropTypes.func.isRequired,\n fileType: PropTypes.func.isRequired,\n};\n\nexport default GalleryCard;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n modalTitle: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.title',\n defaultMessage: 'Sort and Filter',\n },\n sortByHeader: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.sortBySection.header',\n defaultMessage: 'Sort by',\n },\n filterByHeader: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filterBySection.header',\n defaultMessage: 'Filter by',\n },\n clearAllButtonLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.clearAllButton.label',\n defaultMessage: 'Clear all',\n },\n cancelButtonLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.cancelButton.label',\n defaultMessage: 'Cancel',\n },\n sortByNameAscending: {\n id: 'course-authoring..files-and-videos.sort-and-filter.modal.sortByNameAscendingButton.label',\n defaultMessage: 'Name (A-Z)',\n },\n sortByNewest: {\n id: 'course-authoring..files-and-videos.sort-and-filter.modal.sortByNewestButton.label',\n defaultMessage: 'Newest',\n },\n sortBySizeDescending: {\n id: 'course-authoring..files-and-videos.sort-and-filter.modal.sortBySizeDescendingButton.label',\n defaultMessage: 'File size (High to low)',\n },\n sortByNameDescending: {\n id: 'course-authoring..files-and-videos.sort-and-filter.modal.sortByNameDescendingButton.label',\n defaultMessage: 'Name (Z-A)',\n },\n sortByOldest: {\n id: 'course-authoring..files-and-videos.sort-and-filter.modal.sortByOldestButton.label',\n defaultMessage: 'Oldest',\n },\n sortBySizeAscending: {\n id: 'course-authoring..files-and-videos.sort-and-filter.modal.sortBySizeAscendingButton.label',\n defaultMessage: 'File size (Low to high)',\n },\n applySortButton: {\n id: 'course-authoring..files-and-videos.sort-and-filter.modal.applyySortButton.label',\n defaultMessage: 'Apply',\n },\n});\n\nexport default messages;\n","import { isArray, isEmpty } from 'lodash';\n\nexport const getFilterOptions = (columns) => {\n const allOptions = [];\n const filterableColumns = columns.filter(column => column?.filterChoices);\n\n filterableColumns.forEach(column => {\n const { filterChoices } = column;\n allOptions.push(...filterChoices);\n });\n\n return allOptions;\n};\n\nexport const getCheckedFilters = (state) => {\n const { filters } = state;\n const allFilters = [];\n filters.forEach(filter => {\n const { id, value } = filter;\n\n if (isArray(value)) {\n allFilters.push(...value);\n } else {\n allFilters.push([id, value]);\n }\n });\n\n return allFilters;\n};\n\nexport const processFilters = (filters, columns, setAllFilters) => {\n const filterableColumns = columns.filter(column => column?.filterChoices);\n const allFilters = [];\n\n const [displayNameFilter] = filters.filter(filter => isArray(filter));\n if (displayNameFilter) {\n const [id, filterValue] = displayNameFilter;\n allFilters.push({ id, value: [filterValue] });\n }\n\n filterableColumns.forEach(({ id, filterChoices }) => {\n const filterValues = filterChoices.map(choice => choice.value);\n const matchingFilters = filterValues.filter(value => filters.includes(value));\n\n if (!isEmpty(matchingFilters)) {\n allFilters.push({ id, value: matchingFilters });\n }\n });\n\n setAllFilters(allFilters);\n};\n","import React, { useContext, useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n';\n// SelectableBox in paragon has a bug only visible on stage where you can't change selection. So we override it\nimport { SelectableBox } from '@edx/frontend-lib-content-components';\nimport {\n ActionRow,\n Button,\n DataTableContext,\n Form,\n ModalDialog,\n useCheckboxSetValues,\n} from '@openedx/paragon';\nimport messages from './messages';\nimport { getCheckedFilters, getFilterOptions, processFilters } from './utils';\n\nconst SortAndFilterModal = ({\n isSortOpen,\n closeSort,\n handleSort,\n // injected\n intl,\n}) => {\n const {\n state, setAllFilters, columns, gotoPage,\n } = useContext(DataTableContext);\n const filterOptions = getFilterOptions(columns);\n const currentFilters = getCheckedFilters(state);\n const [sortBy, setSortBy] = useState('dateAdded,desc');\n const [filterBy, {\n add, remove, set, clear,\n }] = useCheckboxSetValues(currentFilters);\n\n useEffect(() => {\n const updatedFilters = getCheckedFilters(state);\n set(updatedFilters);\n }, [state]);\n\n const handleChange = (e) => {\n // eslint-disable-next-line no-console\n console.log('SortAndFilterModal | handleChange called | e: ', e);\n setSortBy(e.target.value);\n };\n\n const handleFilterUpdate = (e) => {\n if (e.target.checked) {\n add(e.target.value);\n } else {\n remove(e.target.value);\n }\n };\n const handleApply = async () => {\n await handleSort(sortBy);\n processFilters(filterBy, columns, setAllFilters);\n gotoPage(0);\n closeSort();\n };\n\n const handleClearAll = () => {\n setSortBy('dateAdded,desc');\n clear();\n };\n\n return (\n <ModalDialog\n title={intl.formatMessage(messages.modalTitle)}\n isOpen={isSortOpen}\n onClose={closeSort}\n size=\"lg\"\n hasCloseButton\n >\n <ModalDialog.Header>\n <ModalDialog.Title>\n <FormattedMessage {...messages.modalTitle} />\n </ModalDialog.Title>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <div className=\"h4 mb-4\">\n <FormattedMessage {...messages.sortByHeader} />\n </div>\n <SelectableBox.Set\n type=\"radio\"\n value={sortBy}\n onChange={handleChange}\n name=\"sort options\"\n columns={3}\n ariaLabel=\"sort by selection\"\n className=\"mb-4.5\"\n >\n <SelectableBox\n className=\"text-center\"\n value=\"displayName,asc\"\n type=\"radio\"\n aria-label=\"name descending radio\"\n >\n <FormattedMessage {...messages.sortByNameAscending} />\n </SelectableBox>\n <SelectableBox\n className=\"text-center\"\n value=\"dateAdded,desc\"\n type=\"radio\"\n aria-label=\"date added descending radio\"\n >\n <FormattedMessage {...messages.sortByNewest} />\n </SelectableBox>\n <SelectableBox\n className=\"text-center\"\n value=\"fileSize,desc\"\n type=\"radio\"\n aria-label=\"file size descending radio\"\n >\n <FormattedMessage {...messages.sortBySizeDescending} />\n </SelectableBox>\n <SelectableBox\n className=\"text-center\"\n value=\"displayName,desc\"\n type=\"radio\"\n aria-label=\"name ascending radio\"\n >\n <FormattedMessage {...messages.sortByNameDescending} />\n </SelectableBox>\n <SelectableBox\n className=\"text-center\"\n value=\"dateAdded,asc\"\n type=\"radio\"\n aria-label=\"date added ascending radio\"\n >\n <FormattedMessage {...messages.sortByOldest} />\n </SelectableBox>\n <SelectableBox\n className=\"text-center\"\n value=\"fileSize,asc\"\n type=\"radio\"\n aria-label=\"file size ascending radio\"\n >\n <FormattedMessage {...messages.sortBySizeAscending} />\n </SelectableBox>\n </SelectableBox.Set>\n <hr />\n <div className=\"h4 my-4\">\n <FormattedMessage {...messages.filterByHeader} />\n </div>\n <Form.Group>\n <Form.CheckboxSet\n name=\"filters\"\n onChange={handleFilterUpdate}\n value={filterBy}\n isInline\n >\n {filterOptions.map(({ name, value }) => (\n <Form.Checkbox {...{ value, key: value }}>{name}</Form.Checkbox>\n ))}\n </Form.CheckboxSet>\n </Form.Group>\n <Button className=\"pl-0\" variant=\"link\" onClick={handleClearAll}>\n <FormattedMessage {...messages.clearAllButtonLabel} />\n </Button>\n <hr />\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <ActionRow>\n <ModalDialog.CloseButton variant=\"tertiary\">\n <FormattedMessage {...messages.cancelButtonLabel} />\n </ModalDialog.CloseButton>\n <Button\n variant=\"primary\"\n onClick={handleApply}\n >\n <FormattedMessage {...messages.applySortButton} />\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nSortAndFilterModal.propTypes = {\n handleSort: PropTypes.func.isRequired,\n isSortOpen: PropTypes.bool.isRequired,\n closeSort: PropTypes.func.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(SortAndFilterModal);\n","import SortAndFilterModal from './SortAndFilterModal';\n\nexport default SortAndFilterModal;\n","import React, { useContext, useEffect } from 'react';\nimport _ from 'lodash';\nimport { PropTypes } from 'prop-types';\nimport { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform';\nimport {\n Button,\n DataTableContext,\n Dropdown,\n useToggle,\n} from '@openedx/paragon';\nimport { Add, Tune } from '@openedx/paragon/icons';\nimport messages from '../messages';\nimport SortAndFilterModal from './sort-and-filter-modal';\n\nconst TableActions = ({\n selectedFlatRows,\n fileInputControl,\n handleSort,\n handleBulkDownload,\n handleOpenDeleteConfirmation,\n encodingsDownloadUrl,\n fileType,\n setInitialState,\n // injected\n intl,\n}) => {\n const [isSortOpen, openSort, closeSort] = useToggle(false);\n const { state } = useContext(DataTableContext);\n\n // This useEffect saves DataTable state so it can persist after table re-renders due to data reload.\n useEffect(() => {\n setInitialState(state);\n }, [state]);\n\n return (\n <>\n <Button variant=\"outline-primary\" onClick={openSort} iconBefore={Tune}>\n <FormattedMessage {...messages.sortButtonLabel} />\n </Button>\n <Dropdown className=\"mx-2\">\n <Dropdown.Toggle\n id=\"actions-menu-toggle\"\n alt=\"actions-menu-toggle\"\n variant=\"outline-primary\"\n >\n <FormattedMessage {...messages.actionsButtonLabel} />\n </Dropdown.Toggle>\n <Dropdown.Menu>\n {encodingsDownloadUrl ? (\n <Dropdown.Item\n download\n href={`${getConfig().STUDIO_BASE_URL}${encodingsDownloadUrl}`}\n >\n <FormattedMessage {...messages.downloadEncodingsTitle} />\n </Dropdown.Item>\n ) : null}\n <Dropdown.Item\n onClick={() => handleBulkDownload(selectedFlatRows)}\n disabled={_.isEmpty(selectedFlatRows)}\n >\n <FormattedMessage {...messages.downloadTitle} />\n </Dropdown.Item>\n <Dropdown.Divider />\n <Dropdown.Item\n data-testid=\"open-delete-confirmation-button\"\n onClick={() => handleOpenDeleteConfirmation(selectedFlatRows)}\n disabled={_.isEmpty(selectedFlatRows)}\n >\n <FormattedMessage {...messages.deleteTitle} />\n </Dropdown.Item>\n </Dropdown.Menu>\n </Dropdown>\n <Button iconBefore={Add} onClick={fileInputControl.click}>\n {intl.formatMessage(messages.addFilesButtonLabel, { fileType })}\n </Button>\n <SortAndFilterModal {...{ isSortOpen, closeSort, handleSort }} />\n </>\n );\n};\n\nTableActions.defaultProps = {\n selectedFlatRows: null,\n};\nTableActions.propTypes = {\n selectedFlatRows: PropTypes.arrayOf(\n PropTypes.shape({\n original: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n wrapperType: PropTypes.string.isRequired,\n locked: PropTypes.bool,\n externalUrl: PropTypes.string,\n thumbnail: PropTypes.string,\n id: PropTypes.string.isRequired,\n portableUrl: PropTypes.string,\n }).isRequired,\n }),\n ),\n fileInputControl: PropTypes.shape({\n click: PropTypes.func.isRequired,\n }).isRequired,\n handleOpenDeleteConfirmation: PropTypes.func.isRequired,\n handleBulkDownload: PropTypes.func.isRequired,\n encodingsDownloadUrl: PropTypes.string,\n handleSort: PropTypes.func.isRequired,\n fileType: PropTypes.string.isRequired,\n setInitialState: PropTypes.func.isRequired,\n intl: intlShape.isRequired,\n};\n\nTableActions.defaultProps = {\n encodingsDownloadUrl: null,\n};\n\nexport default injectIntl(TableActions);\n","import { isEmpty, isArray } from 'lodash';\nimport messages from '../messages';\n\nconst getFilterDisplayName = (column, values) => {\n const displayNames = [];\n const { filterChoices } = column;\n values.forEach(value => {\n const [displayName] = filterChoices.filter(choice => choice.value === value);\n displayNames.push(displayName);\n });\n return displayNames;\n};\n\nexport const getFilters = (state, columns) => {\n const { filters } = state;\n const filterableColumns = columns.filter(column => column?.filterChoices);\n const allFilters = [];\n\n filters.forEach(filter => {\n const { id, value } = filter;\n const [filterColumn] = filterableColumns.filter(column => column.id === id);\n let currentFilters;\n\n if (filterColumn) {\n currentFilters = getFilterDisplayName(filterColumn, value);\n } else {\n const searchValue = Array.isArray(value) ? value[0] : value;\n currentFilters = [{ name: searchValue, value: searchValue }];\n }\n allFilters.push(...currentFilters);\n });\n\n return allFilters;\n};\n\nexport const removeFilter = (filter, setFilter, setAllFilters, state) => {\n const { filters } = state;\n const [editedFilter] = filters.filter(currentFilter => currentFilter.value.includes(filter));\n\n let updatedFilterValue;\n if (isArray(editedFilter?.value)) {\n updatedFilterValue = editedFilter.value.filter(value => value !== filter);\n } else {\n updatedFilterValue = filter.includes(editedFilter?.value) ? [] : editedFilter.value;\n }\n\n if (isEmpty(updatedFilterValue)) {\n const updatedFilters = filters.filter(currentFilter => currentFilter.id !== editedFilter.id);\n setAllFilters(updatedFilters);\n } else {\n setFilter(editedFilter.id, updatedFilterValue);\n }\n};\n\nexport const getCurrentViewRange = ({\n filterRowCount,\n initialRowCount,\n fileCount,\n intl,\n}) => {\n if (filterRowCount === initialRowCount) {\n return intl.formatMessage(\n messages.rowStatusMessage,\n { fileCount, rowCount: initialRowCount },\n );\n }\n return intl.formatMessage(\n messages.rowStatusMessage,\n { fileCount, rowCount: filterRowCount },\n );\n};\n","import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n';\nimport {\n DataTableContext, Button, Row, Chip,\n} from '@openedx/paragon';\nimport { Close } from '@openedx/paragon/icons';\nimport { getFilters, removeFilter } from './utils';\n\nconst FilterStatus = ({\n className, variant, size, clearFiltersText, buttonClassName,\n}) => {\n const intl = useIntl();\n const {\n state, setAllFilters, setFilter, RowStatusComponent, columns,\n } = useContext(DataTableContext);\n\n if (!setAllFilters) {\n return null;\n }\n\n const filters = getFilters(state, columns);\n\n return (\n <div className={className}>\n <RowStatusComponent />\n <Row className=\"m-0 align-items-center\">\n <span className=\"mr-2\">Filters applied</span>\n {filters.map(({ name, value }) => (\n <Chip\n key={value}\n iconAfter={Close}\n iconAfterAlt={intl.formatMessage({\n id: 'pgn.DataTable.FilterStatus.removeFilter',\n defaultMessage: 'Remove this filter',\n description: 'Remove one of the applied filters.',\n })}\n onIconAfterClick={() => removeFilter(value, setFilter, setAllFilters, state)}\n >\n {name}\n </Chip>\n ))}\n <Button\n className={buttonClassName}\n variant={variant}\n size={size}\n onClick={() => setAllFilters([])}\n >\n {clearFiltersText === undefined\n ? (\n <FormattedMessage\n id=\"pgn.DataTable.FilterStatus.clearFiltersText\"\n defaultMessage=\"Clear filters\"\n description=\"A text that appears on the `Clear filters` button\"\n />\n )\n : clearFiltersText}\n </Button>\n </Row>\n </div>\n );\n};\n\nFilterStatus.defaultProps = {\n /** Specifies class name to append to the base element. */\n className: null,\n /** Specifies class name to append to the button. */\n buttonClassName: 'pgn__smart-status-button',\n /** The visual style of the `FilterStatus`. */\n variant: 'link',\n /** The size of the `FilterStatus`. */\n size: 'inline',\n /** A text that appears on the `Clear filters` button, defaults to 'Clear filters'. */\n clearFiltersText: undefined,\n};\n\nFilterStatus.propTypes = {\n className: PropTypes.string,\n buttonClassName: PropTypes.string,\n variant: PropTypes.string,\n size: PropTypes.string,\n clearFiltersText: PropTypes.oneOfType([PropTypes.element, PropTypes.string]),\n};\n\nexport default FilterStatus;\n","import React, { useContext } from 'react';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { DataTableContext } from '@openedx/paragon';\nimport { getCurrentViewRange } from './utils';\n\nconst RowStatus = ({\n // injected\n intl,\n}) => {\n const { filteredRows, page, initialRows } = useContext(DataTableContext);\n\n return (\n <div>\n <span>\n {getCurrentViewRange({\n filterRowCount: filteredRows.length,\n initialRowCount: initialRows.length,\n fileCount: page.length,\n intl,\n })}\n </span>\n </div>\n );\n};\n\nRowStatus.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(RowStatus);\n","import React, { useContext } from 'react';\nimport { DataTableContext, Pagination, TableFooter } from '@openedx/paragon';\n\nconst Footer = () => {\n const {\n pageOptions, pageCount, gotoPage, state,\n } = useContext(DataTableContext);\n\n if (pageOptions.length < 2) {\n return null;\n }\n\n const pageIndex = state?.pageIndex;\n\n return (\n <TableFooter>\n <Pagination\n size=\"small\"\n currentPage={pageIndex + 1}\n pageCount={pageCount}\n paginationLabel=\"table pagination\"\n onPageSelect={(pageNum) => gotoPage(pageNum - 1)}\n />\n </TableFooter>\n );\n};\n\nexport default Footer;\n","import React from 'react';\nimport { PropTypes } from 'prop-types';\nimport { Icon, OverlayTrigger, Tooltip } from '@openedx/paragon';\nimport { Locked, LockOpen } from '@openedx/paragon/icons';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport messages from '../../messages';\n\nconst AccessColumn = ({\n row,\n // injected\n intl,\n}) => {\n const { locked } = row.original;\n return (\n <OverlayTrigger\n placement=\"top\"\n overlay={(\n <Tooltip id=\"access-tooltip-description\">\n {intl.formatMessage(messages.lockFileTooltipContent)}\n </Tooltip>\n )}\n >\n {locked ? (\n <Icon src={Locked} size=\"sm\" />\n ) : (\n <Icon src={LockOpen} size=\"sm\" />\n )}\n </OverlayTrigger>\n );\n};\n\nAccessColumn.propTypes = {\n row: {\n original: {\n locked: PropTypes.bool.isRequired,\n }.isRequired,\n }.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(AccessColumn);\n","import React from 'react';\nimport { PropTypes } from 'prop-types';\nimport { isNil } from 'lodash';\nimport { injectIntl, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Icon, Spinner } from '@openedx/paragon';\nimport { Check } from '@openedx/paragon/icons';\nimport { RequestStatus } from '../../../../data/constants';\n\nconst ActiveColumn = ({ row, pageLoadStatus }) => {\n const { usageLocations } = row.original;\n if (isNil(usageLocations) || pageLoadStatus !== RequestStatus.SUCCESSFUL) {\n return (\n <Spinner\n animation=\"border\"\n role=\"status\"\n variant=\"primary\"\n size=\"sm\"\n screenReaderText={(\n <FormattedMessage\n id=\"authoring.loading\"\n defaultMessage=\"Loading...\"\n description=\"Screen-reader message for when a active column is loading.\"\n />\n )}\n />\n );\n }\n const numOfUsageLocations = usageLocations.length;\n return numOfUsageLocations > 0 ? <Icon src={Check} /> : null;\n};\n\nActiveColumn.propTypes = {\n row: {\n original: {\n usageLocations: PropTypes.arrayOf(PropTypes.string).isRequired,\n }.isRequired,\n }.isRequired,\n pageLoadStatus: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(ActiveColumn);\n","import React, { useState } from 'react';\nimport { PropTypes } from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Button,\n Icon,\n IconButton,\n ModalPopup,\n Menu,\n MenuItem,\n useToggle,\n} from '@openedx/paragon';\nimport { MoreHoriz } from '@openedx/paragon/icons';\n\nimport messages from '../../messages';\n\nconst MoreInfoColumn = ({\n row,\n handleLock,\n handleBulkDownload,\n handleOpenFileInfo,\n handleOpenDeleteConfirmation,\n fileType,\n // injected\n intl,\n}) => {\n const [isOpen, , close, toggle] = useToggle();\n const [target, setTarget] = useState(null);\n\n const {\n externalUrl,\n locked,\n portableUrl,\n id,\n displayName,\n downloadLink,\n } = row.original;\n return (\n <>\n <IconButton\n src={MoreHoriz}\n iconAs={Icon}\n onClick={toggle}\n ref={setTarget}\n alt=\"More info icon button\"\n />\n <ModalPopup\n placement=\"bottom-end\"\n positionRef={target}\n isOpen={isOpen}\n onClose={close}\n onEscapeKey={close}\n >\n <Menu\n className=\"more-info-menu\"\n >\n {fileType === 'video' ? (\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n onClick={() => {\n navigator.clipboard.writeText(id);\n close();\n }}\n >\n {intl.formatMessage(messages.copyVideoIdTitle)}\n </MenuItem>\n ) : (\n <>\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n onClick={() => {\n navigator.clipboard.writeText(portableUrl);\n close();\n }}\n >\n {intl.formatMessage(messages.copyStudioUrlTitle)}\n </MenuItem>\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n onClick={() => {\n navigator.clipboard.writeText(externalUrl);\n close();\n }}\n >\n {intl.formatMessage(messages.copyWebUrlTitle)}\n </MenuItem>\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n onClick={() => handleLock(id, !locked)}\n >\n {locked ? intl.formatMessage(messages.unlockMenuTitle) : intl.formatMessage(messages.lockMenuTitle)}\n </MenuItem>\n </>\n )}\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n onClick={() => handleBulkDownload(\n [{ original: { id, displayName, downloadLink } }],\n )}\n >\n {intl.formatMessage(messages.downloadTitle)}\n </MenuItem>\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n onClick={() => handleOpenFileInfo(row.original)}\n >\n {intl.formatMessage(messages.infoTitle)}\n </MenuItem>\n <hr className=\"my-2\" />\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n data-testid=\"open-delete-confirmation-button\"\n onClick={() => {\n handleOpenDeleteConfirmation([{ original: row.original }]);\n close();\n }}\n >\n {intl.formatMessage(messages.deleteTitle)}\n </MenuItem>\n </Menu>\n </ModalPopup>\n </>\n );\n};\n\nMoreInfoColumn.propTypes = {\n row: PropTypes.shape({\n original: {\n externalUrl: PropTypes.string,\n locked: PropTypes.bool,\n portableUrl: PropTypes.string,\n id: PropTypes.string.isRequired,\n }.isRequired,\n }).isRequired,\n handleLock: PropTypes.func,\n handleBulkDownload: PropTypes.func.isRequired,\n handleOpenFileInfo: PropTypes.func.isRequired,\n handleOpenDeleteConfirmation: PropTypes.func.isRequired,\n fileType: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nMoreInfoColumn.defaultProps = {\n handleLock: null,\n};\n\nexport default injectIntl(MoreInfoColumn);\n","export const MAX_FILE_SIZE_MB = 2000000;\nexport const MIN_FILE_SIZE_KB = 2000;\nexport const MAX_WIDTH = 1280;\nexport const MAX_HEIGHT = 720;\nexport const MIN_WIDTH = 640;\nexport const MIN_HEIGHT = 360;\nexport const ASPECT_RATIO = 16 / 9;\nexport const ASPECT_RATIO_ERROR_MARGIN = 0.1;\nexport const TRANSCRIPT_FAILURE_STATUSES = ['Transcript Failed', 'Partial Failure'];\nexport const VIDEO_PROCESSING_STATUSES = ['In Progress', 'Uploaded']; // Don't add \"Uploading\" here. Otherwise interrupted uploads will be considered as processing.\nexport const VIDEO_SUCCESS_STATUSES = ['Ready', 'Imported'];\nexport const VIDEO_FAILURE_STATUSES = ['Failed', 'Partial Failure', 'Uploading']; // 'Uploading' is added here to handle interrupted uploads.\n","import React from 'react';\nimport { PropTypes } from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Badge } from '@openedx/paragon';\nimport { VIDEO_FAILURE_STATUSES } from '../../../videos-page/data/constants';\nimport messages from '../../messages';\n\nconst StatusColumn = ({ row }) => {\n const { status } = row.original;\n const isUploaded = status === 'Success';\n const isFailed = VIDEO_FAILURE_STATUSES.includes(status);\n const intl = useIntl();\n const failedText = intl.formatMessage(messages.failedLabel);\n\n if (isUploaded) {\n return null;\n }\n\n return (\n <Badge variant=\"light\">\n {isFailed ? failedText : status}\n </Badge>\n );\n};\n\nStatusColumn.propTypes = {\n row: {\n original: {\n status: PropTypes.string.isRequired,\n }.isRequired,\n }.isRequired,\n};\n\nexport default StatusColumn;\n","import React from 'react';\nimport { PropTypes } from 'prop-types';\nimport ThumbnailPreview from '../../ThumbnailPreview';\n\nconst ThumbnailColumn = ({ row, thumbnailPreview }) => {\n const {\n thumbnail,\n wrapperType,\n externalUrl,\n displayName,\n id,\n status,\n } = row.original;\n return (\n <ThumbnailPreview\n {...{\n thumbnail,\n wrapperType,\n externalUrl,\n displayName,\n id,\n status,\n thumbnailPreview,\n imageSize: { width: '120px', height: '67.5px' },\n }}\n />\n );\n};\n\nThumbnailColumn.propTypes = {\n row: {\n original: {\n thumbnail: PropTypes.string,\n wrapperType: PropTypes.string.isRequired,\n }.isRequired,\n }.isRequired,\n thumbnailPreview: PropTypes.func.isRequired,\n};\n\nexport default ThumbnailColumn;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Icon } from '@openedx/paragon';\nimport { Info } from '@openedx/paragon/icons';\nimport { TRANSCRIPT_FAILURE_STATUSES } from '../../../videos-page/data/constants';\n\nconst TranscriptColumn = ({ row }) => {\n const { transcripts, transcriptionStatus } = row.original;\n const numOfTranscripts = transcripts?.length;\n const transcriptMessage = numOfTranscripts > 0 ? `(${numOfTranscripts}) available` : null;\n\n return (\n <div className=\"row m-0 align-items-center\">\n {TRANSCRIPT_FAILURE_STATUSES.includes(transcriptionStatus) && (\n <Icon src={Info} size=\"sm\" className=\"mr-2 text-danger-500\" />\n )}\n <FormattedMessage\n id=\"course-authoring.videos-page.table.transcriptColumn.message\"\n description=\"Message with the number of transcripts available\"\n defaultMessage=\"{message}\"\n values={{ message: transcriptMessage }}\n />\n </div>\n );\n};\n\nTranscriptColumn.propTypes = {\n row: {\n original: {\n transcript: PropTypes.arrayOf([PropTypes.string]).isRequired,\n transcriptionStatus: PropTypes.string.isRequired,\n }.isRequired,\n }.isRequired,\n};\n\nexport default injectIntl(TranscriptColumn);\n","import { ensureConfig, getConfig } from '@edx/frontend-platform';\nimport { isArray, isEmpty } from 'lodash';\nimport {\n ASPECT_RATIO,\n ASPECT_RATIO_ERROR_MARGIN,\n MAX_HEIGHT,\n MAX_WIDTH,\n MIN_HEIGHT,\n MIN_WIDTH,\n} from './constants';\n\nensureConfig([\n 'STUDIO_BASE_URL',\n], 'Course Apps API service');\n\nexport const updateFileValues = (files, isNewFile) => {\n const updatedFiles = [];\n files.forEach(file => {\n const {\n edxVideoId,\n clientVideoId,\n created,\n courseVideoImageUrl,\n transcripts,\n } = file;\n\n let wrapperType;\n if (clientVideoId.endsWith('.mov')) {\n wrapperType = 'MOV';\n } else if (clientVideoId.endsWith('.mp4')) {\n wrapperType = 'MP4';\n } else {\n wrapperType = 'Unknown';\n }\n\n let thumbnail = courseVideoImageUrl;\n if (thumbnail && thumbnail.startsWith('/')) {\n thumbnail = `${getConfig().STUDIO_BASE_URL}${thumbnail}`;\n }\n const transcriptStatus = transcripts?.length > 0 ? 'transcribed' : 'notTranscribed';\n\n updatedFiles.push({\n ...file,\n displayName: clientVideoId,\n id: edxVideoId,\n wrapperType,\n dateAdded: created.toString(),\n usageLocations: isNewFile ? [] : null,\n thumbnail,\n transcriptStatus,\n activeStatus: 'inactive',\n });\n });\n\n return updatedFiles;\n};\n\nexport const getFormattedDuration = (value) => {\n if (!value || typeof value !== 'number' || value <= 0) {\n return '00:00:00';\n }\n const seconds = Math.floor(value % 60);\n const minutes = Math.floor((value / 60) % 60);\n const hours = Math.floor((value / 360) % 60);\n const zeroPad = (num) => String(num).padStart(2, '0');\n return [hours, minutes, seconds].map(zeroPad).join(':');\n};\n\nexport const getLanguages = (availableLanguages) => {\n const languages = {};\n availableLanguages?.forEach(language => {\n const { languageCode, languageText } = language;\n languages[languageCode] = languageText;\n });\n return languages;\n};\n\nexport const getSortedTranscripts = (languages, transcripts) => {\n const transcriptDisplayNames = [];\n transcripts.forEach(transcript => {\n const displayName = languages[transcript];\n transcriptDisplayNames.push(displayName);\n });\n\n const sortedTranscripts = transcriptDisplayNames.sort();\n const sortedTranscriptCodes = [];\n sortedTranscripts.forEach(transcript => {\n Object.entries(languages).forEach(([key, value]) => {\n if (value === transcript) {\n sortedTranscriptCodes.push(key);\n }\n });\n });\n\n return sortedTranscriptCodes;\n};\n\nexport const getSupportedFormats = (supportedFileFormats) => {\n if (isEmpty(supportedFileFormats)) {\n return null;\n }\n if (isArray(supportedFileFormats)) {\n return supportedFileFormats;\n }\n const supportedFormats = [];\n Object.entries(supportedFileFormats).forEach(([key, value]) => {\n let format;\n if (isArray(value)) {\n value.forEach(val => {\n if (val === '.mov') {\n format = key.replace('*', 'quicktime');\n } else {\n format = key.replace('*', val.substring(1));\n }\n supportedFormats.push(format);\n });\n } else {\n if (value === '.mov') {\n format = key.replace('*', 'quicktime');\n } else {\n format = key.replace('*', value.substring(1));\n }\n supportedFormats.push(format);\n }\n });\n return supportedFormats;\n};\n\n/** createResampledFile({ canvasUrl, filename, mimeType })\n * createResampledFile takes a canvasUrl, filename, and a valid mimeType. The\n * canvasUrl is parsed and written to an 8-bit array of unsigned integers. The\n * new array is saved to a new file with the same filename as the original image.\n * @param {string} canvasUrl - string of base64 URL for new image canvas\n * @param {string} filename - string of the original image's filename\n * @param {string} mimeType - string of mimeType for the canvas\n * @return {File} new File object\n */\nexport const createResampledFile = ({ canvasUrl, filename, mimeType }) => {\n const arr = canvasUrl.split(',');\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n return new File([u8arr], filename, { type: mimeType });\n};\n\n/** resampleImage({ image, filename })\n * resampledImage takes a canvasUrl, filename, and a valid mimeType. The\n * canvasUrl is parsed and written to an 8-bit array of unsigned integers. The\n * new array is saved to a new file with the same filename as the original image.\n * @param {File} canvasUrl - string of base64 URL for new image canvas\n * @param {string} filename - string of the image's filename\n * @return {array} array containing the base64 URL for the resampled image and the file containing the resampled image\n */\nexport const resampleImage = ({ image, filename }) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n // Determine new dimensions for image\n if (image.naturalWidth > MAX_WIDTH) {\n // Set dimensions to the maximum size\n canvas.width = MAX_WIDTH;\n canvas.height = MAX_HEIGHT;\n } else if (image.naturalWidth < MIN_WIDTH) {\n // Set dimensions to the minimum size\n canvas.width = MIN_WIDTH;\n canvas.height = MIN_HEIGHT;\n } else {\n // Set dimensions to the closest 16:9 ratio\n const heightRatio = 9 / 16;\n canvas.width = image.naturalWidth;\n canvas.height = image.naturalWidth * heightRatio;\n }\n const cropLeft = (image.naturalWidth - canvas.width) / 2;\n const cropTop = (image.naturalHeight - canvas.height) / 2;\n\n ctx.drawImage(image, cropLeft, cropTop, canvas.width, canvas.height, 0, 0, canvas.width, canvas.height);\n const resampledFile = createResampledFile({ canvasUrl: canvas.toDataURL(), filename, mimeType: 'image/png' });\n return resampledFile;\n};\n\nexport const hasValidDimensions = ({ width, height }) => {\n const imageAspectRatio = Math.abs((width / height) - ASPECT_RATIO);\n\n if (width < MIN_WIDTH || height < MIN_HEIGHT) {\n return false;\n }\n if (imageAspectRatio >= ASPECT_RATIO_ERROR_MARGIN) {\n return false;\n }\n return true;\n};\n\nexport const resampleFile = ({\n file,\n dispatch,\n videoId,\n courseId,\n addVideoThumbnail,\n}) => {\n const reader = new FileReader();\n const image = new Image();\n reader.onload = () => {\n image.src = reader.result;\n image.onload = () => {\n const width = image.naturalWidth;\n const height = image.naturalHeight;\n if (!hasValidDimensions({ width, height })) {\n const resampledFile = resampleImage({ image, filename: file.name });\n dispatch(addVideoThumbnail({ courseId, videoId, file: resampledFile }));\n } else {\n dispatch(addVideoThumbnail({ courseId, videoId, file }));\n }\n };\n };\n reader.readAsDataURL(file);\n};\n\nexport const getLanguageOptions = (keys, languages) => {\n const options = {};\n if (keys) {\n keys.forEach(key => {\n options[key] = languages[key];\n });\n }\n return options;\n};\n\nexport const getFidelityOptions = (fidelities) => {\n const options = {};\n Object.entries(fidelities).forEach(([key, value]) => {\n const { display_name: displayName } = value;\n options[key] = displayName;\n });\n return options;\n};\n\nexport const checkCredentials = (transcriptCredentials) => {\n const cieloHasCredentials = transcriptCredentials.cielo24;\n const threePlayHasCredentials = transcriptCredentials['3PlayMedia'];\n return [cieloHasCredentials, threePlayHasCredentials];\n};\n\nexport const checkTranscriptionPlans = (transcriptionPlans) => {\n let cieloIsValid = !isEmpty(transcriptionPlans.Cielo24);\n let threePlayIsValid = !isEmpty(transcriptionPlans['3PlayMedia']);\n\n if (cieloIsValid) {\n const { fidelity, turnaround } = transcriptionPlans.Cielo24;\n cieloIsValid = !isEmpty(fidelity) && !isEmpty(turnaround);\n }\n\n if (threePlayIsValid) {\n const { languages, turnaround, translations } = transcriptionPlans['3PlayMedia'];\n threePlayIsValid = !isEmpty(turnaround) && !isEmpty(languages) && !isEmpty(translations);\n }\n\n return [cieloIsValid, threePlayIsValid];\n};\n\nexport const validateForm = (cieloHasCredentials, threePlayHasCredentials, provider, data) => {\n const {\n apiKey,\n apiSecretKey,\n username,\n cielo24Fidelity,\n cielo24Turnaround,\n preferredLanguages,\n threePlayTurnaround,\n videoSourceLanguage,\n } = data;\n switch (provider) {\n case 'Cielo24':\n if (cieloHasCredentials) {\n return !isEmpty(cielo24Fidelity) && !isEmpty(cielo24Turnaround)\n && !isEmpty(preferredLanguages) && !isEmpty(videoSourceLanguage);\n }\n return !isEmpty(apiKey) && !isEmpty(username);\n case '3PlayMedia':\n if (threePlayHasCredentials) {\n return !isEmpty(threePlayTurnaround) && !isEmpty(preferredLanguages) && !isEmpty(videoSourceLanguage);\n }\n return !isEmpty(apiKey) && !isEmpty(apiSecretKey);\n case 'order':\n return true;\n default:\n break;\n }\n return false;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { getSupportedFormats } from '../videos-page/data/utils';\n\nexport const useFileInput = ({\n onAddFile,\n setSelectedRows,\n setAddOpen,\n}) => {\n const ref = React.useRef();\n const click = () => ref.current.click();\n const addFile = (e) => {\n const { files } = e.target;\n setSelectedRows([...files]);\n onAddFile(Object.values(files));\n setAddOpen();\n e.target.value = '';\n };\n return {\n click,\n addFile,\n ref,\n };\n};\n\nconst FileInput = ({ fileInput: hook, supportedFileFormats, allowMultiple }) => (\n <input\n accept={getSupportedFormats(supportedFileFormats)}\n aria-label=\"file-input\"\n className=\"upload d-none\"\n onChange={hook.addFile}\n ref={hook.ref}\n type=\"file\"\n multiple={allowMultiple}\n />\n);\n\nFileInput.propTypes = {\n fileInput: PropTypes.shape({\n addFile: PropTypes.func,\n ref: PropTypes.oneOfType([\n // Either a function\n PropTypes.func,\n // Or the instance of a DOM native element (see the note about SSR)\n PropTypes.shape({ current: PropTypes.instanceOf(Element) }),\n ]),\n }).isRequired,\n supportedFileFormats: PropTypes.oneOfType([\n PropTypes.shape({}),\n PropTypes.arrayOf(PropTypes.string),\n ]),\n allowMultiple: PropTypes.bool,\n};\n\nFileInput.defaultProps = {\n supportedFileFormats: null,\n allowMultiple: true,\n};\n\nexport default FileInput;\n","import { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform';\nimport PropTypes from 'prop-types';\nimport {\n Hyperlink,\n Icon,\n Row,\n Spinner,\n} from '@openedx/paragon';\nimport { ErrorOutline } from '@openedx/paragon/icons';\nimport isEmpty from 'lodash/isEmpty';\nimport { RequestStatus } from '../../data/constants';\nimport messages from './messages';\n\nconst UsageMetricsMessage = ({\n usagePathStatus,\n usageLocations,\n error,\n // injected\n intl,\n}) => {\n let usageMessage;\n if (usagePathStatus === RequestStatus.SUCCESSFUL) {\n usageMessage = isEmpty(usageLocations) ? (\n <FormattedMessage {...messages.usageNotInUseMessage} />\n ) : (\n <ul className=\"p-0\">\n {usageLocations.map(location => (\n <li key={`usage-location-${location.displayLocation}`} style={{ listStyle: 'none' }}>\n <Hyperlink destination={`${getConfig().STUDIO_BASE_URL}${location.url}`} target=\"_blank\">\n {location.displayLocation}\n </Hyperlink>\n </li>\n ))}\n </ul>\n );\n } else if (usagePathStatus === RequestStatus.FAILED) {\n usageMessage = (\n <Row className=\"m-0 pt-1\">\n <Icon\n className=\"mr-1 text-danger-500\"\n size=\"sm\"\n src={ErrorOutline}\n />\n {intl.formatMessage(messages.errorAlertMessage, { message: error })}\n </Row>\n );\n } else {\n usageMessage = (\n <>\n <Spinner\n animation=\"border\"\n size=\"sm\"\n className=\"mie-3\"\n screenReaderText={intl.formatMessage(messages.usageLoadingMessage)}\n />\n <FormattedMessage {...messages.usageLoadingMessage} />\n </>\n );\n }\n return usageMessage;\n};\n\nUsageMetricsMessage.propTypes = {\n usagePathStatus: PropTypes.string.isRequired,\n usageLocations: PropTypes.arrayOf(PropTypes.string).isRequired,\n error: PropTypes.arrayOf(PropTypes.string).isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(UsageMetricsMessage);\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport {\n injectIntl,\n intlShape,\n FormattedMessage,\n} from '@edx/frontend-platform/i18n';\nimport {\n Icon,\n ModalDialog,\n Stack,\n Truncate,\n} from '@openedx/paragon';\nimport { Error } from '@openedx/paragon/icons';\n\nimport messages from './messages';\nimport UsageMetricsMessages from './UsageMetricsMessage';\nimport FileThumbnail from './ThumbnailPreview';\nimport { TRANSCRIPT_FAILURE_STATUSES } from '../videos-page/data/constants';\nimport AlertMessage from '../../generic/alert-message';\n\nconst InfoModal = ({\n file,\n isOpen,\n onClose,\n thumbnailPreview,\n usagePathStatus,\n error,\n sidebar,\n // injected\n intl,\n}) => {\n const [activeTab, setActiveTab] = useState('fileInfo');\n const showTranscriptionError = TRANSCRIPT_FAILURE_STATUSES.includes(file?.transcriptionStatus)\n && activeTab !== 'fileInfo';\n\n return (\n <ModalDialog\n title={file?.displayName}\n isOpen={isOpen}\n onClose={onClose}\n size=\"lg\"\n hasCloseButton\n data-testid=\"file-info-modal\"\n style={{ minHeight: '799px' }}\n >\n <ModalDialog.Header>\n <ModalDialog.Title>\n <div style={{ wordBreak: 'break-word' }}>\n <Truncate lines={2} className=\"font-weight-bold small mt-3\">\n {file?.displayName}\n </Truncate>\n </div>\n </ModalDialog.Title>\n </ModalDialog.Header>\n <ModalDialog.Body className=\"pt-0 x-small\">\n <hr />\n {showTranscriptionError && (\n <AlertMessage\n description={(\n <div className=\"row m-0 align-itmes-center\">\n <Icon src={Error} className=\"text-danger-500 mr-2\" />\n {intl.formatMessage(messages.transcriptionErrorMessage, { error: file.errorDescription })}\n </div>\n )}\n variant=\"danger\"\n />\n )}\n <div className=\"row flex-nowrap m-0 mt-4\">\n <div className=\"col-7 mr-3\">\n <Stack gap={5}>\n <FileThumbnail\n thumbnail={file?.thumbnail}\n externalUrl={file?.externalUrl}\n displayName={file?.displayName}\n wrapperType={file?.wrapperType}\n id={file?.id}\n status={file?.status}\n thumbnailPreview={thumbnailPreview}\n imageSize={{ width: '503px', height: '281px' }}\n />\n <div>\n <div className=\"row m-0 font-weight-bold\">\n <FormattedMessage {...messages.usageTitle} />\n </div>\n <UsageMetricsMessages {...{ usageLocations: file?.usageLocations, usagePathStatus, error }} />\n </div>\n </Stack>\n </div>\n <div className=\"col-5\">\n {sidebar(file, activeTab, setActiveTab)}\n </div>\n </div>\n </ModalDialog.Body>\n </ModalDialog>\n );\n};\n\nInfoModal.propTypes = {\n file: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n wrapperType: PropTypes.string.isRequired,\n locked: PropTypes.bool,\n externalUrl: PropTypes.string,\n thumbnail: PropTypes.string,\n id: PropTypes.string.isRequired,\n portableUrl: PropTypes.string,\n dateAdded: PropTypes.string.isRequired,\n fileSize: PropTypes.number.isRequired,\n usageLocations: PropTypes.arrayOf(PropTypes.string),\n status: PropTypes.string,\n transcriptionStatus: PropTypes.string,\n errorDescription: PropTypes.string,\n }),\n onClose: PropTypes.func.isRequired,\n isOpen: PropTypes.bool.isRequired,\n usagePathStatus: PropTypes.string.isRequired,\n error: PropTypes.arrayOf(PropTypes.string).isRequired,\n thumbnailPreview: PropTypes.func.isRequired,\n sidebar: PropTypes.func.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nInfoModal.defaultProps = {\n file: null,\n};\n\nexport default injectIntl(InfoModal);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Toast } from '@openedx/paragon';\nimport messages from './messages';\n\nconst ApiStatusToast = ({\n actionType,\n selectedRowCount,\n isOpen,\n setClose,\n setSelectedRows,\n fileType,\n // injected\n intl,\n}) => {\n const handleClose = () => {\n setSelectedRows([]);\n setClose();\n };\n\n return (\n <Toast\n show={isOpen}\n onClose={handleClose}\n >\n {intl.formatMessage(messages.apiStatusToastMessage, { actionType, selectedRowCount, fileType })}\n </Toast>\n );\n};\n\nApiStatusToast.propTypes = {\n actionType: PropTypes.string.isRequired,\n selectedRowCount: PropTypes.number.isRequired,\n isOpen: PropTypes.bool.isRequired,\n setClose: PropTypes.func.isRequired,\n setSelectedRows: PropTypes.func.isRequired,\n fileType: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(ApiStatusToast);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform';\nimport {\n ActionRow,\n AlertModal,\n Button,\n Collapsible,\n Hyperlink,\n Truncate,\n} from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst DeleteConfirmationModal = ({\n isDeleteConfirmationOpen,\n closeDeleteConfirmation,\n handleBulkDelete,\n selectedRows,\n fileType,\n // injected\n intl,\n}) => {\n const firstSelectedRow = selectedRows[0]?.original;\n let activeContentRows = [];\n if (Array.isArray(selectedRows)) {\n activeContentRows = selectedRows.filter(row => row.original?.activeStatus === 'active');\n }\n const isDeletingCourseContent = activeContentRows.length > 0;\n\n const deletedCourseContent = activeContentRows.map(({ original }) => (\n <li style={{ listStyle: 'None' }} key={original.id}>\n <Collapsible\n styling=\"basic\"\n title={(\n <h3 className=\"h5 m-n2\">\n <Truncate lines={1}>\n {original.displayName}\n </Truncate>\n </h3>\n )}\n data-testid={`collapsible-${original.id}`}\n >\n <ul className=\"px-2 py-0\">\n {original.usageLocations.map(location => (\n <li key={`usage-location-${location.displayLocation}`} style={{ listStyle: 'square' }}>\n <Hyperlink destination={`${getConfig().STUDIO_BASE_URL}${location.url}`} target=\"_blank\">\n {location.displayLocation}\n </Hyperlink>\n </li>\n ))}\n </ul>\n </Collapsible>\n </li>\n ));\n\n return (\n <AlertModal\n className=\"small\"\n title={intl.formatMessage(\n messages.deleteConfirmationTitle,\n {\n fileName: firstSelectedRow?.displayName,\n fileNumber: selectedRows.length,\n fileType,\n },\n )}\n isOpen={isDeleteConfirmationOpen}\n onClose={closeDeleteConfirmation}\n footerNode={(\n <ActionRow>\n <Button variant=\"tertiary\" onClick={closeDeleteConfirmation}>\n {intl.formatMessage(messages.cancelButtonLabel)}\n </Button>\n <Button onClick={handleBulkDelete}>\n {intl.formatMessage(messages.deleteFileButtonLabel)}\n </Button>\n </ActionRow>\n )}\n >\n {intl.formatMessage(\n messages.deleteConfirmationMessage,\n {\n fileName: firstSelectedRow?.displayName,\n fileNumber: selectedRows.length,\n fileType,\n },\n )}\n {isDeletingCourseContent && (\n <div className=\"mt-3\">\n {intl.formatMessage(\n messages.deleteConfirmationUsageMessage,\n {\n fileNumber: activeContentRows.length,\n fileType,\n },\n )}\n <ul className=\"p-0\">\n {deletedCourseContent}\n </ul>\n </div>\n )}\n </AlertModal>\n );\n};\n\nDeleteConfirmationModal.defaultProps = {\n selectedRows: [],\n};\n\nDeleteConfirmationModal.propTypes = {\n selectedRows: PropTypes.arrayOf(PropTypes.shape({\n original: PropTypes.shape({\n id: PropTypes.string,\n displayName: PropTypes.string,\n activeStatus: PropTypes.string,\n usageLocations: PropTypes.arrayOf(PropTypes.shape({\n url: PropTypes.string,\n displayLocation: PropTypes.string,\n })),\n }),\n })),\n isDeleteConfirmationOpen: PropTypes.bool.isRequired,\n closeDeleteConfirmation: PropTypes.func.isRequired,\n handleBulkDelete: PropTypes.func.isRequired,\n fileType: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(DeleteConfirmationModal);\n","import React, { useCallback, useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport isEmpty from 'lodash/isEmpty';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n CardView,\n DataTable,\n Dropzone,\n TextFilter,\n useToggle,\n} from '@openedx/paragon';\n\nimport { RequestStatus } from '../../data/constants';\nimport { sortFiles } from './utils';\nimport messages from './messages';\n\nimport InfoModal from './InfoModal';\nimport FileInput, { useFileInput } from './FileInput';\nimport {\n GalleryCard,\n TableActions,\n RowStatus,\n MoreInfoColumn,\n FilterStatus,\n Footer,\n} from './table-components';\nimport ApiStatusToast from './ApiStatusToast';\nimport DeleteConfirmationModal from './DeleteConfirmationModal';\n\nconst FileTable = ({\n files,\n data,\n handleAddFile,\n handleLockFile,\n handleDeleteFile,\n handleDownloadFile,\n handleUsagePaths,\n handleErrorReset,\n handleFileOrder,\n tableColumns,\n maxFileSize,\n thumbnailPreview,\n infoModalSidebar,\n // injected\n intl,\n}) => {\n const defaultVal = 'card';\n const pageCount = Math.ceil(files.length / 50);\n const columnSizes = {\n xs: 12,\n sm: 6,\n md: 4,\n lg: 3,\n xl: 2,\n };\n const [currentView, setCurrentView] = useState(defaultVal);\n const [isDeleteOpen, setDeleteOpen, setDeleteClose] = useToggle(false);\n const [isDownloadOpen, setDownloadOpen, setDownloadClose] = useToggle(false);\n const [isAssetInfoOpen, openAssetInfo, closeAssetinfo] = useToggle(false);\n const [isAddOpen, setAddOpen, setAddClose] = useToggle(false);\n const [selectedRows, setSelectedRows] = useState([]);\n const [isDeleteConfirmationOpen, openDeleteConfirmation, closeDeleteConfirmation] = useToggle(false);\n const [initialState, setInitialState] = useState({\n filters: [],\n hiddenColumns: [],\n pageIndex: 0,\n pageSize: 50,\n selectedRowIds: {},\n sortBy: [],\n });\n\n const {\n loadingStatus,\n usagePathStatus,\n usageErrorMessages,\n encodingsDownloadUrl,\n supportedFileFormats,\n fileType,\n } = data;\n\n useEffect(() => {\n if (!isEmpty(selectedRows) && Object.keys(selectedRows[0]).length > 0) {\n const updatedRows = [];\n selectedRows.forEach(row => {\n const currentFile = row.original;\n if (currentFile) {\n const [updatedFile] = files.filter(file => file.id === currentFile?.id);\n updatedRows.push({ original: updatedFile });\n }\n });\n setSelectedRows(updatedRows);\n }\n }, [files]);\n\n const fileInputControl = useFileInput({\n onAddFile: (uploads) => handleAddFile(uploads),\n setSelectedRows,\n setAddOpen,\n });\n const handleDropzoneAsset = ({ fileData, handleError }) => {\n try {\n const file = fileData.get('file');\n handleAddFile([file]);\n } catch (error) {\n handleError(error);\n }\n };\n\n const handleSort = (sortType) => {\n const newFileIdOrder = sortFiles(files, sortType);\n handleFileOrder({ newFileIdOrder, sortType });\n };\n\n const handleBulkDelete = () => {\n closeDeleteConfirmation();\n setDeleteOpen();\n handleErrorReset({ errorType: 'delete' });\n const fileIdsToDelete = selectedRows.map(row => row.original.id);\n fileIdsToDelete.forEach(id => handleDeleteFile(id));\n };\n\n const handleBulkDownload = useCallback(async (selectedFlatRows) => {\n handleErrorReset({ errorType: 'download' });\n setSelectedRows(selectedFlatRows);\n setDownloadOpen();\n handleDownloadFile(selectedFlatRows);\n }, []);\n\n const handleOpenDeleteConfirmation = (selectedFlatRows) => {\n setSelectedRows(selectedFlatRows);\n openDeleteConfirmation();\n };\n\n const handleOpenFileInfo = (original) => {\n handleErrorReset({ errorType: 'usageMetrics' });\n setSelectedRows([{ original }]);\n handleUsagePaths(original);\n openAssetInfo();\n };\n\n const headerActions = ({ selectedFlatRows }) => (\n <TableActions\n {...{\n selectedFlatRows,\n fileInputControl,\n encodingsDownloadUrl,\n handleSort,\n handleBulkDownload,\n handleOpenDeleteConfirmation,\n supportedFileFormats,\n fileType,\n setInitialState,\n }}\n />\n );\n\n const fileCard = ({ className, original }) => (\n <GalleryCard\n {...{\n handleLockFile,\n handleBulkDownload,\n handleOpenDeleteConfirmation,\n handleOpenFileInfo,\n thumbnailPreview,\n className,\n original,\n fileType,\n }}\n />\n );\n\n const moreInfoColumn = {\n id: 'moreInfo',\n Header: '',\n Cell: ({ row }) => MoreInfoColumn({\n row,\n handleLock: handleLockFile,\n handleBulkDownload,\n handleOpenFileInfo,\n handleOpenDeleteConfirmation,\n fileType,\n }),\n };\n\n const hasMoreInfoColumn = tableColumns.filter(col => col.id === 'moreInfo').length === 1;\n if (!hasMoreInfoColumn) {\n tableColumns.push({ ...moreInfoColumn });\n }\n\n return (\n <div className=\"files-table\">\n <DataTable\n isFilterable\n isLoading={loadingStatus === RequestStatus.IN_PROGRESS}\n isSortable\n isSelectable\n isPaginated\n defaultColumnValues={{ Filter: TextFilter }}\n dataViewToggleOptions={{\n isDataViewToggleEnabled: true,\n onDataViewToggle: val => setCurrentView(val),\n defaultActiveStateValue: defaultVal,\n togglePlacement: 'left',\n }}\n initialState={initialState}\n tableActions={headerActions}\n bulkActions={headerActions}\n columns={tableColumns}\n itemCount={files.length}\n pageCount={pageCount}\n data={files}\n FilterStatusComponent={FilterStatus}\n RowStatusComponent={RowStatus}\n >\n {isEmpty(files) && loadingStatus !== RequestStatus.IN_PROGRESS ? (\n <Dropzone\n data-testid=\"files-dropzone\"\n accept={supportedFileFormats}\n onProcessUpload={handleDropzoneAsset}\n maxSize={maxFileSize}\n errorMessages={{\n invalidSize: intl.formatMessage(messages.fileSizeError),\n multipleDragged: 'Dropzone can only upload a single file.',\n }}\n />\n ) : (\n <div data-testid=\"files-data-table\" className=\"bg-light-200\">\n <DataTable.TableControlBar />\n <hr className=\"mb-5 border-light-700\" />\n { currentView === 'card' && <CardView CardComponent={fileCard} columnSizes={columnSizes} selectionPlacement=\"left\" skeletonCardCount={6} /> }\n { currentView === 'list' && <DataTable.Table /> }\n <DataTable.EmptyTable content={intl.formatMessage(messages.noResultsFoundMessage)} />\n <Footer />\n </div>\n )}\n\n <ApiStatusToast\n actionType={intl.formatMessage(messages.apiStatusDeletingAction)}\n selectedRowCount={selectedRows.length}\n isOpen={isDeleteOpen}\n setClose={setDeleteClose}\n setSelectedRows={setSelectedRows}\n fileType={fileType}\n />\n\n <ApiStatusToast\n actionType={intl.formatMessage(messages.apiStatusAddingAction)}\n selectedRowCount={selectedRows.length}\n isOpen={isAddOpen}\n setClose={setAddClose}\n setSelectedRows={setSelectedRows}\n fileType={fileType}\n />\n\n <ApiStatusToast\n actionType={intl.formatMessage(messages.apiStatusDownloadingAction)}\n selectedRowCount={selectedRows.length}\n isOpen={isDownloadOpen}\n setClose={setDownloadClose}\n setSelectedRows={setSelectedRows}\n fileType={fileType}\n />\n </DataTable>\n <FileInput key=\"generic-file-upload\" fileInput={fileInputControl} supportedFileFormats={supportedFileFormats} />\n {!isEmpty(selectedRows) && (\n <InfoModal\n file={selectedRows[0].original}\n onClose={closeAssetinfo}\n isOpen={isAssetInfoOpen}\n thumbnailPreview={thumbnailPreview}\n usagePathStatus={usagePathStatus}\n error={usageErrorMessages}\n sidebar={infoModalSidebar}\n />\n )}\n <DeleteConfirmationModal\n {...{\n isDeleteConfirmationOpen,\n closeDeleteConfirmation,\n handleBulkDelete,\n selectedRows,\n fileType,\n }}\n />\n </div>\n );\n};\n\nFileTable.propTypes = {\n courseId: PropTypes.string.isRequired,\n files: PropTypes.arrayOf(PropTypes.shape({})),\n data: PropTypes.shape({\n fileIds: PropTypes.arrayOf(PropTypes.string).isRequired,\n loadingStatus: PropTypes.string.isRequired,\n usagePathStatus: PropTypes.string.isRequired,\n usageErrorMessages: PropTypes.arrayOf(PropTypes.string).isRequired,\n encodingsDownloadUrl: PropTypes.string,\n supportedFileFormats: PropTypes.shape({}),\n fileType: PropTypes.string.isRequired,\n }).isRequired,\n handleAddFile: PropTypes.func.isRequired,\n handleDeleteFile: PropTypes.func.isRequired,\n handleDownloadFile: PropTypes.func.isRequired,\n handleUsagePaths: PropTypes.func.isRequired,\n handleLockFile: PropTypes.func,\n handleErrorReset: PropTypes.func.isRequired,\n handleFileOrder: PropTypes.func.isRequired,\n tableColumns: PropTypes.arrayOf(PropTypes.shape({\n Header: PropTypes.string,\n accessor: PropTypes.string,\n })).isRequired,\n maxFileSize: PropTypes.number.isRequired,\n thumbnailPreview: PropTypes.func.isRequired,\n infoModalSidebar: PropTypes.func.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nFileTable.defaultProps = {\n files: null,\n handleLockFile: () => {},\n};\n\nexport default injectIntl(FileTable);\n","export const sortFiles = (files, sortType) => { // eslint-disable-line import/prefer-default-export\n const [sort, direction] = sortType.split(',');\n let sortedFiles;\n if (sort === 'displayName') {\n sortedFiles = files.sort((f1, f2) => {\n const lowerCaseF1 = f1[sort].toLowerCase();\n const lowerCaseF2 = f2[sort].toLowerCase();\n if (lowerCaseF1 < lowerCaseF2) {\n return 1;\n }\n if (lowerCaseF1 > lowerCaseF2) {\n return -1;\n }\n return 0;\n });\n } else {\n sortedFiles = files.sort((f1, f2) => {\n if (f1[sort] < f2[sort]) {\n return 1;\n }\n if (f1[sort] > f2[sort]) {\n return -1;\n }\n return 0;\n });\n }\n const sortedIds = sortedFiles.map(file => file.id);\n if (direction === 'asc') {\n return sortedIds.reverse();\n }\n return sortedIds;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { ErrorAlert } from '@edx/frontend-lib-content-components';\nimport { RequestStatus } from '../../data/constants';\nimport messages from './messages';\n\nconst EditFileErrors = ({\n resetErrors,\n errorMessages,\n addFileStatus,\n deleteFileStatus,\n updateFileStatus,\n loadingStatus,\n // injected\n intl,\n}) => (\n <>\n <ErrorAlert\n hideHeading={false}\n dismissError={() => resetErrors({ errorType: 'loading' })}\n isError={loadingStatus === RequestStatus.FAILED || loadingStatus === RequestStatus.PARTIAL_FAILURE}\n >\n {intl.formatMessage(messages.errorAlertMessage, { message: errorMessages.loading })}\n </ErrorAlert>\n <ErrorAlert\n hideHeading={false}\n dismissError={() => resetErrors({ errorType: 'add' })}\n isError={addFileStatus === RequestStatus.FAILED}\n >\n <ul className=\"p-0\">\n {errorMessages.add.map(message => (\n <li key={`add-error-${message}`} style={{ listStyle: 'none' }}>\n {intl.formatMessage(messages.errorAlertMessage, { message })}\n </li>\n ))}\n </ul>\n </ErrorAlert>\n <ErrorAlert\n hideHeading={false}\n dismissError={() => resetErrors({ errorType: 'delete' })}\n isError={deleteFileStatus === RequestStatus.FAILED}\n >\n <ul className=\"p-0\">\n {errorMessages.delete.map(message => (\n <li key={`delete-error-${message}`} style={{ listStyle: 'none' }}>\n {intl.formatMessage(messages.errorAlertMessage, { message })}\n </li>\n ))}\n </ul>\n </ErrorAlert>\n <ErrorAlert\n hideHeading={false}\n dismissError={() => resetErrors({ errorType: 'update' })}\n isError={updateFileStatus === RequestStatus.FAILED}\n >\n <ul className=\"p-0\">\n {errorMessages.lock?.map(message => (\n <li key={`lock-error-${message}`} style={{ listStyle: 'none' }}>\n {intl.formatMessage(messages.errorAlertMessage, { message })}\n </li>\n ))}\n {errorMessages.download.map(message => (\n <li key={`download-error-${message}`} style={{ listStyle: 'none' }}>\n {intl.formatMessage(messages.errorAlertMessage, { message })}\n </li>\n ))}\n {errorMessages.thumbnail?.map(message => (\n <li key={`add-thumbnail-error-${message}`} style={{ listStyle: 'none' }}>\n {intl.formatMessage(messages.errorAlertMessage, { message })}\n </li>\n ))}\n </ul>\n </ErrorAlert>\n </>\n);\n\nEditFileErrors.propTypes = {\n resetErrors: PropTypes.func.isRequired,\n errorMessages: PropTypes.shape({\n add: PropTypes.arrayOf(PropTypes.string).isRequired,\n delete: PropTypes.arrayOf(PropTypes.string).isRequired,\n lock: PropTypes.arrayOf(PropTypes.string),\n download: PropTypes.arrayOf(PropTypes.string).isRequired,\n thumbnail: PropTypes.arrayOf(PropTypes.string),\n loading: PropTypes.string.isRequired,\n }).isRequired,\n addFileStatus: PropTypes.string.isRequired,\n deleteFileStatus: PropTypes.string.isRequired,\n updateFileStatus: PropTypes.string.isRequired,\n loadingStatus: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(EditFileErrors);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Icon,\n Image,\n} from '@openedx/paragon';\nimport { getSrc } from './data/utils';\nimport messages from './messages';\n\nconst FileThumbnail = ({\n thumbnail,\n wrapperType,\n externalUrl,\n displayName,\n imageSize,\n // injected\n intl,\n}) => {\n const src = getSrc({\n thumbnail,\n externalUrl,\n wrapperType,\n });\n const { width, height } = imageSize;\n\n return (\n <div className=\"row justify-content-center align-itmes-center\">\n {thumbnail ? (\n <Image\n style={{\n width,\n height,\n objectFit: 'contain',\n maxWidth: '100%',\n maxHeight: '100%',\n }}\n className=\"border rounded p-1\"\n src={src}\n alt={intl.formatMessage(messages.thumbnailAltMessage, { displayName })}\n />\n ) : (\n <div\n className=\"row justify-content-center align-items-center m-0 border rounded\"\n style={imageSize}\n >\n <Icon src={src} style={{ height: '48px', width: '48px' }} />\n </div>\n )}\n </div>\n );\n};\nFileThumbnail.defaultProps = {\n thumbnail: null,\n wrapperType: null,\n externalUrl: null,\n displayName: null,\n};\nFileThumbnail.propTypes = {\n thumbnail: PropTypes.string,\n wrapperType: PropTypes.string,\n externalUrl: PropTypes.string,\n displayName: PropTypes.string,\n imageSize: PropTypes.shape({\n width: PropTypes.string,\n height: PropTypes.string.isRequired,\n }).isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(FileThumbnail);\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport {\n injectIntl,\n FormattedMessage,\n FormattedDate,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport {\n Stack,\n IconButton,\n ActionRow,\n Icon,\n Truncate,\n IconButtonWithTooltip,\n CheckboxControl,\n} from '@openedx/paragon';\nimport { ContentCopy, InfoOutline } from '@openedx/paragon/icons';\n\nimport { getFileSizeToClosestByte } from '../../utils';\nimport messages from './messages';\n\nconst FileInfoModalSidebar = ({\n asset,\n handleLockedAsset,\n // injected\n intl,\n}) => {\n const [lockedState, setLockedState] = useState(asset?.locked);\n const handleLock = (e) => {\n const locked = e.target.checked;\n setLockedState(locked);\n handleLockedAsset(asset?.id, locked);\n };\n const fileSize = getFileSizeToClosestByte(asset?.fileSize);\n\n return (\n <Stack>\n <div className=\"font-weight-bold\">\n <FormattedMessage {...messages.dateAddedTitle} />\n </div>\n <FormattedDate\n value={asset?.dateAdded}\n year=\"numeric\"\n month=\"short\"\n day=\"2-digit\"\n hour=\"numeric\"\n minute=\"numeric\"\n />\n <div className=\"font-weight-bold mt-3\">\n <FormattedMessage {...messages.fileSizeTitle} />\n </div>\n {fileSize}\n <div className=\"font-weight-bold border-top mt-3 pt-3\">\n <FormattedMessage {...messages.studioUrlTitle} />\n </div>\n <ActionRow>\n <div style={{ wordBreak: 'break-word' }}>\n <Truncate lines={1}>\n {asset?.portableUrl}\n </Truncate>\n </div>\n <ActionRow.Spacer />\n <IconButton\n src={ContentCopy}\n iconAs={Icon}\n alt={messages.copyStudioUrlTitle.defaultMessage}\n onClick={() => navigator.clipboard.writeText(asset?.portableUrl)}\n />\n </ActionRow>\n <div className=\"font-weight-bold mt-3\">\n <FormattedMessage {...messages.webUrlTitle} />\n </div>\n <ActionRow>\n <div style={{ wordBreak: 'break-word' }}>\n <Truncate lines={1}>\n {asset?.externalUrl}\n </Truncate>\n </div>\n <ActionRow.Spacer />\n <IconButton\n src={ContentCopy}\n iconAs={Icon}\n alt={messages.copyWebUrlTitle.defaultMessage}\n onClick={() => navigator.clipboard.writeText(asset?.externalUrl)}\n />\n </ActionRow>\n <ActionRow className=\" border-top mt-3 pt-3\">\n <div className=\"font-weight-bold\">\n <FormattedMessage {...messages.lockFileTitle} />\n </div>\n <IconButtonWithTooltip\n key=\"lock-file-info\"\n tooltipPlacement=\"top\"\n tooltipContent={intl.formatMessage(messages.lockFileTooltipContent)}\n src={InfoOutline}\n iconAs={Icon}\n alt=\"Info\"\n size=\"inline\"\n />\n <ActionRow.Spacer />\n <CheckboxControl\n checked={lockedState}\n onChange={handleLock}\n aria-label=\"Checkbox\"\n />\n </ActionRow>\n </Stack>\n );\n};\nFileInfoModalSidebar.propTypes = {\n asset: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n wrapperType: PropTypes.string.isRequired,\n locked: PropTypes.bool.isRequired,\n externalUrl: PropTypes.string.isRequired,\n thumbnail: PropTypes.string,\n id: PropTypes.string.isRequired,\n portableUrl: PropTypes.string.isRequired,\n dateAdded: PropTypes.string.isRequired,\n fileSize: PropTypes.number.isRequired,\n usageLocations: PropTypes.arrayOf(PropTypes.string),\n }).isRequired,\n handleLockedAsset: PropTypes.func.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(FileInfoModalSidebar);\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\nimport { injectIntl, FormattedMessage, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n Button,\n ModalDialog,\n useToggle,\n} from '@openedx/paragon';\nimport { isEmpty } from 'lodash';\n\nimport messages from './messages';\n\nconst FileValidationModal = ({\n handleFileOverwrite,\n // injected\n intl,\n}) => {\n const [isOpen, open, close] = useToggle();\n\n const { duplicateFiles } = useSelector(state => state.assets);\n\n useEffect(() => {\n if (!isEmpty(duplicateFiles)) {\n open();\n }\n }, [duplicateFiles]);\n\n return (\n <ModalDialog\n title={intl.formatMessage(messages.overwriteModalTitle)}\n isOpen={isOpen}\n onClose={close}\n >\n <ModalDialog.Header>\n <ModalDialog.Title>\n <FormattedMessage {...messages.overwriteModalTitle} />\n </ModalDialog.Title>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <FormattedMessage {...messages.overwriteConfirmMessage} />\n <ul className=\"mt-2\">\n {Object.keys(duplicateFiles).map(file => <li>{file}</li>)}\n </ul>\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <ActionRow>\n <ModalDialog.CloseButton variant=\"tertiary\">\n <FormattedMessage {...messages.cancelOverwriteButtonLabel} />\n </ModalDialog.CloseButton>\n <Button onClick={() => handleFileOverwrite(close, duplicateFiles)}>\n <FormattedMessage {...messages.confirmOverwriteButtonLabel} />\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nFileValidationModal.propTypes = {\n handleFileOverwrite: PropTypes.func.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(FileValidationModal);\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { injectIntl, FormattedMessage, intlShape } from '@edx/frontend-platform/i18n';\nimport { CheckboxFilter, Container } from '@openedx/paragon';\nimport Placeholder from '@edx/frontend-lib-content-components';\n\nimport { RequestStatus } from '../../data/constants';\nimport { useModels, useModel } from '../../generic/model-store';\nimport {\n addAssetFile,\n deleteAssetFile,\n fetchAssets,\n updateAssetLock,\n fetchAssetDownload,\n getUsagePaths,\n resetErrors,\n updateAssetOrder,\n validateAssetFiles,\n} from './data/thunks';\nimport messages from './messages';\nimport FilesPageProvider from './FilesPageProvider';\nimport getPageHeadTitle from '../../generic/utils';\nimport {\n AccessColumn,\n ActiveColumn,\n EditFileErrors,\n FileTable,\n ThumbnailColumn,\n} from '../generic';\nimport { getFileSizeToClosestByte } from '../../utils';\nimport FileThumbnail from './FileThumbnail';\nimport FileInfoModalSidebar from './FileInfoModalSidebar';\nimport FileValidationModal from './FileValidationModal';\n\nconst FilesPage = ({\n courseId,\n // injected\n intl,\n}) => {\n const dispatch = useDispatch();\n const courseDetails = useModel('courseDetails', courseId);\n document.title = getPageHeadTitle(courseDetails?.name, intl.formatMessage(messages.heading));\n\n useEffect(() => {\n dispatch(fetchAssets(courseId));\n }, [courseId]);\n\n const {\n assetIds,\n loadingStatus,\n addingStatus: addAssetStatus,\n deletingStatus: deleteAssetStatus,\n updatingStatus: updateAssetStatus,\n usageStatus: usagePathStatus,\n errors: errorMessages,\n } = useSelector(state => state.assets);\n\n const handleErrorReset = (error) => dispatch(resetErrors(error));\n const handleDeleteFile = (id) => dispatch(deleteAssetFile(courseId, id));\n const handleDownloadFile = (selectedRows) => dispatch(fetchAssetDownload({ selectedRows, courseId }));\n const handleAddFile = (files) => {\n handleErrorReset({ errorType: 'add' });\n dispatch(validateAssetFiles(courseId, files));\n };\n const handleFileOverwrite = (close, files) => {\n Object.values(files).forEach(file => dispatch(addAssetFile(courseId, file, true)));\n close();\n };\n const handleLockFile = (fileId, locked) => {\n handleErrorReset({ errorType: 'lock' });\n dispatch(updateAssetLock({ courseId, assetId: fileId, locked }));\n };\n const handleUsagePaths = (asset) => dispatch(getUsagePaths({ asset, courseId }));\n const handleFileOrder = ({ newFileIdOrder, sortType }) => {\n dispatch(updateAssetOrder(courseId, newFileIdOrder, sortType));\n };\n\n const thumbnailPreview = (props) => FileThumbnail(props);\n const infoModalSidebar = (asset) => FileInfoModalSidebar({\n asset,\n handleLockedAsset: handleLockFile,\n });\n\n const assets = useModels('assets', assetIds);\n const data = {\n fileIds: assetIds,\n loadingStatus,\n usagePathStatus,\n usageErrorMessages: errorMessages.usageMetrics,\n fileType: 'file',\n };\n const maxFileSize = 20 * 1048576;\n\n const activeColumn = {\n id: 'activeStatus',\n Header: 'Active',\n accessor: 'activeStatus',\n Cell: ({ row }) => ActiveColumn({ row, pageLoadStatus: loadingStatus }),\n Filter: CheckboxFilter,\n filter: 'exactTextCase',\n filterChoices: [\n { name: intl.formatMessage(messages.activeCheckboxLabel), value: 'active' },\n { name: intl.formatMessage(messages.inactiveCheckboxLabel), value: 'inactive' },\n ],\n };\n const accessColumn = {\n id: 'lockStatus',\n Header: 'Access',\n accessor: 'lockStatus',\n Cell: ({ row }) => AccessColumn({ row }),\n Filter: CheckboxFilter,\n filterChoices: [\n { name: intl.formatMessage(messages.lockedCheckboxLabel), value: 'locked' },\n { name: intl.formatMessage(messages.publicCheckboxLabel), value: 'public' },\n ],\n };\n const thumbnailColumn = {\n id: 'thumbnail',\n Header: '',\n Cell: ({ row }) => ThumbnailColumn({ row, thumbnailPreview }),\n };\n const fileSizeColumn = {\n id: 'fileSize',\n Header: 'File size',\n accessor: 'fileSize',\n Cell: ({ row }) => {\n const { fileSize } = row.original;\n return getFileSizeToClosestByte(fileSize);\n },\n };\n\n const tableColumns = [\n { ...thumbnailColumn },\n {\n Header: 'File name',\n accessor: 'displayName',\n },\n { ...fileSizeColumn },\n {\n Header: 'Type',\n accessor: 'wrapperType',\n Filter: CheckboxFilter,\n filter: 'includesValue',\n filterChoices: [\n {\n name: intl.formatMessage(messages.codeCheckboxLabel),\n value: 'code',\n },\n {\n name: intl.formatMessage(messages.imageCheckboxLabel),\n value: 'image',\n },\n {\n name: intl.formatMessage(messages.documentCheckboxLabel),\n value: 'document',\n },\n {\n name: intl.formatMessage(messages.audioCheckboxLabel),\n value: 'audio',\n },\n {\n name: intl.formatMessage(messages.otherCheckboxLabel),\n value: 'other',\n },\n ],\n },\n { ...activeColumn },\n { ...accessColumn },\n ];\n\n if (loadingStatus === RequestStatus.DENIED) {\n return (\n <div data-testid=\"under-construction-placeholder\" className=\"row justify-contnt-center m-6\">\n <Placeholder />\n </div>\n );\n }\n\n return (\n <FilesPageProvider courseId={courseId}>\n <Container size=\"xl\" className=\"p-4 pt-4.5\">\n <EditFileErrors\n resetErrors={handleErrorReset}\n errorMessages={errorMessages}\n addFileStatus={addAssetStatus}\n deleteFileStatus={deleteAssetStatus}\n updateFileStatus={updateAssetStatus}\n loadingStatus={loadingStatus}\n />\n <div className=\"h2\">\n <FormattedMessage {...messages.heading} />\n </div>\n {loadingStatus !== RequestStatus.FAILED && (\n <>\n <FileTable\n {...{\n courseId,\n data,\n handleAddFile,\n handleDeleteFile,\n handleDownloadFile,\n handleLockFile,\n handleUsagePaths,\n handleErrorReset,\n handleFileOrder,\n tableColumns,\n maxFileSize,\n thumbnailPreview,\n infoModalSidebar,\n files: assets,\n }}\n />\n <FileValidationModal {...{ handleFileOverwrite }} />\n </>\n )}\n </Container>\n </FilesPageProvider>\n );\n};\n\nFilesPage.propTypes = {\n courseId: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(FilesPage);\n","import FilesPage from './FilesPage';\nimport FileInfoModalSidebar from './FileInfoModalSidebar';\n\nexport default FilesPage;\nexport { FileInfoModalSidebar };\n","import React from 'react';\nimport { Dropdown, Form, Icon } from '@openedx/paragon';\nimport PropTypes from 'prop-types';\nimport { Check } from '@openedx/paragon/icons';\nimport { isArray, isEmpty } from 'lodash';\n\nconst FormDropdown = ({\n value,\n allowMultiple,\n options,\n handleSelect,\n placeholderText,\n}) => {\n let currentSelection;\n if (isEmpty(value)) {\n currentSelection = placeholderText;\n } else {\n currentSelection = isArray(value) && value.length > 1 ? 'Multiple' : options[value];\n }\n\n return (\n <Dropdown\n autoClose={allowMultiple ? 'outside' : true}\n >\n <Dropdown.Toggle\n variant=\"teritary\"\n className=\"border border-gray-700 justify-content-between w-100\"\n id=\"transcript-form-dropdown\"\n >\n <span className=\"mw-100\" style={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {currentSelection}\n </span>\n </Dropdown.Toggle>\n <Dropdown.Menu className=\"m-0\" style={{ maxHeight: '300px', overflowY: 'scroll' }}>\n {Object.entries(options).map(([valueKey, text]) => {\n if (allowMultiple) {\n return (\n <Dropdown.Item as={Form.Checkbox} checked={value.includes(valueKey)} onChange={(e) => handleSelect([valueKey, e.target.checked])} key={`${valueKey}-item`}>\n {text}\n </Dropdown.Item>\n );\n }\n if (valueKey === value) {\n return (\n <Dropdown.Item key={`${valueKey}-item`}>\n <Icon size=\"inline\" src={Check} className=\"m-n2\" /><span className=\"pl-3\">{text}</span>\n </Dropdown.Item>\n );\n }\n return (\n <Dropdown.Item onClick={() => handleSelect(valueKey)} key={`${valueKey}-item`}>\n <span className=\"pl-3\">{text}</span>\n </Dropdown.Item>\n );\n })}\n </Dropdown.Menu>\n </Dropdown>\n );\n};\n\nFormDropdown.propTypes = {\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]).isRequired,\n allowMultiple: PropTypes.bool,\n options: PropTypes.shape({}).isRequired,\n handleSelect: PropTypes.func.isRequired,\n placeholderText: PropTypes.string.isRequired,\n};\n\nFormDropdown.defaultProps = {\n allowMultiple: false,\n};\n\nexport default FormDropdown;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n transcriptSettingsTitle: {\n id: 'course-authoring.video-uploads.transcriptSettings.title',\n defaultMessage: 'Transcript settings',\n description: 'Title for transcript settings sheet',\n },\n invalidCielo24TranscriptionPlanMessage: {\n id: 'course-authoring.video-uploads.transcriptSettings.cielo24.errorAlert.message',\n defaultMessage: 'No transcription plans found for Cielo24.',\n },\n invalid3PlayMediaTranscriptionPlanMessage: {\n id: 'course-authoring.video-uploads.transcriptSettings.3PlayMedia.errorAlert.message',\n defaultMessage: 'No transcription plans found for 3PlayMedia.',\n },\n errorAlertMessage: {\n id: 'course-authoring.video-uploads.transcriptSettings.errorAlert.message',\n defaultMessage: '{message}',\n },\n orderTranscriptsTitle: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.title',\n defaultMessage: 'Order transcripts',\n description: 'Title for order transcript collapsible',\n },\n noneLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.none.label',\n defaultMessage: 'None',\n description: 'Label for order transcript None option',\n },\n cieloLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.label',\n defaultMessage: 'Cielo24',\n description: 'Label for order transcript Cieol24 option',\n },\n threePlayMediaLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.label',\n defaultMessage: '3Play Media',\n description: 'Label for order transcript 3Play Media option',\n },\n updateSettingsLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.updateSettings.label',\n defaultMessage: 'Update settings',\n description: 'Label for order transcript update settings button',\n },\n discardSettingsLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.discardSettings.label',\n defaultMessage: 'Discard changes',\n description: 'Label for order transcript discard settings button',\n },\n lastUpdatedMessage: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.lastUpdated.message',\n defaultMessage: 'Last updated',\n description: 'Message that lets user know when the update was made to transcript settings',\n },\n threePlayMediaTurnaroundLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.turnaround.label',\n defaultMessage: 'Transcript turnaround',\n description: 'Label for 3Play Media transcript turnaround dropdown',\n },\n threePlayMediaTurnaroundPlaceholder: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.turnaround.dropdown.placeholder',\n defaultMessage: 'Select turnaround',\n description: 'Label for 3Play Media transcript turnaround dropdown placeholder',\n },\n threePlayMediaSourceLanguageLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.sourceLanguage.label',\n defaultMessage: 'Video source language',\n description: 'Label for 3Play Media video source language dropdown',\n },\n threePlayMediaSourceLanguagePlaceholder: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.sourceLanguage.dropdown.placeholder',\n defaultMessage: 'Select language',\n description: 'Label for 3Play Media video source language dropdown placeholder',\n },\n threePlayMediaTranscriptLanguageLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.transcriptLanguage.label',\n defaultMessage: 'Transcript language',\n description: 'Label for 3Play Media video source language dropdown',\n },\n threePlayMediaTranscriptLanguagePlaceholder: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.transcriptLanguage.dropdown.placeholder',\n defaultMessage: 'Select language(s)',\n description: 'Label for 3Play Media transcript language dropdown placeholder',\n },\n threePlayMediaCredentialMessage: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.credential.message',\n defaultMessage: 'Enter the account information for your organization.',\n description: 'Message for 3Play Media credential view',\n },\n threePlayMediaApiKeyLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.apiKey.label',\n defaultMessage: 'API key',\n description: 'Label for 3Play Media API key input',\n },\n threePlayMediaApiSecretLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.3PlayMedia.apiSecret.label',\n defaultMessage: 'API secret',\n description: 'Label for 3Play Media API secret input',\n },\n cieloTurnaroundLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.turnaround.label',\n defaultMessage: 'Transcript turnaround',\n description: 'Label for Cielo24 transcript turnaround dropdown',\n },\n cieloTurnaroundPlaceholder: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.turnaround.dropdown.placeholder',\n defaultMessage: 'Select turnaround',\n description: 'Label for Cielo24 transcript turnaround dropdown placeholder',\n },\n cieloFidelityLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.fidelity.label',\n defaultMessage: 'Transcript fidelity',\n description: 'Label for Cielo24 transcript fidelity dropdown',\n },\n cieloFidelityPlaceholder: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.fidelity.dropdown.placeholder',\n defaultMessage: 'Select fidelity',\n description: 'Label for Cielo24 transcript fidelity dropdown placeholder',\n },\n cieloSourceLanguageLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.sourceLanguage.label',\n defaultMessage: 'Video source language',\n description: 'Label for Cielo24 video source language dropdown',\n },\n cieloSourceLanguagePlaceholder: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.sourceLanguage.dropdown.placeholder',\n defaultMessage: 'Select language',\n description: 'Label for Cielo24 video source language dropdown placeholder',\n },\n cieloTranscriptLanguageLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.transcriptLanguage.label',\n defaultMessage: 'Transcript language',\n description: 'Label for Cielo24 video source language dropdown',\n },\n cieloTranscriptLanguagePlaceholder: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.transcriptLanguage.dropdown.placeholder',\n defaultMessage: 'Select language',\n description: 'Label for Cielo24 transcript language dropdown placeholder',\n },\n cieloCredentialMessage: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.credential.message',\n defaultMessage: 'Enter the account information for your organization.',\n description: 'Message for Cielo24 credential view',\n },\n cieloApiKeyLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.apiKey.label',\n defaultMessage: 'API key',\n description: 'Label for Cielo24 API key input',\n },\n cieloUsernameLabel: {\n id: 'course-authoring.video-uploads.transcriptSettings.orderTranscripts.cielo24.username.label',\n defaultMessage: 'Username',\n description: 'Label for Cielo24 username input',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmpty } from 'lodash';\nimport { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Form, Stack, TransitionReplace } from '@openedx/paragon';\nimport FormDropdown from './FormDropdown';\nimport { getFidelityOptions } from '../data/utils';\nimport messages from './messages';\n\nconst Cielo24Form = ({\n hasTranscriptCredentials,\n data,\n setData,\n transcriptionPlan,\n // injected\n intl,\n}) => {\n if (hasTranscriptCredentials) {\n const { fidelity } = transcriptionPlan;\n const selectedLanguage = data.preferredLanguages ? data.preferredLanguages : '';\n const turnaroundOptions = transcriptionPlan.turnaround;\n const fidelityOptions = getFidelityOptions(fidelity);\n const sourceLanguageOptions = data.cielo24Fidelity ? fidelity[data.cielo24Fidelity]?.languages : {};\n const languages = data.cielo24Fidelity === 'PROFESSIONAL' ? sourceLanguageOptions : {\n [data.videoSourceLanguage]: sourceLanguageOptions[data.videoSourceLanguage],\n };\n return (\n <Stack gap={1}>\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.cieloTurnaroundLabel} />\n </Form.Label>\n <FormDropdown\n value={data.cielo24Turnaround}\n options={turnaroundOptions}\n handleSelect={(value) => setData({ ...data, cielo24Turnaround: value })}\n placeholderText={intl.formatMessage(messages.cieloTurnaroundPlaceholder)}\n />\n </Form.Group>\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.cieloFidelityLabel} />\n </Form.Label>\n <FormDropdown\n value={data.cielo24Fidelity}\n options={fidelityOptions}\n handleSelect={(value) => setData({ ...data, cielo24Fidelity: value, videoSourceLanguage: '' })}\n placeholderText={intl.formatMessage(messages.cieloFidelityPlaceholder)}\n />\n </Form.Group>\n <TransitionReplace>\n {isEmpty(data.cielo24Fidelity) ? null : (\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.cieloSourceLanguageLabel} />\n </Form.Label>\n <FormDropdown\n value={data.videoSourceLanguage}\n options={sourceLanguageOptions}\n handleSelect={(value) => setData({ ...data, videoSourceLanguage: value, preferredLanguages: [] })}\n placeholderText={intl.formatMessage(messages.cieloSourceLanguagePlaceholder)}\n />\n </Form.Group>\n )}\n </TransitionReplace>\n <TransitionReplace>\n {isEmpty(data.videoSourceLanguage) ? null : (\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.cieloTranscriptLanguageLabel} />\n </Form.Label>\n <FormDropdown\n value={selectedLanguage}\n options={languages}\n handleSelect={(value) => setData({ ...data, preferredLanguages: [value] })}\n placeholderText={intl.formatMessage(messages.cieloTranscriptLanguagePlaceholder)}\n />\n </Form.Group>\n )}\n </TransitionReplace>\n </Stack>\n );\n }\n\n return (\n <Stack gap={1}>\n <div className=\"small\" data-testid=\"cieloCredentialMessage\">\n <FormattedMessage {...messages.cieloCredentialMessage} />\n </div>\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.cieloApiKeyLabel} />\n </Form.Label>\n <Form.Control onBlur={(e) => setData({ ...data, apiKey: e.target.value })} />\n </Form.Group>\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.cieloUsernameLabel} />\n </Form.Label>\n <Form.Control onBlur={(e) => setData({ ...data, username: e.target.value })} />\n </Form.Group>\n </Stack>\n );\n};\n\nCielo24Form.propTypes = {\n hasTranscriptCredentials: PropTypes.bool.isRequired,\n data: PropTypes.shape({\n apiKey: PropTypes.string,\n apiSecretKey: PropTypes.string,\n cielo24Turnaround: PropTypes.string,\n cielo24Fidelity: PropTypes.string,\n preferredLanguages: PropTypes.arrayOf(PropTypes.string),\n videoSourceLanguage: PropTypes.string,\n }).isRequired,\n setData: PropTypes.func.isRequired,\n transcriptionPlan: PropTypes.shape({\n turnaround: PropTypes.shape({}),\n fidelity: PropTypes.shape({}),\n }).isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(Cielo24Form);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmpty } from 'lodash';\nimport { injectIntl, FormattedMessage, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Form,\n Icon,\n Stack,\n TransitionReplace,\n} from '@openedx/paragon';\nimport { Check } from '@openedx/paragon/icons';\nimport FormDropdown from './FormDropdown';\nimport { getLanguageOptions } from '../data/utils';\nimport messages from './messages';\n\nconst ThreePlayMediaForm = ({\n hasTranscriptCredentials,\n data,\n setData,\n transcriptionPlan,\n // injected\n intl,\n}) => {\n if (hasTranscriptCredentials) {\n const selectedLanguages = data.preferredLanguages ? data.preferredLanguages : [];\n const turnaroundOptions = transcriptionPlan.turnaround;\n const sourceLangaugeOptions = getLanguageOptions(\n Object.keys(transcriptionPlan.translations),\n transcriptionPlan.languages,\n );\n const languages = getLanguageOptions(\n transcriptionPlan.translations[data.videoSourceLanguage],\n transcriptionPlan.languages,\n );\n const allowMultiple = Object.keys(languages).length > 1;\n return (\n <Stack gap={1}>\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.threePlayMediaTurnaroundLabel} />\n </Form.Label>\n <FormDropdown\n value={data.threePlayTurnaround}\n options={turnaroundOptions}\n handleSelect={(value) => setData({ ...data, threePlayTurnaround: value })}\n placeholderText={intl.formatMessage(messages.threePlayMediaTurnaroundPlaceholder)}\n />\n </Form.Group>\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.threePlayMediaSourceLanguageLabel} />\n </Form.Label>\n <FormDropdown\n value={data.videoSourceLanguage}\n options={sourceLangaugeOptions}\n handleSelect={(value) => setData({ ...data, videoSourceLanguage: value, preferredLanguages: [] })}\n placeholderText={intl.formatMessage(messages.threePlayMediaSourceLanguagePlaceholder)}\n />\n </Form.Group>\n <TransitionReplace>\n {!isEmpty(data.videoSourceLanguage) ? (\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.threePlayMediaTranscriptLanguageLabel} />\n </Form.Label>\n <FormDropdown\n value={selectedLanguages}\n options={languages}\n allowMultiple={allowMultiple}\n handleSelect={(value) => {\n if (!allowMultiple) {\n setData({ ...data, preferredLanguages: [value] });\n } else {\n const [lang, checked] = value;\n if (checked) {\n setData({ ...data, preferredLanguages: [...selectedLanguages, lang] });\n } else {\n const updatedLangList = selectedLanguages.filter((selected) => selected !== lang);\n setData({ ...data, preferredLanguages: updatedLangList });\n }\n }\n }}\n placeholderText={intl.formatMessage(messages.threePlayMediaTranscriptLanguagePlaceholder)}\n />\n <Form.Control.Feedback>\n <ul className=\"m-0 p-0\">\n {selectedLanguages.map(language => (\n <li className=\"row align-items-center m-0 pt-2\" key={language}>\n <Icon src={Check} size=\"xs\" /> <span>{languages[language]}</span>\n </li>\n ))}\n </ul>\n </Form.Control.Feedback>\n </Form.Group>\n ) : null }\n </TransitionReplace>\n </Stack>\n );\n }\n return (\n <Stack gap={1}>\n <div className=\"small\" data-testid=\"threePlayMediaCredentialMessage\">\n <FormattedMessage {...messages.threePlayMediaCredentialMessage} />\n </div>\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.threePlayMediaApiKeyLabel} />\n </Form.Label>\n <Form.Control onBlur={(e) => setData({ ...data, apiKey: e.target.value })} />\n </Form.Group>\n <Form.Group size=\"sm\">\n <Form.Label className=\"h5\">\n <FormattedMessage {...messages.threePlayMediaApiSecretLabel} />\n </Form.Label>\n <Form.Control onBlur={(e) => setData({ ...data, apiSecretKey: e.target.value })} />\n </Form.Group>\n </Stack>\n );\n};\n\nThreePlayMediaForm.propTypes = {\n hasTranscriptCredentials: PropTypes.bool.isRequired,\n data: PropTypes.shape({\n apiKey: PropTypes.string,\n apiSecretKey: PropTypes.string,\n threePlayTurnaround: PropTypes.string,\n preferredLanguages: PropTypes.arrayOf(PropTypes.string),\n videoSourceLanguage: PropTypes.string,\n }).isRequired,\n setData: PropTypes.func.isRequired,\n transcriptionPlan: PropTypes.shape({\n turnaround: PropTypes.shape({}),\n translations: PropTypes.shape({}),\n languages: PropTypes.shape({}),\n }).isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(ThreePlayMediaForm);\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n FormattedMessage,\n FormattedDate,\n injectIntl,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport { Button, Stack } from '@openedx/paragon';\nimport { ErrorAlert, SelectableBox } from '@edx/frontend-lib-content-components';\nimport Cielo24Form from './Cielo24Form';\nimport ThreePlayMediaForm from './ThreePlayMediaForm';\nimport { RequestStatus } from '../../../data/constants';\nimport messages from './messages';\nimport { checkCredentials, checkTranscriptionPlans, validateForm } from '../data/utils';\n\nconst OrderTranscriptForm = ({\n setTranscriptType,\n activeTranscriptPreferences,\n transcriptType,\n transcriptCredentials,\n closeTranscriptSettings,\n handleOrderTranscripts,\n transcriptionPlans,\n errorMessages,\n transcriptStatus,\n // injected\n intl,\n}) => {\n const [data, setData] = useState(activeTranscriptPreferences || { videoSourceLanguage: '' });\n\n const [validCieloTranscriptionPlan, validThreePlayTranscriptionPlan] = checkTranscriptionPlans(transcriptionPlans);\n useEffect(() => {\n setTranscriptType(activeTranscriptPreferences?.provider || 'order');\n }, []);\n\n let [cieloHasCredentials, threePlayHasCredentials] = checkCredentials(transcriptCredentials);\n useEffect(() => {\n [cieloHasCredentials, threePlayHasCredentials] = checkCredentials(transcriptCredentials);\n }, [transcriptCredentials]);\n\n let isFormValid = validateForm(cieloHasCredentials, threePlayHasCredentials, transcriptType, data);\n useEffect(() => {\n isFormValid = validateForm(cieloHasCredentials, threePlayHasCredentials, transcriptType, data);\n }, [data]);\n\n const handleDiscard = () => {\n setTranscriptType(activeTranscriptPreferences?.provider);\n closeTranscriptSettings();\n };\n\n const handleUpdate = () => handleOrderTranscripts(data, transcriptType);\n\n let form;\n switch (transcriptType) {\n case 'Cielo24':\n form = (\n <Cielo24Form\n {...{\n hasTranscriptCredentials: cieloHasCredentials,\n data,\n setData,\n transcriptionPlan: transcriptionPlans.Cielo24,\n }}\n />\n );\n break;\n case '3PlayMedia':\n form = (\n <ThreePlayMediaForm\n {...{\n hasTranscriptCredentials: threePlayHasCredentials,\n data,\n setData,\n transcriptionPlan: transcriptionPlans['3PlayMedia'],\n }}\n />\n );\n break;\n default:\n break;\n }\n return (\n <>\n <ErrorAlert\n hideHeading={false}\n isError={!validCieloTranscriptionPlan && cieloHasCredentials}\n >\n <FormattedMessage {...messages.invalidCielo24TranscriptionPlanMessage} />\n </ErrorAlert>\n <ErrorAlert\n hideHeading={false}\n isError={!validThreePlayTranscriptionPlan && threePlayHasCredentials}\n >\n <FormattedMessage {...messages.invalid3PlayMediaTranscriptionPlanMessage} />\n </ErrorAlert>\n <ErrorAlert\n hideHeading={false}\n isError={transcriptStatus === RequestStatus.FAILED}\n >\n <ul className=\"p-0\">\n {errorMessages.transcript.map(message => (\n <li key={`order-transcript-error-${message}`} style={{ listStyle: 'none' }}>\n {intl.formatMessage(messages.errorAlertMessage, { message })}\n </li>\n ))}\n </ul>\n </ErrorAlert>\n <SelectableBox.Set\n columns={1}\n value={transcriptType}\n name=\"transcriptProviders\"\n ariaLabel=\"provider selection\"\n className=\"my-3\"\n onChange={(e) => {\n setTranscriptType(e.target.value);\n }}\n >\n <SelectableBox\n value=\"order\"\n aria-label=\"none radio\"\n className=\"text-center\"\n >\n <FormattedMessage {...messages.noneLabel} />\n </SelectableBox>\n <SelectableBox\n value=\"Cielo24\"\n aria-label=\"Cielo24 radio\"\n className=\"text-center\"\n disabled={!validCieloTranscriptionPlan && cieloHasCredentials}\n >\n <FormattedMessage {...messages.cieloLabel} />\n </SelectableBox>\n <SelectableBox\n value=\"3PlayMedia\"\n aria-label=\"3PlayMedia radio\"\n className=\"text-center\"\n disabled={!validThreePlayTranscriptionPlan && threePlayHasCredentials}\n >\n <FormattedMessage {...messages.threePlayMediaLabel} />\n </SelectableBox>\n </SelectableBox.Set>\n {form}\n <Stack gap={3} className=\"mt-4\">\n <Button onClick={handleUpdate} disabled={!isFormValid}>\n <FormattedMessage {...messages.updateSettingsLabel} />\n </Button>\n <Button variant=\"tertiary\" onClick={handleDiscard}>\n <FormattedMessage {...messages.discardSettingsLabel} />\n </Button>\n {activeTranscriptPreferences?.modified && (\n <div className=\"row m-0 x-small\">\n <div className=\"mr-1\">\n <FormattedMessage {...messages.lastUpdatedMessage} />\n </div>\n <FormattedDate\n value={data.modified}\n year=\"numeric\"\n month=\"long\"\n day=\"2-digit\"\n />\n </div>\n )}\n </Stack>\n </>\n );\n};\n\nOrderTranscriptForm.propTypes = {\n setTranscriptType: PropTypes.func.isRequired,\n activeTranscriptPreferences: PropTypes.shape({\n provider: PropTypes.string.isRequired,\n cielo24Turnaround: PropTypes.string,\n cielo24Fidelity: PropTypes.string,\n preferredLanguages: PropTypes.arrayOf(PropTypes.string),\n turnaround: PropTypes.string,\n videoSourceLanguage: PropTypes.string,\n modified: PropTypes.instanceOf(Date),\n }),\n transcriptType: PropTypes.string.isRequired,\n transcriptCredentials: PropTypes.shape({\n cielo24: PropTypes.bool.isRequired,\n '3PlayMedia': PropTypes.bool.isRequired,\n }).isRequired,\n closeTranscriptSettings: PropTypes.func.isRequired,\n transcriptStatus: PropTypes.string.isRequired,\n errorMessages: PropTypes.shape({\n transcript: PropTypes.arrayOf(PropTypes.string).isRequired,\n }).isRequired,\n handleOrderTranscripts: PropTypes.func.isRequired,\n transcriptionPlans: PropTypes.shape({\n Cielo24: PropTypes.shape({\n turnaround: PropTypes.shape({}),\n fidelity: PropTypes.shape({}),\n }).isRequired,\n '3PlayMedia': PropTypes.shape({\n turnaround: PropTypes.shape({}),\n translations: PropTypes.shape({}),\n languages: PropTypes.shape({}),\n }).isRequired,\n }).isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nOrderTranscriptForm.defaultProps = {\n activeTranscriptPreferences: null,\n};\n\nexport default injectIntl(OrderTranscriptForm);\n","import saveAs from 'file-saver';\nimport { camelCaseObject, ensureConfig, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nimport { isEmpty } from 'lodash';\n\nensureConfig([\n 'STUDIO_BASE_URL',\n], 'Course Apps API service');\n\nexport const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getVideosUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/videos/${courseId}`;\nexport const getCourseVideosApiUrl = (courseId) => `${getApiBaseUrl()}/videos/${courseId}`;\n\n/**\n * Fetches the course custom pages for provided course\n * @param {string} courseId\n * @returns {Promise<[{}]>}\n */\nexport async function getVideos(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getVideosUrl(courseId));\n const { video_transcript_settings: videoTranscriptSettings } = data;\n const { transcription_plans: transcriptionPlans } = videoTranscriptSettings;\n return {\n ...camelCaseObject(data),\n videoTranscriptSettings: {\n ...camelCaseObject(videoTranscriptSettings),\n transcriptionPlans,\n },\n };\n}\n\nexport async function getAllUsagePaths({ courseId, videoIds }) {\n const apiPromises = videoIds.map(id => getAuthenticatedHttpClient()\n .get(`${getVideosUrl(courseId)}/${id}/usage`, { videoId: id }));\n const updatedUsageLocations = [];\n const results = await Promise.allSettled(apiPromises);\n\n results.forEach(result => {\n const value = camelCaseObject(result.value);\n if (value) {\n const { usageLocations } = value.data;\n const activeStatus = usageLocations?.length > 0 ? 'active' : 'inactive';\n const { videoId } = value.config;\n updatedUsageLocations.push({ id: videoId, usageLocations, activeStatus });\n }\n });\n return updatedUsageLocations;\n}\n\n/**\n * Fetches the course custom pages for provided course\n * @param {string} courseId\n * @returns {Promise<[{}]>}\n */\nexport async function fetchVideoList(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseVideosApiUrl(courseId));\n return camelCaseObject(data);\n}\n\nexport async function deleteTranscript({ videoId, language, apiUrl }) {\n await getAuthenticatedHttpClient()\n .delete(`${getApiBaseUrl()}${apiUrl}/${videoId}/${language}`);\n}\n\nexport async function downloadTranscript({\n videoId,\n language,\n apiUrl,\n filename,\n}) {\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getApiBaseUrl()}${apiUrl}?edx_video_id=${videoId}&language_code=${language}`);\n const file = new Blob([data], { type: 'text/plain;charset=utf-8' });\n saveAs(file, filename);\n}\n\nexport async function uploadTranscript({\n videoId,\n newLanguage,\n apiUrl,\n file,\n language,\n}) {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('edx_video_id', videoId);\n formData.append('language_code', language);\n formData.append('new_language_code', newLanguage);\n await getAuthenticatedHttpClient().post(`${getApiBaseUrl()}${apiUrl}`, formData);\n}\n\nexport async function getDownload(selectedRows, courseId) {\n const downloadErrors = [];\n let file;\n let filename;\n if (selectedRows?.length > 1) {\n const downloadLinks = selectedRows.map(row => {\n const video = row.original;\n try {\n const url = video.downloadLink;\n const name = video.displayName;\n return { url, name };\n } catch (error) {\n downloadErrors.push(`Cannot find download file for ${video?.displayName || 'video'}.`);\n return null;\n }\n });\n if (!isEmpty(downloadLinks)) {\n const json = { files: downloadLinks };\n const { data } = await getAuthenticatedHttpClient()\n .put(`${getVideosUrl(courseId)}/download`, json, { responseType: 'arraybuffer' });\n\n const date = new Date().toString();\n filename = `${courseId}-videos-${date}`;\n file = new Blob([data], { type: 'application/zip' });\n saveAs(file, filename);\n }\n } else if (selectedRows?.length === 1) {\n try {\n const video = selectedRows[0].original;\n const { downloadLink } = video;\n if (!isEmpty(downloadLink)) {\n saveAs(downloadLink, video.displayName);\n } else {\n downloadErrors.push(`Cannot find download file for ${video?.displayName}.`);\n }\n } catch (error) {\n downloadErrors.push('Failed to download video.');\n }\n } else {\n downloadErrors.push('No files were selected to download.');\n }\n\n return downloadErrors;\n}\n\n/**\n * Fetch where a video is used in a course.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function getVideoUsagePaths({ courseId, videoId }) {\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getVideosUrl(courseId)}/${videoId}/usage`);\n return camelCaseObject(data);\n}\n\n/**\n * Delete video from course.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function deleteVideo(courseId, videoId) {\n await getAuthenticatedHttpClient()\n .delete(`${getCourseVideosApiUrl(courseId)}/${videoId}`);\n}\n\n/**\n * Add thumbnail to video.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function addThumbnail({ courseId, videoId, file }) {\n const formData = new FormData();\n formData.append('file', file);\n const { data } = await getAuthenticatedHttpClient()\n .post(`${getApiBaseUrl()}/video_images/${courseId}/${videoId}`, formData);\n return camelCaseObject(data);\n}\n\n/**\n * Add video to course.\n * @param {blockId} courseId Course ID for the course to operate on\n\n */\nexport async function addVideo(courseId, file) {\n const postJson = {\n files: [{ file_name: file.name, content_type: file.type }],\n };\n return getAuthenticatedHttpClient().post(getCourseVideosApiUrl(courseId), postJson);\n}\n\nexport async function sendVideoUploadStatus(\n courseId,\n edxVideoId,\n message,\n status,\n) {\n return getAuthenticatedHttpClient()\n .post(getCourseVideosApiUrl(courseId), [{\n edxVideoId,\n message,\n status,\n }]);\n}\n\nexport async function uploadVideo(\n uploadUrl,\n uploadFile,\n) {\n return fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Content-Disposition': `attachment; filename=\"${uploadFile.name}\"`,\n 'Content-Type': uploadFile.type,\n 'Content-Length': uploadFile.size,\n },\n multipart: false,\n body: uploadFile,\n });\n}\n\nexport async function deleteTranscriptPreferences(courseId) {\n await getAuthenticatedHttpClient().delete(`${getApiBaseUrl()}/transcript_preferences/${courseId}`);\n}\n\nexport async function setTranscriptPreferences(courseId, preferences) {\n const {\n cielo24Fidelity,\n cielo24Turnaround,\n global,\n preferredLanguages,\n provider,\n threePlayTurnaround,\n videoSourceLanguage,\n } = preferences;\n const postJson = {\n cielo24_fidelity: cielo24Fidelity?.toUpperCase(),\n cielo24_turnaround: cielo24Turnaround,\n global,\n preferred_languages: preferredLanguages,\n provider,\n video_source_language: videoSourceLanguage,\n three_play_turnaround: threePlayTurnaround,\n };\n\n const { data } = await getAuthenticatedHttpClient()\n .post(`${getApiBaseUrl()}/transcript_preferences/${courseId}`, postJson);\n return camelCaseObject(data);\n}\n\nexport async function setTranscriptCredentials(courseId, formFields) {\n const {\n apiKey,\n global,\n provider,\n ...otherFields\n } = formFields;\n const postJson = {\n api_key: apiKey,\n global,\n provider,\n };\n\n if (provider === '3PlayMedia') {\n const { apiSecretKey } = otherFields;\n postJson.api_secret_key = apiSecretKey;\n } else {\n const { username } = otherFields;\n postJson.username = username;\n }\n await getAuthenticatedHttpClient()\n .post(`${getApiBaseUrl()}/transcript_credentials/${courseId}`, postJson);\n}\n","export class ServerError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.statusCode = statusCode;\n this.name = this.constructor.name;\n }\n}\nexport default { ServerError };\n","/* eslint-disable no-param-reassign */\nimport { camelCase, isEmpty } from 'lodash';\nimport { getConfig, camelCaseObject } from '@edx/frontend-platform';\nimport { RequestStatus } from '../../../data/constants';\nimport {\n addModels,\n removeModel,\n updateModel,\n updateModels,\n} from '../../../generic/model-store';\nimport {\n addThumbnail,\n addVideo,\n deleteVideo,\n fetchVideoList,\n getVideos,\n uploadVideo,\n getDownload,\n deleteTranscript,\n downloadTranscript,\n uploadTranscript,\n getVideoUsagePaths,\n deleteTranscriptPreferences,\n sendVideoUploadStatus,\n setTranscriptCredentials,\n setTranscriptPreferences,\n getAllUsagePaths,\n} from './api';\nimport {\n setVideoIds,\n setPageSettings,\n updateLoadingStatus,\n deleteVideoSuccess,\n updateErrors,\n clearErrors,\n updateEditStatus,\n updateTranscriptCredentialsSuccess,\n updateTranscriptPreferenceSuccess,\n failAddVideo,\n} from './slice';\nimport { ServerError } from './errors';\n\nimport { updateFileValues } from './utils';\n\nexport function fetchVideos(courseId) {\n return async (dispatch) => {\n dispatch(\n updateLoadingStatus({ courseId, status: RequestStatus.IN_PROGRESS }),\n );\n try {\n const { previousUploads, ...data } = await getVideos(courseId);\n dispatch(setPageSettings({ ...data }));\n // Previous uploads are the current videos associated with a course.\n // If previous uploads are empty there is no need to add an empty model\n // or loop through and empty list so automatically set loading to successful\n if (isEmpty(previousUploads)) {\n dispatch(\n updateLoadingStatus({ courseId, status: RequestStatus.SUCCESSFUL }),\n );\n } else {\n const parsedVideos = updateFileValues(previousUploads);\n const videoIds = parsedVideos.map((video) => video.id);\n dispatch(addModels({ modelType: 'videos', models: parsedVideos }));\n dispatch(setVideoIds({ videoIds }));\n dispatch(\n updateLoadingStatus({ courseId, status: RequestStatus.PARTIAL }),\n );\n const allUsageLocations = await getAllUsagePaths({\n courseId,\n videoIds,\n });\n dispatch(\n updateModels({ modelType: 'videos', models: allUsageLocations }),\n );\n dispatch(\n updateLoadingStatus({ courseId, status: RequestStatus.SUCCESSFUL }),\n );\n }\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateLoadingStatus({ status: RequestStatus.DENIED }));\n } else {\n dispatch(\n updateErrors({ error: 'loading', message: 'Failed to load videos' }),\n );\n dispatch(\n updateLoadingStatus({ courseId, status: RequestStatus.FAILED }),\n );\n }\n }\n };\n}\n\nexport function resetErrors({ errorType }) {\n return (dispatch) => {\n dispatch(clearErrors({ error: errorType }));\n };\n}\n\nexport function updateVideoOrder(courseId, videoIds) {\n return async (dispatch) => {\n dispatch(\n updateLoadingStatus({ courseId, status: RequestStatus.IN_PROGRESS }),\n );\n dispatch(setVideoIds({ videoIds }));\n dispatch(\n updateLoadingStatus({ courseId, status: RequestStatus.SUCCESSFUL }),\n );\n };\n}\n\nexport function deleteVideoFile(courseId, id) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'delete',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n try {\n await deleteVideo(courseId, id);\n dispatch(deleteVideoSuccess({ videoId: id }));\n dispatch(removeModel({ modelType: 'videos', id }));\n dispatch(\n updateEditStatus({\n editType: 'delete',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n } catch (error) {\n dispatch(\n updateErrors({\n error: 'delete',\n message: `Failed to delete file id ${id}.`,\n }),\n );\n dispatch(\n updateEditStatus({ editType: 'delete', status: RequestStatus.FAILED }),\n );\n }\n };\n}\n\nexport function markVideoUploadsInProgressAsFailed({ uploadingIdsRef, courseId }) {\n return (dispatch) => {\n uploadingIdsRef.current.forEach((edxVideoId) => {\n try {\n sendVideoUploadStatus(\n courseId,\n edxVideoId || '',\n 'Upload failed',\n 'upload_failed',\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to send \"Failed\" upload status for ${edxVideoId} onbeforeunload`);\n }\n dispatch(\n updateEditStatus({ editType: 'add', status: RequestStatus.FAILED }),\n );\n });\n // eslint-disable-next-line no-param-reassign\n uploadingIdsRef.current = [];\n };\n}\n\nexport function addVideoFile(\n courseId,\n file,\n videoIds,\n uploadingIdsRef,\n) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({ editType: 'add', status: RequestStatus.IN_PROGRESS }),\n );\n\n let edxVideoId;\n let uploadUrl;\n try {\n const createUrlResponse = await addVideo(courseId, file);\n // eslint-disable-next-line\n console.log(`Post Response: ${JSON.stringify(createUrlResponse)}`);\n if (createUrlResponse.status < 200 || createUrlResponse.status >= 300) {\n dispatch(failAddVideo({ fileName: file.name }));\n }\n // eslint-disable-next-line prefer-destructuring\n [{ edxVideoId, uploadUrl }] = camelCaseObject(\n createUrlResponse.data,\n ).files;\n } catch (error) {\n dispatch(failAddVideo({ fileName: file.name }));\n updateEditStatus({ editType: 'add', status: RequestStatus.FAILED });\n return;\n }\n try {\n uploadingIdsRef.current = [...uploadingIdsRef.current, edxVideoId];\n\n const putToServerResponse = await uploadVideo(uploadUrl, file);\n if (\n putToServerResponse.status < 200\n || putToServerResponse.status >= 300\n ) {\n throw new ServerError(\n 'Server responded with an error status',\n putToServerResponse.status,\n );\n } else {\n await sendVideoUploadStatus(\n courseId,\n edxVideoId,\n 'Upload completed',\n 'upload_completed',\n );\n }\n uploadingIdsRef.current = uploadingIdsRef.current.filter(\n (id) => id !== edxVideoId,\n );\n } catch (error) {\n if (error.response && error.response.status === 413) {\n const message = error.response.data.error;\n dispatch(updateErrors({ error: 'add', message }));\n } else {\n dispatch(\n updateErrors({\n error: 'add',\n message: `Failed to upload ${file.name}.`,\n }),\n );\n }\n await sendVideoUploadStatus(\n courseId,\n edxVideoId || '',\n 'Upload failed',\n 'upload_failed',\n );\n dispatch(\n updateEditStatus({ editType: 'add', status: RequestStatus.FAILED }),\n );\n uploadingIdsRef.current = uploadingIdsRef.current.filter(\n (id) => id !== edxVideoId,\n );\n // return;\n }\n try {\n const { videos } = await fetchVideoList(courseId);\n const newVideos = videos.filter(\n (video) => !videoIds.includes(video.edxVideoId),\n );\n const newVideoIds = newVideos.map((video) => video.edxVideoId);\n const parsedVideos = updateFileValues(newVideos, true);\n dispatch(addModels({ modelType: 'videos', models: parsedVideos }));\n dispatch(setVideoIds({ videoIds: newVideoIds.concat(videoIds) }));\n } catch (error) {\n dispatch(\n updateEditStatus({ editType: 'add', status: RequestStatus.FAILED }),\n );\n // eslint-disable-next-line\n console.error(`fetchVideoList failed with message: ${error.message}`);\n dispatch(\n updateErrors({ error: 'add', message: 'Failed to load videos' }),\n );\n return;\n }\n dispatch(\n updateEditStatus({ editType: 'add', status: RequestStatus.SUCCESSFUL }),\n );\n };\n}\n\nexport function addVideoThumbnail({ file, videoId, courseId }) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'thumbnail',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n dispatch(resetErrors({ errorType: 'thumbnail' }));\n try {\n const { imageUrl } = await addThumbnail({ courseId, videoId, file });\n let thumbnail = imageUrl;\n if (thumbnail.startsWith('/')) {\n thumbnail = `${getConfig().STUDIO_BASE_URL}${imageUrl}`;\n }\n dispatch(\n updateModel({\n modelType: 'videos',\n model: {\n id: videoId,\n thumbnail,\n },\n }),\n );\n dispatch(\n updateEditStatus({\n editType: 'thumbnail',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n } catch (error) {\n if (error.response?.data?.error) {\n const message = error.response.data.error;\n dispatch(updateErrors({ error: 'thumbnail', message }));\n } else {\n dispatch(\n updateErrors({\n error: 'thumbnail',\n message: `Failed to add thumbnail for video id ${videoId}.`,\n }),\n );\n }\n dispatch(\n updateEditStatus({\n editType: 'thumbnail',\n status: RequestStatus.FAILED,\n }),\n );\n }\n };\n}\n\nexport function deleteVideoTranscript({\n language,\n videoId,\n transcripts,\n apiUrl,\n}) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n\n try {\n await deleteTranscript({\n videoId,\n language,\n apiUrl,\n });\n const updatedTranscripts = transcripts.filter(\n (transcript) => transcript !== language,\n );\n const transcriptStatus = updatedTranscripts?.length > 0 ? 'transcribed' : 'notTranscribed';\n\n dispatch(\n updateModel({\n modelType: 'videos',\n model: {\n id: videoId,\n transcripts: updatedTranscripts,\n transcriptStatus,\n },\n }),\n );\n\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n } catch (error) {\n dispatch(\n updateErrors({\n error: 'transcript',\n message: `Failed to delete ${language} transcript.`,\n }),\n );\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.FAILED,\n }),\n );\n }\n };\n}\n\nexport function downloadVideoTranscript({\n language,\n videoId,\n filename,\n apiUrl,\n}) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n\n try {\n await downloadTranscript({\n videoId,\n language,\n apiUrl,\n filename,\n });\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n } catch (error) {\n dispatch(\n updateErrors({\n error: 'transcript',\n message: `Failed to download ${filename}.`,\n }),\n );\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.FAILED,\n }),\n );\n }\n };\n}\n\nexport function uploadVideoTranscript({\n language,\n newLanguage,\n videoId,\n file,\n apiUrl,\n transcripts,\n}) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n const isReplacement = !isEmpty(language);\n\n try {\n await uploadTranscript({\n videoId,\n language,\n apiUrl,\n file,\n newLanguage,\n });\n let updatedTranscripts = transcripts;\n if (isReplacement) {\n const removeTranscript = transcripts.filter(\n (transcript) => transcript !== language,\n );\n updatedTranscripts = [...removeTranscript, newLanguage];\n } else {\n updatedTranscripts = [...transcripts, newLanguage];\n }\n\n const transcriptStatus = updatedTranscripts?.length > 0 ? 'transcribed' : 'notTranscribed';\n\n dispatch(\n updateModel({\n modelType: 'videos',\n model: {\n id: videoId,\n transcripts: updatedTranscripts,\n transcriptStatus,\n },\n }),\n );\n\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n } catch (error) {\n if (error.response?.data?.error) {\n const message = error.response.data.error;\n dispatch(updateErrors({ error: 'transcript', message }));\n } else {\n const message = isReplacement\n ? `Failed to replace ${language} with ${newLanguage}.`\n : `Failed to add ${newLanguage}.`;\n dispatch(updateErrors({ error: 'transcript', message }));\n }\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.FAILED,\n }),\n );\n }\n };\n}\n\nexport function getUsagePaths({ video, courseId }) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'usageMetrics',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n\n try {\n const { usageLocations } = await getVideoUsagePaths({\n videoId: video.id,\n courseId,\n });\n const activeStatus = usageLocations?.length > 0 ? 'active' : 'inactive';\n\n dispatch(\n updateModel({\n modelType: 'videos',\n model: {\n id: video.id,\n usageLocations,\n activeStatus,\n },\n }),\n );\n dispatch(\n updateEditStatus({\n editType: 'usageMetrics',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n } catch (error) {\n dispatch(\n updateErrors({\n error: 'usageMetrics',\n message: `Failed to get usage metrics for ${video.displayName}.`,\n }),\n );\n dispatch(\n updateEditStatus({\n editType: 'usageMetrics',\n status: RequestStatus.FAILED,\n }),\n );\n }\n };\n}\n\nexport function fetchVideoDownload({ selectedRows, courseId }) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'download',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n try {\n const errors = await getDownload(selectedRows, courseId);\n dispatch(\n updateEditStatus({\n editType: 'download',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n if (!isEmpty(errors)) {\n errors.forEach((error) => {\n dispatch(updateErrors({ error: 'download', message: error }));\n });\n dispatch(\n updateEditStatus({\n editType: 'download',\n status: RequestStatus.FAILED,\n }),\n );\n }\n } catch (error) {\n dispatch(\n updateErrors({\n error: 'download',\n message: 'Failed to download zip file of videos.',\n }),\n );\n dispatch(\n updateEditStatus({\n editType: 'download',\n status: RequestStatus.FAILED,\n }),\n );\n }\n };\n}\n\nexport function clearAutomatedTranscript({ courseId }) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n\n try {\n await deleteTranscriptPreferences(courseId);\n dispatch(updateTranscriptPreferenceSuccess({ modified: new Date() }));\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n } catch (error) {\n dispatch(\n updateErrors({\n error: 'transcript',\n message: 'Failed to update order transcripts settings.',\n }),\n );\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.FAILED,\n }),\n );\n }\n };\n}\n\nexport function updateTranscriptCredentials({ courseId, data }) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n\n try {\n await setTranscriptCredentials(courseId, data);\n dispatch(\n updateTranscriptCredentialsSuccess({\n provider: camelCase(data.provider),\n }),\n );\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n } catch (error) {\n dispatch(\n updateErrors({\n error: 'transcript',\n message: `Failed to update ${data.provider} credentials.`,\n }),\n );\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.FAILED,\n }),\n );\n }\n };\n}\n\nexport function updateTranscriptPreference({ courseId, data }) {\n return async (dispatch) => {\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.IN_PROGRESS,\n }),\n );\n\n try {\n const preferences = await setTranscriptPreferences(courseId, data);\n dispatch(updateTranscriptPreferenceSuccess(preferences));\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.SUCCESSFUL,\n }),\n );\n } catch (error) {\n if (error.response?.data?.error) {\n const message = error.response.data.error;\n dispatch(updateErrors({ error: 'transcript', message }));\n } else {\n dispatch(\n updateErrors({\n error: 'transcript',\n message: `Failed to update ${data.provider} transcripts settings.`,\n }),\n );\n }\n dispatch(\n updateEditStatus({\n editType: 'transcript',\n status: RequestStatus.FAILED,\n }),\n );\n }\n };\n}\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmpty } from 'lodash';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { injectIntl, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n Collapsible,\n Icon, IconButton,\n Sheet,\n TransitionReplace,\n} from '@openedx/paragon';\nimport { ChevronLeft, ChevronRight, Close } from '@openedx/paragon/icons';\nimport AITranslationsComponent from '@edx/frontend-component-ai-translations';\nimport OrderTranscriptForm from './OrderTranscriptForm';\nimport messages from './messages';\nimport {\n clearAutomatedTranscript,\n resetErrors,\n updateTranscriptCredentials,\n updateTranscriptPreference,\n} from '../data/thunks';\n\nconst TranscriptSettings = ({\n isTranscriptSettingsOpen,\n closeTranscriptSettings,\n courseId,\n}) => {\n const dispatch = useDispatch();\n const { errors: errorMessages, pageSettings, transcriptStatus } = useSelector(state => state.videos);\n const {\n activeTranscriptPreferences,\n transcriptCredentials,\n videoTranscriptSettings,\n isAiTranslationsEnabled,\n } = pageSettings;\n const { transcriptionPlans } = videoTranscriptSettings || {};\n const [transcriptType, setTranscriptType] = useState(null);\n const [isAiTranslations, setIsAiTranslations] = useState(false);\n\n const handleOrderTranscripts = (data, provider) => {\n const noCredentials = isEmpty(transcriptCredentials) || data.apiKey;\n dispatch(resetErrors({ errorType: 'transcript' }));\n if (provider === 'order') {\n dispatch(clearAutomatedTranscript({ courseId }));\n } else if (noCredentials) {\n dispatch(updateTranscriptCredentials({ courseId, data: { ...data, provider, global: false } }));\n } else {\n dispatch(updateTranscriptPreference({ courseId, data: { ...data, provider, global: false } }));\n }\n };\n\n return (\n <Sheet\n position=\"right\"\n blocking\n show={isTranscriptSettingsOpen}\n onClose={closeTranscriptSettings}\n >\n <div>\n {!isAiTranslations && (\n <>\n <ActionRow>\n <TransitionReplace>\n {transcriptType ? (\n <IconButton\n key=\"back-button\"\n size=\"sm\"\n iconAs={Icon}\n src={ChevronLeft}\n onClick={() => setTranscriptType(null)}\n alt=\"back button to main transcript settings view\"\n />\n ) : (\n <div key=\"title\" className=\"h3\">\n <FormattedMessage {...messages.transcriptSettingsTitle} />\n </div>\n )}\n </TransitionReplace>\n <ActionRow.Spacer />\n <IconButton size=\"sm\" iconAs={Icon} src={Close} onClick={closeTranscriptSettings} alt=\"close settings\" />\n </ActionRow>\n <TransitionReplace>\n { transcriptType ? (\n <div key=\"transcript-settings\">\n <OrderTranscriptForm\n {...{\n setTranscriptType,\n transcriptType,\n activeTranscriptPreferences,\n transcriptCredentials,\n closeTranscriptSettings,\n handleOrderTranscripts,\n transcriptionPlans,\n errorMessages,\n transcriptStatus,\n }}\n />\n </div>\n ) : (\n <div key=\"transcript-type-selection\" className=\"mt-3\">\n <Collapsible.Advanced\n onOpen={() => setTranscriptType('order')}\n >\n <Collapsible.Trigger\n className=\"row m-0 justify-content-between align-items-center\"\n >\n <FormattedMessage {...messages.orderTranscriptsTitle} />\n <Icon src={ChevronRight} />\n </Collapsible.Trigger>\n </Collapsible.Advanced>\n </div>\n )}\n </TransitionReplace>\n </>\n )}\n {(!transcriptType && isAiTranslationsEnabled) && (\n <TransitionReplace>\n <div data-testid=\"ai-translations-component\">\n <AITranslationsComponent\n setIsAiTranslations={setIsAiTranslations}\n closeTranscriptSettings={closeTranscriptSettings}\n courseId={courseId}\n key=\"ai-component\"\n />\n </div>\n </TransitionReplace>\n )}\n </div>\n </Sheet>\n );\n};\n\nTranscriptSettings.propTypes = {\n closeTranscriptSettings: PropTypes.func.isRequired,\n isTranscriptSettingsOpen: PropTypes.bool.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(TranscriptSettings);\n","import TranscriptSettings from './TranscriptSettings';\n\nexport default TranscriptSettings;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n heading: {\n id: 'course-authoring.video-uploads.heading',\n defaultMessage: 'Videos',\n },\n transcriptSettingsButtonLabel: {\n id: 'course-authoring.video-uploads.transcript-settings.button.toggle',\n defaultMessage: 'Transcript settings',\n },\n thumbnailAltMessage: {\n id: 'course-authoring.video-uploads.thumbnail.alt',\n defaultMessage: '{displayName} video thumbnail',\n },\n activeCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.activeCheckbox.label',\n defaultMessage: 'Active',\n },\n inactiveCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.inactiveCheckbox.label',\n defaultMessage: 'Inactive',\n },\n transcribedCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.transcribedCheckbox.label',\n defaultMessage: 'Transcribed',\n },\n notTranscribedCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.notTranscribedCheckbox.label',\n defaultMessage: 'Not transcribed',\n },\n processingCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.processingCheckbox.label',\n defaultMessage: 'Processing',\n },\n failedCheckboxLabel: {\n id: 'course-authoring.files-and-videos.sort-and-filter.modal.filter.failedCheckbox.label',\n defaultMessage: 'Failed',\n },\n videoUploadProgressBarLabel: {\n id: 'course-authoring.files-and-videos.add-video-progress-bar.progress-bar.label',\n defaultMessage: 'Video upload progress:',\n },\n videoUploadAlertLabel: {\n id: 'course-authoring.files-and-videos.video-upload-alert',\n defaultMessage: 'Upload in progress. Please wait for the upload to complete before navigating away from this page.',\n },\n});\n\nexport default messages;\n","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nexport const VideosPageContext = React.createContext({});\n\nconst VideosPageProvider = ({ courseId, children }) => {\n const contextValue = useMemo(() => ({\n courseId,\n path: `/course/${courseId}/videos`,\n }), []);\n return (\n <VideosPageContext.Provider\n value={contextValue}\n >\n {children}\n </VideosPageContext.Provider>\n );\n};\n\nVideosPageProvider.propTypes = {\n courseId: PropTypes.string.isRequired,\n children: PropTypes.node.isRequired,\n};\n\nexport default VideosPageProvider;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { VideoFile } from '@openedx/paragon/icons';\nimport {\n Badge,\n Button,\n Icon,\n Image,\n} from '@openedx/paragon';\nimport { FileInput, useFileInput } from '../generic';\nimport messages from './messages';\nimport { VIDEO_SUCCESS_STATUSES, VIDEO_FAILURE_STATUSES } from './data/constants';\nimport { RequestStatus } from '../../data/constants';\n\nconst VideoThumbnail = ({\n thumbnail,\n displayName,\n id,\n imageSize,\n handleAddThumbnail,\n videoImageSettings,\n status,\n pageLoadStatus,\n // injected\n intl,\n}) => {\n const fileInputControl = useFileInput({\n onAddFile: (files) => {\n const [file] = files;\n handleAddThumbnail(file, id);\n },\n setSelectedRows: () => {},\n setAddOpen: () => false,\n });\n const [thumbnailError, setThumbnailError] = useState(false);\n const allowThumbnailUpload = videoImageSettings?.videoImageUploadEnabled;\n\n let addThumbnailMessage = 'Add thumbnail';\n if (allowThumbnailUpload) {\n if (thumbnail) {\n addThumbnailMessage = 'Replace thumbnail';\n }\n }\n const supportedFiles = videoImageSettings?.supportedFileFormats\n ? Object.values(videoImageSettings.supportedFileFormats) : null;\n const isUploaded = VIDEO_SUCCESS_STATUSES.includes(status);\n const isFailed = VIDEO_FAILURE_STATUSES.includes(status);\n const failedMessage = intl.formatMessage(messages.failedCheckboxLabel);\n\n const showThumbnail = allowThumbnailUpload && thumbnail && isUploaded;\n\n return (\n <div className=\"video-thumbnail row justify-content-center align-itmes-center\">\n {allowThumbnailUpload && showThumbnail && <div className=\"thumbnail-overlay\" />}\n {showThumbnail && !thumbnailError && pageLoadStatus === RequestStatus.SUCCESSFUL ? (\n <>\n <div className=\"border rounded\">\n <Image\n style={imageSize}\n className=\"m-1 bg-light-300\"\n src={thumbnail}\n alt={intl.formatMessage(messages.thumbnailAltMessage, { displayName })}\n onError={() => setThumbnailError(true)}\n />\n </div>\n <div className=\"add-thumbnail\" data-testid={`video-thumbnail-${id}`}>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={fileInputControl.click}\n tabIndex=\"0\"\n >\n {addThumbnailMessage}\n </Button>\n </div>\n </>\n ) : (\n <>\n <div\n className=\"row justify-content-center align-items-center m-0 border rounded\"\n style={imageSize}\n >\n <Icon src={VideoFile} style={{ height: '48px', width: '48px' }} />\n </div>\n <div className=\"status-badge\">\n {!isUploaded && (\n <Badge variant=\"light\">\n {!isFailed ? status : failedMessage}\n </Badge>\n )}\n </div>\n </>\n )}\n {allowThumbnailUpload && (\n <FileInput\n key=\"video-thumbnail-upload\"\n fileInput={fileInputControl}\n supportedFileFormats={supportedFiles}\n allowMultiple={false}\n />\n )}\n </div>\n );\n};\n\nVideoThumbnail.propTypes = {\n thumbnail: PropTypes.string,\n displayName: PropTypes.string.isRequired,\n id: PropTypes.string.isRequired,\n imageSize: PropTypes.shape({\n width: PropTypes.string,\n height: PropTypes.string,\n }).isRequired,\n handleAddThumbnail: PropTypes.func.isRequired,\n videoImageSettings: PropTypes.shape({\n videoImageUploadEnabled: PropTypes.bool.isRequired,\n supportedFileFormats: PropTypes.shape({}),\n }).isRequired,\n status: PropTypes.string.isRequired,\n pageLoadStatus: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nVideoThumbnail.defaultProps = {\n thumbnail: null,\n};\n\nexport default injectIntl(VideoThumbnail);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n infoTabTitle: {\n id: 'course-authoring.video-uploads.file-info.infoTab.title',\n defaultMessage: 'Info',\n description: 'Title for info tab',\n },\n transcriptTabTitle: {\n id: 'course-authoring.video-uploads.file-info.transcriptTab.title',\n defaultMessage: 'Transcript ({transcriptCount})',\n description: 'Title for info tab',\n },\n notificationScreenReaderText: {\n id: 'course-authoring.video-uploads.file-info.transcriptTab.notification.screenReader.text',\n defaultMessage: 'Transcription error',\n description: 'Scrren reader text for transcript tab notification',\n },\n dateAddedTitle: {\n id: 'course-authoring.video-uploads.file-info.infoTab.dateAdded.title',\n defaultMessage: 'Date added',\n description: 'Title for date added section',\n },\n fileSizeTitle: {\n id: 'course-authoring.video-uploads.file-info.infoTab.fileSize.title',\n defaultMessage: 'File size',\n description: 'Title for file size section',\n },\n videoLengthTitle: {\n id: 'course-authoring.video-uploads.file-info.infoTab.videoLength.title',\n defaultMessage: 'Video length',\n description: 'Title for video length section',\n },\n errorAlertMessage: {\n id: 'course-authoring.files-and-upload.file-info.transcriptTab.errorAlert.message',\n defaultMessage: '{message}',\n },\n uploadButtonLabel: {\n id: 'course-authoriong.video-uploads.file-info.transcriptTab.upload.label',\n defaultMessage: 'Add a transcript',\n description: 'Label for upload button',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Stack } from '@openedx/paragon';\nimport { injectIntl, FormattedDate, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { getFileSizeToClosestByte } from '../../../utils';\nimport { getFormattedDuration } from '../data/utils';\nimport messages from './messages';\n\nconst InfoTab = ({ video }) => {\n const fileSize = getFileSizeToClosestByte(video?.fileSize);\n const duration = getFormattedDuration(video?.duration);\n\n return (\n <Stack className=\"mt-3\">\n <div className=\"font-weight-bold\">\n <FormattedMessage {...messages.dateAddedTitle} />\n </div>\n <FormattedDate\n value={video?.dateAdded}\n year=\"numeric\"\n month=\"short\"\n day=\"2-digit\"\n hour=\"numeric\"\n minute=\"numeric\"\n />\n <div className=\"font-weight-bold mt-3\">\n <FormattedMessage {...messages.fileSizeTitle} />\n </div>\n {fileSize}\n <div className=\"font-weight-bold mt-3\">\n <FormattedMessage {...messages.videoLengthTitle} />\n </div>\n {duration}\n </Stack>\n );\n};\n\nInfoTab.propTypes = {\n video: PropTypes.shape({\n duration: PropTypes.number.isRequired,\n dateAdded: PropTypes.string.isRequired,\n fileSize: PropTypes.number.isRequired,\n }),\n};\n\nInfoTab.defaultProps = {\n video: {},\n};\n\nexport default injectIntl(InfoTab);\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\n\nimport {\n Button,\n Icon,\n ModalPopup,\n Menu,\n MenuItem,\n useToggle,\n} from '@openedx/paragon';\nimport { Check, ExpandMore, ExpandLess } from '@openedx/paragon/icons';\nimport { isEmpty } from 'lodash';\n\nconst LanguageSelect = ({\n value,\n previousSelection,\n options,\n handleSelect,\n placeholderText,\n}) => {\n const currentSelection = isEmpty(value) ? placeholderText : options[value];\n\n const [isOpen, , close, toggle] = useToggle();\n const [target, setTarget] = useState(null);\n\n return (\n <>\n <div className=\"col-9 p-0\">\n <Button\n variant=\"tertiary\"\n size=\"sm\"\n className=\"border border-gray-700 justify-content-between\"\n style={{ minWidth: '100%' }}\n id={`language-select-dropdown-${currentSelection}`}\n data-testid=\"language-select-dropdown\"\n iconAfter={isOpen ? ExpandLess : ExpandMore}\n onClick={toggle}\n ref={setTarget}\n >\n {currentSelection}\n </Button>\n </div>\n <ModalPopup\n placement=\"bottom-end\"\n positionRef={target}\n isOpen={isOpen}\n onClose={close}\n onEscapeKey={close}\n >\n <Menu\n className=\"language-select\"\n >\n <div>\n {Object.entries(options).map(([valueKey, text]) => {\n if (valueKey === value) {\n return (\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n size=\"sm\"\n key={`${valueKey}-item`}\n >\n <Icon size=\"inline\" src={Check} />\n <span className=\"pl-1\">{text}</span>\n </MenuItem>\n );\n }\n if (!previousSelection.includes(valueKey)) {\n return (\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n size=\"sm\"\n onClick={() => {\n handleSelect(valueKey);\n close();\n }}\n key={`${valueKey}-item`}\n >\n <span className=\"pl-3\">{text}</span>\n </MenuItem>\n );\n }\n return (\n <MenuItem\n disabled\n variant=\"tertiary\"\n as={Button}\n size=\"sm\"\n key={`${valueKey}-item`}\n >\n <span className=\"pl-3\">{text}</span>\n </MenuItem>\n );\n })}\n </div>\n </Menu>\n <div className=\"row justify-content-center\">\n <Icon src={ExpandMore} size=\"xs\" />\n </div>\n </ModalPopup>\n </>\n );\n};\n\nLanguageSelect.propTypes = {\n value: PropTypes.string.isRequired,\n options: PropTypes.shape({}).isRequired,\n handleSelect: PropTypes.func.isRequired,\n placeholderText: PropTypes.string.isRequired,\n previousSelection: PropTypes.arrayOf(PropTypes.string).isRequired,\n};\n\nexport default LanguageSelect;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n fileSizeError: {\n id: 'course-authoriong.video-uploads.file-info.transcript.error.fileSizeError',\n defaultMessage: 'Transcript file size exeeds the maximum. Please try again.',\n description: 'Message presented to user when transcript file size is too large',\n },\n deleteTranscript: {\n id: 'course-authoriong.video-uploads.file-info.transcript.deleteTranscript',\n defaultMessage: 'Delete',\n description: 'Message Presented To user for action to delete transcript',\n },\n replaceTranscript: {\n id: 'course-authoriong.video-uploads.file-info.transcript.replaceTranscript',\n defaultMessage: 'Replace',\n description: 'Message Presented To user for action to replace transcript',\n },\n downloadTranscript: {\n id: 'course-authoriong.video-uploads.file-info.transcript.downloadTranscript',\n defaultMessage: 'Download',\n description: 'Message Presented To user for action to download transcript',\n },\n languageSelectPlaceholder: {\n id: 'course-authoriong.video-uploads.file-info.transcripts.languageSelectPlaceholder',\n defaultMessage: 'Select language',\n description: 'Placeholder For Dropdown, which allows users to set the language associtated with a transcript',\n },\n cancelDeleteLabel: {\n id: 'course-authoriong.video-uploads.file-info.transcripts.cancelDeleteLabel',\n defaultMessage: 'Cancel',\n description: 'Label For Button, which allows users to stop the process of deleting a transcript',\n },\n confirmDeleteLabel: {\n id: 'course-authoriong.video-uploads.file-info.transcripts.confirmDeleteLabel',\n defaultMessage: 'Delete',\n description: 'Label For Button, which allows users to confirm the process of deleting a transcript',\n },\n deleteConfirmationMessage: {\n id: 'course-authoriong.video-uploads.file-info.transcripts.deleteConfirmationMessage',\n defaultMessage: 'Are you sure you want to delete this transcript?',\n description: 'Warning which allows users to select next step in the process of deleting a transcript',\n },\n deleteConfirmationHeader: {\n id: 'course-authoriong.video-uploads.file-info.transcripts.deleteConfirmationTitle',\n defaultMessage: 'Delete this transcript?',\n description: 'Title for Warning which allows users to select next step in the process of deleting a transcript',\n },\n});\n\nexport default messages;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage, injectIntl } from '@edx/frontend-platform/i18n';\nimport {\n Button,\n Icon,\n IconButton,\n ModalPopup,\n Menu,\n MenuItem,\n useToggle,\n} from '@openedx/paragon';\nimport { MoreHoriz } from '@openedx/paragon/icons';\n\nimport messages from './messages';\n\nexport const TranscriptActionMenu = ({\n language,\n launchDeleteConfirmation,\n handleTranscript,\n input,\n}) => {\n const [isOpen, , close, toggle] = useToggle();\n const [target, setTarget] = useState(null);\n return (\n <>\n <IconButton\n src={MoreHoriz}\n iconAs={Icon}\n onClick={toggle}\n ref={setTarget}\n alt=\"Actions dropdown\"\n data-testid={`${language}-transcript-menu`}\n />\n <ModalPopup\n placement=\"bottom-end\"\n positionRef={target}\n isOpen={isOpen}\n onClose={close}\n onEscapeKey={close}\n >\n <Menu\n className=\"transcript-menu\"\n >\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n key={`transcript-actions-${language}-replace`}\n onClick={input.click}\n >\n <FormattedMessage {...messages.replaceTranscript} />\n </MenuItem>\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n key={`transcript-actions-${language}-download`}\n onClick={() => handleTranscript({ language }, 'download')}\n >\n <FormattedMessage {...messages.downloadTranscript} />\n </MenuItem>\n <hr className=\"my-2\" />\n <MenuItem\n as={Button}\n variant=\"tertiary\"\n key={`transcript-actions-${language}-delete`}\n onClick={launchDeleteConfirmation}\n >\n <FormattedMessage {...messages.deleteTranscript} />\n </MenuItem>\n </Menu>\n </ModalPopup>\n </>\n );\n};\n\nTranscriptActionMenu.propTypes = {\n language: PropTypes.string.isRequired,\n handleTranscript: PropTypes.func.isRequired,\n launchDeleteConfirmation: PropTypes.func.isRequired,\n input: PropTypes.shape({\n click: PropTypes.func.isRequired,\n }).isRequired,\n};\n\nexport default injectIntl(TranscriptActionMenu);\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Card,\n Button,\n Icon,\n IconButton,\n useToggle,\n} from '@openedx/paragon';\nimport { DeleteOutline } from '@openedx/paragon/icons';\nimport { injectIntl, FormattedMessage, intlShape } from '@edx/frontend-platform/i18n';\nimport { isEmpty } from 'lodash';\nimport LanguageSelect from './LanguageSelect';\nimport TranscriptMenu from './TranscriptMenu';\nimport messages from './messages';\nimport { FileInput, useFileInput } from '../../../generic';\n\nconst Transcript = ({\n languages,\n transcript,\n previousSelection,\n handleTranscript,\n // injected\n intl,\n}) => {\n const [isConfirmationOpen, openConfirmation, closeConfirmation] = useToggle();\n const [newLanguage, setNewLanguage] = useState(transcript);\n const language = transcript;\n\n useEffect(() => {\n setNewLanguage(transcript);\n }, [transcript]);\n\n const input = useFileInput({\n onAddFile: (files) => {\n const [file] = files;\n handleTranscript({\n file,\n language,\n newLanguage,\n }, 'upload');\n },\n setSelectedRows: () => {},\n setAddOpen: () => {},\n });\n\n const updateLangauge = (selected) => {\n setNewLanguage(selected);\n if (isEmpty(language)) {\n input.click();\n }\n };\n\n return (\n <>\n {isConfirmationOpen ? (\n <Card className=\"my-2\">\n <Card.Header className=\"h3\" title={(<FormattedMessage {...messages.deleteConfirmationHeader} />)} />\n <Card.Body>\n <Card.Section>\n <FormattedMessage {...messages.deleteConfirmationMessage} />\n </Card.Section>\n <Card.Footer>\n <Button size=\"sm\" variant=\"tertiary\" className=\"mb-2 mb-sm-0\" onClick={closeConfirmation}>\n <FormattedMessage {...messages.cancelDeleteLabel} />\n </Button>\n <Button\n variant=\"danger\"\n className=\"mb-2 mb-sm-0\"\n size=\"sm\"\n onClick={() => {\n handleTranscript({ language: transcript }, 'delete');\n closeConfirmation();\n }}\n >\n <FormattedMessage {...messages.confirmDeleteLabel} />\n </Button>\n </Card.Footer>\n </Card.Body>\n </Card>\n ) : (\n <div\n className=\"row m-0 align-items-center justify-content-between\"\n key={`transcript-${language}`}\n data-testid={`transcript-${language}`}\n >\n <LanguageSelect\n options={languages}\n value={newLanguage}\n placeholderText={intl.formatMessage(messages.languageSelectPlaceholder)}\n previousSelection={previousSelection}\n handleSelect={updateLangauge}\n />\n { transcript === '' ? (\n <IconButton\n iconAs={Icon}\n src={DeleteOutline}\n onClick={openConfirmation}\n alt=\"delete empty transcript\"\n />\n ) : (\n <TranscriptMenu\n {...{\n language,\n newLanguage,\n setNewLanguage,\n handleTranscript,\n input,\n launchDeleteConfirmation: openConfirmation,\n }}\n />\n )}\n </div>\n )}\n <FileInput key=\"transcript-input\" fileInput={input} supportedFileFormats={['.srt']} />\n </>\n );\n};\n\nTranscript.propTypes = {\n languages: PropTypes.shape({}).isRequired,\n transcript: PropTypes.string.isRequired,\n previousSelection: PropTypes.arrayOf(PropTypes.string).isRequired,\n handleTranscript: PropTypes.func.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(Transcript);\n","import Transcript from './Transcript';\n\nexport default Transcript;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { isEmpty } from 'lodash';\nimport { ErrorAlert } from '@edx/frontend-lib-content-components';\nimport { Button, Stack } from '@openedx/paragon';\nimport { Add } from '@openedx/paragon/icons';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { getLanguages, getSortedTranscripts } from '../data/utils';\nimport Transcript from './transcript-item';\nimport {\n deleteVideoTranscript,\n downloadVideoTranscript,\n resetErrors,\n uploadVideoTranscript,\n} from '../data/thunks';\nimport { RequestStatus } from '../../../data/constants';\nimport messages from './messages';\n\nconst TranscriptTab = ({\n video,\n // injected\n intl,\n}) => {\n const dispatch = useDispatch();\n const divRef = useRef(null);\n const { transcriptStatus, errors } = useSelector(state => state.videos);\n const {\n transcriptAvailableLanguages,\n videoTranscriptSettings,\n } = useSelector(state => state.videos.pageSettings);\n const {\n transcriptDeleteHandlerUrl,\n transcriptUploadHandlerUrl,\n transcriptDownloadHandlerUrl,\n } = videoTranscriptSettings;\n const { transcripts, id, displayName } = video;\n const languages = getLanguages(transcriptAvailableLanguages);\n let sortedTranscripts = getSortedTranscripts(languages, transcripts);\n const [previousSelection, setPreviousSelection] = useState(sortedTranscripts);\n\n useEffect(() => {\n dispatch(resetErrors({ errorType: 'transcript' }));\n sortedTranscripts = getSortedTranscripts(languages, transcripts);\n setPreviousSelection(sortedTranscripts);\n }, [transcripts]);\n\n const handleAddEmptyTranscript = () => {\n setPreviousSelection(['', ...previousSelection]);\n if (divRef?.current?.scrollTo) {\n divRef.current.scrollTo({ top: 0, behavior: 'smooth' });\n }\n };\n\n const handleTranscript = (data, actionType) => {\n const {\n language,\n newLanguage,\n file,\n } = data;\n dispatch(resetErrors({ errorType: 'transcript' }));\n switch (actionType) {\n case 'delete':\n if (isEmpty(language)) {\n const updatedSelection = previousSelection;\n updatedSelection.shift();\n setPreviousSelection(updatedSelection);\n } else {\n dispatch(deleteVideoTranscript({\n language,\n videoId: id,\n apiUrl: transcriptDeleteHandlerUrl,\n transcripts,\n }));\n }\n break;\n case 'download':\n dispatch(downloadVideoTranscript({\n filename: `${displayName}-${language}.srt`,\n language,\n videoId: id,\n apiUrl: transcriptDownloadHandlerUrl,\n }));\n break;\n case 'upload':\n dispatch(uploadVideoTranscript({\n language,\n videoId: id,\n apiUrl: transcriptUploadHandlerUrl,\n newLanguage,\n file,\n transcripts,\n }));\n break;\n default:\n break;\n }\n };\n\n return (\n <Stack gap={3}>\n <div ref={divRef} style={{ overflowY: 'auto', maxHeight: '310px' }} className=\"px-1 py-2\">\n <ErrorAlert\n hideHeading={false}\n isError={transcriptStatus === RequestStatus.FAILED && !isEmpty(errors.transcript)}\n >\n <ul className=\"p-0\">\n {errors.transcript.map(message => (\n <li key={`transcript-error-${message}`} style={{ listStyle: 'none' }}>\n {intl.formatMessage(messages.errorAlertMessage, { message })}\n </li>\n ))}\n </ul>\n </ErrorAlert>\n {previousSelection.map(transcript => (\n <Transcript\n {...{\n languages,\n transcript,\n previousSelection,\n handleTranscript,\n }}\n />\n ))}\n </div>\n <div className=\"border-top border-light-400\">\n <Button\n variant=\"link\"\n iconBefore={Add}\n size=\"sm\"\n className=\"text-primary-500 justify-content-start pl-0 pt-3\"\n onClick={handleAddEmptyTranscript}\n >\n {intl.formatMessage(messages.uploadButtonLabel)}\n </Button>\n </div>\n </Stack>\n );\n};\n\nTranscriptTab.propTypes = {\n video: PropTypes.shape({\n transcripts: PropTypes.arrayOf(PropTypes.string).isRequired,\n id: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n }).isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(TranscriptTab);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Tabs,\n Tab,\n} from '@openedx/paragon';\nimport InfoTab from './InfoTab';\nimport TranscriptTab from './TranscriptTab';\nimport messages from './messages';\nimport { TRANSCRIPT_FAILURE_STATUSES } from '../data/constants';\n\nconst VideoInfoModalSidebar = ({\n video,\n activeTab,\n setActiveTab,\n // injected\n intl,\n}) => (\n <Tabs\n id=\"controlled-info-sidebar-tab\"\n activeKey={activeTab}\n onSelect={(tab) => setActiveTab(tab)}\n >\n <Tab eventKey=\"fileInfo\" title={intl.formatMessage(messages.infoTabTitle)}>\n <InfoTab {...{ video }} />\n </Tab>\n <Tab\n eventKey=\"fileTranscripts\"\n title={intl.formatMessage(\n messages.transcriptTabTitle,\n { transcriptCount: video.transcripts.length },\n )}\n notification={TRANSCRIPT_FAILURE_STATUSES.includes(video.transcriptionStatus) && (\n <span>\n <span className=\"sr-only\">{intl.formatMessage(messages.notificationScreenReaderText)}</span>\n </span>\n )}\n >\n <TranscriptTab {...{ video }} />\n </Tab>\n </Tabs>\n);\n\nVideoInfoModalSidebar.propTypes = {\n video: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n wrapperType: PropTypes.string.isRequired,\n id: PropTypes.string.isRequired,\n dateAdded: PropTypes.string.isRequired,\n fileSize: PropTypes.number.isRequired,\n transcripts: PropTypes.arrayOf(PropTypes.string),\n transcriptionStatus: PropTypes.string.isRequired,\n }),\n activeTab: PropTypes.string.isRequired,\n setActiveTab: PropTypes.func.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nVideoInfoModalSidebar.defaultProps = {\n video: null,\n};\n\nexport default injectIntl(VideoInfoModalSidebar);\n","import VideoInfoModalSidebar from './VideoInfoModalSidebar';\n\nexport default VideoInfoModalSidebar;\n","import React, { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n injectIntl,\n FormattedMessage,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport {\n useToggle,\n ActionRow,\n Button,\n CheckboxFilter,\n Container,\n Alert,\n Spinner,\n} from '@openedx/paragon';\nimport Placeholder from '@edx/frontend-lib-content-components';\n\nimport { RequestStatus } from '../../data/constants';\nimport { useModels, useModel } from '../../generic/model-store';\nimport {\n addVideoFile,\n addVideoThumbnail,\n deleteVideoFile,\n fetchVideoDownload,\n fetchVideos,\n getUsagePaths,\n markVideoUploadsInProgressAsFailed,\n resetErrors,\n updateVideoOrder,\n} from './data/thunks';\nimport messages from './messages';\nimport VideosPageProvider from './VideosPageProvider';\nimport getPageHeadTitle from '../../generic/utils';\nimport {\n ActiveColumn,\n EditFileErrors,\n FileTable,\n StatusColumn,\n ThumbnailColumn,\n TranscriptColumn,\n} from '../generic';\nimport TranscriptSettings from './transcript-settings';\nimport VideoThumbnail from './VideoThumbnail';\nimport { getFormattedDuration, resampleFile } from './data/utils';\nimport FILES_AND_UPLOAD_TYPE_FILTERS from '../generic/constants';\nimport VideoInfoModalSidebar from './info-sidebar';\n\nconst VideosPage = ({\n courseId,\n // injected\n intl,\n}) => {\n const dispatch = useDispatch();\n const [\n isTranscriptSettingsOpen,\n openTranscriptSettings,\n closeTranscriptSettings,\n ] = useToggle(false);\n const courseDetails = useModel('courseDetails', courseId);\n document.title = getPageHeadTitle(\n courseDetails?.name,\n intl.formatMessage(messages.heading),\n );\n\n useEffect(() => {\n dispatch(fetchVideos(courseId));\n }, [courseId]);\n\n const {\n videoIds,\n loadingStatus,\n transcriptStatus,\n addingStatus: addVideoStatus,\n deletingStatus: deleteVideoStatus,\n updatingStatus: updateVideoStatus,\n usageStatus: usagePathStatus,\n errors: errorMessages,\n pageSettings,\n } = useSelector((state) => state.videos);\n\n const uploadingIdsRef = useRef([]);\n\n useEffect(() => {\n window.onbeforeunload = () => {\n dispatch(markVideoUploadsInProgressAsFailed({ uploadingIdsRef, courseId }));\n if (addVideoStatus === RequestStatus.IN_PROGRESS) {\n return '';\n }\n return undefined;\n };\n }, [addVideoStatus]);\n\n const {\n isVideoTranscriptEnabled,\n encodingsDownloadUrl,\n videoUploadMaxFileSize,\n videoSupportedFileFormats,\n videoImageSettings,\n } = pageSettings;\n\n const supportedFileFormats = {\n 'video/*': videoSupportedFileFormats || FILES_AND_UPLOAD_TYPE_FILTERS.video,\n };\n\n const handleErrorReset = (error) => dispatch(resetErrors(error));\n const handleAddFile = (files) => {\n handleErrorReset({ errorType: 'add' });\n files.forEach((file) => dispatch(addVideoFile(courseId, file, videoIds, uploadingIdsRef)));\n };\n const handleDeleteFile = (id) => dispatch(deleteVideoFile(courseId, id));\n const handleDownloadFile = (selectedRows) => dispatch(fetchVideoDownload({ selectedRows, courseId }));\n const handleUsagePaths = (video) => dispatch(getUsagePaths({ video, courseId }));\n const handleFileOrder = ({ newFileIdOrder, sortType }) => {\n dispatch(updateVideoOrder(courseId, newFileIdOrder, sortType));\n };\n const handleAddThumbnail = (file, videoId) => resampleFile({\n file,\n dispatch,\n courseId,\n videoId,\n addVideoThumbnail,\n });\n\n const videos = useModels('videos', videoIds);\n\n const data = {\n supportedFileFormats,\n encodingsDownloadUrl,\n fileIds: videoIds,\n loadingStatus,\n usagePathStatus,\n usageErrorMessages: errorMessages.usageMetrics,\n fileType: 'video',\n };\n const thumbnailPreview = (props) => VideoThumbnail({\n ...props,\n pageLoadStatus: loadingStatus,\n handleAddThumbnail,\n videoImageSettings,\n });\n const infoModalSidebar = (video, activeTab, setActiveTab) => (\n VideoInfoModalSidebar({ video, activeTab, setActiveTab })\n );\n const maxFileSize = videoUploadMaxFileSize * 1073741824;\n const transcriptColumn = {\n id: 'transcriptStatus',\n Header: 'Transcript',\n accessor: 'transcriptStatus',\n Cell: ({ row }) => TranscriptColumn({ row }),\n Filter: CheckboxFilter,\n filter: 'exactTextCase',\n filterChoices: [\n {\n name: intl.formatMessage(messages.transcribedCheckboxLabel),\n value: 'transcribed',\n },\n {\n name: intl.formatMessage(messages.notTranscribedCheckboxLabel),\n value: 'notTranscribed',\n },\n ],\n };\n const activeColumn = {\n id: 'activeStatus',\n Header: 'Active',\n accessor: 'activeStatus',\n Cell: ({ row }) => ActiveColumn({ row, pageLoadStatus: loadingStatus }),\n Filter: CheckboxFilter,\n filter: 'exactTextCase',\n filterChoices: [\n { name: intl.formatMessage(messages.activeCheckboxLabel), value: 'active' },\n { name: intl.formatMessage(messages.inactiveCheckboxLabel), value: 'inactive' },\n ],\n };\n const durationColumn = {\n id: 'duration',\n Header: 'Video length',\n accessor: 'duration',\n Cell: ({ row }) => {\n const { duration } = row.original;\n return getFormattedDuration(duration);\n },\n };\n const processingStatusColumn = {\n id: 'status',\n Header: 'Status',\n accessor: 'status',\n Cell: ({ row }) => StatusColumn({ row }),\n Filter: CheckboxFilter,\n filterChoices: [\n { name: intl.formatMessage(messages.processingCheckboxLabel), value: 'Processing' },\n\n { name: intl.formatMessage(messages.failedCheckboxLabel), value: 'Failed' },\n ],\n };\n const videoThumbnailColumn = {\n id: 'courseVideoImageUrl',\n Header: '',\n Cell: ({ row }) => ThumbnailColumn({ row, thumbnailPreview }),\n };\n const tableColumns = [\n { ...videoThumbnailColumn },\n {\n Header: 'File name',\n accessor: 'clientVideoId',\n },\n { ...durationColumn },\n { ...transcriptColumn },\n { ...activeColumn },\n { ...processingStatusColumn },\n ];\n\n if (loadingStatus === RequestStatus.DENIED) {\n return (\n <div data-testid=\"under-construction-placeholder\" className=\"row justify-contnt-center m-6\">\n <Placeholder />\n </div>\n );\n }\n\n return (\n <VideosPageProvider courseId={courseId}>\n <Container size=\"xl\" className=\"p-4 pt-4.5\">\n <EditFileErrors\n resetErrors={handleErrorReset}\n errorMessages={errorMessages}\n addFileStatus={addVideoStatus}\n deleteFileStatus={deleteVideoStatus}\n updateFileStatus={updateVideoStatus}\n loadingStatus={loadingStatus}\n />\n <Alert variant=\"warning\" show={addVideoStatus === RequestStatus.IN_PROGRESS}>\n <div className=\"video-upload-warning-text\"><Spinner animation=\"border\" variant=\"warning\" className=\"video-upload-spinner mr-3\" screenReaderText=\"loading\" />\n <p className=\"d-inline\"><FormattedMessage {...messages.videoUploadAlertLabel} /></p>\n </div>\n </Alert>\n <ActionRow>\n <div className=\"h2\">\n <FormattedMessage {...messages.heading} />\n </div>\n <ActionRow.Spacer />\n {isVideoTranscriptEnabled ? (\n <Button\n variant=\"link\"\n size=\"sm\"\n onClick={() => {\n openTranscriptSettings();\n handleErrorReset({ errorType: 'transcript' });\n }}\n >\n <FormattedMessage {...messages.transcriptSettingsButtonLabel} />\n </Button>\n ) : null}\n </ActionRow>\n {loadingStatus !== RequestStatus.FAILED && (\n <>\n {isVideoTranscriptEnabled && (\n <TranscriptSettings\n {...{\n isTranscriptSettingsOpen,\n closeTranscriptSettings,\n handleErrorReset,\n errorMessages,\n transcriptStatus,\n courseId,\n }}\n />\n )}\n <FileTable\n {...{\n courseId,\n data,\n handleAddFile,\n handleDeleteFile,\n handleDownloadFile,\n handleUsagePaths,\n handleErrorReset,\n handleFileOrder,\n tableColumns,\n maxFileSize,\n thumbnailPreview,\n infoModalSidebar,\n files: videos,\n }}\n />\n </>\n )}\n </Container>\n </VideosPageProvider>\n );\n};\n\nVideosPage.propTypes = {\n courseId: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(VideosPage);\n","import TranscriptSettings from './transcript-settings';\nimport VideosPage from './VideosPage';\nimport VideoThumbnail from './VideoThumbnail';\nimport VideoInfoModalSidebar from './info-sidebar';\n\nexport default VideosPage;\nexport { TranscriptSettings, VideoThumbnail, VideoInfoModalSidebar };\n","import { Alert } from '@openedx/paragon';\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nconst AlertProctoringError = ({ proctoringErrorsData, children, ...props }) => (\n <ul className=\"alert-proctoring-error p-0\">\n <Alert {...props}>\n {children}\n {proctoringErrorsData.map(({ key, model, message }) => (\n <li key={key}>\n <Alert.Heading>{model.displayName}</Alert.Heading>\n <p>{message}</p>\n </li>\n ))}\n </Alert>\n </ul>\n);\n\nAlertProctoringError.propTypes = {\n variant: PropTypes.string,\n children: PropTypes.node,\n proctoringErrorsData: PropTypes.arrayOf(PropTypes.shape({\n key: PropTypes.string,\n message: PropTypes.string,\n model: PropTypes.shape({\n deprecated: PropTypes.bool,\n displayName: PropTypes.string,\n help: PropTypes.string,\n hideOnEnabledPublisher: PropTypes.bool,\n }),\n value: PropTypes.string,\n })).isRequired,\n};\n\nAlertProctoringError.defaultProps = {\n variant: 'danger',\n children: null,\n};\n\nexport default AlertProctoringError;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n offlineWarningTitle: {\n id: 'course-authoring.generic.alert.warning.offline.title',\n defaultMessage: 'Studio\\'s having trouble saving your work',\n },\n offlineWarningDescription: {\n id: 'course-authoring.generic.alert.warning.offline.description',\n defaultMessage: 'This may be happening because of an error with our server or your internet connection. Try refreshing the page or making sure you are online.',\n },\n offlineWarningTitleAriaLabelledBy: {\n id: 'course-authoring.generic.alert.warning.offline.title.aria.labelled-by',\n defaultMessage: 'alert-internet-error-title',\n },\n offlineWarningDescriptionAriaDescribedBy: {\n id: 'course-authoring.generic.alert.warning.offline.subtitle.aria.described-by',\n defaultMessage: 'alert-internet-error-description',\n },\n});\n\nexport default messages;\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Warning as WarningIcon } from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport AlertMessage from '../alert-message';\nimport messages from './messages';\n\nconst InternetConnectionAlert = ({\n isFailed, isQueryPending, onQueryProcessing, onInternetConnectionFailed,\n}) => {\n const intl = useIntl();\n const [showAlert, setShowAlert] = useState(false);\n const [isOnline, setIsOnline] = useState(window.navigator.onLine);\n\n useEffect(() => {\n const handleOnlineStatus = () => setIsOnline(window.navigator.onLine);\n const events = ['online', 'offline'];\n\n events.forEach(event => {\n window.addEventListener(event, handleOnlineStatus);\n });\n\n return () => {\n events.forEach(event => {\n window.removeEventListener(event, handleOnlineStatus);\n });\n };\n }, [isOnline]);\n\n useEffect(() => {\n if (isQueryPending) {\n if (onQueryProcessing) {\n onQueryProcessing();\n }\n\n setShowAlert(!isOnline);\n\n if (!isOnline) {\n onInternetConnectionFailed();\n }\n } else if (isFailed) {\n setShowAlert(!isOnline);\n } else if (isOnline) {\n setShowAlert(false);\n }\n }, [isOnline, isQueryPending, isFailed]);\n\n return (\n <AlertMessage\n show={showAlert}\n variant=\"danger\"\n icon={WarningIcon}\n title={intl.formatMessage(messages.offlineWarningTitle)}\n description={intl.formatMessage(messages.offlineWarningDescription)}\n aria-hidden=\"true\"\n aria-labelledby={intl.formatMessage(\n messages.offlineWarningTitleAriaLabelledBy,\n )}\n aria-describedby={intl.formatMessage(\n messages.offlineWarningDescriptionAriaDescribedBy,\n )}\n />\n );\n};\n\nInternetConnectionAlert.defaultProps = {\n isQueryPending: false,\n onQueryProcessing: () => ({}),\n onInternetConnectionFailed: () => ({}),\n};\n\nInternetConnectionAlert.propTypes = {\n isFailed: PropTypes.bool.isRequired,\n isQueryPending: PropTypes.bool,\n onQueryProcessing: PropTypes.func,\n onInternetConnectionFailed: PropTypes.func,\n};\n\nexport default InternetConnectionAlert;\n","/* eslint-disable import/prefer-default-export */\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\nimport { convertObjectToSnakeCase } from '../../utils';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getCourseAdvancedSettingsApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v0/advanced_settings/${courseId}`;\nconst getProctoringErrorsApiUrl = () => `${getApiBaseUrl()}/api/contentstore/v1/proctoring_errors/`;\n\n/**\n * Get's advanced setting for a course.\n * @param {string} courseId\n * @returns {Promise<Object>}\n */\nexport async function getCourseAdvancedSettings(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(`${getCourseAdvancedSettingsApiUrl(courseId)}?fetch_all=0`);\n return camelCaseObject(data);\n}\n\n/**\n * Updates advanced setting for a course.\n * @param {string} courseId\n * @param {object} settings\n * @returns {Promise<Object>}\n */\nexport async function updateCourseAdvancedSettings(courseId, settings) {\n const { data } = await getAuthenticatedHttpClient()\n .patch(`${getCourseAdvancedSettingsApiUrl(courseId)}`, convertObjectToSnakeCase(settings));\n return camelCaseObject(data);\n}\n\n/**\n * Gets proctoring exam errors.\n * @param {string} courseId\n * @returns {Promise<Object>}\n */\nexport async function getProctoringExamErrors(courseId) {\n const { data } = await getAuthenticatedHttpClient().get(`${getProctoringErrorsApiUrl()}${courseId}`);\n return camelCaseObject(data);\n}\n","import { RequestStatus } from '../../data/constants';\nimport {\n getCourseAdvancedSettings,\n updateCourseAdvancedSettings,\n getProctoringExamErrors,\n} from './api';\nimport {\n fetchCourseAppsSettingsSuccess,\n updateCourseAppsSettingsSuccess,\n updateLoadingStatus,\n updateSavingStatus,\n fetchProctoringExamErrorsSuccess,\n getDataSendErrors,\n} from './slice';\n\nexport function fetchCourseAppSettings(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const settingValues = await getCourseAdvancedSettings(courseId);\n const sortedDisplayName = [];\n Object.values(settingValues).forEach(value => {\n const { displayName } = value;\n sortedDisplayName.push(displayName);\n });\n const sortedSettingValues = {};\n sortedDisplayName.sort().forEach((displayName => {\n Object.entries(settingValues).forEach(([key, value]) => {\n if (value.displayName === displayName) {\n sortedSettingValues[key] = value;\n }\n });\n }));\n dispatch(fetchCourseAppsSettingsSuccess(sortedSettingValues));\n dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.DENIED }));\n } else {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.FAILED }));\n }\n }\n };\n}\n\nexport function updateCourseAppSetting(courseId, settings) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const settingValues = await updateCourseAdvancedSettings(courseId, settings);\n dispatch(updateCourseAppsSettingsSuccess(settingValues));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n let errorData;\n try {\n const { customAttributes: { httpErrorResponseData } } = error;\n errorData = JSON.parse(httpErrorResponseData);\n } catch (err) {\n errorData = {};\n }\n\n dispatch(getDataSendErrors(errorData));\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport function fetchProctoringExamErrors(courseId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const settingValues = await getProctoringExamErrors(courseId);\n dispatch(fetchProctoringExamErrorsSuccess(settingValues));\n return true;\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n","export const getLoadingStatus = (state) => state.advancedSettings.loadingStatus;\nexport const getCourseAppSettings = state => state.advancedSettings.courseAppSettings;\nexport const getSavingStatus = (state) => state.advancedSettings.savingStatus;\nexport const getProctoringExamErrors = (state) => state.advancedSettings.proctoringErrors;\nexport const getSendRequestErrors = (state) => state.advancedSettings.sendRequestErrors.developer_message;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n deprecated: {\n id: 'course-authoring.advanced-settings.button.deprecated',\n defaultMessage: 'Deprecated',\n },\n helpButtonText: {\n id: 'course-authoring.advanced-settings.button.help',\n defaultMessage: 'Show help text',\n },\n});\n\nexport default messages;\n","import React, { useState } from 'react';\nimport {\n ActionRow,\n Card,\n Form,\n Icon,\n IconButton,\n ModalPopup,\n useToggle,\n} from '@openedx/paragon';\nimport { InfoOutline, Warning } from '@openedx/paragon/icons';\nimport PropTypes from 'prop-types';\nimport { capitalize } from 'lodash';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport TextareaAutosize from 'react-textarea-autosize';\n\nimport messages from './messages';\n\nconst SettingCard = ({\n name,\n settingData,\n handleBlur,\n setEdited,\n showSaveSettingsPrompt,\n saveSettingsPrompt,\n isEditableState,\n setIsEditableState,\n // injected\n intl,\n}) => {\n const { deprecated, help, displayName } = settingData;\n const initialValue = JSON.stringify(settingData.value, null, 4);\n const [isOpen, open, close] = useToggle(false);\n const [target, setTarget] = useState(null);\n const [newValue, setNewValue] = useState(initialValue);\n\n const handleSettingChange = (e) => {\n const { value } = e.target;\n setNewValue(e.target.value);\n if (value !== initialValue) {\n if (!saveSettingsPrompt) {\n showSaveSettingsPrompt(true);\n }\n if (!isEditableState) {\n setIsEditableState(true);\n }\n }\n };\n\n const handleCardBlur = () => {\n setEdited((prevEditedSettings) => ({\n ...prevEditedSettings,\n [name]: newValue,\n }));\n handleBlur();\n };\n\n return (\n <li className=\"field-group course-advanced-policy-list-item\">\n <Card className=\"flex-column setting-card\">\n <Card.Body className=\"d-flex row m-0 align-items-center\">\n <Card.Header\n className=\"col-6\"\n title={(\n <ActionRow>\n {capitalize(displayName)}\n <IconButton\n ref={setTarget}\n onClick={open}\n src={InfoOutline}\n iconAs={Icon}\n alt={intl.formatMessage(messages.helpButtonText)}\n variant=\"primary\"\n className=\"flex-shrink-0 ml-1 mr-2\"\n />\n <ModalPopup\n hasArrow\n placement=\"right\"\n positionRef={target}\n isOpen={isOpen}\n onClose={close}\n className=\"pgn__modal-popup__arrow\"\n >\n <div\n className=\"p-2 x-small rounded modal-popup-content\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: help }}\n />\n </ModalPopup>\n <ActionRow.Spacer />\n </ActionRow>\n )}\n />\n <Card.Section className=\"col-6 flex-grow-1\">\n <Form.Group className=\"m-0\">\n <Form.Control\n as={TextareaAutosize}\n value={isEditableState ? newValue : initialValue}\n name={name}\n onChange={handleSettingChange}\n aria-label={displayName}\n onBlur={handleCardBlur}\n />\n </Form.Group>\n </Card.Section>\n </Card.Body>\n {deprecated && (\n <Card.Status icon={Warning} variant=\"danger\">\n {intl.formatMessage(messages.deprecated)}\n </Card.Status>\n )}\n </Card>\n </li>\n );\n};\n\nSettingCard.propTypes = {\n intl: intlShape.isRequired,\n settingData: PropTypes.shape({\n deprecated: PropTypes.bool,\n help: PropTypes.string,\n displayName: PropTypes.string,\n value: PropTypes.PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.bool,\n PropTypes.number,\n PropTypes.object,\n PropTypes.array,\n ]),\n }).isRequired,\n setEdited: PropTypes.func.isRequired,\n showSaveSettingsPrompt: PropTypes.func.isRequired,\n name: PropTypes.string.isRequired,\n handleBlur: PropTypes.func.isRequired,\n saveSettingsPrompt: PropTypes.bool.isRequired,\n isEditableState: PropTypes.bool.isRequired,\n setIsEditableState: PropTypes.func.isRequired,\n};\n\nexport default injectIntl(SettingCard);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n about: {\n id: 'course-authoring.advanced-settings.sidebar.about.title',\n defaultMessage: 'What do advanced settings do?',\n },\n aboutDescription1: {\n id: 'course-authoring.advanced-settings.sidebar.about.description-1',\n defaultMessage: 'Advanced settings control specific course functionality. On this page, you can edit manual policies, which are JSON-based key and value pairs that control specific course settings.',\n },\n aboutDescription2: {\n id: 'course-authoring.advanced-settings.sidebar.about.description-2',\n defaultMessage: 'Any policies you modify here override all other information you’ve defined elsewhere in Studio. Do not edit policies unless you are familiar with both their purpose and syntax.',\n },\n other: {\n id: 'course-authoring.advanced-settings.sidebar.other.title',\n defaultMessage: 'Other course settings',\n },\n otherCourseSettingsLinkToScheduleAndDetails: {\n id: 'course-authoring.advanced-settings.sidebar.links.schedule-and-details',\n defaultMessage: 'Details & schedule',\n description: 'Link to Studio Details & schedule page',\n },\n otherCourseSettingsLinkToGrading: {\n id: 'course-authoring.advanced-settings.sidebar.links.grading',\n defaultMessage: 'Grading',\n description: 'Link to Studio Grading page',\n },\n otherCourseSettingsLinkToCourseTeam: {\n id: 'course-authoring.advanced-settings.sidebar.links.course-team',\n defaultMessage: 'Course team',\n description: 'Link to Studio Course team page',\n },\n otherCourseSettingsLinkToGroupConfigurations: {\n id: 'course-authoring.advanced-settings.sidebar.links.group-configurations',\n defaultMessage: 'Group configurations',\n description: 'Link to Studio Group configurations page',\n },\n otherCourseSettingsLinkToProctoredExamSettings: {\n id: 'course-authoring.advanced-settings.sidebar.links.proctored-exam-settings',\n defaultMessage: 'Proctored exam settings',\n description: 'Link to Proctored exam settings page',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport {\n FormattedMessage,\n injectIntl,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\n\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport messages from './messages';\n\nconst SettingsSidebar = ({ intl, courseId, proctoredExamSettingsUrl }) => (\n <HelpSidebar\n courseId={courseId}\n proctoredExamSettingsUrl={proctoredExamSettingsUrl}\n showOtherSettings\n >\n <h4 className=\"help-sidebar-about-title\">\n {intl.formatMessage(messages.about)}\n </h4>\n <p className=\"help-sidebar-about-descriptions\">\n {intl.formatMessage(messages.aboutDescription1)}\n </p>\n <p className=\"help-sidebar-about-descriptions\">\n {intl.formatMessage(messages.aboutDescription2)}\n </p>\n <p className=\"help-sidebar-about-descriptions\">\n <FormattedMessage\n id=\"course-authoring.advanced-settings.about.description-3\"\n defaultMessage=\"{notice} When you enter strings as policy values, ensure that you use double quotation marks (“) around the string. Do not use single quotation marks (‘).\"\n values={{ notice: <strong>Note:</strong> }}\n />\n </p>\n </HelpSidebar>\n);\n\nSettingsSidebar.defaultProps = {\n proctoredExamSettingsUrl: '',\n};\n\nSettingsSidebar.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n proctoredExamSettingsUrl: PropTypes.string,\n};\n\nexport default injectIntl(SettingsSidebar);\n","/**\n * Validates advanced settings data by checking if the provided settings are correctly formatted JSON.\n * It performs validation on a given object of settings, detects incorrectly formatted settings,\n * and sets error fields accordingly using the setErrorFields function.\n *\n * @param {object} settingObj - The object containing the settings to validate.\n * @param {function} setErrorFields - The function to set error fields.\n * @returns {boolean} - `true` if the data is valid, otherwise `false`.\n */\nexport default function validateAdvancedSettingsData(settingObj, setErrorFields, setEditedSettings) {\n const fieldsWithErrors = [];\n\n const pushDataToErrorArray = (settingName) => {\n fieldsWithErrors.push({ key: settingName, message: 'Incorrectly formatted JSON' });\n };\n\n Object.entries(settingObj).forEach(([settingName, settingValue]) => {\n try {\n JSON.parse(settingValue);\n } catch (e) {\n let targetSettingValue = settingValue;\n const firstNonWhite = settingValue.substring(0, 1);\n const isValid = !['{', '[', \"'\"].includes(firstNonWhite);\n\n if (isValid) {\n try {\n targetSettingValue = `\"${ targetSettingValue.trim() }\"`;\n JSON.parse(targetSettingValue);\n setEditedSettings((prevEditedSettings) => ({\n ...prevEditedSettings,\n [settingName]: targetSettingValue,\n }));\n } catch (quotedE) { /* empty */ }\n }\n\n pushDataToErrorArray(settingName);\n }\n });\n\n setErrorFields((prevState) => {\n if (JSON.stringify(prevState) !== JSON.stringify(fieldsWithErrors)) {\n return fieldsWithErrors;\n }\n return prevState;\n });\n\n return fieldsWithErrors.length === 0;\n}\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.advanced-settings.heading.title',\n defaultMessage: 'Advanced settings',\n },\n headingSubtitle: {\n id: 'course-authoring.advanced-settings.heading.subtitle',\n defaultMessage: 'Settings',\n },\n policy: {\n id: 'course-authoring.advanced-settings.policies.title',\n defaultMessage: 'Manual policy definition',\n },\n alertWarning: {\n id: 'course-authoring.advanced-settings.alert.warning',\n defaultMessage: \"You've made some changes\",\n },\n alertWarningDescriptions: {\n id: 'course-authoring.advanced-settings.alert.warning.descriptions',\n defaultMessage: 'Your changes will not take effect until you save your progress. Take care with key and value formatting, as validation is not implemented.',\n },\n alertSuccess: {\n id: 'course-authoring.advanced-settings.alert.success',\n defaultMessage: 'Your policy changes have been saved.',\n },\n alertSuccessDescriptions: {\n id: 'course-authoring.advanced-settings.alert.success.descriptions',\n defaultMessage: 'No validation is performed on policy keys or value pairs. If you are having difficulties, check your formatting.',\n },\n alertProctoringError: {\n id: 'course-authoring.advanced-settings.alert.proctoring.error',\n defaultMessage: 'This course has protected exam setting that are incomplete or invalid.',\n },\n alertProctoringErrorDescriptions: {\n id: 'course-authoring.advanced-settings.alert.proctoring.error.descriptions',\n defaultMessage: 'You will be unable to make changes until the following setting are updated on the page below.',\n },\n buttonSaveText: {\n id: 'course-authoring.advanced-settings.alert.button.save',\n defaultMessage: 'Save changes',\n },\n buttonSavingText: {\n id: 'course-authoring.advanced-settings.alert.button.saving',\n defaultMessage: 'Saving',\n },\n buttonCancelText: {\n id: 'course-authoring.advanced-settings.alert.button.cancel',\n defaultMessage: 'Cancel',\n },\n deprecatedButtonShowText: {\n id: 'course-authoring.advanced-settings.deprecated.button.show',\n defaultMessage: 'Show',\n },\n deprecatedButtonHideText: {\n id: 'course-authoring.advanced-settings.deprecated.button.hide',\n defaultMessage: 'Hide',\n },\n alertWarningAriaLabelledby: {\n id: 'course-authoring.advanced-settings.alert.warning.aria.labelledby',\n defaultMessage: 'notification-warning-title',\n },\n alertWarningAriaDescribedby: {\n id: 'course-authoring.advanced-settings.alert.warning.aria.describedby',\n defaultMessage: 'notification-warning-description',\n },\n alertSuccessAriaLabelledby: {\n id: 'course-authoring.advanced-settings.alert.success.aria.labelledby',\n defaultMessage: 'alert-confirmation-title',\n },\n alertSuccessAriaDescribedby: {\n id: 'course-authoring.advanced-settings.alert.success.aria.describedby',\n defaultMessage: 'alert-confirmation-description',\n },\n alertProctoringAriaLabelledby: {\n id: 'course-authoring.advanced-settings.alert.proctoring.error.aria.labelledby',\n defaultMessage: 'alert-danger-title',\n },\n alertProctoringDescribedby: {\n id: 'course-authoring.advanced-settings.alert.proctoring.error.aria.describedby',\n defaultMessage: 'alert-danger-description',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Icon } from '@openedx/paragon';\nimport { Error } from '@openedx/paragon/icons';\nimport { capitalize } from 'lodash';\n\nimport { transformKeysToCamelCase } from '../../utils';\n\nconst ModalErrorListItem = ({ settingName, settingsData }) => {\n const { displayName } = settingsData[transformKeysToCamelCase(settingName)];\n return (\n <li className=\"modal-error-item\">\n <Alert variant=\"danger\">\n <h4 className=\"modal-error-item-title\">\n <Icon src={Error} />{capitalize(displayName)}:\n </h4>\n <p className=\"m-0\">{settingName.message}</p>\n </Alert>\n </li>\n );\n};\n\nModalErrorListItem.propTypes = {\n settingName: PropTypes.shape({\n key: PropTypes.string,\n message: PropTypes.string,\n }).isRequired,\n settingsData: PropTypes.shape({}).isRequired,\n};\n\nexport default ModalErrorListItem;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n modalErrorTitle: {\n id: 'course-authoring.advanced-settings.modal.error.title',\n defaultMessage: 'Validation error while saving',\n },\n modalErrorButtonChangeManually: {\n id: 'course-authoring.advanced-settings.modal.error.btn.change-manually',\n defaultMessage: 'Change manually',\n },\n modalErrorButtonUndoChanges: {\n id: 'course-authoring.advanced-settings.modal.error.btn.undo-changes',\n defaultMessage: 'Undo changes',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { ActionRow, AlertModal, Button } from '@openedx/paragon';\nimport { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';\n\nimport ModalErrorListItem from './ModalErrorListItem';\nimport messages from './messages';\n\nconst ModalError = ({\n intl, isError, handleUndoChanges, showErrorModal, errorList, settingsData,\n}) => (\n <AlertModal\n title={intl.formatMessage(messages.modalErrorTitle)}\n isOpen={isError}\n variant=\"danger\"\n footerNode={(\n <ActionRow>\n <Button\n variant=\"tertiary\"\n onClick={() => showErrorModal(!isError)}\n >\n {intl.formatMessage(messages.modalErrorButtonChangeManually)}\n </Button>\n <Button onClick={handleUndoChanges}>\n {intl.formatMessage(messages.modalErrorButtonUndoChanges)}\n </Button>\n </ActionRow>\n )}\n >\n <p>\n <FormattedMessage\n id=\"course-authoring.advanced-settings.modal.error.description\"\n defaultMessage=\"There was {errorCounter} while trying to save the course settings in the database.\n Please check the following validation feedbacks and reflect them in your course settings:\"\n values={{ errorCounter: <strong>{errorList.length} validation error </strong> }}\n />\n </p>\n <hr />\n <ul className=\"p-0\">\n {errorList.map((settingName) => (\n <ModalErrorListItem\n key={settingName.key}\n settingName={settingName}\n settingsData={settingsData}\n />\n ))}\n </ul>\n </AlertModal>\n);\n\nModalError.propTypes = {\n intl: intlShape.isRequired,\n isError: PropTypes.bool.isRequired,\n handleUndoChanges: PropTypes.func.isRequired,\n showErrorModal: PropTypes.func.isRequired,\n errorList: PropTypes.arrayOf(PropTypes.shape({\n key: PropTypes.string,\n message: PropTypes.string,\n })).isRequired,\n settingsData: PropTypes.shape({}).isRequired,\n};\n\nexport default injectIntl(ModalError);\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n Container, Button, Layout, StatefulButton, TransitionReplace,\n} from '@openedx/paragon';\nimport { CheckCircle, Info, Warning } from '@openedx/paragon/icons';\nimport { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport Placeholder from '@edx/frontend-lib-content-components';\n\nimport AlertProctoringError from '../generic/AlertProctoringError';\nimport { useModel } from '../generic/model-store';\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport { parseArrayOrObjectValues } from '../utils';\nimport { RequestStatus } from '../data/constants';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport AlertMessage from '../generic/alert-message';\nimport { fetchCourseAppSettings, updateCourseAppSetting, fetchProctoringExamErrors } from './data/thunks';\nimport {\n getCourseAppSettings, getSavingStatus, getProctoringExamErrors, getSendRequestErrors, getLoadingStatus,\n} from './data/selectors';\nimport SettingCard from './setting-card/SettingCard';\nimport SettingsSidebar from './settings-sidebar/SettingsSidebar';\nimport validateAdvancedSettingsData from './utils';\nimport messages from './messages';\nimport ModalError from './modal-error/ModalError';\nimport getPageHeadTitle from '../generic/utils';\n\nconst AdvancedSettings = ({ intl, courseId }) => {\n const dispatch = useDispatch();\n const [saveSettingsPrompt, showSaveSettingsPrompt] = useState(false);\n const [showDeprecated, setShowDeprecated] = useState(false);\n const [errorModal, showErrorModal] = useState(false);\n const [editedSettings, setEditedSettings] = useState({});\n const [errorFields, setErrorFields] = useState([]);\n const [showSuccessAlert, setShowSuccessAlert] = useState(false);\n const [isQueryPending, setIsQueryPending] = useState(false);\n const [isEditableState, setIsEditableState] = useState(false);\n const [hasInternetConnectionError, setInternetConnectionError] = useState(false);\n\n const courseDetails = useModel('courseDetails', courseId);\n document.title = getPageHeadTitle(courseDetails?.name, intl.formatMessage(messages.headingTitle));\n\n useEffect(() => {\n dispatch(fetchCourseAppSettings(courseId));\n dispatch(fetchProctoringExamErrors(courseId));\n }, [courseId]);\n\n const advancedSettingsData = useSelector(getCourseAppSettings);\n const savingStatus = useSelector(getSavingStatus);\n const proctoringExamErrors = useSelector(getProctoringExamErrors);\n const settingsWithSendErrors = useSelector(getSendRequestErrors) || {};\n const loadingSettingsStatus = useSelector(getLoadingStatus);\n\n const isLoading = loadingSettingsStatus === RequestStatus.IN_PROGRESS;\n const updateSettingsButtonState = {\n labels: {\n default: intl.formatMessage(messages.buttonSaveText),\n pending: intl.formatMessage(messages.buttonSavingText),\n },\n disabledStates: ['pending'],\n };\n const {\n proctoringErrors,\n mfeProctoredExamSettingsUrl,\n } = proctoringExamErrors;\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n setIsQueryPending(false);\n setShowSuccessAlert(true);\n setIsEditableState(false);\n setTimeout(() => setShowSuccessAlert(false), 15000);\n window.scrollTo({ top: 0, behavior: 'smooth' });\n showSaveSettingsPrompt(false);\n } else if (savingStatus === RequestStatus.FAILED && !hasInternetConnectionError) {\n setErrorFields(settingsWithSendErrors);\n showErrorModal(true);\n }\n }, [savingStatus]);\n\n if (isLoading) {\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return <></>;\n }\n if (loadingSettingsStatus === RequestStatus.DENIED) {\n return (\n <div className=\"row justify-content-center m-6\">\n <Placeholder />\n </div>\n );\n }\n\n const handleResetSettingsValues = () => {\n setIsEditableState(false);\n showErrorModal(false);\n setEditedSettings({});\n showSaveSettingsPrompt(false);\n };\n\n const handleSettingBlur = () => {\n validateAdvancedSettingsData(editedSettings, setErrorFields, setEditedSettings);\n };\n\n const handleUpdateAdvancedSettingsData = () => {\n const isValid = validateAdvancedSettingsData(editedSettings, setErrorFields, setEditedSettings);\n if (isValid) {\n setIsQueryPending(true);\n } else {\n showSaveSettingsPrompt(false);\n showErrorModal(!errorModal);\n }\n };\n\n const handleInternetConnectionFailed = () => {\n setInternetConnectionError(true);\n showSaveSettingsPrompt(false);\n setShowSuccessAlert(false);\n };\n\n const handleQueryProcessing = () => {\n setShowSuccessAlert(false);\n dispatch(updateCourseAppSetting(courseId, parseArrayOrObjectValues(editedSettings)));\n };\n\n const handleManuallyChangeClick = (setToState) => {\n showErrorModal(setToState);\n showSaveSettingsPrompt(true);\n };\n\n return (\n <>\n <Container size=\"xl\" className=\"advanced-settings px-4\">\n <div className=\"setting-header mt-5\">\n {(proctoringErrors?.length > 0) && (\n <AlertProctoringError\n icon={Info}\n proctoringErrorsData={proctoringErrors}\n aria-hidden=\"true\"\n aria-labelledby={intl.formatMessage(messages.alertProctoringAriaLabelledby)}\n aria-describedby={intl.formatMessage(messages.alertProctoringDescribedby)}\n />\n )}\n <TransitionReplace>\n {showSuccessAlert ? (\n <AlertMessage\n key={intl.formatMessage(messages.alertSuccessAriaLabelledby)}\n show={showSuccessAlert}\n variant=\"success\"\n icon={CheckCircle}\n title={intl.formatMessage(messages.alertSuccess)}\n description={intl.formatMessage(messages.alertSuccessDescriptions)}\n aria-hidden=\"true\"\n aria-labelledby={intl.formatMessage(messages.alertSuccessAriaLabelledby)}\n aria-describedby={intl.formatMessage(messages.alertSuccessAriaDescribedby)}\n />\n ) : null}\n </TransitionReplace>\n </div>\n <section className=\"setting-items mb-4\">\n <Layout\n lg={[{ span: 9 }, { span: 3 }]}\n md={[{ span: 9 }, { span: 3 }]}\n sm={[{ span: 9 }, { span: 3 }]}\n xs={[{ span: 9 }, { span: 3 }]}\n xl={[{ span: 9 }, { span: 3 }]}\n >\n <Layout.Element>\n <SubHeader\n subtitle={intl.formatMessage(messages.headingSubtitle)}\n title={intl.formatMessage(messages.headingTitle)}\n contentTitle={intl.formatMessage(messages.policy)}\n />\n <article>\n <div>\n <section className=\"setting-items-policies\">\n <div className=\"small\">\n <FormattedMessage\n id=\"course-authoring.advanced-settings.policies.description\"\n defaultMessage=\"{notice} Do not modify these policies unless you are familiar with their purpose.\"\n values={{ notice: <strong>Warning: </strong> }}\n />\n </div>\n <div className=\"setting-items-deprecated-setting\">\n <Button\n variant={showDeprecated ? 'outline-brand' : 'tertiary'}\n onClick={() => setShowDeprecated(!showDeprecated)}\n size=\"sm\"\n >\n <FormattedMessage\n id=\"course-authoring.advanced-settings.deprecated.button.text\"\n defaultMessage=\"{visibility} deprecated settings\"\n values={{\n visibility:\n showDeprecated ? intl.formatMessage(messages.deprecatedButtonHideText)\n : intl.formatMessage(messages.deprecatedButtonShowText),\n }}\n />\n </Button>\n </div>\n <ul className=\"setting-items-list p-0\">\n {Object.keys(advancedSettingsData).map((settingName) => {\n const settingData = advancedSettingsData[settingName];\n if (settingData.deprecated && !showDeprecated) {\n return null;\n }\n return (\n <SettingCard\n key={settingName}\n settingData={settingData}\n name={settingName}\n showSaveSettingsPrompt={showSaveSettingsPrompt}\n saveSettingsPrompt={saveSettingsPrompt}\n setEdited={setEditedSettings}\n handleBlur={handleSettingBlur}\n isEditableState={isEditableState}\n setIsEditableState={setIsEditableState}\n />\n );\n })}\n </ul>\n </section>\n </div>\n </article>\n </Layout.Element>\n <Layout.Element>\n <SettingsSidebar\n courseId={courseId}\n proctoredExamSettingsUrl={mfeProctoredExamSettingsUrl}\n />\n </Layout.Element>\n </Layout>\n </section>\n </Container>\n <div className=\"alert-toast\">\n {isQueryPending && (\n <InternetConnectionAlert\n isFailed={savingStatus === RequestStatus.FAILED}\n isQueryPending={isQueryPending}\n onQueryProcessing={handleQueryProcessing}\n onInternetConnectionFailed={handleInternetConnectionFailed}\n />\n )}\n <AlertMessage\n show={saveSettingsPrompt}\n aria-hidden={saveSettingsPrompt}\n aria-labelledby={intl.formatMessage(messages.alertWarningAriaLabelledby)}\n aria-describedby={intl.formatMessage(messages.alertWarningAriaDescribedby)}\n role=\"dialog\"\n actions={[\n !isQueryPending && (\n <Button variant=\"tertiary\" onClick={handleResetSettingsValues}>\n {intl.formatMessage(messages.buttonCancelText)}\n </Button>\n ),\n <StatefulButton\n key=\"statefulBtn\"\n onClick={handleUpdateAdvancedSettingsData}\n state={isQueryPending ? RequestStatus.PENDING : 'default'}\n {...updateSettingsButtonState}\n />,\n ].filter(Boolean)}\n variant=\"warning\"\n icon={Warning}\n title={intl.formatMessage(messages.alertWarning)}\n description={intl.formatMessage(messages.alertWarningDescriptions)}\n />\n </div>\n <ModalError\n isError={errorModal}\n showErrorModal={(setToState) => handleManuallyChangeClick(setToState)}\n handleUndoChanges={handleResetSettingsValues}\n settingsData={advancedSettingsData}\n errorList={errorFields.length > 0 ? errorFields : []}\n />\n </>\n );\n};\n\nAdvancedSettings.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(AdvancedSettings);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.course-outline.configure-modal.title',\n defaultMessage: '{title} settings',\n },\n componentTitle: {\n id: 'course-authoring.course-outline.configure-modal.component.title',\n defaultMessage: 'Editing access for: {title}',\n description: 'The visibility modal title for unit',\n },\n basicTabTitle: {\n id: 'course-authoring.course-outline.configure-modal.basic-tab.title',\n defaultMessage: 'Basic',\n },\n notGradedTypeOption: {\n id: 'course-authoring.course-outline.configure-modal.basic-tab.notGradedTypeOption',\n defaultMessage: 'Not Graded',\n },\n releaseDateAndTime: {\n id: 'course-authoring.course-outline.configure-modal.basic-tab.release-date-and-time',\n defaultMessage: 'Release date and time',\n },\n releaseDate: {\n id: 'course-authoring.course-outline.configure-modal.basic-tab.release-date',\n defaultMessage: 'Release date:',\n },\n releaseTimeUTC: {\n id: 'course-authoring.course-outline.configure-modal.basic-tab.release-time-UTC',\n defaultMessage: 'Release time in UTC:',\n },\n visibilityTabTitle: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.title',\n defaultMessage: 'Visibility',\n },\n visibilitySectionTitle: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.section-visibility',\n defaultMessage: '{visibilityTitle} visibility',\n },\n unitVisibility: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.unit-visibility',\n defaultMessage: 'Unit visibility',\n },\n hideFromLearners: {\n id: 'course-authoring.course-outline.configure-modal.visibility.hide-from-learners',\n defaultMessage: 'Hide from learners',\n },\n restrictAccessTo: {\n id: 'course-authoring.course-outline.configure-modal.visibility.restrict-access-to',\n defaultMessage: 'Restrict access to',\n },\n sectionVisibilityWarning: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.section-visibility-warning',\n defaultMessage: 'If you make this section visible to learners, learners will be able to see its content after the release date has passed and you have published the section. Only units that are explicitly hidden from learners will remain hidden after you clear this option for the section.',\n },\n unitVisibilityWarning: {\n id: 'course-authoring.course-outline.configure-modal.unit-tab.unit-visibility-warning',\n defaultMessage: 'If the unit was previously published and released to learners, any changes you made to the unit when it was hidden will now be visible to learners.',\n },\n subsectionVisibilityWarning: {\n id: 'course-authoring.course-outline.configure-modal.unit-tab.subsection-visibility-warning',\n defaultMessage: 'If you select an option other than \"Hide entire subsection\", published units in this subsection will become available to learners unless they are explicitly hidden.',\n },\n unitSelectGroup: {\n id: 'course-authoring.course-outline.configure-modal.unit-tab.unit-select-group',\n defaultMessage: 'Select one or more groups:',\n },\n unitSelectGroupType: {\n id: 'course-authoring.course-outline.configure-modal.unit-tab.unit-select-group-type',\n defaultMessage: 'Select a group type',\n },\n unitSelectDeletedGroupErrorMessage: {\n id: 'course-authoring.course-outline.configure-modal.unit-tab.unit-select-group-deleted-error-message',\n defaultMessage: 'This group no longer exists. Choose another group or remove the access restriction.',\n description: 'The alert text of no longer available group',\n },\n unitAllLearnersAndStaff: {\n id: 'course-authoring.course-outline.configure-modal.unit-tab.unit-all-learners-staff',\n defaultMessage: 'All Learners and Staff',\n },\n cancelButton: {\n id: 'course-authoring.course-outline.configure-modal.button.cancel',\n defaultMessage: 'Cancel',\n },\n saveButton: {\n id: 'course-authoring.course-outline.configure-modal.button.label',\n defaultMessage: 'Save',\n },\n grading: {\n id: 'course-authoring.course-outline.configure-modal.basic-tab.grading',\n defaultMessage: 'Grading',\n },\n gradeAs: {\n id: 'course-authoring.course-outline.configure-modal.basic-tab.grade-as',\n defaultMessage: 'Grade as:',\n },\n dueDate: {\n id: 'course-authoring.course-outline.configure-modal.basic-tab.due-date',\n defaultMessage: 'Due date:',\n },\n dueTimeUTC: {\n id: 'course-authoring.course-outline.configure-modal.basic-tab.due-time-UTC',\n defaultMessage: 'Due time in UTC:',\n },\n subsectionVisibility: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.subsection-visibility',\n defaultMessage: 'Subsection visibility',\n },\n showEntireSubsection: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.show-entire-subsection',\n defaultMessage: 'Show entire subsection',\n },\n showEntireSubsectionDescription: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.show-entire-subsection-description',\n defaultMessage: 'Learners see the published subsection and can access its content',\n },\n hideContentAfterDue: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.hide-content-after-due',\n defaultMessage: 'Hide content after due date',\n },\n hideContentAfterDueDescription: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.hide-content-after-due-description',\n defaultMessage: 'After the subsection\\'s due date has passed, learners can no longer access its content. The subsection is not included in grade calculations.',\n },\n hideEntireSubsection: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.hide-entire-subsection',\n defaultMessage: 'Hide entire subsection',\n },\n hideEntireSubsectionDescription: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.hide-entire-subsection-description',\n defaultMessage: 'Learners do not see the subsection in the course outline. The subsection is not included in grade calculations.',\n },\n assessmentResultsVisibility: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.assessment-results-visibility',\n defaultMessage: 'Assessment Results Visibility',\n },\n alwaysShowAssessmentResults: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.always-show-assessment-results',\n defaultMessage: 'Always show assessment results',\n },\n alwaysShowAssessmentResultsDescription: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.always-show-assessment-results-description',\n defaultMessage: 'When learners submit an answer to an assessment, they immediately see whether the answer is correct or incorrect, and the score received.',\n },\n neverShowAssessmentResults: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.never-show-assessment-results',\n defaultMessage: 'Never show assessment results',\n },\n neverShowAssessmentResultsDescription: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.never-show-assessment-results-description',\n defaultMessage: 'Learners never see whether their answers to assessments are correct or incorrect, nor the score received.',\n },\n showAssessmentResultsPastDue: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.show-assessment-results-past-due',\n defaultMessage: 'Show assessment results when subsection is past due',\n },\n showAssessmentResultsPastDueDescription: {\n id: 'course-authoring.course-outline.configure-modal.visibility-tab.show-assessment-results-past-due-description',\n defaultMessage: 'Learners do not see whether their answer to assessments were correct or incorrect, nor the score received, until after the due date for the subsection has passed. If the subsection does not have a due date, learners always see their scores when they submit answers to assessments.',\n },\n setSpecialExam: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.set-special-exam',\n defaultMessage: 'Set as a special exam',\n },\n none: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.none',\n defaultMessage: 'None',\n },\n timed: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.timed',\n defaultMessage: 'Timed',\n },\n timedDescription: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.timed-description',\n defaultMessage: 'Use a timed exam to limit the time learners can spend on problems in this subsection. Learners must submit answers before the time expires. You can allow additional time for individual learners through the instructor Dashboard.',\n },\n proctoredExam: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.proctoredExam',\n defaultMessage: 'Proctored',\n },\n proctoredExamDescription: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.timed-description',\n defaultMessage: 'Proctored exams are timed and they record video of each learner taking the exam. The videos are then reviewed to ensure that learners follow all examination rules. Please note that setting this exam as proctored will change the visibility settings to \"Hide content after due date.\"',\n },\n onboardingExam: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.onboardingExam',\n defaultMessage: 'Onboarding',\n },\n onboardingExamDescription: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.timed-description',\n defaultMessage: 'Use Onboarding to introduce learners to proctoring, verify their identity, and create an onboarding profile. Learners must complete the onboarding profile step prior to taking a proctored exam. Profile reviews take 2+ business days.',\n },\n practiceExam: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.practiceExam',\n defaultMessage: 'Practice proctored',\n },\n practiceExamDescription: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.timed-description',\n defaultMessage: 'Use a practice proctored exam to introduce learners to the proctoring tools and processes. Results of a practice exam do not affect a learner\\'s grade.',\n },\n advancedTabTitle: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.title',\n defaultMessage: 'Advanced',\n },\n timeAllotted: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.time-allotted',\n defaultMessage: 'Time allotted (HH:MM):',\n },\n timeLimitDescription: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.time-limit-description',\n defaultMessage: 'Select a time allotment for the exam. If it is over 24 hours, type in the amount of time. You can grant individual learners extra time to complete the exam through the Instructor Dashboard.',\n },\n prereqTitle: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.prereqTitle',\n defaultMessage: 'Use as a Prerequisite',\n },\n prereqCheckboxLabel: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.prereqCheckboxLabel',\n defaultMessage: 'Make this subsection available as a prerequisite to other content',\n },\n limitAccessTitle: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.limitAccessTitle',\n defaultMessage: 'Limit access',\n },\n limitAccessDescription: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.limitAccessDescription',\n defaultMessage: 'Select a prerequisite subsection and enter a minimum score percentage and minimum completion percentage to limit access to this subsection. Allowed values are 0-100',\n },\n noPrerequisiteOption: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.noPrerequisiteOption',\n defaultMessage: 'No prerequisite',\n },\n prerequisiteSelectLabel: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.prerequisiteSelectLabel',\n defaultMessage: 'Prerequisite:',\n },\n minScoreLabel: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.minScoreLabel',\n defaultMessage: 'Minimum score:',\n },\n minCompletionLabel: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.minCompletionLabel',\n defaultMessage: 'Minimum completion:',\n },\n minScoreError: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.minScoreError',\n defaultMessage: 'The minimum score percentage must be a whole number between 0 and 100.',\n },\n minCompletionError: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.minCompletionError',\n defaultMessage: 'The minimum completion percentage must be a whole number between 0 and 100.',\n },\n proctoredExamLockedAndisNotProctoredExamAlert: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.proctoredExamLockedAndisNotProctoredExamAlert',\n defaultMessage: 'This subsection was released to learners as a proctored exam, but was reverted back to a basic or timed exam. You may not configure it as a proctored exam now. Contact edX Support for assistance.',\n },\n proctoredExamLockedAndisProctoredExamAlert: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.proctoredExamLockedAndisProctoredExamAlert',\n defaultMessage: 'This proctored exam has been released to learners. You may not convert it to another type of special exam. You may revert this subsection back to being a basic exam by selecting \\'None\\', or a timed exam, but you will NOT be able to configure it as a proctored exam in the future.',\n },\n reviewRulesLabel: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.reviewRulesLabel',\n defaultMessage: 'Review rules',\n },\n reviewRulesDescription: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.reviewRulesDescription',\n defaultMessage: 'Specify any rules or rule exceptions that the proctoring review team should enforce when reviewing the videos. For example, you could specify that calculators are allowed. These specified rules are visible to learners before the learners start the exam.',\n },\n reviewRulesDescriptionWithLink: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.reviewRulesDescriptionWithLink',\n defaultMessage: 'Specify any rules or rule exceptions that the proctoring review team should enforce when reviewing the videos. For example, you could specify that calculators are allowed. These specified rules are visible to learners before the learners start the exam, along with the {hyperlink}.',\n },\n reviewRulesDescriptionLinkText: {\n id: 'course-authoring.course-outline.configure-modal.advanced-tab.reviewRulesDescriptionLinkText',\n defaultMessage: 'general proctored exam rules',\n },\n});\n\nexport default messages;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n calendarAltText: {\n id: 'course-authoring.schedule.schedule-section.alt-text',\n defaultMessage: 'Calendar for datepicker input',\n },\n datepickerUTC: {\n id: 'course-authoring.schedule.schedule-section.datepicker.utc',\n defaultMessage: 'UTC',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport DatePicker from 'react-datepicker/dist';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Form, Icon } from '@openedx/paragon';\nimport { Calendar } from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { convertToDateFromString, convertToStringFromDate, isValidDate } from '../../utils';\nimport { DATE_FORMAT, TIME_FORMAT } from '../../constants';\nimport messages from './messages';\n\nexport const DATEPICKER_TYPES = {\n date: 'date',\n time: 'time',\n};\n\nconst DatepickerControl = ({\n type,\n label,\n value,\n showUTC,\n readonly,\n helpText,\n isInvalid,\n controlName,\n onChange,\n}) => {\n const intl = useIntl();\n const formattedDate = convertToDateFromString(value);\n const inputFormat = {\n [DATEPICKER_TYPES.date]: DATE_FORMAT,\n [DATEPICKER_TYPES.time]: TIME_FORMAT,\n };\n\n return (\n <Form.Group className=\"form-group-custom datepicker-custom\">\n <Form.Label className=\"d-flex justify-content-between\">\n {label}\n {showUTC && (\n <span className=\"h6 font-weight-normal text-gray-500 mb-0\">\n ({intl.formatMessage(messages.datepickerUTC)})\n </span>\n )}\n </Form.Label>\n <div className=\"position-relative\">\n {type === DATEPICKER_TYPES.date && !readonly && (\n <Icon\n src={Calendar}\n className=\"datepicker-custom-control-icon\"\n alt={intl.formatMessage(messages.calendarAltText)}\n />\n )}\n <DatePicker\n name={controlName}\n selected={formattedDate}\n disabled={readonly}\n dateFormat={inputFormat[type]}\n timeFormat={inputFormat[type]}\n className={classNames('datepicker-custom-control', {\n 'datepicker-custom-control_readonly': readonly,\n 'datepicker-custom-control_isInvalid': isInvalid,\n })}\n autoComplete=\"off\"\n selectsStart\n showTimeSelect={type === DATEPICKER_TYPES.time}\n showTimeSelectOnly={type === DATEPICKER_TYPES.time}\n placeholderText={inputFormat[type].toLocaleUpperCase()}\n showPopperArrow={false}\n onChange={(date) => {\n if (isValidDate(date)) {\n onChange(convertToStringFromDate(date));\n }\n }}\n />\n </div>\n {helpText && <Form.Control.Feedback>{helpText}</Form.Control.Feedback>}\n </Form.Group>\n );\n};\n\nDatepickerControl.defaultProps = {\n helpText: '',\n showUTC: false,\n value: '',\n readonly: false,\n isInvalid: false,\n};\n\nDatepickerControl.propTypes = {\n type: PropTypes.oneOf(Object.values(DATEPICKER_TYPES)).isRequired,\n value: PropTypes.string,\n label: PropTypes.string.isRequired,\n showUTC: PropTypes.bool,\n helpText: PropTypes.string,\n readonly: PropTypes.bool,\n isInvalid: PropTypes.bool,\n controlName: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default DatepickerControl;\n","import PropTypes from 'prop-types';\nimport { Stack, Form } from '@openedx/paragon';\nimport { FormattedMessage, injectIntl, useIntl } from '@edx/frontend-platform/i18n';\n\nimport { DatepickerControl, DATEPICKER_TYPES } from '../datepicker-control';\nimport messages from './messages';\n\nconst BasicTab = ({\n values,\n setFieldValue,\n courseGraders,\n isSubsection,\n}) => {\n const intl = useIntl();\n\n const {\n releaseDate,\n graderType,\n dueDate,\n } = values;\n\n const onChangeGraderType = (e) => setFieldValue('graderType', e.target.value);\n\n const createOptions = () => courseGraders.map((option) => (\n <option key={option} value={option}> {option} </option>\n ));\n\n return (\n <>\n <h5 className=\"mt-4 text-gray-700\"><FormattedMessage {...messages.releaseDateAndTime} /></h5>\n <hr />\n <div data-testid=\"release-date-stack\">\n <Stack className=\"mt-3\" direction=\"horizontal\" gap={5}>\n <DatepickerControl\n type={DATEPICKER_TYPES.date}\n value={releaseDate}\n label={intl.formatMessage(messages.releaseDate)}\n controlName=\"state-date\"\n onChange={(val) => setFieldValue('releaseDate', val)}\n />\n <DatepickerControl\n type={DATEPICKER_TYPES.time}\n value={releaseDate}\n label={intl.formatMessage(messages.releaseTimeUTC)}\n controlName=\"start-time\"\n onChange={(val) => setFieldValue('releaseDate', val)}\n />\n </Stack>\n </div>\n {\n isSubsection && (\n <div>\n <h5 className=\"mt-4 text-gray-700\"><FormattedMessage {...messages.grading} /></h5>\n <hr />\n <Form.Group>\n <Form.Label><FormattedMessage {...messages.gradeAs} /></Form.Label>\n <Form.Control\n as=\"select\"\n defaultValue={graderType}\n onChange={onChangeGraderType}\n data-testid=\"grader-type-select\"\n >\n <option key=\"notgraded\" value=\"notgraded\">\n {intl.formatMessage(messages.notGradedTypeOption)}\n </option>\n {createOptions()}\n </Form.Control>\n </Form.Group>\n <div data-testid=\"due-date-stack\">\n <Stack className=\"mt-3\" direction=\"horizontal\" gap={5}>\n <DatepickerControl\n type={DATEPICKER_TYPES.date}\n value={dueDate}\n label={intl.formatMessage(messages.dueDate)}\n controlName=\"state-date\"\n onChange={(val) => setFieldValue('dueDate', val)}\n data-testid=\"due-date-picker\"\n />\n <DatepickerControl\n type={DATEPICKER_TYPES.time}\n value={dueDate}\n label={intl.formatMessage(messages.dueTimeUTC)}\n controlName=\"start-time\"\n onChange={(val) => setFieldValue('dueDate', val)}\n />\n </Stack>\n </div>\n </div>\n )\n }\n </>\n );\n};\n\nBasicTab.propTypes = {\n isSubsection: PropTypes.bool.isRequired,\n values: PropTypes.shape({\n releaseDate: PropTypes.string.isRequired,\n graderType: PropTypes.string.isRequired,\n dueDate: PropTypes.string,\n }).isRequired,\n courseGraders: PropTypes.arrayOf(PropTypes.string).isRequired,\n setFieldValue: PropTypes.func.isRequired,\n};\n\nexport default injectIntl(BasicTab);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Form } from '@openedx/paragon';\nimport { FormattedMessage, injectIntl, useIntl } from '@edx/frontend-platform/i18n';\nimport messages from './messages';\nimport { COURSE_BLOCK_NAMES } from '../../constants';\n\nconst VisibilityTab = ({\n values,\n setFieldValue,\n category,\n showWarning,\n isSubsection,\n}) => {\n const intl = useIntl();\n const visibilityTitle = COURSE_BLOCK_NAMES[category]?.name;\n\n const {\n isVisibleToStaffOnly,\n hideAfterDue,\n showCorrectness,\n } = values;\n\n const handleChange = (e) => {\n setFieldValue('isVisibleToStaffOnly', e.target.checked);\n };\n\n const getVisibilityValue = () => {\n if (isVisibleToStaffOnly) {\n return 'hide';\n }\n if (hideAfterDue) {\n return 'hideDue';\n }\n return 'show';\n };\n\n const visibilityChanged = (e) => {\n const selected = e.target.value;\n if (selected === 'hide') {\n setFieldValue('isVisibleToStaffOnly', true);\n setFieldValue('hideAfterDue', false);\n } else if (selected === 'hideDue') {\n setFieldValue('isVisibleToStaffOnly', false);\n setFieldValue('hideAfterDue', true);\n } else {\n setFieldValue('isVisibleToStaffOnly', false);\n setFieldValue('hideAfterDue', false);\n }\n };\n\n const correctnessChanged = (e) => {\n setFieldValue('showCorrectness', e.target.value);\n };\n\n return (\n <>\n <h5 className=\"mt-4 text-gray-700\">\n {intl.formatMessage(messages.visibilitySectionTitle, { visibilityTitle })}\n </h5>\n <hr />\n {\n isSubsection ? (\n <>\n <Form.RadioSet\n name=\"subsectionVisibility\"\n onChange={visibilityChanged}\n value={getVisibilityValue()}\n >\n <Form.Radio value=\"show\">\n <FormattedMessage {...messages.showEntireSubsection} />\n </Form.Radio>\n <Form.Text><FormattedMessage {...messages.showEntireSubsectionDescription} /></Form.Text>\n <Form.Radio value=\"hideDue\">\n <FormattedMessage {...messages.hideContentAfterDue} />\n </Form.Radio>\n <Form.Text><FormattedMessage {...messages.hideContentAfterDueDescription} /></Form.Text>\n <Form.Radio value=\"hide\">\n <FormattedMessage {...messages.hideEntireSubsection} />\n </Form.Radio>\n <Form.Text><FormattedMessage {...messages.hideEntireSubsectionDescription} /></Form.Text>\n </Form.RadioSet>\n {showWarning && (\n <Alert className=\"mt-2\" variant=\"warning\">\n <FormattedMessage {...messages.subsectionVisibilityWarning} />\n </Alert>\n )}\n <h5 className=\"mt-4 text-gray-700\"><FormattedMessage {...messages.assessmentResultsVisibility} /></h5>\n <Form.RadioSet\n name=\"assessmentResultsVisibility\"\n onChange={correctnessChanged}\n value={showCorrectness}\n >\n <Form.Radio value=\"always\">\n <FormattedMessage {...messages.alwaysShowAssessmentResults} />\n </Form.Radio>\n <Form.Text><FormattedMessage {...messages.alwaysShowAssessmentResultsDescription} /></Form.Text>\n <Form.Radio value=\"never\">\n <FormattedMessage {...messages.neverShowAssessmentResults} />\n </Form.Radio>\n <Form.Text><FormattedMessage {...messages.neverShowAssessmentResultsDescription} /></Form.Text>\n <Form.Radio value=\"past_due\">\n <FormattedMessage {...messages.showAssessmentResultsPastDue} />\n </Form.Radio>\n <Form.Text><FormattedMessage {...messages.showAssessmentResultsPastDueDescription} /></Form.Text>\n </Form.RadioSet>\n </>\n ) : (\n <Form.Checkbox checked={isVisibleToStaffOnly} onChange={handleChange} data-testid=\"visibility-checkbox\">\n <FormattedMessage {...messages.hideFromLearners} />\n </Form.Checkbox>\n )\n }\n {showWarning && !isSubsection && (\n <Alert className=\"mt-2\" variant=\"warning\">\n <FormattedMessage {...messages.sectionVisibilityWarning} />\n </Alert>\n )}\n </>\n );\n};\n\nVisibilityTab.propTypes = {\n values: PropTypes.shape({\n isVisibleToStaffOnly: PropTypes.bool.isRequired,\n hideAfterDue: PropTypes.bool.isRequired,\n showCorrectness: PropTypes.string.isRequired,\n }).isRequired,\n setFieldValue: PropTypes.func.isRequired,\n category: PropTypes.string.isRequired,\n showWarning: PropTypes.bool.isRequired,\n isSubsection: PropTypes.bool.isRequired,\n};\n\nexport default injectIntl(VisibilityTab);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Form } from '@openedx/paragon';\nimport { FormattedMessage, injectIntl, useIntl } from '@edx/frontend-platform/i18n';\nimport messages from './messages';\n\nimport FormikControl from '../FormikControl';\n\nconst PrereqSettings = ({\n values,\n setFieldValue,\n prereqs,\n}) => {\n const intl = useIntl();\n const {\n isPrereq,\n prereqUsageKey,\n prereqMinScore,\n prereqMinCompletion,\n } = values;\n\n if (isPrereq === null || isPrereq === undefined) {\n return null;\n }\n\n const handleSelectChange = (e) => {\n setFieldValue('prereqUsageKey', e.target.value);\n };\n\n const prereqSelectionForm = () => (\n <>\n <h5 className=\"mt-4 text-gray-700\"><FormattedMessage {...messages.limitAccessTitle} /></h5>\n <hr />\n <Form>\n <Form.Text><FormattedMessage {...messages.limitAccessDescription} /></Form.Text>\n <Form.Group controlId=\"prereqForm.select\">\n <Form.Label>\n {intl.formatMessage(messages.prerequisiteSelectLabel)}\n </Form.Label>\n <Form.Control\n as=\"select\"\n defaultValue={prereqUsageKey}\n onChange={handleSelectChange}\n role=\"combobox\"\n >\n <option value=\"\">\n {intl.formatMessage(messages.noPrerequisiteOption)}\n </option>\n {prereqs.map((prereqOption) => (\n <option\n key={prereqOption.blockUsageKey}\n value={prereqOption.blockUsageKey}\n >\n {prereqOption.blockDisplayName}\n </option>\n ))}\n </Form.Control>\n </Form.Group>\n {prereqUsageKey && (\n <>\n <FormikControl\n name=\"prereqMinScore\"\n value={prereqMinScore}\n label={<Form.Label>{intl.formatMessage(messages.minScoreLabel)}</Form.Label>}\n controlClassName=\"text-right\"\n controlClasses=\"w-7rem\"\n type=\"number\"\n trailingElement=\"%\"\n />\n <FormikControl\n name=\"prereqMinCompletion\"\n value={prereqMinCompletion}\n label={<Form.Label>{intl.formatMessage(messages.minCompletionLabel)}</Form.Label>}\n controlClassName=\"text-right\"\n controlClasses=\"w-7rem\"\n type=\"number\"\n trailingElement=\"%\"\n />\n </>\n )}\n </Form>\n </>\n );\n\n const handleCheckboxChange = e => setFieldValue('isPrereq', e.target.checked);\n\n return (\n <>\n {prereqs.length > 0 && prereqSelectionForm()}\n <h5 className=\"mt-4 text-gray-700\"><FormattedMessage {...messages.prereqTitle} /></h5>\n <hr />\n <Form.Checkbox checked={isPrereq} onChange={handleCheckboxChange}>\n <FormattedMessage {...messages.prereqCheckboxLabel} />\n </Form.Checkbox>\n </>\n );\n};\n\nPrereqSettings.defaultProps = {\n prereqs: [],\n};\n\nPrereqSettings.propTypes = {\n values: PropTypes.shape({\n isPrereq: PropTypes.bool,\n prereqUsageKey: PropTypes.string,\n prereqMinScore: PropTypes.number,\n prereqMinCompletion: PropTypes.number,\n }).isRequired,\n prereqs: PropTypes.arrayOf(PropTypes.shape({\n blockUsageKey: PropTypes.string.isRequired,\n blockDisplayName: PropTypes.string.isRequired,\n })),\n setFieldValue: PropTypes.func.isRequired,\n};\n\nexport default injectIntl(PrereqSettings);\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Alert, Form, Hyperlink } from '@openedx/paragon';\nimport {\n Warning as WarningIcon,\n} from '@openedx/paragon/icons';\nimport { FormattedMessage, injectIntl } from '@edx/frontend-platform/i18n';\nimport messages from './messages';\n\nimport PrereqSettings from './PrereqSettings';\n\nconst AdvancedTab = ({\n values,\n setFieldValue,\n prereqs,\n releasedToStudents,\n wasExamEverLinkedWithExternal,\n enableProctoredExams,\n supportsOnboarding,\n wasProctoredExam,\n showReviewRules,\n onlineProctoringRules,\n}) => {\n const {\n isTimeLimited,\n isProctoredExam,\n isOnboardingExam,\n isPracticeExam,\n defaultTimeLimitMinutes,\n examReviewRules,\n } = values;\n let examTypeValue = 'none';\n\n if (isTimeLimited && isProctoredExam) {\n if (isOnboardingExam) {\n examTypeValue = 'onboardingExam';\n } else if (isPracticeExam) {\n examTypeValue = 'practiceExam';\n } else {\n examTypeValue = 'proctoredExam';\n }\n } else if (isTimeLimited) {\n examTypeValue = 'timed';\n }\n\n const formatHour = (hour) => {\n const hh = Math.floor(hour / 60);\n const mm = hour % 60;\n let hhs = `${hh}`;\n let mms = `${mm}`;\n if (hh < 10) {\n hhs = `0${hh}`;\n }\n if (mm < 10) {\n mms = `0${mm}`;\n }\n if (Number.isNaN(hh)) {\n hhs = '00';\n }\n if (Number.isNaN(mm)) {\n mms = '00';\n }\n return `${hhs}:${mms}`;\n };\n\n const [timeLimit, setTimeLimit] = useState(formatHour(defaultTimeLimitMinutes));\n const showReviewRulesDiv = showReviewRules && isProctoredExam && !isPracticeExam && !isOnboardingExam;\n\n const handleChange = (e) => {\n if (e.target.value === 'timed') {\n setFieldValue('isTimeLimited', true);\n setFieldValue('isOnboardingExam', false);\n setFieldValue('isPracticeExam', false);\n setFieldValue('isProctoredExam', false);\n } else if (e.target.value === 'onboardingExam') {\n setFieldValue('isOnboardingExam', true);\n setFieldValue('isProctoredExam', true);\n setFieldValue('isTimeLimited', true);\n setFieldValue('isPracticeExam', false);\n } else if (e.target.value === 'practiceExam') {\n setFieldValue('isPracticeExam', true);\n setFieldValue('isProctoredExam', true);\n setFieldValue('isTimeLimited', true);\n setFieldValue('isOnboardingExam', false);\n } else if (e.target.value === 'proctoredExam') {\n setFieldValue('isProctoredExam', true);\n setFieldValue('isTimeLimited', true);\n setFieldValue('isOnboardingExam', false);\n setFieldValue('isPracticeExam', false);\n } else {\n setFieldValue('isTimeLimited', false);\n setFieldValue('isOnboardingExam', false);\n setFieldValue('isPracticeExam', false);\n setFieldValue('isProctoredExam', false);\n }\n };\n\n const setCurrentTimeLimit = (event) => {\n const { validity: { valid } } = event.target;\n let { value } = event.target;\n value = value.trim();\n if (value && valid) {\n const minutes = moment.duration(value).asMinutes();\n setFieldValue('defaultTimeLimitMinutes', minutes);\n }\n setTimeLimit(value);\n };\n\n const renderAlerts = () => {\n const proctoredExamLockedIn = releasedToStudents && wasExamEverLinkedWithExternal;\n return (\n <>\n {proctoredExamLockedIn && !wasProctoredExam && (\n <Alert variant=\"warning\" icon={WarningIcon}>\n <FormattedMessage {...messages.proctoredExamLockedAndisNotProctoredExamAlert} />\n </Alert>\n )}\n {proctoredExamLockedIn && wasProctoredExam && (\n <Alert variant=\"warning\" icon={WarningIcon}>\n <FormattedMessage {...messages.proctoredExamLockedAndisProctoredExamAlert} />\n </Alert>\n )}\n </>\n );\n };\n\n return (\n <>\n <h5 className=\"mt-4 text-gray-700\"><FormattedMessage {...messages.setSpecialExam} /></h5>\n <hr />\n <Form.RadioSet\n name=\"specialExam\"\n onChange={handleChange}\n value={examTypeValue}\n >\n {renderAlerts()}\n <Form.Radio value=\"none\">\n <FormattedMessage {...messages.none} />\n </Form.Radio>\n <Form.Radio\n value=\"timed\"\n description={<FormattedMessage {...messages.timedDescription} />}\n controlClassName=\"mw-1-25rem\"\n >\n <FormattedMessage {...messages.timed} />\n </Form.Radio>\n {enableProctoredExams && (\n <>\n <Form.Radio\n value=\"proctoredExam\"\n description={<FormattedMessage {...messages.proctoredExamDescription} />}\n controlClassName=\"mw-1-25rem\"\n >\n <FormattedMessage {...messages.proctoredExam} />\n </Form.Radio>\n {supportsOnboarding ? (\n <Form.Radio\n description={<FormattedMessage {...messages.onboardingExamDescription} />}\n value=\"onboardingExam\"\n controlClassName=\"mw-1-25rem\"\n >\n <FormattedMessage {...messages.onboardingExam} />\n </Form.Radio>\n ) : (\n <Form.Radio\n value=\"practiceExam\"\n controlClassName=\"mw-1-25rem\"\n description={<FormattedMessage {...messages.practiceExamDescription} />}\n >\n <FormattedMessage {...messages.practiceExam} />\n </Form.Radio>\n )}\n </>\n )}\n </Form.RadioSet>\n { isTimeLimited && (\n <div className=\"mt-3\" data-testid=\"advanced-tab-hours-picker-wrapper\">\n <Form.Group>\n <Form.Label>\n <FormattedMessage {...messages.timeAllotted} />\n </Form.Label>\n <Form.Control\n onChange={setCurrentTimeLimit}\n value={timeLimit}\n placeholder=\"HH:MM\"\n pattern=\"^[0-9][0-9]:[0-5][0-9]$\"\n />\n </Form.Group>\n <Form.Text><FormattedMessage {...messages.timeLimitDescription} /></Form.Text>\n </div>\n )}\n { showReviewRulesDiv && (\n <div className=\"mt-3\">\n <Form.Group>\n <Form.Label>\n <FormattedMessage {...messages.reviewRulesLabel} />\n </Form.Label>\n <Form.Control\n onChange={(e) => setFieldValue('examReviewRules', e.target.value)}\n value={examReviewRules}\n as=\"textarea\"\n rows=\"3\"\n />\n </Form.Group>\n <Form.Text>\n { onlineProctoringRules ? (\n <FormattedMessage\n {...messages.reviewRulesDescriptionWithLink}\n values={{\n hyperlink: (\n <Hyperlink\n destination={onlineProctoringRules}\n target=\"_blank\"\n showLaunchIcon={false}\n >\n <FormattedMessage\n {...messages.reviewRulesDescriptionLinkText}\n />\n </Hyperlink>\n ),\n }}\n />\n ) : (\n <FormattedMessage {...messages.reviewRulesDescription} />\n )}\n </Form.Text>\n </div>\n )}\n <PrereqSettings\n values={values}\n setFieldValue={setFieldValue}\n prereqs={prereqs}\n />\n </>\n );\n};\n\nAdvancedTab.defaultProps = {\n prereqs: [],\n wasExamEverLinkedWithExternal: false,\n enableProctoredExams: false,\n supportsOnboarding: false,\n wasProctoredExam: false,\n showReviewRules: false,\n onlineProctoringRules: '',\n};\n\nAdvancedTab.propTypes = {\n values: PropTypes.shape({\n isTimeLimited: PropTypes.bool.isRequired,\n defaultTimeLimitMinutes: PropTypes.number,\n isPrereq: PropTypes.bool,\n prereqUsageKey: PropTypes.string,\n prereqMinScore: PropTypes.number,\n prereqMinCompletion: PropTypes.number,\n isProctoredExam: PropTypes.bool,\n isPracticeExam: PropTypes.bool,\n isOnboardingExam: PropTypes.bool,\n examReviewRules: PropTypes.string,\n }).isRequired,\n setFieldValue: PropTypes.func.isRequired,\n prereqs: PropTypes.arrayOf(PropTypes.shape({\n blockUsageKey: PropTypes.string.isRequired,\n blockDisplayName: PropTypes.string.isRequired,\n })),\n releasedToStudents: PropTypes.bool.isRequired,\n wasExamEverLinkedWithExternal: PropTypes.bool,\n enableProctoredExams: PropTypes.bool,\n supportsOnboarding: PropTypes.bool,\n wasProctoredExam: PropTypes.bool,\n showReviewRules: PropTypes.bool,\n onlineProctoringRules: PropTypes.string,\n};\n\nexport default injectIntl(AdvancedTab);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Form } from '@openedx/paragon';\nimport {\n FormattedMessage, injectIntl, useIntl,\n} from '@edx/frontend-platform/i18n';\nimport { Field } from 'formik';\nimport classNames from 'classnames';\n\nimport messages from './messages';\n\nconst UnitTab = ({\n isXBlockComponent,\n values,\n setFieldValue,\n showWarning,\n userPartitionInfo,\n}) => {\n const intl = useIntl();\n const {\n isVisibleToStaffOnly,\n selectedPartitionIndex,\n selectedGroups,\n } = values;\n\n const handleChange = (e) => {\n setFieldValue('isVisibleToStaffOnly', e.target.checked);\n };\n\n const handleSelect = (e) => {\n setFieldValue('selectedPartitionIndex', parseInt(e.target.value, 10));\n setFieldValue('selectedGroups', []);\n };\n\n const checkIsDeletedGroup = (group) => {\n const isGroupSelected = selectedGroups.includes(group.id.toString());\n\n return group.deleted && isGroupSelected;\n };\n\n return (\n <>\n {!isXBlockComponent && (\n <>\n <h3 className=\"mt-3\"><FormattedMessage {...messages.unitVisibility} /></h3>\n <hr />\n <Form.Checkbox checked={isVisibleToStaffOnly} onChange={handleChange} data-testid=\"unit-visibility-checkbox\">\n <FormattedMessage {...messages.hideFromLearners} />\n </Form.Checkbox>\n {showWarning && (\n <Alert className=\"mt-2\" variant=\"warning\">\n <FormattedMessage {...messages.unitVisibilityWarning} />\n </Alert>\n )}\n <hr />\n </>\n )}\n <Form.Group controlId=\"groupSelect\">\n <Form.Label as=\"legend\" className=\"font-weight-bold\">\n <FormattedMessage {...messages.restrictAccessTo} />\n </Form.Label>\n <Form.Control\n as=\"select\"\n name=\"groupSelect\"\n value={selectedPartitionIndex}\n onChange={handleSelect}\n data-testid=\"group-type-select\"\n >\n <option value=\"-1\" key=\"-1\">\n {userPartitionInfo.selectedPartitionIndex === -1\n ? intl.formatMessage(messages.unitSelectGroupType)\n : intl.formatMessage(messages.unitAllLearnersAndStaff)}\n </option>\n {userPartitionInfo.selectablePartitions.map((partition, index) => (\n <option\n key={partition.id}\n value={index}\n >\n {partition.name}\n </option>\n ))}\n </Form.Control>\n\n {selectedPartitionIndex >= 0 && userPartitionInfo.selectablePartitions.length && (\n <Form.Group controlId=\"select-groups-checkboxes\">\n <Form.Label><FormattedMessage {...messages.unitSelectGroup} /></Form.Label>\n <div\n role=\"group\"\n className=\"d-flex flex-column\"\n data-testid=\"group-checkboxes\"\n aria-labelledby=\"select-groups-checkboxes\"\n >\n {userPartitionInfo.selectablePartitions[selectedPartitionIndex].groups.map((group) => (\n <Form.Group\n key={group.id}\n className=\"pgn__form-checkbox\"\n >\n <Field\n as={Form.Control}\n className=\"flex-grow-0 mr-1\"\n controlClassName=\"pgn__form-checkbox-input mr-1\"\n type=\"checkbox\"\n value={`${group.id}`}\n name=\"selectedGroups\"\n />\n <div>\n <Form.Label\n className={classNames({ 'text-danger': checkIsDeletedGroup(group) })}\n isInline\n >\n {group.name}\n </Form.Label>\n {group.deleted && (\n <Form.Control.Feedback type=\"invalid\" hasIcon={false}>\n {intl.formatMessage(messages.unitSelectDeletedGroupErrorMessage)}\n </Form.Control.Feedback>\n )}\n </div>\n </Form.Group>\n ))}\n </div>\n </Form.Group>\n )}\n </Form.Group>\n\n </>\n );\n};\n\nUnitTab.defaultProps = {\n isXBlockComponent: false,\n};\n\nUnitTab.propTypes = {\n isXBlockComponent: PropTypes.bool,\n values: PropTypes.shape({\n isVisibleToStaffOnly: PropTypes.bool.isRequired,\n selectedPartitionIndex: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n ]).isRequired,\n selectedGroups: PropTypes.oneOfType([\n PropTypes.string,\n ]),\n }).isRequired,\n setFieldValue: PropTypes.func.isRequired,\n showWarning: PropTypes.bool.isRequired,\n userPartitionInfo: PropTypes.shape({\n selectablePartitions: PropTypes.arrayOf(PropTypes.shape({\n groups: PropTypes.arrayOf(PropTypes.shape({\n deleted: PropTypes.bool.isRequired,\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n selected: PropTypes.bool.isRequired,\n }).isRequired).isRequired,\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n scheme: PropTypes.string.isRequired,\n }).isRequired).isRequired,\n selectedGroupsLabel: PropTypes.string,\n selectedPartitionIndex: PropTypes.number.isRequired,\n }).isRequired,\n};\n\nexport default injectIntl(UnitTab);\n","/* eslint-disable import/named */\nimport React from 'react';\nimport * as Yup from 'yup';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ModalDialog,\n Button,\n ActionRow,\n Form,\n Tab,\n Tabs,\n} from '@openedx/paragon';\nimport { Formik } from 'formik';\n\nimport { VisibilityTypes } from '../../data/constants';\nimport { COURSE_BLOCK_NAMES } from '../../constants';\nimport messages from './messages';\nimport BasicTab from './BasicTab';\nimport VisibilityTab from './VisibilityTab';\nimport AdvancedTab from './AdvancedTab';\nimport UnitTab from './UnitTab';\n\nconst ConfigureModal = ({\n isOpen,\n onClose,\n onConfigureSubmit,\n currentItemData,\n enableProctoredExams,\n isXBlockComponent,\n}) => {\n const intl = useIntl();\n const {\n displayName,\n start: sectionStartDate,\n visibilityState,\n due,\n isTimeLimited,\n defaultTimeLimitMinutes,\n hideAfterDue,\n showCorrectness,\n courseGraders,\n category,\n format,\n userPartitionInfo,\n ancestorHasStaffLock,\n isPrereq,\n prereqs,\n prereq,\n prereqMinScore,\n prereqMinCompletion,\n releasedToStudents,\n wasExamEverLinkedWithExternal,\n isProctoredExam,\n isOnboardingExam,\n isPracticeExam,\n examReviewRules,\n supportsOnboarding,\n showReviewRules,\n onlineProctoringRules,\n } = currentItemData;\n\n const getSelectedGroups = () => {\n if (userPartitionInfo?.selectedPartitionIndex >= 0) {\n return userPartitionInfo?.selectablePartitions[userPartitionInfo?.selectedPartitionIndex]\n ?.groups\n .filter(({ selected }) => selected)\n .map(({ id }) => `${id}`)\n || [];\n }\n return [];\n };\n\n const defaultPrereqScore = (val) => {\n if (val === null || val === undefined) {\n return 100;\n }\n return parseFloat(val);\n };\n\n const initialValues = {\n releaseDate: sectionStartDate,\n isVisibleToStaffOnly: visibilityState === VisibilityTypes.STAFF_ONLY,\n graderType: format == null ? 'notgraded' : format,\n dueDate: due == null ? '' : due,\n isTimeLimited,\n isProctoredExam,\n isOnboardingExam,\n isPracticeExam,\n examReviewRules,\n defaultTimeLimitMinutes,\n hideAfterDue: hideAfterDue === undefined ? false : hideAfterDue,\n showCorrectness,\n isPrereq,\n prereqUsageKey: prereq,\n prereqMinScore: defaultPrereqScore(prereqMinScore),\n prereqMinCompletion: defaultPrereqScore(prereqMinCompletion),\n // by default it is -1 i.e. accessible to all learners & staff\n selectedPartitionIndex: userPartitionInfo?.selectedPartitionIndex,\n selectedGroups: getSelectedGroups(),\n };\n\n const validationSchema = Yup.object().shape({\n isTimeLimited: Yup.boolean(),\n isProctoredExam: Yup.boolean(),\n isPracticeExam: Yup.boolean(),\n isOnboardingExam: Yup.boolean(),\n examReviewRules: Yup.string(),\n defaultTimeLimitMinutes: Yup.number().nullable(true),\n hideAfterDueState: Yup.boolean(),\n showCorrectness: Yup.string().required(),\n isPrereq: Yup.boolean(),\n prereqUsageKey: Yup.string().nullable(true),\n prereqMinScore: Yup.number().min(\n 0,\n intl.formatMessage(messages.minScoreError),\n ).max(\n 100,\n intl.formatMessage(messages.minScoreError),\n ).nullable(true),\n prereqMinCompletion: Yup.number().min(\n 0,\n intl.formatMessage(messages.minScoreError),\n ).max(\n 100,\n intl.formatMessage(messages.minScoreError),\n ).nullable(true),\n selectedPartitionIndex: Yup.number().integer(),\n selectedGroups: Yup.array().of(Yup.string()),\n });\n\n const isSubsection = category === COURSE_BLOCK_NAMES.sequential.id;\n\n const dialogTitle = isXBlockComponent\n ? intl.formatMessage(messages.componentTitle, { title: displayName })\n : intl.formatMessage(messages.title, { title: displayName });\n\n const handleSave = (data) => {\n const groupAccess = {};\n switch (category) {\n case COURSE_BLOCK_NAMES.chapter.id:\n onConfigureSubmit(data.isVisibleToStaffOnly, data.releaseDate);\n break;\n case COURSE_BLOCK_NAMES.sequential.id:\n onConfigureSubmit(\n data.isVisibleToStaffOnly,\n data.releaseDate,\n data.graderType,\n data.dueDate,\n data.isTimeLimited,\n data.isProctoredExam,\n data.isOnboardingExam,\n data.isPracticeExam,\n data.examReviewRules,\n data.isTimeLimited ? data.defaultTimeLimitMinutes : 0,\n data.hideAfterDue,\n data.showCorrectness,\n data.isPrereq,\n data.prereqUsageKey,\n data.prereqMinScore,\n data.prereqMinCompletion,\n );\n break;\n case COURSE_BLOCK_NAMES.vertical.id:\n case COURSE_BLOCK_NAMES.component.id:\n // groupAccess should be {partitionId: [group1, group2]} or {} if selectedPartitionIndex === -1\n if (data.selectedPartitionIndex >= 0) {\n const partitionId = userPartitionInfo.selectablePartitions[data.selectedPartitionIndex].id;\n groupAccess[partitionId] = data.selectedGroups.map(g => parseInt(g, 10));\n }\n onConfigureSubmit(data.isVisibleToStaffOnly, groupAccess);\n break;\n default:\n break;\n }\n };\n\n const renderModalBody = (values, setFieldValue) => {\n switch (category) {\n case COURSE_BLOCK_NAMES.chapter.id:\n return (\n <Tabs>\n <Tab eventKey=\"basic\" title={intl.formatMessage(messages.basicTabTitle)}>\n <BasicTab\n values={values}\n setFieldValue={setFieldValue}\n isSubsection={isSubsection}\n courseGraders={courseGraders === 'undefined' ? [] : courseGraders}\n />\n </Tab>\n <Tab eventKey=\"visibility\" title={intl.formatMessage(messages.visibilityTabTitle)}>\n <VisibilityTab\n values={values}\n setFieldValue={setFieldValue}\n category={category}\n isSubsection={isSubsection}\n showWarning={visibilityState === VisibilityTypes.STAFF_ONLY}\n />\n </Tab>\n </Tabs>\n );\n case COURSE_BLOCK_NAMES.sequential.id:\n return (\n <Tabs>\n <Tab eventKey=\"basic\" title={intl.formatMessage(messages.basicTabTitle)}>\n <BasicTab\n values={values}\n setFieldValue={setFieldValue}\n isSubsection={isSubsection}\n courseGraders={courseGraders === 'undefined' ? [] : courseGraders}\n />\n </Tab>\n <Tab eventKey=\"visibility\" title={intl.formatMessage(messages.visibilityTabTitle)}>\n <VisibilityTab\n values={values}\n setFieldValue={setFieldValue}\n category={category}\n isSubsection={isSubsection}\n showWarning={visibilityState === VisibilityTypes.STAFF_ONLY}\n />\n </Tab>\n <Tab eventKey=\"advanced\" title={intl.formatMessage(messages.advancedTabTitle)}>\n <AdvancedTab\n values={values}\n setFieldValue={setFieldValue}\n prereqs={prereqs}\n releasedToStudents={releasedToStudents}\n wasExamEverLinkedWithExternal={wasExamEverLinkedWithExternal}\n enableProctoredExams={enableProctoredExams}\n supportsOnboarding={supportsOnboarding}\n showReviewRules={showReviewRules}\n wasProctoredExam={isProctoredExam}\n onlineProctoringRules={onlineProctoringRules}\n />\n </Tab>\n </Tabs>\n );\n case COURSE_BLOCK_NAMES.vertical.id:\n case COURSE_BLOCK_NAMES.component.id:\n return (\n <UnitTab\n isXBlockComponent={COURSE_BLOCK_NAMES.component.id === category}\n values={values}\n setFieldValue={setFieldValue}\n showWarning={visibilityState === VisibilityTypes.STAFF_ONLY && !ancestorHasStaffLock}\n userPartitionInfo={userPartitionInfo}\n />\n );\n default:\n return null;\n }\n };\n\n return (\n <ModalDialog\n className=\"configure-modal\"\n size=\"lg\"\n isOpen={isOpen}\n onClose={onClose}\n hasCloseButton\n isFullscreenOnMobile\n >\n <div data-testid=\"configure-modal\">\n <ModalDialog.Header className=\"configure-modal__header\">\n <ModalDialog.Title>\n {dialogTitle}\n </ModalDialog.Title>\n </ModalDialog.Header>\n <Formik\n initialValues={initialValues}\n onSubmit={handleSave}\n validationSchema={validationSchema}\n validateOnBlur\n validateOnChange\n >\n {({\n values, handleSubmit, setFieldValue,\n }) => (\n <>\n <ModalDialog.Body className=\"configure-modal__body\">\n <Form.Group size=\"sm\" className=\"form-field\">\n {renderModalBody(values, setFieldValue)}\n </Form.Group>\n </ModalDialog.Body>\n <ModalDialog.Footer className=\"pt-1\">\n <ActionRow>\n <ModalDialog.CloseButton variant=\"tertiary\">\n {intl.formatMessage(messages.cancelButton)}\n </ModalDialog.CloseButton>\n <Button\n data-testid=\"configure-save-button\"\n onClick={handleSubmit}\n >\n {intl.formatMessage(messages.saveButton)}\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </>\n )}\n </Formik>\n </div>\n </ModalDialog>\n );\n};\n\nConfigureModal.defaultProps = {\n isXBlockComponent: false,\n enableProctoredExams: false,\n};\n\nConfigureModal.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onConfigureSubmit: PropTypes.func.isRequired,\n enableProctoredExams: PropTypes.bool,\n currentItemData: PropTypes.shape({\n displayName: PropTypes.string,\n start: PropTypes.string,\n visibilityState: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n due: PropTypes.string,\n isTimeLimited: PropTypes.bool,\n defaultTimeLimitMinutes: PropTypes.number,\n hideAfterDue: PropTypes.bool,\n showCorrectness: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n courseGraders: PropTypes.arrayOf(PropTypes.string),\n category: PropTypes.string,\n format: PropTypes.string,\n userPartitionInfo: PropTypes.shape({\n selectablePartitions: PropTypes.arrayOf(PropTypes.shape({\n groups: PropTypes.arrayOf(PropTypes.shape({\n deleted: PropTypes.bool,\n id: PropTypes.number,\n name: PropTypes.string,\n selected: PropTypes.bool,\n })),\n id: PropTypes.number,\n name: PropTypes.string,\n scheme: PropTypes.string,\n })),\n selectedPartitionIndex: PropTypes.number,\n selectedGroupsLabel: PropTypes.string,\n }),\n ancestorHasStaffLock: PropTypes.bool,\n isPrereq: PropTypes.bool,\n prereqs: PropTypes.arrayOf({\n blockDisplayName: PropTypes.string,\n blockUsageKey: PropTypes.string,\n }),\n prereq: PropTypes.number,\n prereqMinScore: PropTypes.number,\n prereqMinCompletion: PropTypes.number,\n releasedToStudents: PropTypes.bool,\n wasExamEverLinkedWithExternal: PropTypes.bool,\n isProctoredExam: PropTypes.bool,\n isOnboardingExam: PropTypes.bool,\n isPracticeExam: PropTypes.bool,\n examReviewRules: PropTypes.string,\n supportsOnboarding: PropTypes.bool,\n showReviewRules: PropTypes.bool,\n onlineProctoringRules: PropTypes.string,\n }).isRequired,\n isXBlockComponent: PropTypes.bool,\n};\n\nexport default ConfigureModal;\n","export const getOutlineIndexData = (state) => state.courseOutline.outlineIndexData;\nexport const getLoadingStatus = (state) => state.courseOutline.loadingStatus;\nexport const getStatusBarData = (state) => state.courseOutline.statusBarData;\nexport const getSavingStatus = (state) => state.courseOutline.savingStatus;\nexport const getSectionsList = (state) => state.courseOutline.sectionsList;\nexport const getCurrentItem = (state) => state.courseOutline.currentItem;\nexport const getCurrentSection = (state) => state.courseOutline.currentSection;\nexport const getCurrentSubsection = (state) => state.courseOutline.currentSubsection;\nexport const getCourseActions = (state) => state.courseOutline.actions;\nexport const getCustomRelativeDatesActiveFlag = (state) => state.courseOutline.isCustomRelativeDatesActive;\nexport const getProctoredExamsFlag = (state) => state.courseOutline.enableProctoredExams;\nexport const getPasteFileNotices = (state) => state.courseOutline.pasteFileNotices;\nexport const getErrors = (state) => state.courseOutline.errors;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n newSectionButton: {\n id: 'course-authoring.course-outline.header-navigations.button.new-section',\n defaultMessage: 'New section',\n },\n newSectionButtonTooltip: {\n id: 'course-authoring.course-outline.header-navigations.button.new-section.tooltip',\n defaultMessage: 'Click to add a new section',\n },\n reindexButton: {\n id: 'course-authoring.course-outline.header-navigations.button.reindex',\n defaultMessage: 'Reindex',\n },\n reindexButtonTooltip: {\n id: 'course-authoring.course-outline.header-navigations.button.reindex.tooltip',\n defaultMessage: 'Reindex current course',\n },\n expandAllButton: {\n id: 'course-authoring.course-outline.header-navigations.button.expand-all',\n defaultMessage: 'Expand all',\n },\n collapseAllButton: {\n id: 'course-authoring.course-outline.header-navigations.button.collapse-all',\n defaultMessage: 'Collapse all',\n },\n viewLiveButton: {\n id: 'course-authoring.course-outline.header-navigations.button.view-live',\n defaultMessage: 'View live',\n },\n viewLiveButtonTooltip: {\n id: 'course-authoring.course-outline.header-navigations.button.view-live.tooltip',\n defaultMessage: 'Click to open the courseware in the LMS in a new tab',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Button, OverlayTrigger, Tooltip } from '@openedx/paragon';\nimport {\n Add as IconAdd,\n ArrowDropDown as ArrowDownIcon,\n ArrowDropUp as ArrowUpIcon,\n} from '@openedx/paragon/icons';\n\nimport messages from './messages';\n\nconst HeaderNavigations = ({\n headerNavigationsActions,\n isReIndexShow,\n isSectionsExpanded,\n isDisabledReindexButton,\n hasSections,\n courseActions,\n errors,\n}) => {\n const intl = useIntl();\n const {\n handleNewSection, handleReIndex, handleExpandAll, lmsLink,\n } = headerNavigationsActions;\n\n return (\n <nav className=\"header-navigations ml-auto\">\n {courseActions.childAddable && (\n <OverlayTrigger\n placement=\"bottom\"\n overlay={(\n <Tooltip id={intl.formatMessage(messages.newSectionButtonTooltip)}>\n {intl.formatMessage(messages.newSectionButtonTooltip)}\n </Tooltip>\n )}\n >\n <Button\n iconBefore={IconAdd}\n onClick={handleNewSection}\n disabled={errors?.outlineIndexApi}\n >\n {intl.formatMessage(messages.newSectionButton)}\n </Button>\n </OverlayTrigger>\n )}\n {isReIndexShow && (\n <OverlayTrigger\n placement=\"bottom\"\n overlay={!isDisabledReindexButton ? (\n <Tooltip id={intl.formatMessage(messages.reindexButtonTooltip)}>\n {intl.formatMessage(messages.reindexButtonTooltip)}\n </Tooltip>\n ) : <React.Fragment key=\"reindex close\" />}\n >\n <Button\n onClick={handleReIndex}\n data-testid=\"course-reindex\"\n variant=\"outline-primary\"\n disabled={isDisabledReindexButton}\n >\n {intl.formatMessage(messages.reindexButton)}\n </Button>\n </OverlayTrigger>\n )}\n {hasSections && (\n <Button\n variant=\"outline-primary\"\n iconBefore={isSectionsExpanded ? ArrowUpIcon : ArrowDownIcon}\n onClick={handleExpandAll}\n >\n {isSectionsExpanded\n ? intl.formatMessage(messages.collapseAllButton)\n : intl.formatMessage(messages.expandAllButton)}\n </Button>\n )}\n <OverlayTrigger\n placement=\"bottom\"\n overlay={(\n <Tooltip id={intl.formatMessage(messages.viewLiveButtonTooltip)}>\n {intl.formatMessage(messages.viewLiveButtonTooltip)}\n </Tooltip>\n )}\n >\n <Button\n href={lmsLink}\n target=\"_blank\"\n variant=\"outline-primary\"\n >\n {intl.formatMessage(messages.viewLiveButton)}\n </Button>\n </OverlayTrigger>\n </nav>\n );\n};\n\nHeaderNavigations.defaultProps = {\n errors: {},\n};\n\nHeaderNavigations.propTypes = {\n isReIndexShow: PropTypes.bool.isRequired,\n isSectionsExpanded: PropTypes.bool.isRequired,\n isDisabledReindexButton: PropTypes.bool.isRequired,\n headerNavigationsActions: PropTypes.shape({\n handleNewSection: PropTypes.func.isRequired,\n handleReIndex: PropTypes.func.isRequired,\n handleExpandAll: PropTypes.func.isRequired,\n lmsLink: PropTypes.string.isRequired,\n }).isRequired,\n hasSections: PropTypes.bool.isRequired,\n courseActions: PropTypes.shape({\n deletable: PropTypes.bool.isRequired,\n draggable: PropTypes.bool.isRequired,\n childAddable: PropTypes.bool.isRequired,\n duplicable: PropTypes.bool.isRequired,\n }).isRequired,\n errors: PropTypes.shape({\n outlineIndexApi: PropTypes.shape({\n data: PropTypes.string,\n type: PropTypes.string.isRequired,\n }),\n reindexApi: PropTypes.shape({\n data: PropTypes.string,\n type: PropTypes.string.isRequired,\n }),\n sectionLoadingApi: PropTypes.shape({\n data: PropTypes.string,\n type: PropTypes.string.isRequired,\n }),\n courseLaunchApi: PropTypes.shape({\n data: PropTypes.string,\n type: PropTypes.string.isRequired,\n }),\n }),\n};\n\nexport default HeaderNavigations;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n section_1_title: {\n id: 'course-authoring.course-outline.sidebar.section-1.title',\n defaultMessage: 'Creating your course organization',\n },\n section_1_descriptions_1: {\n id: 'course-authoring.course-outline.sidebar.section-1.descriptions-1',\n defaultMessage: 'You add sections, subsections, and units directly in the outline.',\n },\n section_1_descriptions_2: {\n id: 'course-authoring.course-outline.sidebar.section-1.descriptions-2',\n defaultMessage: 'Create a section, then add subsections and units. Open a unit to add course components.',\n },\n section_2_title: {\n id: 'course-authoring.course-outline.sidebar.section-2.title',\n defaultMessage: 'Reorganizing your course',\n },\n section_2_descriptions_1: {\n id: 'course-authoring.course-outline.sidebar.section-2.descriptions-1',\n defaultMessage: 'Drag sections, subsections, and units to new locations in the outline.',\n },\n section_2_link: {\n id: 'course-authoring.course-outline.sidebar.section-2.link',\n defaultMessage: 'Learn more about the course outline',\n },\n section_3_title: {\n id: 'course-authoring.course-outline.sidebar.section-3.title',\n defaultMessage: 'Setting release dates and grading policies',\n },\n section_3_descriptions_1: {\n id: 'course-authoring.course-outline.sidebar.section-3.descriptions-1',\n defaultMessage: 'Select the Configure icon for a section or subsection to set its release date. When you configure a subsection, you can also set the grading policy and due date.',\n },\n section_3_link: {\n id: 'course-authoring.course-outline.sidebar.section-3.link',\n defaultMessage: 'Learn more about grading policy settings',\n },\n section_4_title: {\n id: 'course-authoring.course-outline.sidebar.section-4.title',\n defaultMessage: 'Changing the content learners see',\n },\n section_4_descriptions_1: {\n id: 'course-authoring.course-outline.sidebar.section-4.descriptions-1',\n defaultMessage: 'To publish draft content, select the Publish icon for a section, subsection, or unit.',\n },\n section_4_descriptions_2: {\n id: 'course-authoring.course-outline.sidebar.section-4.descriptions-2',\n defaultMessage: 'To make a section, subsection, or unit unavailable to learners, select the Configure icon for that level, then select the appropriate {hide} option. Grades for hidden sections, subsections, and units are not included in grade calculations.',\n },\n section_4_descriptions_2_hide: {\n id: 'course-authoring.course-outline.sidebar.section-4.descriptions-2.hide',\n defaultMessage: 'Hide',\n },\n section_4_descriptions_3: {\n id: 'course-authoring.course-outline.sidebar.section-4.descriptions-3',\n defaultMessage: 'To hide the content of a subsection from learners after the subsection due date has passed, select the Configure icon for a subsection, then select {hide}. Grades for the subsection remain included in grade calculations.',\n },\n section_4_descriptions_3_hide: {\n id: 'course-authoring.course-outline.sidebar.section-4.descriptions-3.hide',\n defaultMessage: 'Hide content after due date',\n },\n section_4_link: {\n id: 'course-authoring.course-outline.sidebar.section-4.link',\n defaultMessage: 'Learn more about content visibility settings',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Hyperlink } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport { useHelpUrls } from '../../help-urls/hooks';\nimport { getFormattedSidebarMessages } from './utils';\n\nconst OutlineSideBar = ({ courseId }) => {\n const intl = useIntl();\n const {\n visibility: learnMoreVisibilityUrl,\n grading: learnMoreGradingUrl,\n outline: learnMoreOutlineUrl,\n } = useHelpUrls(['visibility', 'grading', 'outline']);\n\n const sidebarMessages = getFormattedSidebarMessages(\n {\n learnMoreGradingUrl,\n learnMoreOutlineUrl,\n learnMoreVisibilityUrl,\n },\n intl,\n );\n\n return (\n <HelpSidebar\n intl={intl}\n courseId={courseId}\n showOtherSettings={false}\n className=\"outline-sidebar mt-4\"\n data-testid=\"outline-sidebar\"\n >\n {sidebarMessages.map(({ title, descriptions, link }, index) => {\n const isLastSection = index === sidebarMessages.length - 1;\n\n return (\n <div className=\"outline-sidebar-section\" key={title}>\n <h4 className=\"help-sidebar-about-title\">{title}</h4>\n {descriptions.map((description) => (\n <p className=\"help-sidebar-about-descriptions\" key={description}>{description}</p>\n ))}\n {Boolean(link) && Boolean(link.href) && (\n <Hyperlink\n className=\"small\"\n destination={link.href}\n target=\"_blank\"\n showLaunchIcon={false}\n >\n {link.text}\n </Hyperlink>\n )}\n {!isLastSection && <hr className=\"my-3.5\" />}\n </div>\n );\n })}\n </HelpSidebar>\n );\n};\n\nOutlineSideBar.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default OutlineSideBar;\n","import React from 'react';\nimport messages from './messages';\n\n/**\n * Get formatted sidebar messages for render\n * @param {object} docsLinks - Docs links object from store\n * @returns {Array<{\n * title: string,\n * descriptions: Array<string>,\n * link?: {\n * text: string,\n * href: string\n * }\n * }>}\n */\nconst getFormattedSidebarMessages = (docsLinks, intl) => {\n const { learnMoreOutlineUrl, learnMoreGradingUrl, learnMoreVisibilityUrl } = docsLinks;\n\n return [\n {\n title: intl.formatMessage(messages.section_1_title),\n descriptions: [\n intl.formatMessage(messages.section_1_descriptions_1),\n intl.formatMessage(messages.section_1_descriptions_2),\n ],\n },\n {\n title: intl.formatMessage(messages.section_2_title),\n descriptions: [\n intl.formatMessage(messages.section_2_descriptions_1),\n ],\n link: {\n text: intl.formatMessage(messages.section_2_link),\n href: learnMoreOutlineUrl,\n },\n },\n {\n title: intl.formatMessage(messages.section_3_title),\n descriptions: [\n intl.formatMessage(messages.section_3_descriptions_1),\n ],\n link: {\n text: intl.formatMessage(messages.section_3_link),\n href: learnMoreGradingUrl,\n },\n },\n {\n title: intl.formatMessage(messages.section_4_title),\n descriptions: [\n intl.formatMessage(messages.section_4_descriptions_1),\n intl.formatMessage(\n messages.section_4_descriptions_2,\n { hide: <strong>{intl.formatMessage(messages.section_4_descriptions_2_hide)}</strong> },\n ),\n intl.formatMessage(\n messages.section_4_descriptions_3,\n { hide: <strong>{intl.formatMessage(messages.section_4_descriptions_3_hide)}</strong> },\n ),\n ],\n link: {\n text: intl.formatMessage(messages.section_4_link),\n href: learnMoreVisibilityUrl,\n },\n },\n ];\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { getFormattedSidebarMessages };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headerSubtitle: {\n id: 'course-authoring.content-tags-drawer.header.subtitle',\n defaultMessage: 'Manage tags',\n },\n addTagsButtonText: {\n id: 'course-authoring.content-tags-drawer.collapsible.add-tags.button',\n defaultMessage: 'Add tags',\n },\n loadingMessage: {\n id: 'course-authoring.content-tags-drawer.spinner.loading',\n defaultMessage: 'Loading',\n },\n loadingTagsDropdownMessage: {\n id: 'course-authoring.content-tags-drawer.tags-dropdown-selector.spinner.loading',\n defaultMessage: 'Loading tags',\n },\n loadMoreTagsButtonText: {\n id: 'course-authoring.content-tags-drawer.tags-dropdown-selector.load-more-tags.button',\n defaultMessage: 'Load more',\n },\n noTagsFoundMessage: {\n id: 'course-authoring.content-tags-drawer.tags-dropdown-selector.no-tags-found',\n defaultMessage: 'No tags found with the search term \"{searchTerm}\"',\n },\n noTagsInTaxonomyMessage: {\n id: 'course-authoring.content-tags-drawer.tags-dropdown-selector.no-tags-in-taxonomy',\n defaultMessage: 'No tags in this taxonomy yet',\n description: 'Message when the user uses the tags dropdown selector of an empty taxonomy',\n },\n taxonomyTagChecked: {\n id: 'course-authoring.content-tags-drawer.tags-dropdown-selector.tag-checked',\n defaultMessage: 'Checked',\n },\n taxonomyTagUnchecked: {\n id: 'course-authoring.content-tags-drawer.tags-dropdown-selector.tag-unchecked',\n defaultMessage: 'Unchecked',\n },\n taxonomyTagImplicit: {\n id: 'course-authoring.content-tags-drawer.tags-dropdown-selector.tag-implicit',\n defaultMessage: 'Implicit',\n },\n taxonomyTagActionInstructionsAriaLabel: {\n id: 'course-authoring.content-tags-drawer.tags-dropdown-selector.tag-action-instructions.aria.label',\n defaultMessage: '{tagState} Tag: {tag}. Use the arrow keys to move among the tags in this taxonomy. Press space to select a tag.',\n },\n taxonomyTagActionsAriaLabel: {\n id: 'course-authoring.content-tags-drawer.tags-dropdown-selector.tag-actions.aria.label',\n defaultMessage: '{tagState} Tag: {tag}',\n },\n taxonomyTagsAriaLabel: {\n id: 'course-authoring.content-tags-drawer.content-tags-collapsible.selectable-box.selection.aria.label',\n defaultMessage: 'taxonomy tags selection',\n },\n manageTagsButton: {\n id: 'course-authoring.content-tags-drawer.button.manage',\n defaultMessage: 'Manage tags',\n description: 'Label in the button that opens the drawer to edit content tags',\n },\n tagsSidebarTitle: {\n id: 'course-authoring.course-unit.sidebar.tags.title',\n defaultMessage: 'Unit tags',\n description: 'Title of the tags sidebar',\n },\n collapsibleAddTagsPlaceholderText: {\n id: 'course-authoring.content-tags-drawer.content-tags-collapsible.custom-menu.placeholder-text',\n defaultMessage: 'Add a tag',\n },\n collapsibleNoTagsAddedText: {\n id: 'course-authoring.content-tags-drawer.content-tags-collapsible.custom-menu.placeholder-text',\n defaultMessage: 'No tags added yet.',\n },\n collapsibleAddStagedTagsButtonText: {\n id: 'course-authoring.content-tags-drawer.content-tags-collapsible.custom-menu.save-staged-tags',\n defaultMessage: 'Add tags',\n },\n collapsibleCancelStagedTagsButtonText: {\n id: 'course-authoring.content-tags-drawer.content-tags-collapsible.custom-menu.cancel-staged-tags',\n defaultMessage: 'Cancel',\n },\n collapsibleInlineAddStagedTagsButtonText: {\n id: 'course-authoring.content-tags-drawer.content-tags-collapsible.custom-menu.inline-save-staged-tags',\n defaultMessage: 'Add',\n },\n tagsDrawerCancelButtonText: {\n id: 'course-authoring.content-tags-drawer.cancel',\n defaultMessage: 'Cancel',\n description: 'Button to cancel edit tags.',\n },\n tagsDrawerSaveButtonText: {\n id: 'course-authoring.content-tags-drawer.save',\n defaultMessage: 'Save',\n description: 'Button to save edited tags.',\n },\n tagsDrawerCloseButtonText: {\n id: 'course-authoring.content-tags-drawer.close',\n defaultMessage: 'Close',\n description: 'Button to close manage tags drawer.',\n },\n tagsDrawerEditTagsButtonText: {\n id: 'course-authoring.content-tags-drawer.edit-tags',\n defaultMessage: 'Edit tags',\n description: 'Button to edit tags in manage tags drawer.',\n },\n tagsSaveToastTextTypeAdded: {\n id: 'course-authoring.content-tags-drawer.toast.added',\n defaultMessage: '{tagsAdded} tags added.',\n description: 'Text of toast after save when the user added tags.',\n },\n tagsSaveToastTextTypeRemoved: {\n id: 'course-authoring.content-tags-drawer.toast.removed',\n defaultMessage: '{tagsRemoved} tags removed.',\n description: 'Text of toast after save when the user removed tags.',\n },\n tagsDeleteAltText: {\n id: 'course-authoring.content-tags-drawer.tag.delete',\n defaultMessage: 'Delete',\n description: 'Alt label for Delete tag button.',\n },\n otherTagsHeader: {\n id: 'course-authoring.content-tags-drawer.other-tags.header',\n defaultMessage: 'Other tags',\n description: 'Header of \"Other tags\" subsection in tags drawer',\n },\n otherTagsDescription: {\n id: 'course-authoring.content-tags-drawer.other-tags.description',\n defaultMessage: 'These tags are already applied, but you can\\'t add new ones as you don\\'t have access to their taxonomies.',\n description: 'Description of \"Other tags\" subsection in tags drawer',\n },\n emptyDrawerContent: {\n id: 'course-authoring.content-tags-drawer.empty',\n defaultMessage: 'To use tags, please {link} or contact your administrator.',\n description: 'Message when there are no taxonomies.',\n },\n emptyDrawerContentLink: {\n id: 'course-authoring.content-tags-drawer.empty-link',\n defaultMessage: 'enable a taxonomy',\n description: 'Message of the link used in empty drawer message.',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\n\n/**\n * Get the URL used to fetch tags data from the \"taxonomy tags\" REST API\n * @param {number} taxonomyId\n * @param {{page?: number, searchTerm?: string, parentTag?: string}} options\n * @returns {string} the URL\n */\nexport const getTaxonomyTagsApiUrl = (taxonomyId, options = {}) => {\n const url = new URL(`api/content_tagging/v1/taxonomies/${taxonomyId}/tags/`, getApiBaseUrl());\n if (options.parentTag) {\n url.searchParams.append('parent_tag', options.parentTag);\n }\n if (options.page) {\n url.searchParams.append('page', String(options.page));\n }\n if (options.searchTerm) {\n url.searchParams.append('search_term', options.searchTerm);\n }\n\n // Load in the full tree if children at once, if we can:\n // Note: do not combine this with page_size (we currently aren't using page_size)\n url.searchParams.append('full_depth_threshold', '1000');\n\n return url.href;\n};\nexport const getContentTaxonomyTagsApiUrl = (contentId) => new URL(`api/content_tagging/v1/object_tags/${contentId}/`, getApiBaseUrl()).href;\nexport const getXBlockContentDataApiURL = (contentId) => new URL(`/xblock/outline/${contentId}`, getApiBaseUrl()).href;\nexport const getCourseContentDataApiURL = (contentId) => new URL(`/api/contentstore/v1/course_settings/${contentId}`, getApiBaseUrl()).href;\nexport const getLibraryContentDataApiUrl = (contentId) => new URL(`/api/libraries/v2/blocks/${contentId}/`, getApiBaseUrl()).href;\nexport const getContentTaxonomyTagsCountApiUrl = (contentId) => new URL(`api/content_tagging/v1/object_tag_counts/${contentId}/?count_implicit`, getApiBaseUrl()).href;\n\n/**\n * Get all tags that belong to taxonomy.\n * @param {number} taxonomyId The id of the taxonomy to fetch tags for\n * @param {{page?: number, searchTerm?: string, parentTag?: string}} options\n * @returns {Promise<import(\"../../taxonomy/tag-list/data/types.mjs\").TagListData>}\n */\nexport async function getTaxonomyTagsData(taxonomyId, options = {}) {\n const url = getTaxonomyTagsApiUrl(taxonomyId, options);\n const { data } = await getAuthenticatedHttpClient().get(url);\n return camelCaseObject(data);\n}\n\n/**\n * Get the tags that are applied to the content object\n * @param {string} contentId The id of the content object to fetch the applied tags for\n * @returns {Promise<import(\"./types.mjs\").ContentTaxonomyTagsData>}\n */\nexport async function getContentTaxonomyTagsData(contentId) {\n const { data } = await getAuthenticatedHttpClient().get(getContentTaxonomyTagsApiUrl(contentId));\n return camelCaseObject(data[contentId]);\n}\n\n/**\n * Get the count of tags that are applied to the content object\n * @param {string} contentId The id of the content object to fetch the count of the applied tags for\n * @returns {Promise<number>}\n */\nexport async function getContentTaxonomyTagsCount(contentId) {\n const { data } = await getAuthenticatedHttpClient().get(getContentTaxonomyTagsCountApiUrl(contentId));\n if (contentId in data) {\n return camelCaseObject(data[contentId]);\n }\n return 0;\n}\n\n/**\n * Fetch meta data (eg: display_name) about the content object (unit/compoenent)\n * @param {string} contentId The id of the content object (unit/component)\n * @returns {Promise<import(\"./types.mjs\").ContentData>}\n */\nexport async function getContentData(contentId) {\n let url;\n if (contentId.startsWith('lb:')) {\n url = getLibraryContentDataApiUrl(contentId);\n } else if (contentId.startsWith('course-v1:')) {\n url = getCourseContentDataApiURL(contentId);\n } else {\n url = getXBlockContentDataApiURL(contentId);\n }\n const { data } = await getAuthenticatedHttpClient().get(url);\n return camelCaseObject(data);\n}\n\n/**\n * Update content object's applied tags\n * @param {string} contentId The id of the content object (unit/component)\n * @param {Promise<import(\"./types.mjs\").UpdateTagsData[]>} tagsData The list of tags (values) to set on content object\n * @returns {Promise<import(\"./types.mjs\").ContentTaxonomyTagsData>}\n */\nexport async function updateContentTaxonomyTags(contentId, tagsData) {\n const url = getContentTaxonomyTagsApiUrl(contentId);\n const { data } = await getAuthenticatedHttpClient().put(url, { tagsData });\n return camelCaseObject(data[contentId]);\n}\n","// @ts-check\nimport { useMemo } from 'react';\nimport { getConfig } from '@edx/frontend-platform';\nimport {\n useQuery,\n useQueries,\n useMutation,\n useQueryClient,\n} from '@tanstack/react-query';\nimport {\n getTaxonomyTagsData,\n getContentTaxonomyTagsData,\n getContentData,\n updateContentTaxonomyTags,\n getContentTaxonomyTagsCount,\n} from './api';\n\n/** @typedef {import(\"../../taxonomy/tag-list/data/types.mjs\").TagListData} TagListData */\n/** @typedef {import(\"../../taxonomy/tag-list/data/types.mjs\").TagData} TagData */\n\n/**\n * Builds the query to get the taxonomy tags\n * @param {number} taxonomyId The id of the taxonomy to fetch tags for\n * @param {string|null} parentTag The tag whose children we're loading, if any\n * @param {string} searchTerm The term passed in to perform search on tags\n * @param {number} numPages How many pages of tags to load at this level\n */\nexport const useTaxonomyTagsData = (taxonomyId, parentTag = null, numPages = 1, searchTerm = '') => {\n const queryClient = useQueryClient();\n\n const queryFn = async ({ queryKey }) => {\n const page = queryKey[3];\n return getTaxonomyTagsData(taxonomyId, { parentTag: parentTag || '', searchTerm, page });\n };\n\n /** @type {{queryKey: any[], queryFn: typeof queryFn, staleTime: number}[]} */\n const queries = [];\n for (let page = 1; page <= numPages; page++) {\n queries.push(\n { queryKey: ['taxonomyTags', taxonomyId, parentTag, page, searchTerm], queryFn, staleTime: Infinity },\n );\n }\n\n const dataPages = useQueries({ queries });\n\n const totalPages = dataPages[0]?.data?.numPages || 1;\n const hasMorePages = numPages < totalPages;\n\n const tagPages = useMemo(() => {\n // Pre-load desendants if possible\n const preLoadedData = new Map();\n\n const newTags = dataPages.map(result => {\n /** @type {TagData[]} */\n const simplifiedTagsList = [];\n\n result.data?.results?.forEach((tag) => {\n if (tag.parentValue === parentTag) {\n simplifiedTagsList.push(tag);\n } else if (!preLoadedData.has(tag.parentValue)) {\n preLoadedData.set(tag.parentValue, [tag]);\n } else {\n preLoadedData.get(tag.parentValue).push(tag);\n }\n });\n\n return { ...result, data: simplifiedTagsList };\n });\n\n // Store the pre-loaded descendants into the query cache:\n preLoadedData.forEach((tags, parentValue) => {\n const queryKey = ['taxonomyTags', taxonomyId, parentValue, 1, searchTerm];\n /** @type {TagListData} */\n const cachedData = {\n next: '',\n previous: '',\n count: tags.length,\n numPages: 1,\n currentPage: 1,\n start: 0,\n results: tags,\n };\n queryClient.setQueryData(queryKey, cachedData);\n });\n\n return newTags;\n }, [dataPages]);\n\n const flatTagPages = {\n isLoading: tagPages.some(page => page.isLoading),\n isError: tagPages.some(page => page.isError),\n isSuccess: tagPages.every(page => page.isSuccess),\n data: tagPages.flatMap(page => page.data),\n };\n\n return { hasMorePages, tagPages: flatTagPages };\n};\n\n/**\n * Builds the query to get the taxonomy tags applied to the content object\n * @param {string} contentId The ID of the content object to fetch the applied tags for (e.g. an XBlock usage key)\n */\nexport const useContentTaxonomyTagsData = (contentId) => (\n useQuery({\n queryKey: ['contentTaxonomyTags', contentId],\n queryFn: () => getContentTaxonomyTagsData(contentId),\n })\n);\n\n/**\n * Builds the query to get meta data about the content object\n * @param {string} contentId The id of the content object (unit/component)\n */\nexport const useContentData = (contentId) => (\n useQuery({\n queryKey: ['contentData', contentId],\n queryFn: () => getContentData(contentId),\n })\n);\n\n/**\n * Builds the mutation to update the tags applied to the content object\n * @param {string} contentId The id of the content object to update tags for\n */\nexport const useContentTaxonomyTagsUpdater = (contentId) => {\n const queryClient = useQueryClient();\n\n return useMutation({\n /**\n * @type {import(\"@tanstack/react-query\").MutateFunction<\n * any,\n * any,\n * {\n * tagsData: Promise<import(\"./types.mjs\").UpdateTagsData[]>\n * }\n * >}\n */\n mutationFn: ({ tagsData }) => updateContentTaxonomyTags(contentId, tagsData),\n onSettled: /* istanbul ignore next */ () => {\n queryClient.invalidateQueries({ queryKey: ['contentTaxonomyTags', contentId] });\n /// Invalidate query with pattern on course outline\n let contentPattern;\n if (contentId.includes('course-v1')) {\n contentPattern = contentId;\n } else {\n contentPattern = contentId.replace(/\\+type@.*$/, '*');\n }\n queryClient.invalidateQueries({ queryKey: ['contentTagsCount', contentPattern] });\n },\n onSuccess: /* istanbul ignore next */ () => {\n /* istanbul ignore next */\n if (window.top != null) {\n // This send messages to the parent page if the drawer is called from a iframe.\n // Is used on Studio to update tags data and counts.\n // In the future, when the Course Outline Page and Unit Page are integrated into this MFE,\n // they should just use React Query to load the tag counts, and React Query will automatically\n // refresh those counts when the mutation invalidates them. So this postMessage is just a temporary\n // feature to support the legacy Django template courseware page.\n\n // Sends content tags.\n getContentTaxonomyTagsData(contentId).then((data) => {\n const contentData = {\n contentId,\n ...data,\n };\n window.top?.postMessage(\n { type: 'authoring.events.tags.updated', data: contentData },\n getConfig().STUDIO_BASE_URL,\n );\n });\n\n // Sends tags count.\n getContentTaxonomyTagsCount(contentId).then((data) => {\n const contentData = {\n contentId,\n count: data,\n };\n window.top?.postMessage(\n { type: 'authoring.events.tags.count.updated', data: contentData },\n getConfig().STUDIO_BASE_URL,\n );\n });\n }\n },\n });\n};\n","// @ts-check\nimport React, { useEffect, useState, useCallback } from 'react';\nimport {\n Icon,\n Spinner,\n Button,\n} from '@openedx/paragon';\nimport { SelectableBox } from '@edx/frontend-lib-content-components';\nimport { useIntl, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { ArrowDropDown, ArrowDropUp, Add } from '@openedx/paragon/icons';\nimport PropTypes from 'prop-types';\nimport messages from './messages';\n\nimport { useTaxonomyTagsData } from './data/apiHooks';\n\nconst HighlightedText = ({ text, highlight }) => {\n if (!highlight) {\n return <span>{text}</span>;\n }\n\n const parts = text.split(new RegExp(`(${highlight})`, 'gi'));\n return (\n <span>\n {parts.map((part, index) => (\n // eslint-disable-next-line react/no-array-index-key -- using index because part is not unique\n <React.Fragment key={index}>\n {part.toLowerCase() === highlight.toLowerCase() ? <b>{part}</b> : part}\n </React.Fragment>\n ))}\n </span>\n );\n};\n\nHighlightedText.propTypes = {\n text: PropTypes.string.isRequired,\n highlight: PropTypes.string,\n};\n\nHighlightedText.defaultProps = {\n highlight: '',\n};\n\nconst ContentTagsDropDownSelector = ({\n taxonomyId, level, lineage, appliedContentTagsTree, stagedContentTagsTree, searchTerm,\n}) => {\n const intl = useIntl();\n\n // This object represents the states of the dropdowns on this level\n // The keys represent the index of the dropdown with\n // the value true (open) false (closed)\n const [dropdownStates, setDropdownStates] = useState(/** type Record<string, boolean> */ {});\n const isOpen = (tagValue) => dropdownStates[tagValue];\n\n const [numPages, setNumPages] = useState(1);\n const parentTagValue = lineage.length ? decodeURIComponent(lineage[lineage.length - 1]) : null;\n const { hasMorePages, tagPages } = useTaxonomyTagsData(taxonomyId, parentTagValue, numPages, searchTerm);\n\n const [prevSearchTerm, setPrevSearchTerm] = useState(searchTerm);\n\n // Reset the page and tags state when search term changes\n // and store search term to compare\n if (prevSearchTerm !== searchTerm) {\n setPrevSearchTerm(searchTerm);\n setNumPages(1);\n }\n\n useEffect(() => {\n if (tagPages.isSuccess) {\n if (searchTerm) {\n const expandAll = tagPages.data.reduce(\n (acc, tagData) => ({\n ...acc,\n [tagData.value]: !!tagData.childCount,\n }),\n {},\n );\n setDropdownStates(expandAll);\n } else {\n setDropdownStates({});\n }\n }\n }, [searchTerm, tagPages.isSuccess]);\n\n const clickAndEnterHandler = (tagValue) => {\n // This flips the state of the dropdown at index false (closed) -> true (open)\n // and vice versa. Initially they are undefined which is falsy.\n setDropdownStates({ ...dropdownStates, [tagValue]: !dropdownStates[tagValue] });\n };\n\n const isImplicit = (tag) => {\n // Traverse the applied tags tree using the lineage\n let appliedTraversal = appliedContentTagsTree;\n lineage.forEach(t => {\n appliedTraversal = appliedTraversal[t]?.children || {};\n });\n const isAppliedImplicit = (appliedTraversal[tag.value] && !appliedTraversal[tag.value].explicit);\n\n // Traverse the staged tags tree using the lineage\n let stagedTraversal = stagedContentTagsTree;\n lineage.forEach(t => {\n stagedTraversal = stagedTraversal[t]?.children || {};\n });\n const isStagedImplicit = (stagedTraversal[tag.value] && !stagedTraversal[tag.value].explicit);\n\n return isAppliedImplicit || isStagedImplicit || false;\n };\n\n const isApplied = (tag) => {\n // Traverse the applied tags tree using the lineage\n let appliedTraversal = appliedContentTagsTree;\n lineage.forEach(t => {\n appliedTraversal = appliedTraversal[t]?.children || {};\n });\n return !!appliedTraversal[tag.value];\n };\n\n const isStagedExplicit = (tag) => {\n // Traverse the staged tags tree using the lineage\n let stagedTraversal = stagedContentTagsTree;\n lineage.forEach(t => {\n stagedTraversal = stagedTraversal[t]?.children || {};\n });\n return stagedTraversal[tag.value] && stagedTraversal[tag.value].explicit;\n };\n\n // Returns the state of the tag as a string: [Unchecked/Implicit/Checked]\n const getTagState = (tag) => {\n if (isApplied(tag) || isStagedExplicit(tag)) {\n return intl.formatMessage(messages.taxonomyTagChecked);\n }\n\n if (isImplicit(tag)) {\n return intl.formatMessage(messages.taxonomyTagImplicit);\n }\n\n return intl.formatMessage(messages.taxonomyTagUnchecked);\n };\n\n const isTopOfTagTreeDropdown = (index) => index === 0 && level === 0;\n\n const loadMoreTags = useCallback(() => {\n setNumPages((x) => x + 1);\n }, []);\n\n const handleKeyBoardNav = (e, hasChildren) => {\n const keyPressed = e.code;\n const currentElement = e.target;\n const encapsulator = currentElement.closest('.dropdown-selector-tag-encapsulator');\n\n // Get tag value with full lineage, this is URI encoded\n const tagValueWithLineage = currentElement.querySelector('.pgn__form-checkbox-input')?.value;\n // Extract and decode the actual tag value\n let tagValue = tagValueWithLineage.split(',').slice(-1)[0];\n tagValue = tagValue ? decodeURIComponent(tagValue) : tagValue;\n\n if (keyPressed === 'ArrowRight') {\n e.preventDefault();\n if (tagValue && !isOpen(tagValue)) {\n clickAndEnterHandler(tagValue);\n }\n } else if (keyPressed === 'ArrowLeft') {\n e.preventDefault();\n if (tagValue && isOpen(tagValue)) {\n clickAndEnterHandler(tagValue);\n } else {\n // Handles case of jumping out of subtags to previous parent tag\n const prevParentTagEncapsulator = encapsulator?.parentNode.closest('.dropdown-selector-tag-encapsulator');\n const prevParentTag = prevParentTagEncapsulator?.querySelector('.dropdown-selector-tag-actions');\n prevParentTag?.focus();\n }\n } else if (keyPressed === 'ArrowUp') {\n const prevSubTags = encapsulator?.previousElementSibling?.querySelectorAll('.dropdown-selector-tag-actions');\n const prevSubTag = prevSubTags && prevSubTags[prevSubTags.length - 1];\n const prevTag = encapsulator?.previousElementSibling?.querySelector('.dropdown-selector-tag-actions');\n\n if (prevSubTag) {\n // Handles case of jumping in to subtags\n prevSubTag.focus();\n } else if (prevTag) {\n // Handles case of navigating to previous tag on same level\n prevTag.focus();\n } else {\n // Handles case of jumping out of subtags to previous parent tag\n const prevParentTagEncapsulator = encapsulator?.parentNode.closest('.dropdown-selector-tag-encapsulator');\n const prevParentTag = prevParentTagEncapsulator?.querySelector('.dropdown-selector-tag-actions');\n prevParentTag?.focus();\n }\n } else if (keyPressed === 'ArrowDown') {\n const subTagEncapsulator = encapsulator?.querySelector('.dropdown-selector-tag-encapsulator');\n const nextSubTag = subTagEncapsulator?.querySelector('.dropdown-selector-tag-actions');\n const nextTag = encapsulator?.nextElementSibling?.querySelector('.dropdown-selector-tag-actions');\n\n if (nextSubTag) {\n // Handles case of jumping into subtags\n nextSubTag.focus();\n } else if (nextTag) {\n // Handles case of navigating to next tag on same level\n nextTag?.focus();\n } else {\n // Handles case of jumping out of subtags to next focusable parent tag\n let nextParentTagEncapsulator = encapsulator?.parentNode?.closest('.dropdown-selector-tag-encapsulator');\n\n while (nextParentTagEncapsulator) {\n const nextParentTag = nextParentTagEncapsulator.nextElementSibling?.querySelector(\n '.dropdown-selector-tag-actions',\n );\n if (nextParentTag) {\n nextParentTag.focus();\n break;\n }\n nextParentTagEncapsulator = nextParentTagEncapsulator.parentNode.closest(\n '.dropdown-selector-tag-encapsulator',\n );\n }\n }\n } else if (keyPressed === 'Enter') {\n e.preventDefault();\n if (hasChildren && tagValue) {\n clickAndEnterHandler(tagValue);\n } else {\n const checkbox = currentElement.querySelector('.taxonomy-tags-selectable-box');\n checkbox.click();\n }\n } else if (keyPressed === 'Space') {\n e.preventDefault();\n const checkbox = currentElement.querySelector('.taxonomy-tags-selectable-box');\n checkbox.click();\n }\n };\n\n return (\n <div style={{ marginLeft: `${level * 1 }rem` }}>\n {tagPages.isLoading ? (\n <div className=\"d-flex justify-content-center align-items-center flex-row\">\n <Spinner\n animation=\"border\"\n size=\"xl\"\n screenReaderText={intl.formatMessage(messages.loadingTagsDropdownMessage)}\n />\n </div>\n ) : null }\n {tagPages.isError ? 'Error...' : null /* TODO: show a proper error message */}\n\n {tagPages.data?.map((tagData, i) => (\n <div key={tagData.value} className=\"mt-1 ml-1 dropdown-selector-tag-encapsulator\">\n <div\n className=\"d-flex flex-row\"\n style={{\n minHeight: '44px',\n }}\n >\n {/* The tabIndex and onKeyDown are needed to implement custom keyboard navigation */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n className=\"d-flex dropdown-selector-tag-actions\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={isTopOfTagTreeDropdown(i) ? 0 : -1} // Only enable tab into top of dropdown tree to set focus\n onKeyDown={(e) => handleKeyBoardNav(e, tagData.childCount > 0)}\n aria-label={\n intl.formatMessage(\n (isTopOfTagTreeDropdown(i)\n ? messages.taxonomyTagActionInstructionsAriaLabel\n : messages.taxonomyTagActionsAriaLabel),\n { tag: tagData.value, tagState: getTagState(tagData) },\n )\n }\n >\n <SelectableBox\n inputHidden={false}\n type=\"checkbox\"\n className=\"d-flex align-items-center taxonomy-tags-selectable-box\"\n data-selectable-box=\"taxonomy-tags\"\n value={[...lineage, tagData.value].map(t => encodeURIComponent(t)).join(',')}\n isIndeterminate={isApplied(tagData) || isImplicit(tagData)}\n disabled={isApplied(tagData) || isImplicit(tagData)}\n tabIndex=\"-1\"\n >\n <HighlightedText text={tagData.value} highlight={searchTerm} />\n </SelectableBox>\n { tagData.childCount > 0\n && (\n <div className=\"d-flex align-items-center taxonomy-tags-arrow-drop-down\">\n <Icon\n src={isOpen(tagData.value) ? ArrowDropUp : ArrowDropDown}\n onClick={() => clickAndEnterHandler(tagData.value)}\n tabIndex={-1}\n />\n </div>\n )}\n </div>\n\n </div>\n\n { tagData.childCount > 0 && isOpen(tagData.value) && (\n <ContentTagsDropDownSelector\n taxonomyId={taxonomyId}\n level={level + 1}\n lineage={[...lineage, tagData.value]}\n appliedContentTagsTree={appliedContentTagsTree}\n stagedContentTagsTree={stagedContentTagsTree}\n searchTerm={searchTerm}\n />\n )}\n\n </div>\n ))}\n\n { hasMorePages\n ? (\n <div>\n <Button\n tabIndex=\"0\"\n variant=\"tertiary\"\n iconBefore={Add}\n onClick={loadMoreTags}\n className=\"mb-2 ml-1 taxonomy-tags-load-more-button px-0 text-info-500\"\n >\n <FormattedMessage {...messages.loadMoreTagsButtonText} />\n </Button>\n </div>\n )\n : null}\n\n { tagPages.data.length === 0 && !tagPages.isLoading && (\n <div className=\"d-flex justify-content-center muted-text\">\n { searchTerm\n ? <FormattedMessage {...messages.noTagsFoundMessage} values={{ searchTerm }} />\n : <FormattedMessage {...messages.noTagsInTaxonomyMessage} />}\n </div>\n )}\n\n </div>\n );\n};\n\nContentTagsDropDownSelector.defaultProps = {\n lineage: [],\n searchTerm: '',\n};\n\nContentTagsDropDownSelector.propTypes = {\n taxonomyId: PropTypes.number.isRequired,\n level: PropTypes.number.isRequired,\n lineage: PropTypes.arrayOf(PropTypes.string),\n appliedContentTagsTree: PropTypes.objectOf(\n PropTypes.shape({\n explicit: PropTypes.bool.isRequired,\n children: PropTypes.shape({}).isRequired,\n }).isRequired,\n ).isRequired,\n stagedContentTagsTree: PropTypes.objectOf(\n PropTypes.shape({\n explicit: PropTypes.bool.isRequired,\n children: PropTypes.shape({}).isRequired,\n }).isRequired,\n ).isRequired,\n searchTerm: PropTypes.string,\n};\n\nexport default ContentTagsDropDownSelector;\n","// @ts-check\n/* eslint-disable import/prefer-default-export */\nimport React from 'react';\n\n/** @typedef {import(\"../data/types.mjs\").TagsInTaxonomy} TagsInTaxonomy */\n/** @typedef {import(\"../data/types.mjs\").StagedTagData} StagedTagData */\n\n/* istanbul ignore next */\nexport const ContentTagsDrawerContext = React.createContext({\n stagedContentTags: /** @type{Record<number, StagedTagData[]>} */ ({}),\n globalStagedContentTags: /** @type{Record<number, StagedTagData[]>} */ ({}),\n globalStagedRemovedContentTags: /** @type{Record<number, string>} */ ({}),\n addStagedContentTag: /** @type{(taxonomyId: number, addedTag: StagedTagData) => void} */ (() => {}),\n removeStagedContentTag: /** @type{(taxonomyId: number, tagValue: string) => void} */ (() => {}),\n removeGlobalStagedContentTag: /** @type{(taxonomyId: number, tagValue: string) => void} */ (() => {}),\n addRemovedContentTag: /** @type{(taxonomyId: number, tagValue: string) => void} */ (() => {}),\n deleteRemovedContentTag: /** @type{(taxonomyId: number, tagValue: string) => void} */ (() => {}),\n setStagedTags: /** @type{(taxonomyId: number, tagsList: StagedTagData[]) => void} */ (() => {}),\n setGlobalStagedContentTags: /** @type{Function} */ (() => {}),\n commitGlobalStagedTags: /** @type{() => void} */ (() => {}),\n commitGlobalStagedTagsStatus: /** @type{null|string} */ (null),\n isContentDataLoaded: /** @type{boolean} */ (false),\n isContentTaxonomyTagsLoaded: /** @type{boolean} */ (false),\n isTaxonomyListLoaded: /** @type{boolean} */ (false),\n contentName: /** @type{string} */ (''),\n tagsByTaxonomy: /** @type{TagsInTaxonomy[]} */ ([]),\n isEditMode: /** @type{boolean} */ (false),\n toEditMode: /** @type{() => void} */ (() => {}),\n toReadMode: /** @type{() => void} */ (() => {}),\n collapsibleStates: /** @type{Record<number, boolean>} */ ({}),\n openCollapsible: /** @type{(taxonomyId: number) => void} */ (() => {}),\n closeCollapsible: /** @type{(taxonomyId: number) => void} */ (() => {}),\n toastMessage: /** @type{string|undefined} */ (undefined),\n showToastAfterSave: /** @type{() => void} */ (() => {}),\n closeToast: /** @type{() => void} */ (() => {}),\n setCollapsibleToInitalState: /** @type{() => void} */ (() => {}),\n otherTaxonomies: /** @type{TagsInTaxonomy[]} */ ([]),\n});\n\n// This context has not been added to ContentTagsDrawerContext because it has been\n// created one level higher to control the behavior of the Sheet that contatins the Drawer.\n// This logic is not used in legacy edx-platform screens. But it can be separated if we keep\n// the contexts separate.\n// TODO We can join both contexts when the Drawer is no longer used on edx-platform\n/* istanbul ignore next */\nexport const ContentTagsDrawerSheetContext = React.createContext({\n blockingSheet: /** @type{boolean} */ (false),\n setBlockingSheet: /** @type{Function} */ (() => {}),\n});\n","// @ts-check\nimport React from 'react';\nimport { useCheckboxSetValues } from '@openedx/paragon';\nimport { cloneDeep } from 'lodash';\n\nimport { useContentTaxonomyTagsUpdater } from './data/apiHooks';\nimport { ContentTagsDrawerContext } from './common/context';\n\n/** @typedef {import(\"../taxonomy/data/types.mjs\").TaxonomyData} TaxonomyData */\n/** @typedef {import(\"./data/types.mjs\").Tag} ContentTagData */\n/** @typedef {import(\"./ContentTagsCollapsible\").TagTreeEntry} TagTreeEntry */\n/** @typedef {import(\"./data/types.mjs\").StagedTagData} StagedTagData */\n/** @typedef {import(\"./data/types.mjs\").UpdateTagsData} UpdateTagsData */\n\n/**\n * Util function that sorts the keys of a tree in alphabetical order.\n *\n * @param {object} tree - tree that needs it's keys sorted\n * @returns {object} sorted tree\n */\nconst sortKeysAlphabetically = (tree) => {\n const sortedObj = {};\n Object.keys(tree)\n .sort()\n .forEach((key) => {\n sortedObj[key] = tree[key];\n if (tree[key] && typeof tree[key] === 'object') {\n sortedObj[key].children = sortKeysAlphabetically(tree[key].children);\n }\n });\n return sortedObj;\n};\n\n/**\n * Util function that returns the leafs of a tree. Mainly used to extract the explicit\n * tags selected in the staged tags tree\n *\n * @param {object} tree - tree to extract the leaf tags from\n * @returns {StagedTagData[]} array of leaf (explicit) tags of provided tree\n */\nconst getLeafTags = (tree) => {\n const leafTags = [];\n\n function traverse(node) {\n Object.keys(node).forEach(key => {\n const child = node[key];\n if (Object.keys(child.children).length === 0) {\n leafTags.push({\n value: key,\n // Always true because this is a new added tag,\n // so the user can delete.\n canDeleteObjecttag: true,\n lineage: child.lineage,\n });\n } else {\n traverse(child.children);\n }\n });\n }\n\n traverse(tree);\n return leafTags;\n};\n\n/**\n * Handles all the underlying logic for the ContentTagsCollapsible component\n * @param {string} contentId The ID of the content we're tagging (e.g. usage key)\n * @param {StagedTagData[]} stagedContentTags\n * - Array of staged tags represented as objects with value/label\n * @param {TaxonomyData & {contentTags: ContentTagData[]}} taxonomyAndTagsData\n * @returns {{\n * tagChangeHandler: (tagSelectableBoxValue: string, checked: boolean) => void,\n * removeAppliedTagHandler: (tagSelectableBoxValue: string) => void,\n * appliedContentTagsTree: Record<string, TagTreeEntry>,\n * stagedContentTagsTree: Record<string, TagTreeEntry>,\n * contentTagsCount: number,\n * checkedTags: any,\n * commitStagedTagsToGlobal: () => void,\n * updateTags: import('@tanstack/react-query').UseMutationResult<\n * any, unknown, { tagsData: Promise<UpdateTagsData[]>; }, unknown\n * >\n * }}\n */\nconst useContentTagsCollapsibleHelper = (\n contentId,\n stagedContentTags,\n taxonomyAndTagsData,\n) => {\n const {\n isEditMode,\n addStagedContentTag,\n removeStagedContentTag,\n removeGlobalStagedContentTag,\n addRemovedContentTag,\n deleteRemovedContentTag,\n globalStagedContentTags,\n setGlobalStagedContentTags,\n globalStagedRemovedContentTags,\n } = React.useContext(ContentTagsDrawerContext);\n\n const {\n id, contentTags,\n } = taxonomyAndTagsData;\n const updateTags = useContentTaxonomyTagsUpdater(contentId);\n\n // Keeps track of the content objects tags count (both implicit and explicit)\n const [contentTagsCount, setContentTagsCount] = React.useState(0);\n\n // Keeps track of the tree structure for tags that are add by selecting/unselecting\n // tags in the dropdowns.\n const [stagedContentTagsTree, setStagedContentTagsTree] = React.useState({});\n\n // To handle checking/unchecking tags in the SelectableBox\n const [checkedTags, { add, remove, clear }] = useCheckboxSetValues();\n\n // State to keep track of the staged tags (and along with ancestors) that should be removed\n const [stagedTagsToRemove, setStagedTagsToRemove] = React.useState(/** @type string[] */([]));\n\n // State to keep track of the global tags (stagged and feched) that should be removed\n const [globalTagsToRemove, setGlobalTagsToRemove] = React.useState(/** @type string[] */([]));\n\n // Handles the removal of staged content tags based on what was removed\n // from the staged tags tree. We are doing it in a useEffect since the removeTag\n // method is being called inside a setState of the parent component, which\n // was causing warnings\n React.useEffect(() => {\n stagedTagsToRemove.forEach(tag => removeStagedContentTag(id, tag));\n }, [stagedTagsToRemove, removeStagedContentTag, id]);\n\n // When you change the drawer mode, it is necessary to clear\n // all checked tags in the select.\n React.useEffect(() => {\n clear();\n }, [isEditMode]);\n\n React.useEffect(() => {\n globalTagsToRemove.forEach((tag) => {\n if (globalStagedContentTags[id]\n && globalStagedContentTags[id].some(t => t.value === tag)) {\n // A new tag has been removed\n removeGlobalStagedContentTag(id, tag);\n } else if (contentTags.some(t => t.value === tag)) {\n // A feched tag has been removed\n addRemovedContentTag(id, tag);\n }\n });\n }, [globalTagsToRemove, removeGlobalStagedContentTag, id]);\n\n // Handles making requests to the update endpoint when the staged tags need to be committed\n const commitStagedTagsToGlobal = React.useCallback(() => {\n // Filter out only leaf nodes of staging tree to commit\n const explicitStaged = getLeafTags(stagedContentTagsTree);\n\n const globalTags = cloneDeep(globalStagedContentTags);\n const newGlobalTags = [];\n\n explicitStaged.forEach((tag) => {\n if (globalStagedRemovedContentTags[id]\n && globalStagedRemovedContentTags[id].includes(tag.value)) {\n // A feched tag that has been removed has been added again\n deleteRemovedContentTag(id, tag.value);\n } else {\n // New tag added\n newGlobalTags.push(tag);\n }\n });\n\n if (newGlobalTags) {\n if (!globalTags[id]) {\n globalTags[id] = newGlobalTags;\n } else {\n // Filter out applied tags that should become implicit because a child tag was committed\n const stagedLineages = stagedContentTags.map(st => decodeURIComponent(st.value).split(',').slice(0, -1)).flat();\n const applied = globalTags[id].filter(t => !stagedLineages.includes(t.value));\n\n globalTags[id] = [...applied, ...newGlobalTags];\n }\n\n setGlobalStagedContentTags(globalTags);\n }\n }, [contentTags, stagedContentTags, stagedContentTagsTree, updateTags]);\n\n // This converts the contentTags prop to the tree structure mentioned above\n const appliedContentTagsTree = React.useMemo(() => {\n let contentTagsCounter = 0;\n\n // When an error occurs while updating, the contentTags query is invalidated,\n // hence they will be recalculated, and the updateTags mutation should be reset.\n if (updateTags.isError) {\n updateTags.reset();\n }\n\n const resultTree = {};\n contentTags.forEach(item => {\n let currentLevel = resultTree;\n\n item.lineage.forEach((key, index) => {\n if (!currentLevel[key]) {\n const isExplicit = index === item.lineage.length - 1;\n currentLevel[key] = {\n explicit: isExplicit,\n children: {},\n canChangeObjecttag: item.canChangeObjecttag,\n canDeleteObjecttag: item.canDeleteObjecttag,\n };\n\n // Populating the SelectableBox with \"selected\" (explicit) tags\n const value = item.lineage.map(l => encodeURIComponent(l)).join(',');\n // Clear all the existing applied tags\n remove(value);\n // Add only the explicitly applied tags\n if (isExplicit) {\n add(value);\n }\n contentTagsCounter += 1;\n }\n\n currentLevel = currentLevel[key].children;\n });\n });\n\n setContentTagsCount(contentTagsCounter);\n return resultTree;\n }, [contentTags, updateTags.isError]);\n\n /**\n * Util function that removes the tag along with its ancestors if it was\n * the only explicit child tag. It returns a list of staged tags (and ancestors) that\n * were unstaged and should be removed\n *\n * @param {object} tree - tag tree to remove the tag from\n * @param {string[]} tagsToRemove - remaining lineage of tag to remove at each recursive level.\n * eg: ['grand parent', 'parent', 'tag']\n * @param {boolean} staged - whether we are removing staged tags or not\n * @param {string[]} fullLineage - Full lineage of tag being removed\n * @returns {string[]} array of staged tag values (with ancestors) that should be removed from staged tree\n *\n */\n const removeTags = React.useCallback((tree, tagsToRemove, staged, fullLineage) => {\n const removedTags = [];\n\n const traverseAndRemoveTags = (subTree, innerTagsToRemove) => {\n if (!subTree || !innerTagsToRemove.length) {\n return;\n }\n const key = innerTagsToRemove[0];\n if (subTree[key]) {\n traverseAndRemoveTags(subTree[key].children, innerTagsToRemove.slice(1));\n\n if (\n Object.keys(subTree[key].children).length === 0\n && (subTree[key].explicit === false || innerTagsToRemove.length === 1)\n ) {\n // eslint-disable-next-line no-param-reassign\n delete subTree[key];\n\n // Remove tags (including ancestors) from staged tags select menu\n if (staged) {\n // Build value from lineage by traversing beginning till key, then encoding them\n const toRemove = fullLineage.slice(0, fullLineage.indexOf(key) + 1).map(item => encodeURIComponent(item));\n if (toRemove.length > 0) {\n removedTags.push(toRemove.join(','));\n }\n }\n }\n }\n };\n\n traverseAndRemoveTags(tree, tagsToRemove);\n\n return removedTags;\n }, []);\n\n // Add tag to the tree, and while traversing remove any selected ancestor tags\n // as they should become implicit\n const addTags = (tree, tagLineage, selectedTag) => {\n const value = [];\n let traversal = tree;\n tagLineage.forEach(tag => {\n const isExplicit = selectedTag === tag;\n\n // Clear out the ancestor tags leading to newly selected tag\n // as they automatically become implicit\n value.push(encodeURIComponent(tag));\n\n if (!traversal[tag]) {\n traversal[tag] = {\n explicit: isExplicit,\n children: {},\n canChangeObjecttag: false,\n canDeleteObjecttag: false,\n };\n if (isExplicit) {\n traversal[tag].lineage = tagLineage;\n }\n } /* istanbul ignore next */ else {\n traversal[tag].explicit = isExplicit;\n traversal[tag].lineage = tagLineage;\n }\n\n // eslint-disable-next-line no-unused-expressions\n isExplicit ? add(value.join(',')) : remove(value.join(','));\n traversal = traversal[tag].children;\n });\n };\n\n const tagChangeHandler = React.useCallback((tagSelectableBoxValue, checked) => {\n const tagLineage = tagSelectableBoxValue.split(',').map(t => decodeURIComponent(t));\n const selectedTag = tagLineage.slice(-1)[0];\n\n if (checked) {\n const stagedTree = cloneDeep(stagedContentTagsTree);\n // We \"add\" the tag to the SelectableBox.Set inside the addTags method\n addTags(stagedTree, tagLineage, selectedTag);\n\n // Update the staged content tags tree\n setStagedContentTagsTree(stagedTree);\n\n // Add content tag to taxonomy's staged tags select menu\n addStagedContentTag(\n id,\n {\n value: tagSelectableBoxValue,\n label: selectedTag,\n },\n );\n } else {\n // Remove tag from the SelectableBox.Set\n remove(tagSelectableBoxValue);\n\n // Remove tag along with it's from ancestors if it's the only child tag\n // from the staged tags tree and update the staged content tags tree\n setStagedContentTagsTree(prevStagedContentTagsTree => {\n const updatedStagedContentTagsTree = cloneDeep(prevStagedContentTagsTree);\n const tagsToRemove = removeTags(updatedStagedContentTagsTree, tagLineage, true, tagLineage);\n setStagedTagsToRemove(tagsToRemove);\n return updatedStagedContentTagsTree;\n });\n }\n }, [\n stagedContentTagsTree, setStagedContentTagsTree, addTags, removeTags,\n id, addStagedContentTag, removeStagedContentTag,\n ]);\n\n const removeAppliedTagHandler = React.useCallback((tagSelectableBoxValue) => {\n const tagLineage = tagSelectableBoxValue.split(',').map(t => decodeURIComponent(t));\n\n // Remove tag from the SelectableBox.Set\n remove(tagSelectableBoxValue);\n\n // Remove tags from applied tags\n removeTags(appliedContentTagsTree, tagLineage, false, tagLineage);\n const selectedTag = tagLineage.slice(-1)[0];\n\n setGlobalTagsToRemove([selectedTag]);\n }, [appliedContentTagsTree, id, removeStagedContentTag]);\n\n return {\n tagChangeHandler,\n removeAppliedTagHandler,\n appliedContentTagsTree: sortKeysAlphabetically(appliedContentTagsTree),\n stagedContentTagsTree: sortKeysAlphabetically(stagedContentTagsTree),\n contentTagsCount,\n checkedTags,\n commitStagedTagsToGlobal,\n updateTags,\n };\n};\n\nexport default useContentTagsCollapsibleHelper;\n","// @ts-check\nimport React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Icon, Stack, IconButton } from '@openedx/paragon';\nimport { Tag, Close } from '@openedx/paragon/icons';\nimport messages from './messages';\nimport { ContentTagsDrawerContext } from './common/context';\n\nconst TagComponent = ({\n value,\n canDelete,\n explicit,\n removeTagHandler,\n lineage,\n}) => {\n const intl = useIntl();\n\n const handleClick = React.useCallback(() => {\n if (explicit && canDelete) {\n removeTagHandler(lineage.join(','));\n }\n }, [explicit, lineage, canDelete, removeTagHandler]);\n\n return (\n <Stack direction=\"horizontal\">\n <Icon src={Tag} className=\"mr-1 pb-1.5 text-info-500\" />\n {value}\n {explicit && canDelete && (\n <IconButton\n isActive\n key={value}\n src={Close}\n iconAs={Icon}\n alt={intl.formatMessage(messages.tagsDeleteAltText)}\n onClick={handleClick}\n variant=\"light\"\n className=\"tags-tree-delete-button ml-2 text-gray-600\"\n />\n )}\n </Stack>\n );\n};\n\nTagComponent.propTypes = {\n value: PropTypes.string.isRequired,\n canDelete: PropTypes.bool,\n explicit: PropTypes.bool,\n lineage: PropTypes.arrayOf(PropTypes.string).isRequired,\n removeTagHandler: PropTypes.func,\n};\n\nTagComponent.defaultProps = {\n removeTagHandler: undefined,\n canDelete: false,\n explicit: false,\n};\n\n/**\n * Component that renders Tags under a Taxonomy in the nested tree format.\n *\n * Example:\n *\n * {\n * \"Science and Research\": {\n * explicit: false,\n * canDeleteObjecttag: true,\n * children: {\n * \"Genetics Subcategory\": {\n * explicit: false,\n * canDeleteObjecttag: true,\n * children: {\n * \"DNA Sequencing\": {\n * explicit: true,\n * canDeleteObjecttag: false,\n * children: {}\n * }\n * }\n * },\n * \"Molecular, Cellular, and Microbiology\": {\n * explicit: false,\n * canDeleteObjecttag: false,\n * children: {\n * \"Virology\": {\n * explicit: true,\n * canDeleteObjecttag: true,\n * children: {}\n * }\n * }\n * }\n * }\n * }\n * };\n *\n * @param {Object} props - The component props.\n * @param {Object} props.tags - Array of taxonomy tags that are applied to the content.\n * @param {number} props.rootDepth - Depth of the parent tag (root), used to render tabs for the tree.\n * @param {string} props.parentKey - Key of the parent tag.\n * @param {string[]} props.lineage - Lineage of the tag.\n * @param {(\n * tagSelectableBoxValue: string,\n * checked: boolean\n * ) => void} props.removeTagHandler - Function that is called when removing tags from the tree.\n */\nconst TagsTree = ({\n tags,\n rootDepth,\n parentKey,\n lineage,\n removeTagHandler,\n}) => {\n const { isEditMode } = useContext(ContentTagsDrawerContext);\n\n if (Object.keys(tags).length === 0) {\n return null;\n }\n\n // Used to Generate tabs for the parents of this tree\n const tabsNumberArray = Array.from({ length: rootDepth }, (_, index) => index + 1);\n\n return (\n <div className=\"tags-tree\" key={parentKey}>\n {Object.keys(tags).map((key) => (\n <div className=\"mt-1.5 mb-1.5\" key={key}>\n <div className=\"d-flex pl-2.5\" key={key}>\n {\n tabsNumberArray.map((index) => <span className=\"d-inline-block ml-4\" key={`${key}-${index}`} />)\n }\n <TagComponent\n value={key}\n canDelete={isEditMode && tags[key].canDeleteObjecttag}\n explicit={tags[key].explicit}\n lineage={[...lineage, encodeURIComponent(key)]}\n removeTagHandler={removeTagHandler}\n />\n </div>\n { tags[key].children\n && (\n <TagsTree\n tags={tags[key].children}\n rootDepth={rootDepth + 1}\n parentKey={key}\n lineage={[...lineage, encodeURIComponent(key)]}\n removeTagHandler={removeTagHandler}\n />\n )}\n </div>\n ))}\n </div>\n );\n};\n\nTagsTree.propTypes = {\n tags: PropTypes.shape({}).isRequired,\n parentKey: PropTypes.string,\n rootDepth: PropTypes.number,\n lineage: PropTypes.arrayOf(PropTypes.string),\n removeTagHandler: PropTypes.func,\n};\n\nTagsTree.defaultProps = {\n rootDepth: 0,\n parentKey: undefined,\n lineage: [],\n removeTagHandler: undefined,\n};\n\nexport default TagsTree;\n","// @ts-check\n// disable prop-types since we're using TypeScript to define the prop types,\n// but the linter can't detect that in a .jsx file.\n/* eslint-disable react/prop-types */\nimport React, { useContext } from 'react';\nimport Select, { components } from 'react-select';\nimport {\n Collapsible,\n Button,\n Spinner,\n Chip,\n Icon,\n} from '@openedx/paragon';\nimport { Tag, KeyboardArrowDown, KeyboardArrowUp } from '@openedx/paragon/icons';\nimport { SelectableBox } from '@edx/frontend-lib-content-components';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { debounce } from 'lodash';\nimport messages from './messages';\n\nimport ContentTagsDropDownSelector from './ContentTagsDropDownSelector';\n\nimport useContentTagsCollapsibleHelper from './ContentTagsCollapsibleHelper';\nimport TagsTree from './TagsTree';\nimport { ContentTagsDrawerContext } from './common/context';\n\n/** @typedef {import(\"./ContentTagsCollapsible\").TaxonomySelectProps} TaxonomySelectProps */\n/** @typedef {import(\"../taxonomy/data/types.mjs\").TaxonomyData} TaxonomyData */\n/** @typedef {import(\"./data/types.mjs\").Tag} ContentTagData */\n/** @typedef {import(\"./data/types.mjs\").StagedTagData} StagedTagData */\n\n/**\n * Custom Menu component for our Select box\n * @param {import(\"react-select\").MenuProps&{selectProps: TaxonomySelectProps}} props\n */\nconst CustomMenu = (props) => {\n const {\n handleSelectableBoxChange,\n checkedTags,\n taxonomyId,\n appliedContentTagsTree,\n stagedContentTagsTree,\n handleCommitStagedTags,\n handleCancelStagedTags,\n searchTerm,\n selectCancelRef,\n selectAddRef,\n value,\n } = props.selectProps;\n const intl = useIntl();\n return (\n <components.Menu {...props}>\n <div className=\"bg-white p-3 shadow\">\n\n <SelectableBox.Set\n type=\"checkbox\"\n name=\"tags\"\n columns={1}\n ariaLabel={intl.formatMessage(messages.taxonomyTagsAriaLabel)}\n className=\"taxonomy-tags-selectable-box-set\"\n onChange={handleSelectableBoxChange}\n value={checkedTags}\n tabIndex=\"-1\"\n >\n <ContentTagsDropDownSelector\n key={`selector-${taxonomyId}`}\n taxonomyId={taxonomyId}\n level={0}\n appliedContentTagsTree={appliedContentTagsTree}\n stagedContentTagsTree={stagedContentTagsTree}\n searchTerm={searchTerm}\n />\n </SelectableBox.Set>\n <hr className=\"mt-0 mb-0\" />\n <div className=\"d-flex flex-row justify-content-end\">\n <div className=\"d-inline\">\n <Button\n tabIndex=\"0\"\n ref={selectCancelRef}\n variant=\"tertiary\"\n className=\"tags-drawer-cancel-button\"\n onClick={handleCancelStagedTags}\n >\n { intl.formatMessage(messages.collapsibleCancelStagedTagsButtonText) }\n </Button>\n <Button\n tabIndex=\"0\"\n ref={selectAddRef}\n variant=\"tertiary\"\n className=\"text-info-500 add-tags-button\"\n disabled={!(value && value.length)}\n onClick={handleCommitStagedTags}\n >\n { intl.formatMessage(messages.collapsibleAddStagedTagsButtonText) }\n </Button>\n </div>\n </div>\n </div>\n </components.Menu>\n );\n};\n\nconst disableActionKeys = (e) => {\n const arrowKeys = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft', 'Backspace'];\n if (arrowKeys.includes(e.code)) {\n e.preventDefault();\n }\n};\n\nconst CustomLoadingIndicator = () => {\n const intl = useIntl();\n return (\n <Spinner\n animation=\"border\"\n size=\"xl\"\n screenReaderText={intl.formatMessage(messages.loadingMessage)}\n />\n );\n};\n\n/**\n * Custom IndicatorsContainer component for our Select box\n * @param {import(\"react-select\").IndicatorsContainerProps&{selectProps: TaxonomySelectProps}} props\n */\nconst CustomIndicatorsContainer = (props) => {\n const {\n value,\n handleCommitStagedTags,\n selectInlineAddRef,\n } = props.selectProps;\n const intl = useIntl();\n return (\n <components.IndicatorsContainer {...props}>\n {\n (value && value.length && (\n <Button\n variant=\"dark\"\n size=\"sm\"\n className=\"mt-2 mb-2 rounded-0 inline-add-button\"\n onClick={handleCommitStagedTags}\n onMouseDown={(e) => { e.stopPropagation(); e.preventDefault(); }}\n ref={selectInlineAddRef}\n tabIndex=\"0\"\n onKeyDown={disableActionKeys} // To prevent navigating staged tags when button focused\n >\n { intl.formatMessage(messages.collapsibleInlineAddStagedTagsButtonText) }\n </Button>\n )) || null\n }\n {props.children}\n </components.IndicatorsContainer>\n );\n};\n\n/**\n * Collapsible component that holds a Taxonomy along with Tags that belong to it.\n * This includes both applied tags and tags that are available to select\n * from a dropdown list.\n *\n * This component also handles all the logic with selecting/deselecting tags and keeps track of the\n * tags tree in the state. That is used to render the Tag bubbgles as well as the populating the\n * state of the tags in the dropdown selectors.\n *\n * The `contentTags` that is passed are consolidated and converted to a tree structure. For example:\n *\n * FROM:\n *\n * [\n * {\n * \"value\": \"DNA Sequencing\",\n * \"lineage\": [\n * \"Science and Research\",\n * \"Genetics Subcategory\",\n * \"DNA Sequencing\"\n * ]\n * },\n * {\n * \"value\": \"Virology\",\n * \"lineage\": [\n * \"Science and Research\",\n * \"Molecular, Cellular, and Microbiology\",\n * \"Virology\"\n * ]\n * }\n * ]\n *\n * TO:\n *\n * {\n * \"Science and Research\": {\n * explicit: false,\n * children: {\n * \"Genetics Subcategory\": {\n * explicit: false,\n * children: {\n * \"DNA Sequencing\": {\n * explicit: true,\n * children: {}\n * }\n * }\n * },\n * \"Molecular, Cellular, and Microbiology\": {\n * explicit: false,\n * children: {\n * \"Virology\": {\n * explicit: true,\n * children: {}\n * }\n * }\n * }\n * }\n * }\n * };\n *\n *\n * It also keeps track of newly added tags as they are selected in the dropdown selectors.\n * They are store in the same format above, and then merged to one tree that is used as the\n * source of truth for both the tag bubble and the dropdowns. They keys are order alphabetically.\n *\n * In the dropdowns, the value of each SelectableBox is stored along with it's lineage and is URI encoded.\n * Ths is so we are able to traverse and manipulate different parts of the tree leading to it.\n * Here is an example of what the value of the \"Virology\" tag would be:\n *\n * \"Science%20and%20Research,Molecular%2C%20Cellular%2C%20and%20Microbiology,Virology\"\n *\n * @param {Object} props - The component props.\n * @param {string} props.contentId - Id of the content object\n * @param {StagedTagData[]} props.stagedContentTags\n * - Array of staged tags represented as objects with value/label\n * @param {TaxonomyData & {contentTags: ContentTagData[]}} props.taxonomyAndTagsData - Taxonomy metadata & applied tags\n * @param {boolean} props.collapsibleState - True if the collapsible is open\n */\nconst ContentTagsCollapsible = ({\n contentId,\n taxonomyAndTagsData,\n stagedContentTags,\n collapsibleState,\n}) => {\n const intl = useIntl();\n const { id: taxonomyId, name, canTagObject } = taxonomyAndTagsData;\n const selectCancelRef = React.useRef(/** @type {HTMLSelectElement | null} */(null));\n const selectAddRef = React.useRef(/** @type {HTMLSelectElement | null} */(null));\n const selectInlineAddRef = React.useRef(/** @type {HTMLSelectElement | null} */(null));\n const selectInlineEditModeRef = React.useRef(/** @type {HTMLSelectElement | null} */(null));\n const selectRef = React.useRef(/** @type {HTMLSelectElement | null} */(null));\n\n const [selectMenuIsOpen, setSelectMenuIsOpen] = React.useState(false);\n\n const {\n isEditMode,\n toEditMode,\n setStagedTags,\n openCollapsible,\n closeCollapsible,\n } = useContext(ContentTagsDrawerContext);\n\n const {\n tagChangeHandler,\n removeAppliedTagHandler,\n appliedContentTagsTree,\n stagedContentTagsTree,\n contentTagsCount,\n checkedTags,\n commitStagedTagsToGlobal,\n updateTags,\n } = useContentTagsCollapsibleHelper(\n contentId,\n stagedContentTags,\n taxonomyAndTagsData,\n );\n\n const [searchTerm, setSearchTerm] = React.useState('');\n\n const handleSelectableBoxChange = React.useCallback((e) => {\n tagChangeHandler(e.target.value, e.target.checked);\n }, [tagChangeHandler]);\n\n const handleSearch = debounce((term) => {\n setSearchTerm(term.trim());\n }, 500); // Perform search after 500ms\n\n const handleSearchChange = React.useCallback((value, { action }) => {\n if (action === 'input-blur') {\n if (!selectMenuIsOpen) {\n // Cancel/clear search if focused away from select input and menu closed\n handleSearch.cancel();\n setSearchTerm('');\n }\n } else if (action === 'input-change') {\n if (value === '') {\n // No need to debounce when search term cleared. Clear debounce function\n handleSearch.cancel();\n setSearchTerm('');\n } else {\n handleSearch(value);\n }\n }\n }, [selectMenuIsOpen, setSearchTerm, handleSearch]);\n\n // onChange handler for react-select component, currently only called when\n // staged tags in the react-select input are removed or fully cleared.\n // The remaining staged tags are passed in as the parameter, so we set the state\n // to the passed in tags\n const handleStagedTagsMenuChange = React.useCallback((stagedTags) => {\n // Get tags that were unstaged to remove them from checkbox selector\n const unstagedTags = stagedContentTags.filter(\n t1 => !stagedTags.some(t2 => t1.value === t2.value),\n );\n\n // Call the `tagChangeHandler` with the unstaged tags to unselect them from the selectbox\n // and update the staged content tags tree. Since the `handleStagedTagsMenuChange` function is={}\n // only called when a change occurs in the react-select menu component we know that tags can only be\n // removed from there, hence the tagChangeHandler is always called with `checked=false`.\n unstagedTags.forEach(unstagedTag => tagChangeHandler(unstagedTag.value, false));\n setStagedTags(taxonomyId, stagedTags);\n }, [taxonomyId, setStagedTags, stagedContentTags, tagChangeHandler]);\n\n const handleCommitStagedTags = React.useCallback(() => {\n commitStagedTagsToGlobal();\n handleStagedTagsMenuChange([]);\n selectRef.current?.blur();\n setSearchTerm('');\n setSelectMenuIsOpen(false);\n }, [commitStagedTagsToGlobal, handleStagedTagsMenuChange, selectRef, setSearchTerm]);\n\n const handleCancelStagedTags = React.useCallback(() => {\n handleStagedTagsMenuChange([]);\n selectRef.current?.blur();\n setSearchTerm('');\n setSelectMenuIsOpen(false);\n }, [handleStagedTagsMenuChange, selectRef, setSearchTerm]);\n\n const handleSelectOnKeyDown = (event) => {\n const focusedElement = event.target;\n\n if (event.key === 'Escape') {\n setSelectMenuIsOpen(false);\n } else if (event.key === 'Tab') {\n // Keep the menu open when navigating inside the select menu\n setSelectMenuIsOpen(true);\n\n // Determine when to close the menu when navigating with keyboard\n if (!event.shiftKey) { // Navigating forwards\n if (focusedElement === selectAddRef.current) {\n setSelectMenuIsOpen(false);\n } else if (focusedElement === selectCancelRef.current && selectAddRef.current?.disabled) {\n setSelectMenuIsOpen(false);\n }\n // Navigating backwards\n // @ts-ignore inputRef actually exists under the current selectRef\n } else if (event.shiftKey && focusedElement === selectRef.current?.inputRef) {\n setSelectMenuIsOpen(false);\n }\n }\n };\n\n // Open the select menu and make sure the search term is cleared when focused\n const onSelectMenuFocus = React.useCallback(() => {\n setSelectMenuIsOpen(true);\n setSearchTerm('');\n }, [setSelectMenuIsOpen, setSearchTerm]);\n\n // Handles logic to close the select menu when clicking outside\n const handleOnBlur = React.useCallback((event) => {\n // Check if a target we are focusing to is an element in our select menu, if not close it\n const menuClasses = ['dropdown-selector', 'inline-add-button', 'cancel-add-tags-button'];\n if (!event.relatedTarget || !menuClasses.some(cls => event.relatedTarget.className?.includes(cls))) {\n setSelectMenuIsOpen(false);\n }\n }, [setSelectMenuIsOpen]);\n\n return (\n <div className=\"d-flex\">\n <Collapsible.Advanced\n className=\"collapsible-card-lg taxonomy-tags-collapsible\"\n open={collapsibleState}\n onClose={() => closeCollapsible(taxonomyId)}\n onOpen={() => openCollapsible(taxonomyId)}\n >\n <Collapsible.Trigger className=\"collapsible-trigger pl-2.5\">\n <Collapsible.Visible whenClosed>\n <Icon src={KeyboardArrowDown} />\n </Collapsible.Visible>\n\n <Collapsible.Visible whenOpen>\n <Icon src={KeyboardArrowUp} />\n </Collapsible.Visible>\n <h3 className=\"h5 flex-grow-1 pl-2\">{name}</h3>\n </Collapsible.Trigger>\n\n <Collapsible.Body className=\"collapsible-body\">\n { Object.keys(appliedContentTagsTree).length === 0 && !isEditMode\n && (\n <div className=\"mb-3\" key={taxonomyId}>\n <p className=\"text-gray-500\">{intl.formatMessage(messages.collapsibleNoTagsAddedText)}\n <Button\n tabIndex=\"0\"\n size=\"inline\"\n ref={selectInlineEditModeRef}\n variant=\"link\"\n className=\"text-info-500 add-tags-button\"\n onClick={toEditMode}\n >\n { intl.formatMessage(messages.collapsibleAddStagedTagsButtonText) }\n </Button>\n </p>\n </div>\n )}\n { Object.keys(appliedContentTagsTree).length !== 0\n && (\n <div className=\"mb-3\" key={taxonomyId}>\n <TagsTree\n tags={appliedContentTagsTree}\n parentKey={taxonomyId.toString()}\n removeTagHandler={removeAppliedTagHandler}\n />\n </div>\n )}\n\n <div className=\"d-flex taxonomy-tags-selector-menu\">\n {isEditMode && canTagObject && (\n <Select\n onBlur={handleOnBlur}\n styles={{\n // Overriding 'x' button styles for staged tags when navigating by keyboard\n multiValueRemove: (base, state) => ({\n ...base,\n background: state.isFocused ? 'black' : base.background,\n color: state.isFocused ? 'white' : base.color,\n }),\n }}\n menuIsOpen={selectMenuIsOpen}\n onFocus={onSelectMenuFocus}\n onKeyDown={handleSelectOnKeyDown}\n ref={/** @type {React.RefObject} */(selectRef)}\n isMulti\n isLoading={updateTags.isLoading}\n isDisabled={updateTags.isLoading}\n name=\"tags-select\"\n placeholder={intl.formatMessage(messages.collapsibleAddTagsPlaceholderText)}\n isSearchable\n className=\"d-flex flex-column flex-fill\"\n classNamePrefix=\"react-select-add-tags\"\n onInputChange={handleSearchChange}\n onChange={handleStagedTagsMenuChange}\n components={{\n Menu: CustomMenu,\n LoadingIndicator: CustomLoadingIndicator,\n IndicatorsContainer: CustomIndicatorsContainer,\n }}\n closeMenuOnSelect={false}\n blurInputOnSelect={false}\n handleSelectableBoxChange={handleSelectableBoxChange}\n checkedTags={checkedTags}\n taxonomyId={taxonomyId}\n appliedContentTagsTree={appliedContentTagsTree}\n stagedContentTagsTree={stagedContentTagsTree}\n handleCommitStagedTags={handleCommitStagedTags}\n handleCancelStagedTags={handleCancelStagedTags}\n searchTerm={searchTerm}\n selectCancelRef={selectCancelRef}\n selectAddRef={selectAddRef}\n selectInlineAddRef={selectInlineAddRef}\n value={stagedContentTags}\n />\n )}\n </div>\n </Collapsible.Body>\n </Collapsible.Advanced>\n <div className=\"d-flex align-items-start pt-2.5 taxonomy-tags-count-chip\">\n <Chip\n className=\"border-0\"\n iconBefore={Tag}\n iconBeforeAlt=\"icon-before\"\n disabled={contentTagsCount === 0}\n >\n {contentTagsCount}\n </Chip>\n </div>\n </div>\n );\n};\n\nexport default ContentTagsCollapsible;\n","// @ts-check\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nconst getTaxonomiesV1Endpoint = () => new URL('api/content_tagging/v1/taxonomies/', getApiBaseUrl()).href;\n/**\n * Helper method for creating URLs for the tagging/taxonomy API. Used only in this file.\n * @param {string} path The subpath within the taxonomies \"v1\" REST API namespace\n * @param {Record<string, string | number>} [searchParams] Query parameters to include\n */\nconst makeUrl = (path, searchParams) => {\n const url = new URL(path, getTaxonomiesV1Endpoint());\n if (searchParams) {\n Object.entries(searchParams).forEach(([k, v]) => url.searchParams.append(k, String(v)));\n }\n return url.href;\n};\n\nexport const ALL_TAXONOMIES = '__all';\nexport const UNASSIGNED = '__unassigned';\n\n/** @satisfies {Record<string, (...args: any[]) => string>} */\nexport const apiUrls = {\n /**\n * Get the URL of the \"list all taxonomies\" endpoint\n * @param {string} [org] Optionally, Filter the list to only show taxonomies assigned to this org\n */\n taxonomyList(org) {\n const params = {};\n if (org !== undefined) {\n if (org === UNASSIGNED) {\n params.unassigned = 'true';\n } else if (org !== ALL_TAXONOMIES) {\n params.org = org;\n }\n }\n return makeUrl('.', { enabled: 'true', ...params });\n },\n /**\n * Get the URL of the API endpoint to download a taxonomy as a CSV/JSON file.\n * @param {number} taxonomyId The ID of the taxonomy\n * @param {'json'|'csv'} format Which format to use for the export\n */\n exportTaxonomy: (taxonomyId, format) => makeUrl(`${taxonomyId}/export/`, { output_format: format, download: 1 }),\n /**\n * The the URL of the downloadable template file that shows how to format a\n * taxonomy file.\n * @param {'json'|'csv'} format The format requested\n */\n taxonomyTemplate: (format) => makeUrl(`import/template.${format}`),\n /**\n * Get the URL for a Taxonomy\n * @param {number} taxonomyId The ID of the taxonomy\n */\n taxonomy: (taxonomyId) => makeUrl(`${taxonomyId}/`),\n /**\n * Get the URL for listing the tags of a taxonomy\n * @param {number} taxonomyId\n * @param {number} pageIndex Zero-indexed page number\n * @param {*} pageSize How many tags per page to load\n */\n tagList: (taxonomyId, pageIndex, pageSize) => makeUrl(`${taxonomyId}/tags/`, {\n page: (pageIndex + 1), page_size: pageSize,\n }),\n /**\n * Get _all_ tags below a given parent tag. This may be replaced with something more scalable in the future.\n * @param {number} taxonomyId\n * @param {string} parentTagValue\n */\n allSubtagsOf: (taxonomyId, parentTagValue) => makeUrl(`${taxonomyId}/tags/`, {\n // Load as deeply as we can\n full_depth_threshold: 10000,\n parent_tag: parentTagValue,\n }),\n /** URL to create a new taxonomy from an import file. */\n createTaxonomyFromImport: () => makeUrl('import/'),\n /**\n * @param {number} taxonomyId\n */\n tagsImport: (taxonomyId) => makeUrl(`${taxonomyId}/tags/import/`),\n /**\n * @param {number} taxonomyId\n */\n tagsPlanImport: (taxonomyId) => makeUrl(`${taxonomyId}/tags/import/plan/`),\n};\n\n/**\n * Get list of taxonomies.\n * @param {string} [org] Filter the list to only show taxonomies assigned to this org\n * @returns {Promise<import(\"./types.mjs\").TaxonomyListData>}\n */\nexport async function getTaxonomyListData(org) {\n const { data } = await getAuthenticatedHttpClient().get(apiUrls.taxonomyList(org));\n return camelCaseObject(data);\n}\n\n/**\n * Delete a Taxonomy\n * @param {number} taxonomyId\n * @returns {Promise<void>}\n */\nexport async function deleteTaxonomy(taxonomyId) {\n await getAuthenticatedHttpClient().delete(apiUrls.taxonomy(taxonomyId));\n}\n\n/**\n * Get metadata about a Taxonomy\n * @param {number} taxonomyId The ID of the taxonomy to get\n * @returns {Promise<import(\"./types.mjs\").TaxonomyData>}\n */\nexport async function getTaxonomy(taxonomyId) {\n const { data } = await getAuthenticatedHttpClient().get(apiUrls.taxonomy(taxonomyId));\n return camelCaseObject(data);\n}\n\n/**\n * Downloads the file of the exported taxonomy\n * @param {number} taxonomyId The ID of the taxonomy\n * @param {'json'|'csv'} format Which format to use for the export file.\n * @returns {void}\n */\nexport function getTaxonomyExportFile(taxonomyId, format) {\n window.location.href = apiUrls.exportTaxonomy(taxonomyId, format);\n}\n","// @ts-check\n/**\n * This is a file used especially in this `taxonomy` module.\n *\n * We are using a new approach, using `useQuery` to build and execute the queries to the APIs.\n * This approach accelerates the development.\n *\n * In this file you will find two types of hooks:\n * - Hooks that builds the query with `useQuery`. These hooks are not used outside of this file.\n * Ex. useTaxonomyListData.\n * - Hooks that calls the query hook, prepare and return the data.\n * Ex. useTaxonomyListDataResponse & useIsTaxonomyListDataLoaded.\n */\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { camelCaseObject } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\nimport { apiUrls, ALL_TAXONOMIES } from './api';\nimport * as api from './api';\n\n// Query key patterns. Allows an easy way to clear all data related to a given taxonomy.\n// https://github.com/openedx/frontend-app-admin-portal/blob/2ba315d/docs/decisions/0006-tanstack-react-query.rst\n// Inspired by https://tkdodo.eu/blog/effective-react-query-keys#use-query-key-factories.\nexport const taxonomyQueryKeys = {\n all: ['taxonomies'],\n /**\n * Key for the list of taxonomies, optionally filtered by org.\n * @param {string} [org] Which org we fetched the taxonomy list for (optional)\n */\n taxonomyList: (org) => [\n ...taxonomyQueryKeys.all, 'taxonomyList', ...(org && org !== ALL_TAXONOMIES ? [org] : []),\n ],\n /**\n * Base key for data specific to a single taxonomy. No data is stored directly in this key.\n * @param {number} taxonomyId ID of the taxonomy\n */\n taxonomy: (taxonomyId) => [...taxonomyQueryKeys.all, 'taxonomy', taxonomyId],\n /**\n * @param {number} taxonomyId ID of the taxonomy\n */\n taxonomyMetadata: (taxonomyId) => [...taxonomyQueryKeys.taxonomy(taxonomyId), 'metadata'],\n /**\n * @param {number} taxonomyId ID of the taxonomy\n */\n taxonomyTagList: (taxonomyId) => [...taxonomyQueryKeys.taxonomy(taxonomyId), 'tags'],\n /**\n * @param {number} taxonomyId ID of the taxonomy\n * @param {number} pageIndex Which page of tags to load (zero-based)\n * @param {number} pageSize\n */\n taxonomyTagListPage: (taxonomyId, pageIndex, pageSize) => [\n ...taxonomyQueryKeys.taxonomyTagList(taxonomyId), 'page', pageIndex, pageSize,\n ],\n /**\n * Query for loading _all_ the subtags of a particular parent tag\n * @param {number} taxonomyId ID of the taxonomy\n * @param {string} parentTagValue\n */\n taxonomyTagSubtagsList: (taxonomyId, parentTagValue) => [\n ...taxonomyQueryKeys.taxonomyTagList(taxonomyId), 'subtags', parentTagValue,\n ],\n /**\n * @param {number} taxonomyId ID of the taxonomy\n * @param {string} fileId Some string to uniquely identify the file we want to upload\n */\n importPlan: (taxonomyId, fileId) => [...taxonomyQueryKeys.all, 'importPlan', taxonomyId, fileId],\n};\n\n/**\n * Builds the query to get the taxonomy list\n * @param {string} [org] Filter the list to only show taxonomies assigned to this org\n */\nexport const useTaxonomyList = (org) => (\n useQuery({\n queryKey: taxonomyQueryKeys.taxonomyList(org),\n queryFn: () => api.getTaxonomyListData(org),\n })\n);\n\n/**\n * Builds the mutation to delete a taxonomy.\n * @returns A function that can be used to delete the taxonomy.\n */\nexport const useDeleteTaxonomy = () => {\n const queryClient = useQueryClient();\n const { mutateAsync } = useMutation({\n /** @type {import(\"@tanstack/react-query\").MutateFunction<any, any, {pk: number}>} */\n mutationFn: async ({ pk }) => api.deleteTaxonomy(pk),\n onSettled: (_d, _e, args) => {\n queryClient.invalidateQueries({ queryKey: taxonomyQueryKeys.taxonomyList() });\n queryClient.removeQueries({ queryKey: taxonomyQueryKeys.taxonomy(args.pk) });\n },\n });\n return mutateAsync;\n};\n\n/** Builds the query to get the taxonomy detail\n * @param {number} taxonomyId\n */\nexport const useTaxonomyDetails = (taxonomyId) => useQuery({\n queryKey: taxonomyQueryKeys.taxonomyMetadata(taxonomyId),\n queryFn: () => api.getTaxonomy(taxonomyId),\n});\n\n/**\n * Use this mutation to import a new taxonomy.\n */\nexport const useImportNewTaxonomy = () => {\n const queryClient = useQueryClient();\n return useMutation({\n /**\n * @type {import(\"@tanstack/react-query\").MutateFunction<\n * import(\"./types.mjs\").TaxonomyData,\n * any,\n * {\n * name: string,\n * description: string,\n * file: File,\n * }\n * >}\n */\n mutationFn: async ({\n name, description, file,\n }) => {\n const formData = new FormData();\n formData.append('taxonomy_name', name);\n formData.append('taxonomy_description', description);\n formData.append('file', file);\n\n const { data } = await getAuthenticatedHttpClient().post(apiUrls.createTaxonomyFromImport(), formData);\n return camelCaseObject(data);\n },\n onSuccess: (data) => {\n // There's a new taxonomy, so the list of taxonomies needs to be refreshed:\n queryClient.invalidateQueries({\n queryKey: taxonomyQueryKeys.taxonomyList(),\n });\n queryClient.setQueryData(taxonomyQueryKeys.taxonomyMetadata(data.id), data);\n },\n });\n};\n\n/**\n * Build the mutation to import tags to an existing taxonomy\n */\nexport const useImportTags = () => {\n const queryClient = useQueryClient();\n return useMutation({\n /**\n * @type {import(\"@tanstack/react-query\").MutateFunction<\n * import(\"./types.mjs\").TaxonomyData,\n * any,\n * {\n * taxonomyId: number,\n * file: File,\n * }\n * >}\n */\n mutationFn: async ({ taxonomyId, file }) => {\n const formData = new FormData();\n formData.append('file', file);\n\n try {\n const { data } = await getAuthenticatedHttpClient().put(apiUrls.tagsImport(taxonomyId), formData);\n return camelCaseObject(data);\n } catch (/** @type {any} */ err) {\n throw new Error(err.response?.data?.error || err.message);\n }\n },\n onSuccess: (data) => {\n queryClient.invalidateQueries({\n queryKey: taxonomyQueryKeys.taxonomyTagList(data.id),\n });\n // In the metadata, 'tagsCount' (and possibly other fields) will have changed:\n queryClient.setQueryData(taxonomyQueryKeys.taxonomyMetadata(data.id), data);\n },\n });\n};\n\n/**\n * Preview the results of importing the given file into an existing taxonomy.\n * @param {number} taxonomyId The ID of the taxonomy whose tags we're updating.\n * @param {File|null} file The file that we want to import\n */\nexport const useImportPlan = (taxonomyId, file) => useQuery({\n queryKey: taxonomyQueryKeys.importPlan(taxonomyId, file ? `${file.name}${file.lastModified}${file.size}` : ''),\n /**\n * @type {import(\"@tanstack/react-query\").QueryFunction<string|null>}\n */\n queryFn: async () => {\n if (file === null) {\n return null;\n }\n const formData = new FormData();\n formData.append('file', file);\n\n try {\n const { data } = await getAuthenticatedHttpClient().put(apiUrls.tagsPlanImport(taxonomyId), formData);\n return /** @type {string} */(data.plan);\n } catch (/** @type {any} */ err) {\n throw new Error(err.response?.data?.error || err.message);\n }\n },\n retry: false, // If there's an error, it's probably a real problem with the file. Don't try again several times!\n});\n","// @ts-check\nimport React from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { cloneDeep } from 'lodash';\nimport { useContentData, useContentTaxonomyTagsData, useContentTaxonomyTagsUpdater } from './data/apiHooks';\nimport { useTaxonomyList } from '../taxonomy/data/apiHooks';\nimport { extractOrgFromContentId, languageExportId } from './utils';\nimport messages from './messages';\nimport { ContentTagsDrawerSheetContext } from './common/context';\n\n/** @typedef {import(\"./data/types.mjs\").Tag} ContentTagData */\n/** @typedef {import(\"./data/types.mjs\").StagedTagData} StagedTagData */\n/** @typedef {import(\"./data/types.mjs\").TagsInTaxonomy} TagsInTaxonomy */\n\n/**\n * Handles the context and all the underlying logic for the ContentTagsDrawer component\n * @param {string} contentId\n * @returns {{\n * stagedContentTags: Record<number, StagedTagData[]>,\n * addStagedContentTag: (taxonomyId: number, addedTag: StagedTagData) => void,\n * removeStagedContentTag: (taxonomyId: number, tagValue: string) => void,\n * removeGlobalStagedContentTag: (taxonomyId: number, tagValue: string) => void,\n * addRemovedContentTag: (taxonomyId: number, tagValue: string) => void,\n * deleteRemovedContentTag: (taxonomyId: number, tagValue: string) => void,\n * setStagedTags: (taxonomyId: number, tagsList: StagedTagData[]) => void,\n * globalStagedContentTags: Record<number, StagedTagData[]>,\n * globalStagedRemovedContentTags: Record<number, string>,\n * setGlobalStagedContentTags: Function,\n * commitGlobalStagedTags: () => void,\n * commitGlobalStagedTagsStatus: string,\n * isContentDataLoaded: boolean,\n * isContentTaxonomyTagsLoaded: boolean,\n * isTaxonomyListLoaded: boolean,\n * contentName: string,\n * tagsByTaxonomy: TagsInTaxonomy[],\n * isEditMode: boolean,\n * toEditMode: () => void,\n * toReadMode: () => void,\n * collapsibleStates: Record<number, boolean>,\n * openCollapsible: (taxonomyId: number) => void,\n * closeCollapsible: (taxonomyId: number) => void,\n * toastMessage: string | undefined,\n * showToastAfterSave: () => void,\n * closeToast: () => void,\n * setCollapsibleToInitalState: () => void,\n * otherTaxonomies: TagsInTaxonomy[],\n * }}\n */\nconst useContentTagsDrawerContext = (contentId) => {\n const intl = useIntl();\n const org = extractOrgFromContentId(contentId);\n\n const { setBlockingSheet } = React.useContext(ContentTagsDrawerSheetContext);\n\n // True if the drawer is on edit mode.\n const [isEditMode, setIsEditMode] = React.useState(false);\n // This stores the tags added on the add tags Select in all taxonomies.\n const [stagedContentTags, setStagedContentTags] = React.useState({});\n // When a staged tags on a taxonomy is commitet then is saved on this map.\n const [globalStagedContentTags, setGlobalStagedContentTags] = React.useState({});\n // This stores feched tags deleted by the user.\n const [globalStagedRemovedContentTags, setGlobalStagedRemovedContentTags] = React.useState({});\n // Merges feched tags, global staged tags and global removed staged tags\n const [tagsByTaxonomy, setTagsByTaxonomy] = React.useState(/** @type TagsInTaxonomy[] */ ([]));\n // Other taxonomies that the user doesn't have permissions\n const [otherTaxonomies, setOtherTaxonomies] = React.useState(/** @type TagsInTaxonomy[] */ ([]));\n // This stores taxonomy collapsible states (open/close).\n const [collapsibleStates, setColapsibleStates] = React.useState({});\n // Message to show a toast in the content drawer.\n const [toastMessage, setToastMessage] = React.useState(/** @type string | undefined */ (undefined));\n // Mutation to update tags\n const updateTags = useContentTaxonomyTagsUpdater(contentId);\n\n // Fetch from database\n const { data: contentData, isSuccess: isContentDataLoaded } = useContentData(contentId);\n const {\n data: contentTaxonomyTagsData,\n isSuccess: isContentTaxonomyTagsLoaded,\n } = useContentTaxonomyTagsData(contentId);\n const { data: taxonomyListData, isSuccess: isTaxonomyListLoaded } = useTaxonomyList(org);\n\n // Tags feched from database\n const { fechedTaxonomies, fechedOtherTaxonomies } = React.useMemo(() => {\n const sortTaxonomies = (taxonomiesList) => {\n const taxonomiesWithData = taxonomiesList.filter(\n (t) => t.contentTags.length !== 0,\n );\n\n // Count implicit tags per taxonomy.\n // TODO This count is also calculated individually\n // in ContentTagsCollapsible. It should only be calculated once.\n const tagsCountBytaxonomy = {};\n taxonomiesWithData.forEach((tax) => {\n tagsCountBytaxonomy[tax.id] = new Set(\n tax.contentTags.flatMap(item => item.lineage),\n ).size;\n });\n\n // Sort taxonomies with data by implicit count\n const sortedTaxonomiesWithData = taxonomiesWithData.sort(\n (a, b) => tagsCountBytaxonomy[b.id] - tagsCountBytaxonomy[a.id],\n );\n\n // Empty taxonomies sorted by name.\n // Since the query returns sorted by name,\n // it is not necessary to do another sorting here.\n const emptyTaxonomies = taxonomiesList.filter(\n (t) => t.contentTags.length === 0,\n );\n\n return [...sortedTaxonomiesWithData, ...emptyTaxonomies];\n };\n\n if (taxonomyListData && contentTaxonomyTagsData) {\n // Initialize list of content tags in taxonomies to populate\n const taxonomiesList = taxonomyListData.results.map((taxonomy) => ({\n ...taxonomy,\n contentTags: /** @type {ContentTagData[]} */([]),\n }));\n\n const contentTaxonomies = contentTaxonomyTagsData.taxonomies;\n\n const otherTaxonomiesList = [];\n\n // eslint-disable-next-line array-callback-return\n contentTaxonomies.map((contentTaxonomyTags) => {\n const contentTaxonomy = taxonomiesList.find((taxonomy) => taxonomy.id === contentTaxonomyTags.taxonomyId);\n if (contentTaxonomy) {\n contentTaxonomy.contentTags = contentTaxonomyTags.tags;\n } else {\n otherTaxonomiesList.push({\n canChangeTaxonomy: false,\n canDeleteTaxonomy: false,\n canTagObject: false,\n contentTags: contentTaxonomyTags.tags,\n enabled: true,\n exportId: contentTaxonomyTags.exportId,\n id: contentTaxonomyTags.taxonomyId,\n name: contentTaxonomyTags.name,\n visibleToAuthors: true,\n });\n }\n });\n\n // Delete Language taxonomy if is empty\n const filteredTaxonomies = taxonomiesList.filter(\n (taxonomy) => taxonomy.exportId !== languageExportId\n || taxonomy.contentTags.length !== 0,\n );\n\n return {\n fechedTaxonomies: sortTaxonomies(filteredTaxonomies),\n fechedOtherTaxonomies: otherTaxonomiesList,\n };\n }\n return {\n fechedTaxonomies: [],\n fechedOtherTaxonomies: [],\n };\n }, [taxonomyListData, contentTaxonomyTagsData]);\n\n // Add a content tags to the staged tags for a taxonomy\n const addStagedContentTag = React.useCallback((taxonomyId, addedTag) => {\n setStagedContentTags(prevStagedContentTags => {\n const updatedStagedContentTags = {\n ...prevStagedContentTags,\n [taxonomyId]: [...(prevStagedContentTags[taxonomyId] ?? []), addedTag],\n };\n return updatedStagedContentTags;\n });\n }, [setStagedContentTags]);\n\n // Remove a content tag from the staged tags for a taxonomy\n const removeStagedContentTag = React.useCallback((taxonomyId, tagValue) => {\n setStagedContentTags(prevStagedContentTags => ({\n ...prevStagedContentTags,\n [taxonomyId]: prevStagedContentTags[taxonomyId].filter((t) => t.value !== tagValue),\n }));\n }, [setStagedContentTags]);\n\n // Remove a content tag from the global staged tags for a taxonomy\n const removeGlobalStagedContentTag = React.useCallback((taxonomyId, tagValue) => {\n setGlobalStagedContentTags(prevContentTags => ({\n ...prevContentTags,\n [taxonomyId]: prevContentTags[taxonomyId].filter((t) => t.value !== tagValue),\n }));\n }, [setGlobalStagedContentTags]);\n\n // Add a content tags to the removed tags for a taxonomy\n const addRemovedContentTag = React.useCallback((taxonomyId, addedTag) => {\n setGlobalStagedRemovedContentTags(prevContentTags => {\n const updatedStagedContentTags = {\n ...prevContentTags,\n [taxonomyId]: [...(prevContentTags[taxonomyId] ?? []), addedTag],\n };\n return updatedStagedContentTags;\n });\n }, [setGlobalStagedRemovedContentTags]);\n\n // Remove a content tag from the removed tags for a taxonomy\n const deleteRemovedContentTag = React.useCallback((taxonomyId, tagValue) => {\n setGlobalStagedRemovedContentTags(prevContentTags => ({\n ...prevContentTags,\n [taxonomyId]: prevContentTags[taxonomyId].filter((t) => t !== tagValue),\n }));\n }, [setGlobalStagedRemovedContentTags]);\n\n // Sets the staged content tags for taxonomy to the provided list of tags\n const setStagedTags = React.useCallback((taxonomyId, tagsList) => {\n setStagedContentTags(prevStagedContentTags => ({ ...prevStagedContentTags, [taxonomyId]: tagsList }));\n }, [setStagedContentTags]);\n\n // Open a collapsible of a taxonomy\n /* istanbul ignore next */\n const openCollapsible = React.useCallback((taxonomyId) => {\n setColapsibleStates(prevStates => ({\n ...prevStates,\n [taxonomyId]: true,\n }));\n }, [setColapsibleStates]);\n\n // Close a collapsible of a taxonomy\n /* istanbul ignore next */\n const closeCollapsible = React.useCallback((taxonomyId) => {\n setColapsibleStates(prevStates => ({\n ...prevStates,\n [taxonomyId]: false,\n }));\n }, [setColapsibleStates]);\n\n const openAllCollapsible = React.useCallback(() => {\n const updatedState = {};\n fechedTaxonomies.forEach((taxonomy) => {\n updatedState[taxonomy.id] = true;\n });\n fechedOtherTaxonomies.forEach((taxonomy) => {\n updatedState[taxonomy.id] = true;\n });\n setColapsibleStates(updatedState);\n }, [fechedTaxonomies, setColapsibleStates]);\n\n // Set initial state of collapsible based on content tags\n const setCollapsibleToInitalState = React.useCallback(() => {\n const updatedState = {};\n fechedTaxonomies.forEach((taxonomy) => {\n // Taxonomy with content tags must be open\n updatedState[taxonomy.id] = taxonomy.contentTags.length !== 0;\n });\n fechedOtherTaxonomies.forEach((taxonomy) => {\n // Taxonomy with content tags must be open\n updatedState[taxonomy.id] = taxonomy.contentTags.length !== 0;\n });\n setColapsibleStates(updatedState);\n }, [fechedTaxonomies, setColapsibleStates]);\n\n // Changes the drawer mode to edit\n const toEditMode = React.useCallback(() => {\n setIsEditMode(true);\n openAllCollapsible();\n }, [setIsEditMode, openAllCollapsible]);\n\n // Changes the drawer mode to read and clears all staged tags and states.\n const toReadMode = React.useCallback(() => {\n setIsEditMode(false);\n setStagedContentTags({});\n setGlobalStagedContentTags({});\n setGlobalStagedRemovedContentTags({});\n setCollapsibleToInitalState();\n }, [\n setIsEditMode,\n setStagedContentTags,\n setGlobalStagedContentTags,\n setGlobalStagedRemovedContentTags,\n setCollapsibleToInitalState,\n ]);\n\n // Count added and removed tags\n /* istanbul ignore next */\n const countTags = React.useCallback(() => {\n const tagsAddedList = Object.values(globalStagedContentTags);\n const tagsRemovedList = Object.values(globalStagedRemovedContentTags);\n\n const tagsAdded = tagsAddedList.length === 1 ? tagsAddedList[0].length : tagsAddedList.reduce(\n /* istanbul ignore next */\n (acc, curr) => acc + curr.length,\n 0,\n );\n const tagsRemoved = tagsRemovedList.length === 1 ? tagsRemovedList[0].length : tagsRemovedList.reduce(\n /* istanbul ignore next */\n (acc, curr) => acc + curr.length,\n 0,\n );\n return {\n tagsAdded,\n tagsRemoved,\n };\n }, [globalStagedContentTags, globalStagedRemovedContentTags]);\n\n // Build toast message and show toast after save drawer.\n /* istanbul ignore next */\n const showToastAfterSave = React.useCallback(() => {\n const { tagsAdded, tagsRemoved } = countTags();\n\n let message;\n if (tagsAdded && tagsRemoved) {\n message = `${intl.formatMessage(\n messages.tagsSaveToastTextTypeAdded,\n { tagsAdded },\n )\n } ${\n intl.formatMessage(\n messages.tagsSaveToastTextTypeRemoved,\n { tagsRemoved },\n )\n }`;\n } else if (tagsAdded) {\n message = intl.formatMessage(\n messages.tagsSaveToastTextTypeAdded,\n { tagsAdded },\n );\n } else if (tagsRemoved) {\n message = intl.formatMessage(\n messages.tagsSaveToastTextTypeRemoved,\n { tagsRemoved },\n );\n }\n setToastMessage(message);\n }, [setToastMessage, countTags]);\n\n // Close the toast\n const closeToast = React.useCallback(() => setToastMessage(undefined), [setToastMessage]);\n\n let contentName = '';\n if (isContentDataLoaded) {\n if ('displayName' in contentData) {\n contentName = contentData.displayName;\n } else {\n contentName = contentData.courseDisplayNameWithDefault;\n }\n }\n\n // Updates `tagsByTaxonomy` merged feched tags, global staged tags\n // and global removed staged tags.\n React.useEffect(() => {\n const mergedTags = cloneDeep(fechedTaxonomies).reduce((acc, obj) => (\n { ...acc, [obj.id]: obj }\n ), {});\n\n const mergedOtherTaxonomies = cloneDeep(fechedOtherTaxonomies).reduce((acc, obj) => (\n { ...acc, [obj.id]: obj }\n ), {});\n\n Object.keys(globalStagedContentTags).forEach((taxonomyId) => {\n if (mergedTags[taxonomyId]) {\n // TODO test this\n // Filter out applied tags that should become implicit because a child tag was committed\n const stagedLineages = globalStagedContentTags[taxonomyId].map((t) => t.lineage.slice(0, -1)).flat();\n const fechedTags = mergedTags[taxonomyId].contentTags.filter((t) => !stagedLineages.includes(t.value));\n\n mergedTags[taxonomyId].contentTags = [\n ...fechedTags,\n ...globalStagedContentTags[taxonomyId],\n ];\n }\n });\n\n Object.keys(globalStagedRemovedContentTags).forEach((taxonomyId) => {\n if (mergedTags[taxonomyId]) {\n mergedTags[taxonomyId].contentTags = mergedTags[taxonomyId].contentTags.filter(\n (t) => !globalStagedRemovedContentTags[taxonomyId].includes(t.value),\n );\n } else if (mergedOtherTaxonomies[taxonomyId]) {\n mergedOtherTaxonomies[taxonomyId].contentTags = mergedOtherTaxonomies[taxonomyId].contentTags.filter(\n (t) => !globalStagedRemovedContentTags[taxonomyId].includes(t.value),\n );\n }\n });\n\n // It is constructed this way to maintain the order\n // of the list `fechedTaxonomies`\n const mergedTagsArray = fechedTaxonomies.map(obj => mergedTags[obj.id]);\n\n setTagsByTaxonomy(mergedTagsArray);\n setOtherTaxonomies(Object.values(mergedOtherTaxonomies));\n\n if (setBlockingSheet) {\n const areChangesInTags = () => {\n // It is calculated in this way, because there are cases in which\n // there are keys in the map, but they contain empty lists\n // (e.g. add a tag, and remove the same tag later).\n\n const tagsAddedList = Object.values(globalStagedContentTags);\n const tagsRemovedList = Object.values(globalStagedRemovedContentTags);\n\n if (tagsAddedList.some(tags => tags.length > 0)) {\n return true;\n }\n if (tagsRemovedList.some(tags => tags.length > 0)) {\n return true;\n }\n return false;\n };\n\n if (areChangesInTags()) {\n setBlockingSheet(true);\n } else {\n setBlockingSheet(false);\n }\n }\n }, [\n fechedTaxonomies,\n fechedOtherTaxonomies,\n globalStagedContentTags,\n globalStagedRemovedContentTags,\n ]);\n\n const commitGlobalStagedTags = React.useCallback(() => {\n const tagsData = [];\n tagsByTaxonomy.forEach((tags) => {\n tagsData.push({\n taxonomy: tags.id,\n tags: tags.contentTags.map(t => t.value),\n });\n });\n otherTaxonomies.forEach((tags) => {\n tagsData.push({\n taxonomy: tags.id,\n tags: tags.contentTags.map(t => t.value),\n });\n });\n // @ts-ignore\n updateTags.mutate({ tagsData });\n }, [tagsByTaxonomy]);\n\n return {\n stagedContentTags,\n addStagedContentTag,\n removeStagedContentTag,\n removeGlobalStagedContentTag,\n addRemovedContentTag,\n deleteRemovedContentTag,\n setStagedTags,\n globalStagedContentTags,\n globalStagedRemovedContentTags,\n setGlobalStagedContentTags,\n commitGlobalStagedTags,\n commitGlobalStagedTagsStatus: updateTags.status,\n isContentDataLoaded,\n isContentTaxonomyTagsLoaded,\n isTaxonomyListLoaded,\n contentName,\n tagsByTaxonomy,\n isEditMode,\n toEditMode,\n toReadMode,\n collapsibleStates,\n openCollapsible,\n closeCollapsible,\n toastMessage,\n showToastAfterSave,\n closeToast,\n setCollapsibleToInitalState,\n otherTaxonomies,\n };\n};\n\nexport default useContentTagsDrawerContext;\n","// eslint-disable-next-line import/prefer-default-export\nexport const extractOrgFromContentId = (contentId) => contentId.split('+')[0].split(':')[1];\nexport const languageExportId = 'languages-v1';\n","// @ts-check\nimport React, { useContext, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Container,\n Spinner,\n Stack,\n Button,\n Toast,\n} from '@openedx/paragon';\nimport { useIntl, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport messages from './messages';\nimport ContentTagsCollapsible from './ContentTagsCollapsible';\nimport Loading from '../generic/Loading';\nimport useContentTagsDrawerContext from './ContentTagsDrawerHelper';\nimport { ContentTagsDrawerContext, ContentTagsDrawerSheetContext } from './common/context';\n\nconst TaxonomyList = ({ contentId }) => {\n const navigate = useNavigate();\n const intl = useIntl();\n\n const {\n isTaxonomyListLoaded,\n isContentTaxonomyTagsLoaded,\n tagsByTaxonomy,\n stagedContentTags,\n collapsibleStates,\n } = React.useContext(ContentTagsDrawerContext);\n\n if (isTaxonomyListLoaded && isContentTaxonomyTagsLoaded) {\n if (tagsByTaxonomy.length !== 0) {\n return (\n <div>\n { tagsByTaxonomy.map((data) => (\n <div key={`taxonomy-tags-collapsible-${data.id}`}>\n <ContentTagsCollapsible\n contentId={contentId}\n taxonomyAndTagsData={data}\n stagedContentTags={stagedContentTags[data.id] || []}\n collapsibleState={collapsibleStates[data.id] || false}\n />\n <hr />\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <FormattedMessage\n {...messages.emptyDrawerContent}\n values={{\n link: (\n <Button\n tabIndex=\"0\"\n size=\"inline\"\n variant=\"link\"\n className=\"text-info-500 p-0 enable-taxonomies-button\"\n onClick={() => navigate('/taxonomies')}\n >\n { intl.formatMessage(messages.emptyDrawerContentLink) }\n </Button>\n ),\n }}\n />\n );\n }\n\n return <Loading />;\n};\n\nTaxonomyList.propTypes = {\n contentId: PropTypes.string.isRequired,\n};\n\n/**\n * Drawer with the functionality to show and manage tags in a certain content.\n * It is used both in interfaces of this MFE and in edx-platform interfaces such as iframe.\n * - If you want to use it as an iframe, the component obtains the `contentId` from the url parameters.\n * Functions to close the drawer are handled internally.\n * TODO: We can delete this method when is no longer used on edx-platform.\n * - If you want to use it as react component, you need to pass the content id and the close functions\n * through the component parameters.\n */\nconst ContentTagsDrawer = ({ id, onClose }) => {\n const intl = useIntl();\n // TODO: We can delete 'params' when the iframe is no longer used on edx-platform\n const params = useParams();\n const contentId = id ?? params.contentId;\n\n const context = useContentTagsDrawerContext(contentId);\n const { blockingSheet } = useContext(ContentTagsDrawerSheetContext);\n\n const {\n showToastAfterSave,\n toReadMode,\n commitGlobalStagedTagsStatus,\n isContentDataLoaded,\n contentName,\n isTaxonomyListLoaded,\n isContentTaxonomyTagsLoaded,\n stagedContentTags,\n collapsibleStates,\n isEditMode,\n commitGlobalStagedTags,\n toEditMode,\n toastMessage,\n closeToast,\n setCollapsibleToInitalState,\n otherTaxonomies,\n } = context;\n\n let onCloseDrawer = onClose;\n if (onCloseDrawer === undefined) {\n onCloseDrawer = () => {\n // \"*\" allows communication with any origin\n window.parent.postMessage('closeManageTagsDrawer', '*');\n };\n }\n\n useEffect(() => {\n const handleEsc = (event) => {\n /* Close drawer when ESC-key is pressed and selectable dropdown box not open */\n const selectableBoxOpen = document.querySelector('[data-selectable-box=\"taxonomy-tags\"]');\n if (event.key === 'Escape' && !selectableBoxOpen && !blockingSheet) {\n onCloseDrawer();\n }\n };\n document.addEventListener('keydown', handleEsc);\n\n return () => {\n document.removeEventListener('keydown', handleEsc);\n };\n }, [blockingSheet]);\n\n useEffect(() => {\n /* istanbul ignore next */\n if (commitGlobalStagedTagsStatus === 'success') {\n showToastAfterSave();\n toReadMode();\n }\n }, [commitGlobalStagedTagsStatus]);\n\n // First call of the initial collapsible states\n React.useEffect(() => {\n setCollapsibleToInitalState();\n }, [isTaxonomyListLoaded, isContentTaxonomyTagsLoaded]);\n\n return (\n <ContentTagsDrawerContext.Provider value={context}>\n <div id=\"content-tags-drawer\" className=\"mt-1 tags-drawer d-flex flex-column justify-content-between min-vh-100 pt-3\">\n <Container size=\"xl\">\n { isContentDataLoaded\n ? <h2 className=\"h3 pl-2.5\">{ contentName }</h2>\n : (\n <div className=\"d-flex justify-content-center align-items-center flex-column\">\n <Spinner\n animation=\"border\"\n size=\"xl\"\n screenReaderText={intl.formatMessage(messages.loadingMessage)}\n />\n </div>\n )}\n <hr />\n <Container>\n <p className=\"h4 text-gray-500 font-weight-bold\">\n {intl.formatMessage(messages.headerSubtitle)}\n </p>\n <TaxonomyList contentId={contentId} />\n {otherTaxonomies.length !== 0 && (\n <div>\n <p className=\"h4 text-gray-500 font-weight-bold\">\n {intl.formatMessage(messages.otherTagsHeader)}\n </p>\n <p className=\"other-description text-gray-500\">\n {intl.formatMessage(messages.otherTagsDescription)}\n </p>\n { isTaxonomyListLoaded && isContentTaxonomyTagsLoaded && (\n otherTaxonomies.map((data) => (\n <div key={`taxonomy-tags-collapsible-${data.id}`}>\n <ContentTagsCollapsible\n contentId={contentId}\n taxonomyAndTagsData={data}\n stagedContentTags={stagedContentTags[data.id] || []}\n collapsibleState={collapsibleStates[data.id] || false}\n />\n <hr />\n </div>\n ))\n )}\n </div>\n )}\n </Container>\n </Container>\n\n { isTaxonomyListLoaded && isContentTaxonomyTagsLoaded && (\n <Container\n className=\"bg-white position-sticky p-3.5 box-shadow-up-2 tags-drawer-footer\"\n >\n <div className=\"d-flex justify-content-end\">\n { commitGlobalStagedTagsStatus !== 'loading' ? (\n <Stack direction=\"horizontal\" gap={2}>\n <Button\n className=\"font-weight-bold tags-drawer-cancel-button\"\n variant=\"tertiary\"\n onClick={isEditMode\n ? toReadMode\n : onCloseDrawer}\n >\n { intl.formatMessage(isEditMode\n ? messages.tagsDrawerCancelButtonText\n : messages.tagsDrawerCloseButtonText)}\n </Button>\n <Button\n variant=\"dark\"\n className=\"rounded-0\"\n onClick={isEditMode\n ? commitGlobalStagedTags\n : toEditMode}\n >\n { intl.formatMessage(isEditMode\n ? messages.tagsDrawerSaveButtonText\n : messages.tagsDrawerEditTagsButtonText)}\n </Button>\n </Stack>\n )\n : (\n <Spinner\n animation=\"border\"\n size=\"xl\"\n screenReaderText={intl.formatMessage(messages.loadingMessage)}\n />\n )}\n </div>\n </Container>\n )}\n {/* istanbul ignore next */\n toastMessage && (\n <Toast\n show\n onClose={closeToast}\n >\n {toastMessage}\n </Toast>\n )\n }\n </div>\n </ContentTagsDrawerContext.Provider>\n );\n};\n\nContentTagsDrawer.propTypes = {\n id: PropTypes.string,\n onClose: PropTypes.func,\n};\n\nContentTagsDrawer.defaultProps = {\n id: undefined,\n onClose: undefined,\n};\n\nexport default ContentTagsDrawer;\n","// @ts-check\nimport React, { useMemo, useState } from 'react';\nimport { Sheet } from '@openedx/paragon';\nimport PropTypes from 'prop-types';\nimport ContentTagsDrawer from './ContentTagsDrawer';\nimport { ContentTagsDrawerSheetContext } from './common/context';\n\nconst ContentTagsDrawerSheet = ({ id, onClose, showSheet }) => {\n const [blockingSheet, setBlockingSheet] = useState(false);\n\n const context = useMemo(() => ({\n blockingSheet, setBlockingSheet,\n }), [blockingSheet, setBlockingSheet]);\n\n return (\n <ContentTagsDrawerSheetContext.Provider value={context}>\n <Sheet\n position=\"right\"\n show={showSheet}\n onClose={onClose}\n blocking={blockingSheet}\n >\n <ContentTagsDrawer\n id={id}\n onClose={onClose}\n />\n </Sheet>\n </ContentTagsDrawerSheetContext.Provider>\n );\n};\n\nContentTagsDrawerSheet.propTypes = {\n id: PropTypes.string,\n onClose: PropTypes.func,\n showSheet: PropTypes.bool,\n};\n\nContentTagsDrawerSheet.defaultProps = {\n id: undefined,\n onClose: undefined,\n showSheet: false,\n};\n\nexport default ContentTagsDrawerSheet;\n","import PropTypes from 'prop-types';\nimport { Icon, Button } from '@openedx/paragon';\nimport { Tag } from '@openedx/paragon/icons';\nimport classNames from 'classnames';\n\nconst TagCount = ({ count, onClick }) => {\n const renderContent = () => (\n <>\n <Icon className=\"mr-1 pt-1\" src={Tag} />\n {count}\n </>\n );\n\n return (\n <div className={\n classNames('generic-tag-count d-flex', { 'zero-count': count === 0 })\n }\n >\n { onClick ? (\n <Button variant=\"tertiary\" onClick={onClick}>\n {renderContent()}\n </Button>\n )\n : renderContent()}\n </div>\n );\n};\n\nTagCount.defaultProps = {\n onClick: undefined,\n};\n\nTagCount.propTypes = {\n count: PropTypes.number.isRequired,\n onClick: PropTypes.func,\n};\n\nexport default TagCount;\n","// @ts-check\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nimport { convertObjectToSnakeCase } from '../../utils';\n\nexport const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getCreateOrRerunCourseUrl = () => new URL('course/', getApiBaseUrl()).href;\nexport const getCourseRerunUrl = (courseId) => new URL(`/api/contentstore/v1/course_rerun/${courseId}`, getApiBaseUrl()).href;\nexport const getOrganizationsUrl = () => new URL('organizations', getApiBaseUrl()).href;\nexport const getClipboardUrl = () => `${getApiBaseUrl()}/api/content-staging/v1/clipboard/`;\nexport const getTagsCountApiUrl = (contentPattern) => new URL(`api/content_tagging/v1/object_tag_counts/${contentPattern}/?count_implicit`, getApiBaseUrl()).href;\n\n/**\n * Get's organizations data. Returns list of organization names.\n * @returns {Promise<string[]>}\n */\nexport async function getOrganizations() {\n const { data } = await getAuthenticatedHttpClient().get(\n getOrganizationsUrl(),\n );\n return camelCaseObject(data);\n}\n\n/**\n * Get's course rerun data.\n * @returns {Promise<Object>}\n */\nexport async function getCourseRerun(courseId) {\n const { data } = await getAuthenticatedHttpClient().get(\n getCourseRerunUrl(courseId),\n );\n return camelCaseObject(data);\n}\n\n/**\n * Create or rerun course with data.\n * @param {object} courseData\n * @returns {Promise<Object>}\n */\nexport async function createOrRerunCourse(courseData) {\n const { data } = await getAuthenticatedHttpClient().post(\n getCreateOrRerunCourseUrl(),\n convertObjectToSnakeCase(courseData, true),\n );\n return camelCaseObject(data);\n}\n\n/**\n * Retrieves user's clipboard.\n * @returns {Promise<Object>} - A Promise that resolves clipboard data.\n */\nexport async function getClipboard() {\n const { data } = await getAuthenticatedHttpClient()\n .get(getClipboardUrl());\n\n return camelCaseObject(data);\n}\n\n/**\n * Updates user's clipboard.\n * @param {string} usageKey - The ID of the block.\n * @returns {Promise<Object>} - A Promise that resolves clipboard data.\n */\nexport async function updateClipboard(usageKey) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getClipboardUrl(), { usage_key: usageKey });\n\n return camelCaseObject(data);\n}\n\n/**\n * Gets the tags count of multiple content by id separated by commas or a pattern using a '*' wildcard.\n * @param {string} contentPattern\n * @returns {Promise<Object>}\n*/\nexport async function getTagsCount(contentPattern) {\n if (contentPattern) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getTagsCountApiUrl(contentPattern));\n\n return data;\n }\n return null;\n}\n","// @ts-check\nimport { useQuery } from '@tanstack/react-query';\nimport { getOrganizations, getTagsCount } from './api';\n\n/**\n * Builds the query to get a list of available organizations\n */\nexport const useOrganizationListData = () => (\n useQuery({\n queryKey: ['organizationList'],\n queryFn: () => getOrganizations(),\n })\n);\n\n/**\n * Builds the query to get tags count of the whole contentId course and\n * returns the tags count of the specific contentId.\n * @param {string} contentId\n */\nexport const useContentTagsCount = (contentId) => {\n let contentPattern;\n if (contentId.includes('course-v1')) {\n // If the contentId is a course, we want to get the tags count only for the course\n contentPattern = contentId;\n } else {\n // If the contentId is not a course, we want to get the tags count for all the content of the course\n contentPattern = contentId.replace(/\\+type@.*$/, '*');\n }\n return useQuery({\n queryKey: ['contentTagsCount', contentPattern],\n queryFn: /* istanbul ignore next */ () => getTagsCount(contentPattern),\n select: (data) => data[contentId] || 0, // Return the tags count of the specific contentId\n });\n};\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n startDateTitle: {\n id: 'course-authoring.course-outline.status-bar.start-date',\n defaultMessage: 'Start date',\n },\n pacingTypeTitle: {\n id: 'course-authoring.course-outline.status-bar.pacing-type',\n defaultMessage: 'Pacing type',\n },\n pacingTypeSelfPaced: {\n id: 'course-authoring.course-outline.status-bar.pacing-type.self-paced',\n defaultMessage: 'Self-paced',\n },\n pacingTypeInstructorPaced: {\n id: 'course-authoring.course-outline.status-bar.pacing-type.instructor-Paced',\n defaultMessage: 'Instructor-paced',\n },\n checklistTitle: {\n id: 'course-authoring.course-outline.status-bar.checklists',\n defaultMessage: 'Checklists',\n },\n checklistCompleted: {\n id: 'course-authoring.course-outline.status-bar.checklists.completed',\n defaultMessage: 'completed',\n },\n highlightEmailsTitle: {\n id: 'course-authoring.course-outline.status-bar.highlight-emails',\n defaultMessage: 'Course highlight emails',\n },\n highlightEmailsButton: {\n id: 'course-authoring.course-outline.status-bar.highlight-emails.button',\n defaultMessage: 'Enable now',\n },\n highlightEmailsEnabled: {\n id: 'course-authoring.course-outline.status-bar.highlight-emails.enabled',\n defaultMessage: 'Enabled',\n },\n highlightEmailsLink: {\n id: 'course-authoring.course-outline.status-bar.highlight-emails.link',\n defaultMessage: 'Learn more',\n },\n courseTagsTitle: {\n id: 'course-authoring.course-outline.status-bar.course-tags',\n defaultMessage: 'Course tags',\n description: 'Course tags header in course outline',\n },\n courseManageTagsLink: {\n id: 'course-authoring.course-outline.status-bar.course-manage-tags-link',\n defaultMessage: 'Manage tags',\n description: 'Opens the drawer to edit content tags',\n },\n videoSharingTitle: {\n id: 'course-authoring.course-outline.status-bar.video-sharing.title',\n defaultMessage: 'Video Sharing',\n },\n videoSharingLink: {\n id: 'course-authoring.course-outline.status-bar.video-sharing.title',\n defaultMessage: 'Learn more',\n },\n videoSharingPerVideoText: {\n id: 'course-authoring.course-outline.status-bar.video-sharing.perVideo.text',\n defaultMessage: 'Per Video',\n },\n videoSharingAllOffText: {\n id: 'course-authoring.course-outline.status-bar.video-sharing.allOff.text',\n defaultMessage: 'No Videos',\n },\n videoSharingAllOnText: {\n id: 'course-authoring.course-outline.status-bar.video-sharing.allOn.text',\n defaultMessage: 'All Videos',\n },\n});\n\nexport default messages;\n","import React from 'react';\n\nconst DraftIcon = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={24}\n height={24}\n viewBox=\"0 -960 960 960\"\n {...props}\n >\n <path\n d=\"M240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default DraftIcon;\n","import {\n CheckCircle as CheckCircleIcon,\n Lock as LockIcon,\n} from '@openedx/paragon/icons';\n\nimport DraftIcon from '../generic/DraftIcon';\nimport { ITEM_BADGE_STATUS, VIDEO_SHARING_OPTIONS } from './constants';\nimport { VisibilityTypes } from '../data/constants';\n\n/**\n * Get section status depended on section info\n * @param {bool} published - value from section info\n * @param {string} visibilityState - value from section info\n * @returns {ITEM_BADGE_STATUS[keyof ITEM_BADGE_STATUS]}\n */\nconst getItemStatus = ({\n published,\n visibilityState,\n hasChanges,\n}) => {\n switch (true) {\n case visibilityState === VisibilityTypes.STAFF_ONLY:\n return ITEM_BADGE_STATUS.staffOnly;\n case visibilityState === VisibilityTypes.GATED:\n return ITEM_BADGE_STATUS.gated;\n case visibilityState === VisibilityTypes.LIVE:\n return ITEM_BADGE_STATUS.live;\n case visibilityState === VisibilityTypes.UNSCHEDULED:\n return ITEM_BADGE_STATUS.unscheduled;\n case published && !hasChanges:\n return ITEM_BADGE_STATUS.publishedNotLive;\n case published && hasChanges:\n return ITEM_BADGE_STATUS.unpublishedChanges;\n default:\n return ITEM_BADGE_STATUS.draft;\n }\n};\n\n/**\n * Get section badge status content\n * @param {string} status - value from on getItemStatus util\n * @returns {\n * badgeTitle: string,\n * badgeIcon: node,\n * }\n */\nconst getItemStatusBadgeContent = (status, messages, intl) => {\n switch (status) {\n case ITEM_BADGE_STATUS.gated:\n return {\n badgeTitle: intl.formatMessage(messages.statusBadgeGated),\n badgeIcon: LockIcon,\n };\n case ITEM_BADGE_STATUS.live:\n return {\n badgeTitle: intl.formatMessage(messages.statusBadgeLive),\n badgeIcon: CheckCircleIcon,\n };\n case ITEM_BADGE_STATUS.publishedNotLive:\n return {\n badgeTitle: intl.formatMessage(messages.statusBadgePublishedNotLive),\n badgeIcon: null,\n };\n case ITEM_BADGE_STATUS.staffOnly:\n return {\n badgeTitle: intl.formatMessage(messages.statusBadgeStaffOnly),\n badgeIcon: LockIcon,\n };\n case ITEM_BADGE_STATUS.unpublishedChanges:\n return {\n badgeTitle: intl.formatMessage(messages.statusBadgeUnpublishedChanges),\n badgeIcon: DraftIcon,\n };\n case ITEM_BADGE_STATUS.draft:\n return {\n badgeTitle: intl.formatMessage(messages.statusBadgeDraft),\n badgeIcon: DraftIcon,\n };\n default:\n return {\n badgeTitle: '',\n badgeIcon: null,\n };\n }\n};\n\n/**\n * Get section border color\n * @param {string} status - value from on getItemStatus util\n * @returns {\n * borderLeft: string,\n * }\n */\nconst getItemStatusBorder = (status) => {\n switch (status) {\n case ITEM_BADGE_STATUS.live:\n return {\n borderLeft: '5px solid #00688D',\n };\n case ITEM_BADGE_STATUS.publishedNotLive:\n return {\n borderLeft: '5px solid #0D7D4D',\n };\n case ITEM_BADGE_STATUS.gated:\n return {\n borderLeft: '5px solid #000000',\n };\n case ITEM_BADGE_STATUS.staffOnly:\n return {\n borderLeft: '5px solid #000000',\n };\n case ITEM_BADGE_STATUS.unpublishedChanges:\n return {\n borderLeft: '5px solid #F0CC00',\n };\n case ITEM_BADGE_STATUS.draft:\n return {\n borderLeft: '5px solid #F0CC00',\n };\n case ITEM_BADGE_STATUS.unscheduled:\n return {\n borderLeft: '5px solid #ccc',\n };\n default:\n return {};\n }\n};\n\n/**\n * Get formatted highlights form values\n * @param {Array<string>} currentHighlights - section highlights\n * @returns {\n * highlight_1: string,\n * highlight_2: string,\n * highlight_3: string,\n * highlight_4: string,\n * highlight_5: string,\n * }\n */\nconst getHighlightsFormValues = (currentHighlights) => {\n const initialFormValues = {\n highlight_1: '',\n highlight_2: '',\n highlight_3: '',\n highlight_4: '',\n highlight_5: '',\n };\n\n const formValues = currentHighlights.length\n ? Object.entries(initialFormValues).reduce((result, [key], index) => {\n if (currentHighlights[index]) {\n return {\n ...result,\n [key]: currentHighlights[index],\n };\n }\n return result;\n }, initialFormValues)\n : initialFormValues;\n\n return formValues;\n};\n\n/**\n * Method to scroll into view port, if it's outside the viewport\n *\n * @param {Object} target - DOM Element\n * @param {boolean} alignWithTop (optional) - Whether top of the target will be aligned to\n * the top of viewpoint. (default: false)\n * @returns {undefined}\n */\nconst scrollToElement = (target, alignWithTop = false) => {\n if (target.getBoundingClientRect().bottom > window.innerHeight) {\n // if alignWithTop is set, the top of the target will be aligned to the top of visible area\n // of the scrollable ancestor, Otherwise, the bottom of the target will be aligned to the\n // bottom of the visible area of the scrollable ancestor.\n target.scrollIntoView({\n behavior: 'smooth',\n block: alignWithTop ? 'start' : 'end',\n inline: 'nearest',\n });\n }\n\n // Target is outside the view from the top\n if (target.getBoundingClientRect().top < 0) {\n // The top of the target will be aligned to the top of the visible area of the scrollable ancestor\n target.scrollIntoView({ behavior: 'smooth' });\n }\n};\n\n/**\n * Get video sharing dropdown translated options.\n * @param {string} id - option id\n * @returns {string} - text to display\n */\nconst getVideoSharingOptionText = (id, messages, intl) => {\n switch (id) {\n case VIDEO_SHARING_OPTIONS.perVideo:\n return intl.formatMessage(messages.videoSharingPerVideoText);\n case VIDEO_SHARING_OPTIONS.allOn:\n return intl.formatMessage(messages.videoSharingAllOnText);\n case VIDEO_SHARING_OPTIONS.allOff:\n return intl.formatMessage(messages.videoSharingAllOffText);\n default:\n return '';\n }\n};\n\nexport {\n getItemStatus,\n getItemStatusBadgeContent,\n getItemStatusBorder,\n getHighlightsFormValues,\n getVideoSharingOptionText,\n scrollToElement,\n};\n","import React, { useContext } from 'react';\nimport moment from 'moment/moment';\nimport PropTypes from 'prop-types';\nimport { FormattedDate, useIntl } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform/config';\nimport {\n Button, Hyperlink, Form, Stack, useToggle,\n} from '@openedx/paragon';\nimport { AppContext } from '@edx/frontend-platform/react';\n\nimport { ContentTagsDrawerSheet } from '../../content-tags-drawer';\nimport TagCount from '../../generic/tag-count';\nimport { useHelpUrls } from '../../help-urls/hooks';\nimport { VIDEO_SHARING_OPTIONS } from '../constants';\nimport { useContentTagsCount } from '../../generic/data/apiHooks';\nimport messages from './messages';\nimport { getVideoSharingOptionText } from '../utils';\n\nconst StatusBarItem = ({ title, children }) => (\n <div className=\"d-flex flex-column justify-content-between\">\n <h5>{title}</h5>\n <div className=\"d-flex align-items-center\">\n {children}\n </div>\n </div>\n);\n\nStatusBarItem.propTypes = {\n title: PropTypes.string.isRequired,\n children: PropTypes.node,\n};\n\nStatusBarItem.defaultProps = {\n children: null,\n};\n\nconst StatusBar = ({\n statusBarData,\n isLoading,\n courseId,\n openEnableHighlightsModal,\n handleVideoSharingOptionChange,\n}) => {\n const intl = useIntl();\n const { config } = useContext(AppContext);\n\n const {\n courseReleaseDate,\n highlightsEnabledForMessaging,\n checklist,\n isSelfPaced,\n videoSharingEnabled,\n videoSharingOptions,\n } = statusBarData;\n\n const {\n completedCourseLaunchChecks,\n completedCourseBestPracticesChecks,\n totalCourseLaunchChecks,\n totalCourseBestPracticesChecks,\n } = checklist;\n\n const courseReleaseDateObj = moment.utc(courseReleaseDate, 'MMM DD, YYYY at HH:mm UTC', true);\n const checkListTitle = `${completedCourseLaunchChecks + completedCourseBestPracticesChecks}/${totalCourseLaunchChecks + totalCourseBestPracticesChecks}`;\n const checklistDestination = () => new URL(`checklists/${courseId}`, config.STUDIO_BASE_URL).href;\n const scheduleDestination = () => new URL(`settings/details/${courseId}#schedule`, config.STUDIO_BASE_URL).href;\n\n const {\n contentHighlights: contentHighlightsUrl,\n socialSharing: socialSharingUrl,\n } = useHelpUrls(['contentHighlights', 'socialSharing']);\n\n const { data: courseTagCount } = useContentTagsCount(courseId);\n\n const [isManageTagsDrawerOpen, openManageTagsDrawer, closeManageTagsDrawer] = useToggle(false);\n\n if (isLoading) {\n return null;\n }\n\n return (\n <>\n <Stack direction=\"horizontal\" gap={3.5} className=\"d-flex align-items-stretch outline-status-bar\" data-testid=\"outline-status-bar\">\n <StatusBarItem title={intl.formatMessage(messages.startDateTitle)}>\n <Hyperlink\n className=\"small\"\n destination={scheduleDestination()}\n showLaunchIcon={false}\n >\n {courseReleaseDateObj.isValid() ? (\n <FormattedDate\n value={courseReleaseDateObj}\n year=\"numeric\"\n month=\"short\"\n day=\"2-digit\"\n hour=\"numeric\"\n minute=\"numeric\"\n />\n ) : courseReleaseDate}\n </Hyperlink>\n </StatusBarItem>\n <StatusBarItem title={intl.formatMessage(messages.pacingTypeTitle)}>\n <span className=\"small\">\n {isSelfPaced\n ? intl.formatMessage(messages.pacingTypeSelfPaced)\n : intl.formatMessage(messages.pacingTypeInstructorPaced)}\n </span>\n </StatusBarItem>\n <StatusBarItem title={intl.formatMessage(messages.checklistTitle)}>\n <Hyperlink\n className=\"small\"\n destination={checklistDestination()}\n showLaunchIcon={false}\n >\n {checkListTitle} {intl.formatMessage(messages.checklistCompleted)}\n </Hyperlink>\n </StatusBarItem>\n <StatusBarItem title={intl.formatMessage(messages.highlightEmailsTitle)}>\n <div className=\"d-flex align-items-center\">\n {highlightsEnabledForMessaging ? (\n <span data-testid=\"highlights-enabled-span\" className=\"small\">\n {intl.formatMessage(messages.highlightEmailsEnabled)}\n </span>\n ) : (\n <Button data-testid=\"highlights-enable-button\" size=\"sm\" onClick={openEnableHighlightsModal}>\n {intl.formatMessage(messages.highlightEmailsButton)}\n </Button>\n )}\n <Hyperlink\n className=\"small ml-2\"\n destination={contentHighlightsUrl}\n target=\"_blank\"\n showLaunchIcon={false}\n >\n {intl.formatMessage(messages.highlightEmailsLink)}\n </Hyperlink>\n </div>\n </StatusBarItem>\n {getConfig().ENABLE_TAGGING_TAXONOMY_PAGES === 'true' && (\n <StatusBarItem title={intl.formatMessage(messages.courseTagsTitle)}>\n <div className=\"d-flex align-items-center\">\n <TagCount count={courseTagCount} />\n { /* eslint-disable-next-line jsx-a11y/anchor-is-valid */ }\n <a\n className=\"small ml-2\"\n href=\"#\"\n onClick={openManageTagsDrawer}\n >\n {intl.formatMessage(messages.courseManageTagsLink)}\n </a>\n </div>\n </StatusBarItem>\n )}\n {videoSharingEnabled && (\n <Form.Group\n size=\"sm\"\n className=\"d-flex flex-column justify-content-between m-0\"\n >\n <Form.Label\n className=\"h5\"\n >{intl.formatMessage(messages.videoSharingTitle)}\n </Form.Label>\n <div className=\"d-flex align-items-center\">\n <Form.Control\n as=\"select\"\n defaultValue={videoSharingOptions}\n onChange={(e) => handleVideoSharingOptionChange(e.target.value)}\n >\n {Object.values(VIDEO_SHARING_OPTIONS).map((option) => (\n <option\n key={option}\n value={option}\n >\n {getVideoSharingOptionText(option, messages, intl)}\n </option>\n ))}\n </Form.Control>\n <Hyperlink\n className=\"small\"\n destination={socialSharingUrl}\n target=\"_blank\"\n showLaunchIcon={false}\n >\n {intl.formatMessage(messages.videoSharingLink)}\n </Hyperlink>\n </div>\n </Form.Group>\n\n )}\n </Stack>\n <ContentTagsDrawerSheet\n id={courseId}\n onClose={/* istanbul ignore next */ () => closeManageTagsDrawer()}\n showSheet={isManageTagsDrawerOpen}\n />\n </>\n );\n};\n\nStatusBar.propTypes = {\n courseId: PropTypes.string.isRequired,\n isLoading: PropTypes.bool.isRequired,\n openEnableHighlightsModal: PropTypes.func.isRequired,\n handleVideoSharingOptionChange: PropTypes.func.isRequired,\n statusBarData: PropTypes.shape({\n courseReleaseDate: PropTypes.string.isRequired,\n isSelfPaced: PropTypes.bool.isRequired,\n checklist: PropTypes.shape({\n totalCourseLaunchChecks: PropTypes.number.isRequired,\n completedCourseLaunchChecks: PropTypes.number.isRequired,\n totalCourseBestPracticesChecks: PropTypes.number.isRequired,\n completedCourseBestPracticesChecks: PropTypes.number.isRequired,\n }),\n highlightsEnabledForMessaging: PropTypes.bool.isRequired,\n videoSharingEnabled: PropTypes.bool.isRequired,\n videoSharingOptions: PropTypes.string.isRequired,\n }).isRequired,\n};\n\nexport default StatusBar;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.course-outline.status-bar.modal.title',\n defaultMessage: 'Enable course highlight emails',\n },\n description_1: {\n id: 'course-authoring.course-outline.status-bar.modal.description-1',\n defaultMessage: 'When you enable course highlight emails, learners automatically receive email messages for each section that has highlights. You cannot disable highlights after you start sending them.',\n },\n description_2: {\n id: 'course-authoring.course-outline.status-bar.modal.description-2',\n defaultMessage: 'Are you sure you want to enable course highlight emails?',\n },\n link: {\n id: 'course-authoring.course-outline.status-bar.modal.link',\n defaultMessage: 'Learn more',\n },\n cancelButton: {\n id: 'course-authoring.course-outline.status-bar.modal.cancelButton',\n defaultMessage: 'Cancel',\n },\n submitButton: {\n id: 'course-authoring.course-outline.status-bar.modal.submitButton',\n defaultMessage: 'Enable',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow, AlertModal, Button, Hyperlink,\n} from '@openedx/paragon';\n\nimport messages from './messages';\nimport { useHelpUrls } from '../../help-urls/hooks';\n\nconst EnableHighlightsModal = ({\n onEnableHighlightsSubmit,\n isOpen,\n close,\n}) => {\n const intl = useIntl();\n\n const {\n contentHighlights: contentHighlightsUrl,\n } = useHelpUrls(['contentHighlights']);\n\n return (\n <AlertModal\n title={intl.formatMessage(messages.title)}\n variant=\"default\"\n size=\"lg\"\n isOpen={isOpen}\n onClose={close}\n footerNode={(\n <ActionRow>\n <Button variant=\"tertiary\" onClick={close}>\n {intl.formatMessage(messages.cancelButton)}\n </Button>\n <Button onClick={onEnableHighlightsSubmit}>\n {intl.formatMessage(messages.submitButton)}\n </Button>\n </ActionRow>\n )}\n >\n <p className=\"small\">{intl.formatMessage(messages.description_1)}</p>\n <p className=\"small\">\n {intl.formatMessage(messages.description_2)}\n <Hyperlink\n className=\"small ml-2 text-decoration-none\"\n destination={contentHighlightsUrl}\n target=\"_blank\"\n showLaunchIcon={false}\n >\n {intl.formatMessage(messages.link)}\n </Hyperlink>\n </p>\n </AlertModal>\n );\n};\n\nEnableHighlightsModal.propTypes = {\n onEnableHighlightsSubmit: PropTypes.func.isRequired,\n isOpen: PropTypes.bool.isRequired,\n close: PropTypes.func.isRequired,\n};\n\nexport default EnableHighlightsModal;\n","import { useEffect, useState } from 'react';\nimport { history } from '@edx/frontend-platform';\n\nexport const useScrollToHashElement = ({ isLoading }) => {\n const [elementWithHash, setElementWithHash] = useState(null);\n\n useEffect(() => {\n const currentHash = window.location.hash.substring(1);\n\n if (currentHash) {\n const element = document.getElementById(currentHash);\n if (element) {\n element.scrollIntoView();\n history.replace({ hash: '' });\n }\n setElementWithHash(currentHash);\n }\n }, [isLoading]);\n\n return { elementWithHash };\n};\n\nexport const useEscapeClick = ({ onEscape, dependency }) => {\n useEffect(() => {\n const handleEscapeClick = (event) => {\n if (event.key === 'Escape') {\n onEscape();\n }\n };\n\n window.addEventListener('keydown', handleEscapeClick);\n\n return () => {\n window.removeEventListener('keydown', handleEscapeClick);\n };\n }, [dependency]);\n};\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n expandTooltip: {\n id: 'course-authoring.course-outline.card.expandTooltip',\n defaultMessage: 'Collapse/Expand this card',\n },\n statusBadgeLive: {\n id: 'course-authoring.course-outline.card.status-badge.live',\n defaultMessage: 'Live',\n },\n statusBadgeGated: {\n id: 'course-authoring.course-outline.card.status-badge.gated',\n defaultMessage: 'Gated',\n },\n statusBadgePublishedNotLive: {\n id: 'course-authoring.course-outline.card.status-badge.published-not-live',\n defaultMessage: 'Published not live',\n },\n statusBadgeStaffOnly: {\n id: 'course-authoring.course-outline.card.status-badge.staff-only',\n defaultMessage: 'Staff only',\n },\n statusBadgeDraft: {\n id: 'course-authoring.course-outline.card.status-badge.draft',\n defaultMessage: 'Draft',\n },\n statusBadgeUnpublishedChanges: {\n id: 'course-authoring.course-outline.card.status-badge.draft-unpublished-changes',\n defaultMessage: 'Draft (Unpublished changes)',\n },\n altButtonEdit: {\n id: 'course-authoring.course-outline.card.button.edit.alt',\n defaultMessage: 'Edit',\n },\n menuPublish: {\n id: 'course-authoring.course-outline.card.menu.publish',\n defaultMessage: 'Publish',\n },\n menuConfigure: {\n id: 'course-authoring.course-outline.card.menu.configure',\n defaultMessage: 'Configure',\n },\n menuDuplicate: {\n id: 'course-authoring.course-outline.card.menu.duplicate',\n defaultMessage: 'Duplicate',\n },\n menuMoveUp: {\n id: 'course-authoring.course-outline.card.menu.moveup',\n defaultMessage: 'Move up',\n },\n menuMoveDown: {\n id: 'course-authoring.course-outline.card.menu.movedown',\n defaultMessage: 'Move down',\n },\n menuDelete: {\n id: 'course-authoring.course-outline.card.menu.delete',\n defaultMessage: 'Delete',\n },\n menuCopy: {\n id: 'course-authoring.course-outline.card.menu.delete',\n defaultMessage: 'Copy to clipboard',\n },\n menuProctoringLinkText: {\n id: 'course-authoring.course-outline.card.menu.proctoring-settings',\n defaultMessage: 'Proctoring settings',\n },\n proctoringLinkTooltip: {\n id: 'course-authoring.course-outline.card.menu.proctoring-settings-tooltip',\n defaultMessage: 'Proctoring settings',\n },\n discussionEnabledBadgeText: {\n id: 'course-authoring.course-outline.card.badge.discussionEnabled',\n defaultMessage: 'Discussions enabled',\n },\n menuManageTags: {\n id: 'course-authoring.course-outline.card.menu.manageTags',\n defaultMessage: 'Manage tags',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Icon } from '@openedx/paragon';\n\nconst StatusBadge = ({\n text,\n icon,\n iconClassName,\n}) => {\n if (text) {\n return (\n <div\n className=\"px-2 py-1 mr-2 rounded bg-white align-self-center align-items-center d-flex border border-light-300\"\n role=\"status\"\n >\n {icon && (\n <Icon\n src={icon}\n size=\"sm\"\n className={iconClassName}\n />\n )}\n <span className=\"small ml-1\">{text}</span>\n </div>\n );\n }\n return null;\n};\n\nStatusBadge.defaultProps = {\n text: '',\n icon: '',\n iconClassName: '',\n};\n\nStatusBadge.propTypes = {\n text: PropTypes.string,\n icon: PropTypes.func,\n iconClassName: PropTypes.string,\n};\n\nexport default StatusBadge;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport classNames from 'classnames';\nimport { ITEM_BADGE_STATUS } from '../constants';\nimport { getItemStatusBadgeContent } from '../utils';\nimport messages from './messages';\nimport StatusBadge from './StatusBadge';\n\nconst CardStatus = ({\n status,\n showDiscussionsEnabledBadge,\n}) => {\n const intl = useIntl();\n const { badgeTitle, badgeIcon } = getItemStatusBadgeContent(status, messages, intl);\n\n return (\n <>\n {showDiscussionsEnabledBadge && (\n <StatusBadge\n text={intl.formatMessage(messages.discussionEnabledBadgeText)}\n />\n )}\n {badgeTitle && (\n <StatusBadge\n text={badgeTitle}\n icon={badgeIcon}\n iconClassName={classNames({ 'text-success-500': status === ITEM_BADGE_STATUS.live })}\n />\n )}\n </>\n );\n};\n\nCardStatus.propTypes = {\n status: PropTypes.string.isRequired,\n showDiscussionsEnabledBadge: PropTypes.bool.isRequired,\n};\n\nexport default CardStatus;\n","// @ts-check\nimport React, { useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { getConfig } from '@edx/frontend-platform';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n Dropdown,\n Form,\n Hyperlink,\n Icon,\n IconButton,\n useToggle,\n} from '@openedx/paragon';\nimport {\n MoreVert as MoveVertIcon,\n EditOutline as EditIcon,\n} from '@openedx/paragon/icons';\n\nimport { useContentTagsCount } from '../../generic/data/apiHooks';\nimport { ContentTagsDrawerSheet } from '../../content-tags-drawer';\nimport TagCount from '../../generic/tag-count';\nimport { useEscapeClick } from '../../hooks';\nimport { ITEM_BADGE_STATUS } from '../constants';\nimport { scrollToElement } from '../utils';\nimport CardStatus from './CardStatus';\nimport messages from './messages';\n\nconst CardHeader = ({\n title,\n status,\n cardId,\n hasChanges,\n onClickPublish,\n onClickConfigure,\n onClickMenuButton,\n onClickEdit,\n isFormOpen,\n onEditSubmit,\n closeForm,\n isDisabledEditField,\n onClickDelete,\n onClickDuplicate,\n onClickMoveUp,\n onClickMoveDown,\n onClickCopy,\n titleComponent,\n namePrefix,\n actions,\n enableCopyPasteUnits,\n isVertical,\n isSequential,\n proctoringExamConfigurationLink,\n discussionEnabled,\n discussionsSettings,\n parentInfo,\n}) => {\n const intl = useIntl();\n const [searchParams] = useSearchParams();\n const [titleValue, setTitleValue] = useState(title);\n const cardHeaderRef = useRef(null);\n const [isManageTagsDrawerOpen, openManageTagsDrawer, closeManageTagsDrawer] = useToggle(false);\n\n // Use studio url as base if proctoringExamConfigurationLink is a relative link\n const fullProctoringExamConfigurationLink = () => (\n proctoringExamConfigurationLink && new URL(proctoringExamConfigurationLink, getConfig().STUDIO_BASE_URL).href\n );\n\n const isDisabledPublish = (status === ITEM_BADGE_STATUS.live\n || status === ITEM_BADGE_STATUS.publishedNotLive) && !hasChanges;\n\n const { data: contentTagCount } = useContentTagsCount(cardId);\n\n useEffect(() => {\n const locatorId = searchParams.get('show');\n if (!locatorId) {\n return;\n }\n\n if (cardHeaderRef.current && locatorId === cardId) {\n scrollToElement(cardHeaderRef.current);\n }\n }, []);\n\n const showDiscussionsEnabledBadge = (\n isVertical\n && !parentInfo?.isTimeLimited\n && discussionEnabled\n && discussionsSettings?.providerType === 'openedx'\n && (\n discussionsSettings?.enableGradedUnits\n || (!discussionsSettings?.enableGradedUnits && !parentInfo.graded)\n )\n );\n\n useEscapeClick({\n onEscape: () => {\n setTitleValue(title);\n closeForm();\n },\n dependency: title,\n });\n\n return (\n <>\n <div\n className=\"item-card-header\"\n data-testid={`${namePrefix}-card-header`}\n ref={cardHeaderRef}\n >\n {isFormOpen ? (\n <Form.Group className=\"m-0 w-75\">\n <Form.Control\n data-testid={`${namePrefix}-edit-field`}\n ref={(e) => e && e.focus()}\n value={titleValue}\n name=\"displayName\"\n onChange={(e) => setTitleValue(e.target.value)}\n aria-label=\"edit field\"\n onBlur={() => onEditSubmit(titleValue)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onEditSubmit(titleValue);\n }\n }}\n disabled={isDisabledEditField}\n />\n </Form.Group>\n ) : (\n <>\n {titleComponent}\n <IconButton\n className=\"item-card-edit-icon\"\n data-testid={`${namePrefix}-edit-button`}\n alt={intl.formatMessage(messages.altButtonEdit)}\n iconAs={EditIcon}\n onClick={onClickEdit}\n />\n </>\n )}\n <div className=\"ml-auto d-flex\">\n {(isVertical || isSequential) && (\n <CardStatus status={status} showDiscussionsEnabledBadge={showDiscussionsEnabledBadge} />\n )}\n { getConfig().ENABLE_TAGGING_TAXONOMY_PAGES === 'true' && contentTagCount > 0 && (\n <TagCount count={contentTagCount} onClick={openManageTagsDrawer} />\n )}\n <Dropdown data-testid={`${namePrefix}-card-header__menu`} onClick={onClickMenuButton}>\n <Dropdown.Toggle\n className=\"item-card-header__menu\"\n id={`${namePrefix}-card-header__menu`}\n data-testid={`${namePrefix}-card-header__menu-button`}\n as={IconButton}\n src={MoveVertIcon}\n alt={`${namePrefix}-card-header__menu`}\n iconAs={Icon}\n />\n <Dropdown.Menu>\n {isSequential && proctoringExamConfigurationLink && (\n <Dropdown.Item\n as={Hyperlink}\n target=\"_blank\"\n destination={fullProctoringExamConfigurationLink()}\n href={fullProctoringExamConfigurationLink()}\n externalLinkTitle={intl.formatMessage(messages.proctoringLinkTooltip)}\n >\n {intl.formatMessage(messages.menuProctoringLinkText)}\n </Dropdown.Item>\n )}\n <Dropdown.Item\n data-testid={`${namePrefix}-card-header__menu-publish-button`}\n disabled={isDisabledPublish}\n onClick={onClickPublish}\n >\n {intl.formatMessage(messages.menuPublish)}\n </Dropdown.Item>\n <Dropdown.Item\n data-testid={`${namePrefix}-card-header__menu-configure-button`}\n onClick={onClickConfigure}\n >\n {intl.formatMessage(messages.menuConfigure)}\n </Dropdown.Item>\n {getConfig().ENABLE_TAGGING_TAXONOMY_PAGES === 'true' && (\n <Dropdown.Item\n data-testid={`${namePrefix}-card-header__menu-manage-tags-button`}\n onClick={openManageTagsDrawer}\n >\n {intl.formatMessage(messages.menuManageTags)}\n </Dropdown.Item>\n )}\n\n {isVertical && enableCopyPasteUnits && (\n <Dropdown.Item onClick={onClickCopy}>\n {intl.formatMessage(messages.menuCopy)}\n </Dropdown.Item>\n )}\n {actions.duplicable && (\n <Dropdown.Item\n data-testid={`${namePrefix}-card-header__menu-duplicate-button`}\n onClick={onClickDuplicate}\n >\n {intl.formatMessage(messages.menuDuplicate)}\n </Dropdown.Item>\n )}\n {actions.draggable && (\n <>\n <Dropdown.Item\n data-testid={`${namePrefix}-card-header__menu-move-up-button`}\n onClick={onClickMoveUp}\n disabled={!actions.allowMoveUp}\n >\n {intl.formatMessage(messages.menuMoveUp)}\n </Dropdown.Item>\n <Dropdown.Item\n data-testid={`${namePrefix}-card-header__menu-move-down-button`}\n onClick={onClickMoveDown}\n disabled={!actions.allowMoveDown}\n >\n {intl.formatMessage(messages.menuMoveDown)}\n </Dropdown.Item>\n </>\n )}\n {actions.deletable && (\n <Dropdown.Item\n className=\"border-top border-light\"\n data-testid={`${namePrefix}-card-header__menu-delete-button`}\n onClick={onClickDelete}\n >\n {intl.formatMessage(messages.menuDelete)}\n </Dropdown.Item>\n )}\n </Dropdown.Menu>\n </Dropdown>\n </div>\n </div>\n <ContentTagsDrawerSheet\n id={cardId}\n onClose={/* istanbul ignore next */ () => closeManageTagsDrawer()}\n showSheet={isManageTagsDrawerOpen}\n />\n </>\n );\n};\n\nCardHeader.defaultProps = {\n enableCopyPasteUnits: false,\n isVertical: false,\n isSequential: false,\n onClickCopy: null,\n proctoringExamConfigurationLink: null,\n discussionEnabled: false,\n discussionsSettings: {},\n parentInfo: {},\n cardId: '',\n};\n\nCardHeader.propTypes = {\n title: PropTypes.string.isRequired,\n status: PropTypes.string.isRequired,\n cardId: PropTypes.string,\n hasChanges: PropTypes.bool.isRequired,\n onClickPublish: PropTypes.func.isRequired,\n onClickConfigure: PropTypes.func.isRequired,\n onClickMenuButton: PropTypes.func.isRequired,\n onClickEdit: PropTypes.func.isRequired,\n isFormOpen: PropTypes.bool.isRequired,\n onEditSubmit: PropTypes.func.isRequired,\n closeForm: PropTypes.func.isRequired,\n isDisabledEditField: PropTypes.bool.isRequired,\n onClickDelete: PropTypes.func.isRequired,\n onClickDuplicate: PropTypes.func.isRequired,\n onClickMoveUp: PropTypes.func.isRequired,\n onClickMoveDown: PropTypes.func.isRequired,\n onClickCopy: PropTypes.func,\n titleComponent: PropTypes.node.isRequired,\n namePrefix: PropTypes.string.isRequired,\n proctoringExamConfigurationLink: PropTypes.string,\n actions: PropTypes.shape({\n deletable: PropTypes.bool.isRequired,\n draggable: PropTypes.bool.isRequired,\n childAddable: PropTypes.bool.isRequired,\n duplicable: PropTypes.bool.isRequired,\n allowMoveUp: PropTypes.bool,\n allowMoveDown: PropTypes.bool,\n }).isRequired,\n enableCopyPasteUnits: PropTypes.bool,\n isVertical: PropTypes.bool,\n isSequential: PropTypes.bool,\n discussionEnabled: PropTypes.bool,\n discussionsSettings: PropTypes.shape({\n providerType: PropTypes.string,\n enableGradedUnits: PropTypes.bool,\n }),\n parentInfo: PropTypes.shape({\n isTimeLimited: PropTypes.bool,\n graded: PropTypes.bool,\n }),\n};\n\nexport default CardHeader;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n tooltipContent: {\n id: 'authoring.draggableList.tooltip.content',\n defaultMessage: 'Drag to reorder',\n description: 'Tooltip content for drag indicator icon',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { intlShape, injectIntl } from '@edx/frontend-platform/i18n';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport {\n Col, Icon, Row,\n} from '@openedx/paragon';\nimport { DragIndicator } from '@openedx/paragon/icons';\n\nimport messages from './messages';\n\nconst SortableItem = ({\n id,\n category,\n isDraggable,\n isDroppable,\n componentStyle,\n children,\n // injected\n intl,\n}) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n setActivatorNodeRef,\n } = useSortable({\n id,\n data: {\n category,\n },\n disabled: {\n draggable: !isDraggable,\n droppable: !isDroppable,\n },\n animateLayoutChanges: () => false,\n });\n\n const style = {\n position: 'relative',\n zIndex: isDragging ? 200 : undefined,\n transform: CSS.Translate.toString(transform),\n transition,\n background: 'white',\n padding: '1rem 1.5rem',\n marginBottom: '1.5rem',\n borderRadius: '0.35rem',\n boxShadow: '0 0 .125rem rgba(0, 0, 0, .15), 0 0 .25rem rgba(0, 0, 0, .15)',\n ...componentStyle,\n };\n\n return (\n <Row\n ref={setNodeRef}\n style={style}\n className=\"mx-0\"\n >\n <Col className=\"extend-margin px-0\">\n {children}\n </Col>\n {isDraggable && (\n <button\n ref={setActivatorNodeRef}\n key=\"drag-to-reorder-icon\"\n aria-label={intl.formatMessage(messages.tooltipContent)}\n className=\"btn-icon btn-icon-secondary btn-icon-md\"\n type=\"button\"\n {...attributes}\n {...listeners}\n >\n <span className=\"btn-icon__icon-container\">\n <Icon src={DragIndicator} />\n </span>\n </button>\n )}\n </Row>\n );\n};\n\nSortableItem.defaultProps = {\n componentStyle: null,\n isDroppable: true,\n isDraggable: true,\n};\n\nSortableItem.propTypes = {\n id: PropTypes.string.isRequired,\n category: PropTypes.string.isRequired,\n isDroppable: PropTypes.bool,\n isDraggable: PropTypes.bool,\n children: PropTypes.node.isRequired,\n componentStyle: PropTypes.shape({}),\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(SortableItem);\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport const DragContext = React.createContext({ activeId: '', overId: '', children: undefined });\n\nconst DragContextProvider = ({ activeId, overId, children }) => {\n const contextValue = React.useMemo(() => ({\n activeId,\n overId,\n }), [activeId, overId]);\n return (\n <DragContext.Provider\n value={contextValue}\n >\n {children}\n </DragContext.Provider>\n );\n};\n\nDragContextProvider.defaultProps = {\n activeId: '',\n overId: '',\n};\n\nDragContextProvider.propTypes = {\n activeId: PropTypes.string,\n overId: PropTypes.string,\n children: PropTypes.node.isRequired,\n};\n\nexport default DragContextProvider;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Button,\n OverlayTrigger,\n Tooltip,\n Truncate,\n} from '@openedx/paragon';\nimport {\n ArrowDropDown as ArrowDownIcon,\n ArrowRight as ArrowRightIcon,\n} from '@openedx/paragon/icons';\nimport messages from './messages';\n\nconst TitleButton = ({\n title,\n isExpanded,\n onTitleClick,\n namePrefix,\n}) => {\n const intl = useIntl();\n const titleTooltipMessage = intl.formatMessage(messages.expandTooltip);\n\n return (\n <OverlayTrigger\n placement=\"bottom\"\n overlay={(\n <Tooltip\n id={`${title}-${titleTooltipMessage}`}\n >\n {titleTooltipMessage}\n </Tooltip>\n )}\n >\n <Button\n iconBefore={isExpanded ? ArrowDownIcon : ArrowRightIcon}\n variant=\"tertiary\"\n data-testid={`${namePrefix}-card-header__expanded-btn`}\n className=\"item-card-header__title-btn\"\n onClick={onTitleClick}\n >\n <Truncate lines={1} className={`${namePrefix}-card-title mb-0`}>{title}</Truncate>\n </Button>\n </OverlayTrigger>\n );\n};\n\nTitleButton.propTypes = {\n title: PropTypes.string.isRequired,\n isExpanded: PropTypes.bool.isRequired,\n onTitleClick: PropTypes.func.isRequired,\n namePrefix: PropTypes.string.isRequired,\n};\n\nexport default TitleButton;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n unscheduledLabel: {\n id: 'course-authoring.course-outline.xblock-status.unscheduled.label',\n defaultMessage: 'Unscheduled',\n },\n releasedLabel: {\n id: 'course-authoring.course-outline.xblock-status.released.label',\n defaultMessage: 'Released: ',\n },\n scheduledLabel: {\n id: 'course-authoring.course-outline.xblock-status.scheduled.label',\n defaultMessage: 'Scheduled: ',\n },\n onboardingExam: {\n id: 'course-authoring.course-outline.xblock-status.onboardingExam.value',\n defaultMessage: 'Onboarding Exam',\n },\n practiceProctoredExam: {\n id: 'course-authoring.course-outline.xblock-status.practiceProctoredExam.value',\n defaultMessage: 'Practice proctored Exam',\n },\n proctoredExam: {\n id: 'course-authoring.course-outline.xblock-status.proctoredExam.value',\n defaultMessage: 'Proctored Exam',\n },\n timedExam: {\n id: 'course-authoring.course-outline.xblock-status.timedExam.value',\n defaultMessage: 'Timed Exam',\n },\n releaseStatusScreenReaderTitle: {\n id: 'course-authoring.course-outline.xblock-status.releaseStatusScreenReader.title',\n defaultMessage: 'Release Status: ',\n },\n gradedAsScreenReaderLabel: {\n id: 'course-authoring.course-outline.xblock-status.gradedAsScreenReader.label',\n defaultMessage: 'Graded as: ',\n },\n ungradedText: {\n id: 'course-authoring.course-outline.xblock-status.ungraded.text',\n defaultMessage: 'Ungraded',\n },\n dueLabel: {\n id: 'course-authoring.course-outline.xblock-status.due.label',\n defaultMessage: 'Due:',\n },\n customDueDateLabel: {\n id: 'course-authoring.course-outline.xblock-status.custom-due-date.label',\n defaultMessage: 'Custom due date: {relativeWeeksDue, plural, one {# week} other {# weeks}} from enrollment',\n },\n prerequisiteLabel: {\n id: 'course-authoring.course-outline.xblock-status.prerequisite.label',\n defaultMessage: 'Prerequisite: {prereqDisplayName}',\n },\n restrictedUnitAccess: {\n id: 'course-authoring.course-outline.xblock-status.restrictedUnitAccess.text',\n defaultMessage: 'Access to this unit is restricted to: {selectedGroupsLabel}',\n },\n restrictedUnitAccessToSomeContent: {\n id: 'course-authoring.course-outline.xblock-status.restrictedUnitAccessToSomeContent.text',\n defaultMessage: 'Access to some content in this unit is restricted to specific groups of learners',\n },\n gradingPolicyMismatchText: {\n id: 'course-authoring.course-outline.xblock-status.gradingPolicyMismatch.text',\n defaultMessage: 'This subsection is configured as \"{gradingType}\", which doesn\\'t exist in the current grading policy.',\n },\n hiddenAfterEndDate: {\n id: 'course-authoring.course-outline.xblock-status.hiddenAfterEndDate.text',\n defaultMessage: 'Subsection is hidden after course end date',\n },\n hiddenAfterDueDate: {\n id: 'course-authoring.course-outline.xblock-status.hiddenAfterDueDate.text',\n defaultMessage: 'Subsection is hidden after due date',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Icon } from '@openedx/paragon';\nimport {\n AccessTime as ClockIcon,\n} from '@openedx/paragon/icons';\n\nimport messages from './messages';\n\nconst ReleaseStatus = ({\n isInstructorPaced,\n explanatoryMessage,\n releaseDate,\n releasedToStudents,\n}) => {\n const intl = useIntl();\n\n const explanatoryMessageDiv = () => (\n <span data-testid=\"explanatory-message-span\">\n {explanatoryMessage}\n </span>\n );\n\n let releaseLabel = messages.unscheduledLabel;\n if (releasedToStudents) {\n releaseLabel = messages.releasedLabel;\n } else if (releaseDate) {\n releaseLabel = messages.scheduledLabel;\n }\n\n const releaseStatusDiv = () => (\n <div className=\"d-flex align-items-center\" data-testid=\"release-status-div\">\n <span className=\"sr-only status-release-label\">\n {intl.formatMessage(messages.releaseStatusScreenReaderTitle)}\n </span>\n <Icon className=\"mr-1\" size=\"sm\" src={ClockIcon} />\n {intl.formatMessage(releaseLabel)}\n {releaseDate && releaseDate}\n </div>\n );\n\n if (explanatoryMessage) {\n return explanatoryMessageDiv();\n }\n\n if (isInstructorPaced) {\n return releaseStatusDiv();\n }\n\n return null;\n};\n\nReleaseStatus.defaultProps = {\n explanatoryMessage: '',\n releaseDate: '',\n releasedToStudents: false,\n};\n\nReleaseStatus.propTypes = {\n isInstructorPaced: PropTypes.bool.isRequired,\n explanatoryMessage: PropTypes.string,\n releaseDate: PropTypes.string,\n releasedToStudents: PropTypes.bool,\n};\n\nexport default ReleaseStatus;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Alert } from '@openedx/paragon';\nimport {\n WarningFilled as WarningIcon,\n} from '@openedx/paragon/icons';\n\nimport messages from './messages';\n\nconst GradingPolicyAlert = ({\n graded,\n gradingType,\n courseGraders,\n}) => {\n const intl = useIntl();\n\n let gradingPolicyMismatch = false;\n if (graded) {\n if (gradingType) {\n gradingPolicyMismatch = (\n courseGraders.filter((cg) => cg.toLowerCase() === gradingType.toLowerCase())\n ).length === 0;\n }\n }\n\n if (gradingPolicyMismatch) {\n return (\n <Alert className=\"mt-2 grading-mismatch-alert\" variant=\"warning\" icon={WarningIcon}>\n {intl.formatMessage(messages.gradingPolicyMismatchText, { gradingType })}\n </Alert>\n );\n }\n return null;\n};\n\nGradingPolicyAlert.defaultProps = {\n graded: false,\n gradingType: '',\n courseGraders: [],\n};\n\nGradingPolicyAlert.propTypes = {\n graded: PropTypes.bool,\n gradingType: PropTypes.string,\n courseGraders: PropTypes.arrayOf(PropTypes.string.isRequired),\n};\n\nexport default GradingPolicyAlert;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Icon } from '@openedx/paragon';\nimport {\n Check as CheckIcon,\n CalendarMonth as CalendarIcon,\n} from '@openedx/paragon/icons';\n\nimport messages from './messages';\n\nconst GradingTypeAndDueDate = ({\n isSelfPaced,\n isInstructorPaced,\n isCustomRelativeDatesActive,\n isTimeLimited,\n isProctoredExam,\n isOnboardingExam,\n isPracticeExam,\n graded,\n gradingType,\n dueDate,\n relativeWeeksDue,\n}) => {\n const intl = useIntl();\n const showRelativeWeeks = isSelfPaced && isCustomRelativeDatesActive && relativeWeeksDue;\n\n let examValue = '';\n if (isProctoredExam) {\n if (isOnboardingExam) {\n examValue = messages.onboardingExam;\n } else if (isPracticeExam) {\n examValue = messages.practiceProctoredExam;\n } else {\n examValue = messages.proctoredExam;\n }\n } else {\n examValue = messages.timedExam;\n }\n\n const gradingTypeDiv = () => (\n <div className=\"d-flex align-items-center mr-1\" data-testid=\"grading-type-div\">\n <span className=\"sr-only status-grading-label\">\n {intl.formatMessage(messages.gradedAsScreenReaderLabel)}\n </span>\n <Icon className=\"mr-1\" size=\"sm\" src={CheckIcon} />\n <span className=\"status-grading-value\">\n {gradingType || intl.formatMessage(messages.ungradedText)}\n </span>\n </div>\n );\n\n const dueDateDiv = () => {\n if (dueDate && isInstructorPaced) {\n return (\n <div className=\"status-grading-date\" data-testid=\"due-date-div\">\n {intl.formatMessage(messages.dueLabel)} {dueDate}\n </div>\n );\n }\n return null;\n };\n\n const selfPacedRelativeDueWeeksDiv = () => (\n <div className=\"d-flex align-items-center\" data-testid=\"self-paced-relative-due-weeks-div\">\n <Icon className=\"mr-1\" size=\"sm\" src={CalendarIcon} />\n <span className=\"status-custom-grading-date\">\n {intl.formatMessage(messages.customDueDateLabel, { relativeWeeksDue })}\n </span>\n </div>\n );\n\n if (isTimeLimited) {\n return (\n <>\n <div className=\"d-flex align-items-center\">\n {gradingTypeDiv()} -\n <span className=\"sr-only\">{intl.formatMessage(examValue)}</span>\n <span className=\"mx-2\" data-testid=\"exam-value-span\">\n {intl.formatMessage(examValue)}\n </span>\n {dueDateDiv()}\n </div>\n {showRelativeWeeks && (selfPacedRelativeDueWeeksDiv())}\n </>\n );\n } if ((dueDate && !isSelfPaced) || graded) {\n return (\n <>\n <div className=\"d-flex align-items-center\">\n {gradingTypeDiv()}\n {dueDateDiv()}\n </div>\n {showRelativeWeeks && (selfPacedRelativeDueWeeksDiv())}\n </>\n );\n } if (showRelativeWeeks) {\n return (\n <>\n {gradingTypeDiv()}\n {selfPacedRelativeDueWeeksDiv()}\n </>\n );\n }\n return null;\n};\n\nGradingTypeAndDueDate.defaultProps = {\n isCustomRelativeDatesActive: false,\n isTimeLimited: false,\n isProctoredExam: false,\n isOnboardingExam: false,\n isPracticeExam: false,\n graded: false,\n gradingType: '',\n dueDate: '',\n relativeWeeksDue: null,\n};\n\nGradingTypeAndDueDate.propTypes = {\n isInstructorPaced: PropTypes.bool.isRequired,\n isSelfPaced: PropTypes.bool.isRequired,\n isCustomRelativeDatesActive: PropTypes.bool,\n isTimeLimited: PropTypes.bool,\n isProctoredExam: PropTypes.bool,\n isOnboardingExam: PropTypes.bool,\n isPracticeExam: PropTypes.bool,\n graded: PropTypes.bool,\n gradingType: PropTypes.string,\n dueDate: PropTypes.string,\n relativeWeeksDue: PropTypes.number,\n};\n\nexport default GradingTypeAndDueDate;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Icon } from '@openedx/paragon';\nimport {\n Lock as LockIcon,\n Groups as GroupsIcon,\n} from '@openedx/paragon/icons';\n\nimport messages from './messages';\n\nconst StatusMessages = ({\n isVertical,\n staffOnlyMessage,\n prereq,\n prereqs,\n userPartitionInfo,\n hasPartitionGroupComponents,\n}) => {\n const intl = useIntl();\n const statusMessages = [];\n\n if (prereq) {\n let prereqDisplayName = '';\n prereqs.forEach((block) => {\n if (block.blockUsageKey === prereq) {\n prereqDisplayName = block.blockDisplayName;\n }\n });\n statusMessages.push({\n icon: LockIcon,\n text: intl.formatMessage(messages.prerequisiteLabel, { prereqDisplayName }),\n });\n }\n\n if (!staffOnlyMessage && isVertical) {\n const { selectedPartitionIndex, selectedGroupsLabel } = userPartitionInfo;\n if (selectedPartitionIndex !== -1 && !Number.isNaN(selectedPartitionIndex)) {\n statusMessages.push({\n icon: GroupsIcon,\n text: intl.formatMessage(messages.restrictedUnitAccess, { selectedGroupsLabel }),\n });\n } else if (hasPartitionGroupComponents) {\n statusMessages.push({\n icon: GroupsIcon,\n text: intl.formatMessage(messages.restrictedUnitAccessToSomeContent),\n });\n }\n }\n\n if (statusMessages.length > 0) {\n return (\n <div className=\"border-top border-light mt-2 text-dark\" data-testid=\"status-messages-div\">\n {statusMessages.map(({ icon, text }) => (\n <div key={text} className=\"d-flex align-items-center pt-1\">\n <Icon className=\"mr-1\" size=\"sm\" src={icon} />\n {text}\n </div>\n ))}\n </div>\n );\n }\n return null;\n};\n\nStatusMessages.defaultProps = {\n staffOnlyMessage: false,\n prereq: '',\n prereqs: [],\n userPartitionInfo: {},\n hasPartitionGroupComponents: false,\n};\n\nStatusMessages.propTypes = {\n isVertical: PropTypes.bool.isRequired,\n staffOnlyMessage: PropTypes.bool,\n prereq: PropTypes.string,\n prereqs: PropTypes.arrayOf(PropTypes.shape({\n blockUsageKey: PropTypes.string.isRequired,\n blockDisplayName: PropTypes.string.isRequired,\n })),\n userPartitionInfo: PropTypes.shape({\n selectedPartitionIndex: PropTypes.number,\n selectedGroupsLabel: PropTypes.string,\n }),\n hasPartitionGroupComponents: PropTypes.bool,\n};\n\nexport default StatusMessages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Icon } from '@openedx/paragon';\nimport {\n VisibilityOff as HideIcon,\n} from '@openedx/paragon/icons';\n\nimport messages from './messages';\n\nconst HideAfterDueMessage = ({ isSelfPaced }) => {\n const intl = useIntl();\n return (\n <div className=\"d-flex align-items-center\" data-testid=\"hide-after-due-message\">\n <Icon className=\"mr-1\" size=\"sm\" src={HideIcon} />\n <span className=\"status-hide-after-due-value\">\n {isSelfPaced\n ? intl.formatMessage(messages.hiddenAfterEndDate)\n : intl.formatMessage(messages.hiddenAfterDueDate)}\n </span>\n </div>\n );\n};\n\nHideAfterDueMessage.propTypes = {\n isSelfPaced: PropTypes.bool.isRequired,\n};\n\nexport default HideAfterDueMessage;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { COURSE_BLOCK_NAMES } from '../constants';\nimport ReleaseStatus from './ReleaseStatus';\nimport GradingPolicyAlert from './GradingPolicyAlert';\nimport GradingTypeAndDueDate from './GradingTypeAndDueDate';\nimport StatusMessages from './StatusMessages';\nimport HideAfterDueMessage from './HideAfterDueMessage';\n\nconst XBlockStatus = ({\n isSelfPaced,\n isCustomRelativeDatesActive,\n blockData,\n}) => {\n const {\n category,\n explanatoryMessage,\n releasedToStudents,\n releaseDate,\n isProctoredExam,\n isOnboardingExam,\n isPracticeExam,\n prereq,\n prereqs,\n staffOnlyMessage,\n userPartitionInfo,\n hasPartitionGroupComponents,\n format: gradingType,\n dueDate,\n relativeWeeksDue,\n isTimeLimited,\n graded,\n courseGraders,\n hideAfterDue,\n } = blockData;\n\n const isInstructorPaced = !isSelfPaced;\n const isVertical = category === COURSE_BLOCK_NAMES.vertical.id;\n\n return (\n <div className=\"text-secondary-400 x-small mb-1\">\n {!isVertical && (\n <ReleaseStatus\n isInstructorPaced={isInstructorPaced}\n explanatoryMessage={explanatoryMessage}\n releaseDate={releaseDate}\n releasedToStudents={releasedToStudents}\n />\n )}\n {!isVertical && (\n <GradingTypeAndDueDate\n isSelfPaced={isSelfPaced}\n isInstructorPaced={isInstructorPaced}\n isCustomRelativeDatesActive={isCustomRelativeDatesActive}\n isTimeLimited={isTimeLimited}\n isProctoredExam={isProctoredExam}\n isOnboardingExam={isOnboardingExam}\n isPracticeExam={isPracticeExam}\n graded={graded}\n gradingType={gradingType}\n dueDate={dueDate}\n relativeWeeksDue={relativeWeeksDue}\n />\n )}\n {hideAfterDue && (\n <HideAfterDueMessage isSelfPaced={isSelfPaced} />\n )}\n <StatusMessages\n isVertical={isVertical}\n staffOnlyMessage={staffOnlyMessage}\n prereq={prereq}\n prereqs={prereqs}\n userPartitionInfo={userPartitionInfo}\n hasPartitionGroupComponents={hasPartitionGroupComponents}\n />\n <GradingPolicyAlert\n graded={graded}\n gradingType={gradingType}\n courseGraders={courseGraders}\n />\n </div>\n );\n};\n\nXBlockStatus.defaultProps = {\n isCustomRelativeDatesActive: false,\n};\n\nXBlockStatus.propTypes = {\n isSelfPaced: PropTypes.bool.isRequired,\n isCustomRelativeDatesActive: PropTypes.bool,\n blockData: PropTypes.shape({\n category: PropTypes.string.isRequired,\n explanatoryMessage: PropTypes.string,\n releasedToStudents: PropTypes.bool,\n releaseDate: PropTypes.string,\n isProctoredExam: PropTypes.bool,\n isOnboardingExam: PropTypes.bool,\n isPracticeExam: PropTypes.bool,\n prereq: PropTypes.string,\n prereqs: PropTypes.arrayOf(PropTypes.shape({\n blockUsageKey: PropTypes.string.isRequired,\n blockDisplayName: PropTypes.string.isRequired,\n })),\n staffOnlyMessage: PropTypes.bool,\n userPartitionInfo: PropTypes.shape({\n selectedPartitionIndex: PropTypes.number,\n selectedGroupsLabel: PropTypes.string,\n }),\n hasPartitionGroupComponents: PropTypes.bool,\n format: PropTypes.string,\n dueDate: PropTypes.string,\n relativeWeeksDue: PropTypes.number,\n isTimeLimited: PropTypes.bool,\n graded: PropTypes.bool,\n courseGraders: PropTypes.arrayOf(PropTypes.string.isRequired),\n hideAfterDue: PropTypes.bool,\n }).isRequired,\n};\n\nexport default XBlockStatus;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n newSubsectionButton: {\n id: 'course-authoring.course-outline.section.button.new-subsection',\n defaultMessage: 'New subsection',\n },\n sectionHighlightsBadge: {\n id: 'course-authoring.course-outline.section.badge.section-highlights',\n defaultMessage: 'Section highlights',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport React, {\n useContext, useEffect, useState, useRef,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Bubble, Button, useToggle } from '@openedx/paragon';\nimport { Add as IconAdd } from '@openedx/paragon/icons';\nimport { useSearchParams } from 'react-router-dom';\nimport classNames from 'classnames';\n\nimport { setCurrentItem, setCurrentSection } from '../data/slice';\nimport { RequestStatus } from '../../data/constants';\nimport CardHeader from '../card-header/CardHeader';\nimport SortableItem from '../../generic/drag-helper/SortableItem';\nimport { DragContext } from '../../generic/drag-helper/DragContextProvider';\nimport TitleButton from '../card-header/TitleButton';\nimport XBlockStatus from '../xblock-status/XBlockStatus';\nimport { getItemStatus, getItemStatusBorder, scrollToElement } from '../utils';\nimport messages from './messages';\n\nconst SectionCard = ({\n section,\n isSelfPaced,\n isCustomRelativeDatesActive,\n children,\n index,\n canMoveItem,\n onOpenHighlightsModal,\n onOpenPublishModal,\n onOpenConfigureModal,\n onEditSectionSubmit,\n savingStatus,\n onOpenDeleteModal,\n onDuplicateSubmit,\n isSectionsExpanded,\n onNewSubsectionSubmit,\n onOrderChange,\n}) => {\n const currentRef = useRef(null);\n const intl = useIntl();\n const dispatch = useDispatch();\n const { activeId, overId } = useContext(DragContext);\n const [searchParams] = useSearchParams();\n const locatorId = searchParams.get('show');\n const isScrolledToElement = locatorId === section.id;\n\n // Expand the section if a search result should be shown/scrolled to\n const containsSearchResult = () => {\n if (locatorId) {\n const subsections = section.childInfo?.children;\n if (subsections) {\n for (let i = 0; i < subsections.length; i++) {\n const subsection = subsections[i];\n\n // Check if the search result is one of the subsections\n const matchedSubsection = subsection.id === locatorId;\n if (matchedSubsection) {\n return true;\n }\n\n // Check if the search result is one of the units\n const matchedUnit = !!subsection.childInfo?.children?.filter((child) => child.id === locatorId).length;\n if (matchedUnit) {\n return true;\n }\n }\n }\n }\n\n return false;\n };\n const [isExpanded, setIsExpanded] = useState(containsSearchResult() || isSectionsExpanded);\n const [isFormOpen, openForm, closeForm] = useToggle(false);\n const namePrefix = 'section';\n\n useEffect(() => {\n setIsExpanded(isSectionsExpanded);\n }, [isSectionsExpanded]);\n\n const {\n id,\n category,\n displayName,\n hasChanges,\n published,\n visibilityState,\n highlights,\n actions: sectionActions,\n isHeaderVisible = true,\n } = section;\n\n useEffect(() => {\n if (activeId === id && isExpanded) {\n setIsExpanded(false);\n } else if (overId === id && !isExpanded) {\n setIsExpanded(true);\n }\n }, [activeId, overId]);\n\n useEffect(() => {\n if (currentRef.current && (section.shouldScroll || isScrolledToElement)) {\n // Align element closer to the top of the screen if scrolling for search result\n const alignWithTop = !!isScrolledToElement;\n scrollToElement(currentRef.current, alignWithTop);\n }\n }, [isScrolledToElement]);\n\n useEffect(() => {\n // If the locatorId is set/changed, we need to make sure that the section is expanded\n // if it contains the result, in order to scroll to it\n setIsExpanded((prevState) => containsSearchResult() || prevState);\n }, [locatorId, setIsExpanded]);\n\n // re-create actions object for customizations\n const actions = { ...sectionActions };\n // add actions to control display of move up & down menu buton.\n actions.allowMoveUp = canMoveItem(index, -1);\n actions.allowMoveDown = canMoveItem(index, 1);\n\n const sectionStatus = getItemStatus({\n published,\n visibilityState,\n hasChanges,\n });\n\n // remove border when section is expanded\n const borderStyle = getItemStatusBorder(!isExpanded ? sectionStatus : '');\n\n const handleExpandContent = () => {\n setIsExpanded((prevState) => !prevState);\n };\n\n const handleClickMenuButton = () => {\n dispatch(setCurrentItem(section));\n dispatch(setCurrentSection(section));\n };\n\n const handleEditSubmit = (titleValue) => {\n if (displayName !== titleValue) {\n // both itemId and sectionId are same\n onEditSectionSubmit(id, id, titleValue);\n return;\n }\n\n closeForm();\n };\n\n const handleOpenHighlightsModal = () => {\n onOpenHighlightsModal(section);\n };\n\n const handleNewSubsectionSubmit = () => {\n onNewSubsectionSubmit(id);\n };\n\n const handleSectionMoveUp = () => {\n onOrderChange(index, index - 1);\n };\n\n const handleSectionMoveDown = () => {\n onOrderChange(index, index + 1);\n };\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n closeForm();\n }\n }, [savingStatus]);\n\n const titleComponent = (\n <TitleButton\n title={displayName}\n isExpanded={isExpanded}\n onTitleClick={handleExpandContent}\n namePrefix={namePrefix}\n />\n );\n\n const isDraggable = actions.draggable && (actions.allowMoveUp || actions.allowMoveDown);\n\n return (\n <SortableItem\n id={id}\n category={category}\n isDraggable={isDraggable}\n isDroppable={actions.childAddable}\n componentStyle={{\n padding: '1.75rem',\n ...borderStyle,\n }}\n >\n <div\n className={`section-card ${isScrolledToElement ? 'highlight' : ''}`}\n data-testid=\"section-card\"\n ref={currentRef}\n >\n <div>\n {isHeaderVisible && (\n <CardHeader\n cardId={id}\n title={displayName}\n status={sectionStatus}\n hasChanges={hasChanges}\n onClickMenuButton={handleClickMenuButton}\n onClickPublish={onOpenPublishModal}\n onClickConfigure={onOpenConfigureModal}\n onClickEdit={openForm}\n onClickDelete={onOpenDeleteModal}\n onClickMoveUp={handleSectionMoveUp}\n onClickMoveDown={handleSectionMoveDown}\n isFormOpen={isFormOpen}\n closeForm={closeForm}\n onEditSubmit={handleEditSubmit}\n isDisabledEditField={savingStatus === RequestStatus.IN_PROGRESS}\n onClickDuplicate={onDuplicateSubmit}\n titleComponent={titleComponent}\n namePrefix={namePrefix}\n actions={actions}\n />\n )}\n <div className=\"section-card__content\" data-testid=\"section-card__content\">\n <div className=\"outline-section__status mb-1\">\n <Button\n className=\"p-0 bg-transparent\"\n data-destid=\"section-card-highlights-button\"\n variant=\"tertiary\"\n onClick={handleOpenHighlightsModal}\n >\n <Bubble className=\"mr-1\">\n {highlights.length}\n </Bubble>\n <p className=\"m-0 text-black\">{messages.sectionHighlightsBadge.defaultMessage}</p>\n </Button>\n </div>\n <XBlockStatus\n isSelfPaced={isSelfPaced}\n isCustomRelativeDatesActive={isCustomRelativeDatesActive}\n blockData={section}\n />\n </div>\n {isExpanded && (\n <div\n data-testid=\"section-card__subsections\"\n className={classNames('section-card__subsections', { 'item-children': isDraggable })}\n >\n {children}\n {actions.childAddable && (\n <Button\n data-testid=\"new-subsection-button\"\n className=\"mt-4\"\n variant=\"outline-primary\"\n iconBefore={IconAdd}\n block\n onClick={handleNewSubsectionSubmit}\n >\n {intl.formatMessage(messages.newSubsectionButton)}\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n </SortableItem>\n );\n};\n\nSectionCard.defaultProps = {\n children: null,\n};\n\nSectionCard.propTypes = {\n section: PropTypes.shape({\n id: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n category: PropTypes.string.isRequired,\n published: PropTypes.bool.isRequired,\n hasChanges: PropTypes.bool.isRequired,\n visibilityState: PropTypes.string.isRequired,\n highlights: PropTypes.arrayOf(PropTypes.string).isRequired,\n shouldScroll: PropTypes.bool,\n actions: PropTypes.shape({\n deletable: PropTypes.bool.isRequired,\n draggable: PropTypes.bool.isRequired,\n childAddable: PropTypes.bool.isRequired,\n duplicable: PropTypes.bool.isRequired,\n }).isRequired,\n isHeaderVisible: PropTypes.bool,\n childInfo: PropTypes.shape({\n children: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n childInfo: PropTypes.shape({\n children: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n }),\n ).isRequired,\n }).isRequired,\n }),\n ).isRequired,\n }).isRequired,\n }).isRequired,\n isSelfPaced: PropTypes.bool.isRequired,\n isCustomRelativeDatesActive: PropTypes.bool.isRequired,\n children: PropTypes.node,\n onOpenHighlightsModal: PropTypes.func.isRequired,\n onOpenPublishModal: PropTypes.func.isRequired,\n onOpenConfigureModal: PropTypes.func.isRequired,\n onEditSectionSubmit: PropTypes.func.isRequired,\n savingStatus: PropTypes.string.isRequired,\n onOpenDeleteModal: PropTypes.func.isRequired,\n onDuplicateSubmit: PropTypes.func.isRequired,\n isSectionsExpanded: PropTypes.bool.isRequired,\n onNewSubsectionSubmit: PropTypes.func.isRequired,\n index: PropTypes.number.isRequired,\n canMoveItem: PropTypes.func.isRequired,\n onOrderChange: PropTypes.func.isRequired,\n};\n\nexport default SectionCard;\n","export const getLoadingStatuses = (state) => state.generic.loadingStatuses;\nexport const getSavingStatus = (state) => state.generic.savingStatus;\nexport const getOrganizations = (state) => state.generic.organizations;\nexport const getCourseData = (state) => state.generic.createOrRerunCourse.courseData;\nexport const getCourseRerunData = (state) => state.generic.createOrRerunCourse.courseRerunData;\nexport const getRedirectUrlObj = (state) => state.generic.createOrRerunCourse.redirectUrlObj;\nexport const getPostErrors = (state) => state.generic.createOrRerunCourse.postErrors;\nexport const getClipboardData = (state) => state.generic.clipboardData;\n","import { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { CLIPBOARD_STATUS, STRUCTURAL_XBLOCK_TYPES, STUDIO_CLIPBOARD_CHANNEL } from '../../../constants';\nimport { getClipboardData } from '../../data/selectors';\n\n/**\n * Custom React hook for managing clipboard functionality.\n *\n * @param {boolean} canEdit - Flag indicating whether the clipboard is editable.\n * @returns {Object} - An object containing state variables and functions related to clipboard functionality.\n * @property {boolean} showPasteUnit - Flag indicating whether the \"Paste Unit\" button should be visible.\n * @property {boolean} showPasteXBlock - Flag indicating whether the \"Paste XBlock\" button should be visible.\n * @property {Object} sharedClipboardData - The shared clipboard data object.\n */\nconst useCopyToClipboard = (canEdit = true) => {\n const [clipboardBroadcastChannel] = useState(() => new BroadcastChannel(STUDIO_CLIPBOARD_CHANNEL));\n const [showPasteUnit, setShowPasteUnit] = useState(false);\n const [showPasteXBlock, setShowPasteXBlock] = useState(false);\n const [sharedClipboardData, setSharedClipboardData] = useState({});\n const clipboardData = useSelector(getClipboardData);\n\n // Function to refresh the paste button's visibility\n const refreshPasteButton = (data) => {\n const isPasteable = canEdit && data?.content && data.content.status !== CLIPBOARD_STATUS.expired;\n const isPasteableXBlock = isPasteable && !STRUCTURAL_XBLOCK_TYPES.includes(data.content.blockType);\n const isPasteableUnit = isPasteable && data.content.blockType === 'vertical';\n\n setShowPasteXBlock(!!isPasteableXBlock);\n setShowPasteUnit(!!isPasteableUnit);\n };\n\n useEffect(() => {\n // Handle updates to clipboard data\n if (canEdit) {\n refreshPasteButton(clipboardData);\n setSharedClipboardData(clipboardData);\n clipboardBroadcastChannel.postMessage(clipboardData);\n } else {\n setShowPasteXBlock(false);\n setShowPasteUnit(false);\n }\n }, [clipboardData, canEdit, clipboardBroadcastChannel]);\n\n useEffect(() => {\n // Handle messages from the broadcast channel\n clipboardBroadcastChannel.onmessage = (event) => {\n setSharedClipboardData(event.data);\n refreshPasteButton(event.data);\n };\n\n // Cleanup function for the BroadcastChannel when the hook is unmounted\n return () => {\n clipboardBroadcastChannel.close();\n };\n }, [clipboardBroadcastChannel]);\n\n return { showPasteUnit, showPasteXBlock, sharedClipboardData };\n};\n\nexport default useCopyToClipboard;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n popoverContentText: {\n id: 'course-authoring.generic.paste-component.popover.content.text',\n defaultMessage: 'From:',\n description: 'The popover content label before the source course name of the copied content.',\n },\n pasteButtonWhatsInClipboardText: {\n id: 'course-authoring.generic.paste-component.paste-button.whats-in-clipboard.text',\n defaultMessage: \"What's in my clipboard?\",\n description: 'The popover trigger button text of the info about copied content.',\n },\n});\n\nexport default messages;\n","import { useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Icon } from '@openedx/paragon';\nimport { Question as QuestionIcon } from '@openedx/paragon/icons';\n\nimport messages from '../messages';\n\nconst WhatsInClipboard = ({\n handlePopoverToggle, togglePopover, popoverElementRef,\n}) => {\n const intl = useIntl();\n const triggerElementRef = useRef(null);\n\n const handleKeyDown = ({ key }) => {\n if (key === 'Tab') {\n popoverElementRef.current?.focus();\n handlePopoverToggle(true);\n }\n };\n\n return (\n <div\n className=\"whats-in-clipboard mt-2 d-flex align-items-center\"\n data-testid=\"whats-in-clipboard\"\n onMouseEnter={() => handlePopoverToggle(true)}\n onMouseLeave={() => handlePopoverToggle(false)}\n onFocus={() => togglePopover(true)}\n onBlur={() => togglePopover(false)}\n >\n <Icon\n className=\"whats-in-clipboard-icon mr-1\"\n src={QuestionIcon}\n />\n <p\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex */\n tabIndex=\"0\"\n role=\"presentation\"\n ref={triggerElementRef}\n className=\"whats-in-clipboard-text m-0\"\n onKeyDown={handleKeyDown}\n >\n {intl.formatMessage(messages.pasteButtonWhatsInClipboardText)}\n </p>\n </div>\n );\n};\n\nWhatsInClipboard.propTypes = {\n handlePopoverToggle: PropTypes.func.isRequired,\n togglePopover: PropTypes.func.isRequired,\n popoverElementRef: PropTypes.oneOfType([\n PropTypes.func,\n PropTypes.shape({ current: PropTypes.instanceOf(Element) }),\n ]).isRequired,\n};\n\nexport default WhatsInClipboard;\n","import PropsTypes from 'prop-types';\nimport { useParams } from 'react-router-dom';\nimport { Button } from '@openedx/paragon';\nimport { ContentCopy as ContentCopyIcon } from '@openedx/paragon/icons';\n\nconst PasteButton = ({ onClick, text, className }) => {\n const { blockId } = useParams();\n\n const handlePasteXBlockComponent = () => {\n onClick({ stagedContent: 'clipboard', parentLocator: blockId }, null, blockId);\n };\n\n return (\n <Button\n className={className}\n iconBefore={ContentCopyIcon}\n variant=\"outline-primary\"\n block\n onClick={handlePasteXBlockComponent}\n >\n {text}\n </Button>\n );\n};\n\nPasteButton.propTypes = {\n onClick: PropsTypes.func.isRequired,\n text: PropsTypes.string.isRequired,\n className: PropsTypes.string,\n};\n\nPasteButton.defaultProps = {\n className: undefined,\n};\n\nexport default PasteButton;\n","import PropTypes from 'prop-types';\n\n/* eslint-disable import/prefer-default-export */\nexport const clipboardPropsTypes = {\n sourceEditUrl: PropTypes.string.isRequired,\n content: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n blockTypeDisplay: PropTypes.string.isRequired,\n }).isRequired,\n sourceContextTitle: PropTypes.string.isRequired,\n};\n","import PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Icon, Popover, Stack } from '@openedx/paragon';\nimport { OpenInNew as OpenInNewIcon } from '@openedx/paragon/icons';\n\nimport messages from '../messages';\nimport { clipboardPropsTypes } from '../constants';\n\nconst PopoverContent = ({ clipboardData }) => {\n const intl = useIntl();\n const { sourceEditUrl, content, sourceContextTitle } = clipboardData;\n\n return (\n <Popover.Title\n className=\"clipboard-popover-title\"\n data-testid=\"popover-content\"\n as={sourceEditUrl ? Link : 'div'}\n to={sourceEditUrl || null}\n target=\"_blank\"\n >\n <Stack>\n <Stack className=\"justify-content-between\" direction=\"horizontal\">\n <strong>{content.displayName}</strong>\n {sourceEditUrl && (\n <Icon className=\"clipboard-popover-icon m-0\" src={OpenInNewIcon} />\n )}\n </Stack>\n <div>\n <small className=\"clipboard-popover-detail-block-type\">\n {content.blockTypeDisplay}\n </small>\n <span className=\"mr-1\">{intl.formatMessage(messages.popoverContentText)}</span>\n <span className=\"clipboard-popover-detail-course-name\">\n {sourceContextTitle}\n </span>\n </div>\n </Stack>\n </Popover.Title>\n );\n};\n\nPopoverContent.propTypes = {\n clipboardData: PropTypes.shape(clipboardPropsTypes).isRequired,\n};\n\nexport default PopoverContent;\n","import { useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { OverlayTrigger, Popover } from '@openedx/paragon';\n\nimport { PopoverContent, PasteButton, WhatsInClipboard } from './components';\nimport { clipboardPropsTypes } from './constants';\n\nconst PasteComponent = ({\n onClick, clipboardData, text, className,\n}) => {\n const [showPopover, togglePopover] = useState(false);\n const popoverElementRef = useRef(null);\n\n const handlePopoverToggle = (isOpen) => togglePopover(isOpen);\n\n const renderPopover = (props) => (\n <div role=\"link\" ref={popoverElementRef} tabIndex=\"0\">\n <Popover\n className=\"clipboard-popover\"\n id=\"popover-positioned\"\n onMouseEnter={() => handlePopoverToggle(true)}\n onMouseLeave={() => handlePopoverToggle(false)}\n onFocus={() => handlePopoverToggle(true)}\n onBlur={() => handlePopoverToggle(false)}\n {...props}\n >\n {clipboardData && (\n <PopoverContent clipboardData={clipboardData} />\n )}\n </Popover>\n </div>\n );\n\n return (\n <>\n <PasteButton className={className} onClick={onClick} text={text} />\n <OverlayTrigger\n show={showPopover}\n overlay={renderPopover}\n >\n <WhatsInClipboard\n handlePopoverToggle={handlePopoverToggle}\n togglePopover={togglePopover}\n popoverElementRef={popoverElementRef}\n />\n </OverlayTrigger>\n </>\n );\n};\n\nPasteComponent.propTypes = {\n onClick: PropTypes.func.isRequired,\n text: PropTypes.string.isRequired,\n clipboardData: PropTypes.shape(clipboardPropsTypes),\n blockType: PropTypes.string,\n className: PropTypes.string,\n};\n\nPasteComponent.defaultProps = {\n clipboardData: null,\n blockType: null,\n className: undefined,\n};\n\nexport default PasteComponent;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n newUnitButton: {\n id: 'course-authoring.course-outline.subsection.button.new-unit',\n defaultMessage: 'New unit',\n },\n pasteButton: {\n id: 'course-authoring.course-outline.subsection.button.new-unit',\n defaultMessage: 'Paste unit',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport React, {\n useContext, useEffect, useState, useRef,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport { useSearchParams } from 'react-router-dom';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Button, useToggle } from '@openedx/paragon';\nimport { Add as IconAdd } from '@openedx/paragon/icons';\nimport classNames from 'classnames';\nimport { isEmpty } from 'lodash';\n\nimport { setCurrentItem, setCurrentSection, setCurrentSubsection } from '../data/slice';\nimport { RequestStatus } from '../../data/constants';\nimport CardHeader from '../card-header/CardHeader';\nimport SortableItem from '../../generic/drag-helper/SortableItem';\nimport { DragContext } from '../../generic/drag-helper/DragContextProvider';\nimport { useCopyToClipboard, PasteComponent } from '../../generic/clipboard';\nimport TitleButton from '../card-header/TitleButton';\nimport XBlockStatus from '../xblock-status/XBlockStatus';\nimport { getItemStatus, getItemStatusBorder, scrollToElement } from '../utils';\nimport messages from './messages';\n\nconst SubsectionCard = ({\n section,\n subsection,\n isSelfPaced,\n isCustomRelativeDatesActive,\n children,\n index,\n getPossibleMoves,\n onOpenPublishModal,\n onEditSubmit,\n savingStatus,\n onOpenDeleteModal,\n onDuplicateSubmit,\n onNewUnitSubmit,\n onOrderChange,\n onOpenConfigureModal,\n onPasteClick,\n}) => {\n const currentRef = useRef(null);\n const intl = useIntl();\n const dispatch = useDispatch();\n const { activeId, overId } = useContext(DragContext);\n const [searchParams] = useSearchParams();\n const locatorId = searchParams.get('show');\n const isScrolledToElement = locatorId === subsection.id;\n const [isFormOpen, openForm, closeForm] = useToggle(false);\n const namePrefix = 'subsection';\n const { sharedClipboardData, showPasteUnit } = useCopyToClipboard();\n\n const {\n id,\n category,\n displayName,\n hasChanges,\n published,\n visibilityState,\n actions: subsectionActions,\n isHeaderVisible = true,\n enableCopyPasteUnits = false,\n proctoringExamConfigurationLink,\n } = subsection;\n\n // re-create actions object for customizations\n const actions = { ...subsectionActions };\n // add actions to control display of move up & down menu button.\n const moveUpDetails = getPossibleMoves(index, -1);\n const moveDownDetails = getPossibleMoves(index, 1);\n actions.allowMoveUp = !isEmpty(moveUpDetails);\n actions.allowMoveDown = !isEmpty(moveDownDetails);\n\n // Expand the subsection if a search result should be shown/scrolled to\n const containsSearchResult = () => {\n if (locatorId) {\n return !!subsection.childInfo?.children?.filter((child) => child.id === locatorId).length;\n }\n\n return false;\n };\n const [isExpanded, setIsExpanded] = useState(containsSearchResult() || !isHeaderVisible);\n const subsectionStatus = getItemStatus({\n published,\n visibilityState,\n hasChanges,\n });\n const borderStyle = getItemStatusBorder(subsectionStatus);\n\n const handleExpandContent = () => {\n setIsExpanded((prevState) => !prevState);\n };\n\n const handleClickMenuButton = () => {\n dispatch(setCurrentSection(section));\n dispatch(setCurrentSubsection(subsection));\n dispatch(setCurrentItem(subsection));\n };\n\n const handleEditSubmit = (titleValue) => {\n if (displayName !== titleValue) {\n onEditSubmit(id, section.id, titleValue);\n return;\n }\n\n closeForm();\n };\n\n const handleSubsectionMoveUp = () => {\n onOrderChange(section, moveUpDetails);\n };\n\n const handleSubsectionMoveDown = () => {\n onOrderChange(section, moveDownDetails);\n };\n\n const handleNewButtonClick = () => onNewUnitSubmit(id);\n const handlePasteButtonClick = () => onPasteClick(id, section.id);\n\n const titleComponent = (\n <TitleButton\n title={displayName}\n isExpanded={isExpanded}\n onTitleClick={handleExpandContent}\n namePrefix={namePrefix}\n />\n );\n\n useEffect(() => {\n if (activeId === id && isExpanded) {\n setIsExpanded(false);\n } else if (overId === id && !isExpanded) {\n setIsExpanded(true);\n }\n }, [activeId, overId]);\n\n useEffect(() => {\n // if this items has been newly added, scroll to it.\n // we need to check section.shouldScroll as whole section is fetched when a\n // subsection is duplicated under it.\n if (currentRef.current && (section.shouldScroll || subsection.shouldScroll || isScrolledToElement)) {\n // Align element closer to the top of the screen if scrolling for search result\n const alignWithTop = !!isScrolledToElement;\n scrollToElement(currentRef.current, alignWithTop);\n }\n }, [isScrolledToElement]);\n\n useEffect(() => {\n // If the locatorId is set/changed, we need to make sure that the subsection is expanded\n // if it contains the result, in order to scroll to it\n setIsExpanded((prevState) => (containsSearchResult() || prevState));\n }, [locatorId, setIsExpanded]);\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n closeForm();\n }\n }, [savingStatus]);\n\n const isDraggable = (\n actions.draggable\n && (actions.allowMoveUp || actions.allowMoveDown)\n && !(isHeaderVisible === false)\n );\n\n return (\n <SortableItem\n id={id}\n category={category}\n key={id}\n isDraggable={isDraggable}\n isDroppable={actions.childAddable}\n componentStyle={{\n background: '#f8f7f6',\n ...borderStyle,\n }}\n >\n <div\n className={`subsection-card ${isScrolledToElement ? 'highlight' : ''}`}\n data-testid=\"subsection-card\"\n ref={currentRef}\n >\n {isHeaderVisible && (\n <>\n <CardHeader\n title={displayName}\n status={subsectionStatus}\n cardId={id}\n hasChanges={hasChanges}\n onClickMenuButton={handleClickMenuButton}\n onClickPublish={onOpenPublishModal}\n onClickEdit={openForm}\n onClickDelete={onOpenDeleteModal}\n onClickMoveUp={handleSubsectionMoveUp}\n onClickMoveDown={handleSubsectionMoveDown}\n onClickConfigure={onOpenConfigureModal}\n isFormOpen={isFormOpen}\n closeForm={closeForm}\n onEditSubmit={handleEditSubmit}\n isDisabledEditField={savingStatus === RequestStatus.IN_PROGRESS}\n onClickDuplicate={onDuplicateSubmit}\n titleComponent={titleComponent}\n namePrefix={namePrefix}\n actions={actions}\n proctoringExamConfigurationLink={proctoringExamConfigurationLink}\n isSequential\n />\n <div className=\"subsection-card__content item-children\" data-testid=\"subsection-card__content\">\n <XBlockStatus\n isSelfPaced={isSelfPaced}\n isCustomRelativeDatesActive={isCustomRelativeDatesActive}\n blockData={subsection}\n />\n </div>\n </>\n )}\n {isExpanded && (\n <div\n data-testid=\"subsection-card__units\"\n className={classNames('subsection-card__units', { 'item-children': isDraggable })}\n >\n {children}\n {actions.childAddable && (\n <>\n <Button\n data-testid=\"new-unit-button\"\n className=\"mt-4\"\n variant=\"outline-primary\"\n iconBefore={IconAdd}\n block\n onClick={handleNewButtonClick}\n >\n {intl.formatMessage(messages.newUnitButton)}\n </Button>\n {enableCopyPasteUnits && showPasteUnit && (\n <PasteComponent\n className=\"mt-4\"\n text={intl.formatMessage(messages.pasteButton)}\n clipboardData={sharedClipboardData}\n onClick={handlePasteButtonClick}\n />\n )}\n </>\n )}\n </div>\n )}\n </div>\n </SortableItem>\n );\n};\n\nSubsectionCard.defaultProps = {\n children: null,\n};\n\nSubsectionCard.propTypes = {\n section: PropTypes.shape({\n id: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n published: PropTypes.bool.isRequired,\n hasChanges: PropTypes.bool.isRequired,\n visibilityState: PropTypes.string.isRequired,\n shouldScroll: PropTypes.bool,\n }).isRequired,\n subsection: PropTypes.shape({\n id: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n category: PropTypes.string.isRequired,\n published: PropTypes.bool.isRequired,\n hasChanges: PropTypes.bool.isRequired,\n visibilityState: PropTypes.string.isRequired,\n shouldScroll: PropTypes.bool,\n enableCopyPasteUnits: PropTypes.bool,\n proctoringExamConfigurationLink: PropTypes.string,\n actions: PropTypes.shape({\n deletable: PropTypes.bool.isRequired,\n draggable: PropTypes.bool.isRequired,\n childAddable: PropTypes.bool.isRequired,\n duplicable: PropTypes.bool.isRequired,\n }).isRequired,\n isHeaderVisible: PropTypes.bool,\n childInfo: PropTypes.shape({\n children: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n }),\n ).isRequired,\n }).isRequired,\n }).isRequired,\n children: PropTypes.node,\n isSelfPaced: PropTypes.bool.isRequired,\n isCustomRelativeDatesActive: PropTypes.bool.isRequired,\n onOpenPublishModal: PropTypes.func.isRequired,\n onEditSubmit: PropTypes.func.isRequired,\n savingStatus: PropTypes.string.isRequired,\n onOpenDeleteModal: PropTypes.func.isRequired,\n onDuplicateSubmit: PropTypes.func.isRequired,\n onNewUnitSubmit: PropTypes.func.isRequired,\n index: PropTypes.number.isRequired,\n getPossibleMoves: PropTypes.func.isRequired,\n onOrderChange: PropTypes.func.isRequired,\n onOpenConfigureModal: PropTypes.func.isRequired,\n onPasteClick: PropTypes.func.isRequired,\n};\n\nexport default SubsectionCard;\n","import PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport { Button, Truncate } from '@openedx/paragon';\n\nconst TitleLink = ({\n title,\n titleLink,\n namePrefix,\n}) => (\n <Button\n as={Link}\n variant=\"tertiary\"\n data-testid={`${namePrefix}-card-header__title-link`}\n className=\"item-card-header__title-btn\"\n to={titleLink}\n >\n <Truncate lines={1} className={`${namePrefix}-card-title mb-0`}>{title}</Truncate>\n </Button>\n);\n\nTitleLink.propTypes = {\n title: PropTypes.string.isRequired,\n titleLink: PropTypes.string.isRequired,\n namePrefix: PropTypes.string.isRequired,\n};\n\nexport default TitleLink;\n","// @ts-check\nimport React, { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport { useToggle } from '@openedx/paragon';\nimport { isEmpty } from 'lodash';\nimport { useSearchParams } from 'react-router-dom';\n\nimport { setCurrentItem, setCurrentSection, setCurrentSubsection } from '../data/slice';\nimport { RequestStatus } from '../../data/constants';\nimport CardHeader from '../card-header/CardHeader';\nimport SortableItem from '../../generic/drag-helper/SortableItem';\nimport TitleLink from '../card-header/TitleLink';\nimport XBlockStatus from '../xblock-status/XBlockStatus';\nimport { getItemStatus, getItemStatusBorder, scrollToElement } from '../utils';\n\nconst UnitCard = ({\n unit,\n subsection,\n section,\n isSelfPaced,\n isCustomRelativeDatesActive,\n index,\n getPossibleMoves,\n onOpenPublishModal,\n onOpenConfigureModal,\n onEditSubmit,\n savingStatus,\n onOpenDeleteModal,\n onDuplicateSubmit,\n getTitleLink,\n onOrderChange,\n onCopyToClipboardClick,\n discussionsSettings,\n}) => {\n const currentRef = useRef(null);\n const dispatch = useDispatch();\n const [searchParams] = useSearchParams();\n const locatorId = searchParams.get('show');\n const isScrolledToElement = locatorId === unit.id;\n const [isFormOpen, openForm, closeForm] = useToggle(false);\n const namePrefix = 'unit';\n\n const {\n id,\n category,\n displayName,\n hasChanges,\n published,\n visibilityState,\n actions: unitActions,\n isHeaderVisible = true,\n enableCopyPasteUnits = false,\n discussionEnabled,\n } = unit;\n\n // re-create actions object for customizations\n const actions = { ...unitActions };\n // add actions to control display of move up & down menu buton.\n const moveUpDetails = getPossibleMoves(index, -1);\n const moveDownDetails = getPossibleMoves(index, 1);\n actions.allowMoveUp = !isEmpty(moveUpDetails);\n actions.allowMoveDown = !isEmpty(moveDownDetails);\n\n const parentInfo = {\n graded: subsection.graded,\n isTimeLimited: subsection.isTimeLimited,\n };\n\n const unitStatus = getItemStatus({\n published,\n visibilityState,\n hasChanges,\n });\n const borderStyle = getItemStatusBorder(unitStatus);\n\n const handleClickMenuButton = () => {\n dispatch(setCurrentItem(unit));\n dispatch(setCurrentSection(section));\n dispatch(setCurrentSubsection(subsection));\n };\n\n const handleEditSubmit = (titleValue) => {\n if (displayName !== titleValue) {\n onEditSubmit(id, section.id, titleValue);\n return;\n }\n\n closeForm();\n };\n\n const handleUnitMoveUp = () => {\n onOrderChange(section, moveUpDetails);\n };\n\n const handleUnitMoveDown = () => {\n onOrderChange(section, moveDownDetails);\n };\n\n const handleCopyClick = () => {\n onCopyToClipboardClick(unit.id);\n };\n\n const titleComponent = (\n <TitleLink\n title={displayName}\n titleLink={getTitleLink(id)}\n namePrefix={namePrefix}\n />\n );\n\n useEffect(() => {\n // if this items has been newly added, scroll to it.\n // we need to check section.shouldScroll as whole section is fetched when a\n // unit is duplicated under it.\n if (currentRef.current && (section.shouldScroll || unit.shouldScroll || isScrolledToElement)) {\n // Align element closer to the top of the screen if scrolling for search result\n const alignWithTop = !!isScrolledToElement;\n scrollToElement(currentRef.current, alignWithTop);\n }\n }, [isScrolledToElement]);\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n closeForm();\n }\n }, [savingStatus]);\n\n if (!isHeaderVisible) {\n return null;\n }\n\n const isDraggable = actions.draggable && (actions.allowMoveUp || actions.allowMoveDown);\n\n return (\n <SortableItem\n id={id}\n category={category}\n key={id}\n isDraggable={isDraggable}\n isDroppable={actions.childAddable}\n componentStyle={{\n background: '#fdfdfd',\n ...borderStyle,\n }}\n >\n <div\n className={`unit-card ${isScrolledToElement ? 'highlight' : ''}`}\n data-testid=\"unit-card\"\n ref={currentRef}\n >\n <CardHeader\n title={displayName}\n status={unitStatus}\n hasChanges={hasChanges}\n cardId={id}\n onClickMenuButton={handleClickMenuButton}\n onClickPublish={onOpenPublishModal}\n onClickConfigure={onOpenConfigureModal}\n onClickEdit={openForm}\n onClickDelete={onOpenDeleteModal}\n onClickMoveUp={handleUnitMoveUp}\n onClickMoveDown={handleUnitMoveDown}\n isFormOpen={isFormOpen}\n closeForm={closeForm}\n onEditSubmit={handleEditSubmit}\n isDisabledEditField={savingStatus === RequestStatus.IN_PROGRESS}\n onClickDuplicate={onDuplicateSubmit}\n titleComponent={titleComponent}\n namePrefix={namePrefix}\n actions={actions}\n isVertical\n enableCopyPasteUnits={enableCopyPasteUnits}\n onClickCopy={handleCopyClick}\n discussionEnabled={discussionEnabled}\n discussionsSettings={discussionsSettings}\n parentInfo={parentInfo}\n />\n <div className=\"unit-card__content item-children\" data-testid=\"unit-card__content\">\n <XBlockStatus\n isSelfPaced={isSelfPaced}\n isCustomRelativeDatesActive={isCustomRelativeDatesActive}\n blockData={unit}\n />\n </div>\n </div>\n </SortableItem>\n );\n};\n\nUnitCard.defaultProps = {\n discussionsSettings: {},\n};\n\nUnitCard.propTypes = {\n unit: PropTypes.shape({\n id: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n category: PropTypes.string.isRequired,\n published: PropTypes.bool.isRequired,\n hasChanges: PropTypes.bool.isRequired,\n visibilityState: PropTypes.string.isRequired,\n shouldScroll: PropTypes.bool,\n actions: PropTypes.shape({\n deletable: PropTypes.bool.isRequired,\n draggable: PropTypes.bool.isRequired,\n childAddable: PropTypes.bool.isRequired,\n duplicable: PropTypes.bool.isRequired,\n }).isRequired,\n isHeaderVisible: PropTypes.bool,\n enableCopyPasteUnits: PropTypes.bool,\n discussionEnabled: PropTypes.bool,\n }).isRequired,\n subsection: PropTypes.shape({\n id: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n published: PropTypes.bool.isRequired,\n hasChanges: PropTypes.bool.isRequired,\n visibilityState: PropTypes.string.isRequired,\n shouldScroll: PropTypes.bool,\n isTimeLimited: PropTypes.bool,\n graded: PropTypes.bool,\n }).isRequired,\n section: PropTypes.shape({\n id: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n published: PropTypes.bool.isRequired,\n hasChanges: PropTypes.bool.isRequired,\n visibilityState: PropTypes.string.isRequired,\n shouldScroll: PropTypes.bool,\n }).isRequired,\n onOpenPublishModal: PropTypes.func.isRequired,\n onOpenConfigureModal: PropTypes.func.isRequired,\n onEditSubmit: PropTypes.func.isRequired,\n savingStatus: PropTypes.string.isRequired,\n onOpenDeleteModal: PropTypes.func.isRequired,\n onDuplicateSubmit: PropTypes.func.isRequired,\n getTitleLink: PropTypes.func.isRequired,\n index: PropTypes.number.isRequired,\n getPossibleMoves: PropTypes.func.isRequired,\n onOrderChange: PropTypes.func.isRequired,\n isSelfPaced: PropTypes.bool.isRequired,\n isCustomRelativeDatesActive: PropTypes.bool.isRequired,\n onCopyToClipboardClick: PropTypes.func.isRequired,\n discussionsSettings: PropTypes.shape({\n providerType: PropTypes.string,\n enableGradedUnits: PropTypes.bool,\n }),\n};\n\nexport default UnitCard;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.course-outline.highlights-modal.title',\n defaultMessage: 'Highlights for {title}',\n },\n description: {\n id: 'course-authoring.course-outline.highlights-modal.description',\n defaultMessage: 'Enter 3-5 highlights to include in the email message that learners receive for this section (250 character limit). For more information and an example of the email template, read our {documentation}.',\n },\n documentationLink: {\n id: 'course-authoring.course-outline.highlights-modal.documentation-link',\n defaultMessage: 'documentation',\n },\n highlight: {\n id: 'course-authoring.course-outline.highlights-modal.highlight',\n defaultMessage: 'Highlight {index}',\n },\n cancelButton: {\n id: 'course-authoring.course-outline.highlights-modal.button.cancel',\n defaultMessage: 'Cancel',\n },\n saveButton: {\n id: 'course-authoring.course-outline.highlights-modal.button.save',\n defaultMessage: 'Save',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ModalDialog,\n Button,\n ActionRow,\n Hyperlink,\n} from '@openedx/paragon';\nimport { Formik } from 'formik';\nimport { useSelector } from 'react-redux';\n\nimport { useHelpUrls } from '../../help-urls/hooks';\nimport FormikControl from '../../generic/FormikControl';\nimport { getCurrentSection } from '../data/selectors';\nimport { HIGHLIGHTS_FIELD_MAX_LENGTH } from '../constants';\nimport { getHighlightsFormValues } from '../utils';\nimport messages from './messages';\n\nconst HighlightsModal = ({\n isOpen,\n onClose,\n onSubmit,\n}) => {\n const intl = useIntl();\n const { highlights = [], displayName } = useSelector(getCurrentSection);\n const initialFormValues = getHighlightsFormValues(highlights);\n\n const {\n contentHighlights: contentHighlightsUrl,\n } = useHelpUrls(['contentHighlights']);\n\n return (\n <ModalDialog\n title={displayName}\n className=\"highlights-modal\"\n isOpen={isOpen}\n onClose={onClose}\n hasCloseButton\n isFullscreenOnMobile\n >\n <ModalDialog.Header className=\"highlights-modal__header\">\n <ModalDialog.Title>\n {intl.formatMessage(messages.title, {\n title: displayName,\n })}\n </ModalDialog.Title>\n </ModalDialog.Header>\n <Formik initialValues={initialFormValues} onSubmit={onSubmit}>\n {({ values, dirty, handleSubmit }) => (\n <>\n <ModalDialog.Body>\n <p className=\"mb-4.5 pb-2\">\n {intl.formatMessage(messages.description, {\n documentation: (\n <Hyperlink destination={contentHighlightsUrl} target=\"_blank\" showLaunchIcon={false}>\n {intl.formatMessage(messages.documentationLink)}\n </Hyperlink>),\n })}\n </p>\n {Object.entries(initialFormValues).map(([key], index) => (\n <FormikControl\n key={key}\n name={key}\n value={values[key]}\n floatingLabel={intl.formatMessage(messages.highlight, { index: index + 1 })}\n maxLength={HIGHLIGHTS_FIELD_MAX_LENGTH}\n as=\"textarea\"\n />\n ))}\n </ModalDialog.Body>\n <ModalDialog.Footer className=\"pt-1\">\n <ActionRow>\n <ModalDialog.CloseButton variant=\"tertiary\">\n {intl.formatMessage(messages.cancelButton)}\n </ModalDialog.CloseButton>\n <Button disabled={!dirty} onClick={handleSubmit}>\n {intl.formatMessage(messages.saveButton)}\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </>\n )}\n </Formik>\n </ModalDialog>\n );\n};\n\nHighlightsModal.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n};\n\nexport default HighlightsModal;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.course-outline.empty-placeholder.title',\n defaultMessage: 'You haven\\'t added any content to this course yet.',\n },\n button: {\n id: 'course-authoring.course-outline.empty-placeholder.button.new-section',\n defaultMessage: 'New section',\n },\n tooltip: {\n id: 'course-authoring.course-outline.empty-placeholder.button.tooltip',\n defaultMessage: 'Click to add a new section',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Add as IconAdd } from '@openedx/paragon/icons/es5';\nimport { Button, OverlayTrigger, Tooltip } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst EmptyPlaceholder = ({\n onCreateNewSection,\n childAddable,\n}) => {\n const intl = useIntl();\n\n return (\n <div className=\"outline-empty-placeholder bg-gray-100\" data-testid=\"empty-placeholder\">\n <p className=\"mb-0 text-gray-500\">{intl.formatMessage(messages.title)}</p>\n {childAddable && (\n <OverlayTrigger\n placement=\"bottom\"\n overlay={(\n <Tooltip id={intl.formatMessage(messages.tooltip)}>\n {intl.formatMessage(messages.tooltip)}\n </Tooltip>\n )}\n >\n <Button\n variant=\"primary\"\n size=\"sm\"\n iconBefore={IconAdd}\n onClick={onCreateNewSection}\n >\n {intl.formatMessage(messages.button)}\n </Button>\n </OverlayTrigger>\n )}\n </div>\n );\n};\n\nEmptyPlaceholder.propTypes = {\n onCreateNewSection: PropTypes.func.isRequired,\n childAddable: PropTypes.bool.isRequired,\n};\n\nexport default EmptyPlaceholder;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.course-outline.publish-modal.title',\n defaultMessage: 'Publish {title}',\n },\n description: {\n id: 'course-authoring.course-outline.publish-modal.description',\n defaultMessage: 'Publish all unpublished changes for this {category}?',\n },\n cancelButton: {\n id: 'course-authoring.course-outline.publish-modal.button.cancel',\n defaultMessage: 'Cancel',\n },\n publishButton: {\n id: 'course-authoring.course-outline.publish-modal.button.label',\n defaultMessage: 'Publish',\n },\n});\n\nexport default messages;\n","/* eslint-disable import/named */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ModalDialog,\n Button,\n ActionRow,\n} from '@openedx/paragon';\nimport { useSelector } from 'react-redux';\n\nimport { getCurrentItem } from '../data/selectors';\nimport { COURSE_BLOCK_NAMES } from '../constants';\nimport messages from './messages';\n\nconst PublishModal = ({\n isOpen,\n onClose,\n onPublishSubmit,\n}) => {\n const intl = useIntl();\n const { displayName, childInfo, category } = useSelector(getCurrentItem);\n const categoryName = COURSE_BLOCK_NAMES[category]?.name.toLowerCase();\n const children = childInfo?.children || [];\n\n return (\n <ModalDialog\n className=\"publish-modal\"\n isOpen={isOpen}\n onClose={onClose}\n hasCloseButton\n isFullscreenOnMobile\n >\n <ModalDialog.Header className=\"publish-modal__header\">\n <ModalDialog.Title>\n {intl.formatMessage(messages.title, { title: displayName })}\n </ModalDialog.Title>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <p className=\"small\">\n {intl.formatMessage(messages.description, { category: categoryName })}\n </p>\n {children.filter(child => child.hasChanges).map((child) => {\n let grandChildren = child.childInfo?.children || [];\n grandChildren = grandChildren.filter(grandChild => grandChild.hasChanges);\n\n return grandChildren.length ? (\n <React.Fragment key={child.id}>\n <span className=\"small text-gray-400\">{child.displayName}</span>\n {grandChildren.map((grandChild) => (\n <div\n key={grandChild.id}\n className=\"small border border-light-400 p-2 publish-modal__subsection\"\n >\n {grandChild.displayName}\n </div>\n ))}\n </React.Fragment>\n ) : (\n <div\n key={child.id}\n className=\"small border border-light-400 p-2 publish-modal__subsection\"\n >\n {child.displayName}\n </div>\n );\n })}\n </ModalDialog.Body>\n <ModalDialog.Footer className=\"pt-1\">\n <ActionRow>\n <ModalDialog.CloseButton variant=\"tertiary\">\n {intl.formatMessage(messages.cancelButton)}\n </ModalDialog.CloseButton>\n <Button\n data-testid=\"publish-confirm-button\"\n onClick={onPublishSubmit}\n >\n {intl.formatMessage(messages.publishButton)}\n </Button>\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nPublishModal.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onPublishSubmit: PropTypes.func.isRequired,\n};\n\nexport default PublishModal;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n configurationErrorTitle: {\n id: 'course-authoring.course-outline.page-alerts.configurationErrorTitle',\n defaultMessage: 'This course was created as a re-run. Some manual configuration is needed.',\n description: 'Configuration error alert title in course outline.',\n },\n configurationErrorText: {\n id: 'course-authoring.course-outline.page-alerts.configurationErrorText',\n defaultMessage: 'No course content is currently visible, and no learners are enrolled. Be sure to review and reset all dates, including the Course Start Date; set up the course team; review course updates and other assets for dated material; and seed the discussions and wiki.',\n description: 'Configuration error alert body in course outline.',\n },\n discussionNotificationText: {\n id: 'course-authoring.course-outline.page-alerts.discussionNotificationText',\n defaultMessage: 'This course run is using an upgraded version of {platformName} discussion forum. In order to display the discussions sidebar, discussions xBlocks will no longer be visible to learners.',\n description: 'Alert text for informing users about upgraded version of discussions forum.',\n },\n discussionNotificationLearnMore: {\n id: 'course-authoring.course-outline.page-alerts.discussionNotificationLearnMore',\n defaultMessage: 'Learn more',\n description: 'Learn more link in upgraded discussion notification alert',\n },\n discussionNotificationFeedback: {\n id: 'course-authoring.course-outline.page-alerts.discussionNotificationLearnMore',\n defaultMessage: 'Share feedback',\n description: 'Share feedback link in upgraded discussion notification alert',\n },\n deprecationWarningTitle: {\n id: 'course-authoring.course-outline.page-alerts.deprecationWarningTitle',\n defaultMessage: 'This course uses features that are no longer supported.',\n description: 'Alert title informing users about deprecated features being used in course that are not supported.',\n },\n deprecationWarningBlocksText: {\n id: 'course-authoring.course-outline.page-alerts.deprecationWarningBlocksText',\n defaultMessage: 'You must delete or replace the following components.',\n description: 'Alert body text informing users about deprecated components which needs to be removed or replaced.',\n },\n deprecationWarningDeprecatedBlockText: {\n id: 'course-authoring.course-outline.page-alerts.deprecationWarningDeprecatedBlockText',\n defaultMessage: 'To avoid errors, {platformName} strongly recommends that you remove unsupported features from the course advanced settings. To do this, go to the {hyperlink}, locate the \"Advanced Module List\" setting, and then delete the following modules from the list.',\n description: 'Alert body text informing users about how to remove deprecated components/modules.',\n },\n advancedSettingLinkText: {\n id: 'course-authoring.course-outline.page-alerts.advancedSettingLinkText',\n defaultMessage: 'Advanced Settings page',\n description: 'Advanced settings page link text',\n },\n deprecatedComponentName: {\n id: 'course-authoring.course-outline.page-alerts.deprecatedComponentName',\n defaultMessage: 'Deprecated Component',\n description: 'Default name for a deprecated component.',\n },\n proctoringErrorTitle: {\n id: 'course-authoring.course-outline.page-alerts.proctoringErrorTitle',\n defaultMessage: 'This course has proctored exam settings that are incomplete or invalid.',\n description: 'Proctoring settings errors alert title.',\n },\n proctoringErrorText: {\n id: 'course-authoring.course-outline.page-alerts.proctoringErrorText',\n defaultMessage: 'To update these settings go to the {hyperlink}.',\n description: 'Proctoring settings errors alert body text.',\n },\n proctoredSettingsLinkText: {\n id: 'course-authoring.course-outline.page-alerts.proctoredSettingsLinkText',\n defaultMessage: 'Proctored Exam Settings page',\n description: 'Proctoring settings page link text.',\n },\n alertFailedGeneric: {\n id: 'course-authoring.course-outline.page-alert.generic-error.description',\n defaultMessage: 'Unable to {actionName} {type}. Please try again.',\n description: 'Generic alert text.',\n },\n newFileAlertTitle: {\n id: 'course-authoring.course-outline.page-alert.paste-alert.new-files.title',\n defaultMessage: 'New {newFilesLen, plural, one {file} other {files}} added to Files.',\n description: 'This title is displayed when new files are successfully imported into the course after pasting an unit.',\n },\n newFileAlertDesc: {\n id: 'course-authoring.course-outline.page-alert.paste-alert.new-files.description',\n defaultMessage: 'The following required {newFilesLen, plural, one {file was} other {files were}} imported to this course: {newFilesStr}',\n description: 'This description is displayed when new files are successfully imported into the course after pasting an unit',\n },\n newFileAlertAction: {\n id: 'course-authoring.course-outline.page-alert.paste-alert.new-files.action',\n defaultMessage: 'View files',\n description: 'This label is used as the text for a button that allows the user to view the imported files.',\n },\n errorFileAlertTitle: {\n id: 'course-authoring.course-outline.page-alert.paste-alert.error-files.title',\n defaultMessage: 'Some errors occurred',\n description: 'This title is displayed when there are errors during the import of files while pasting an unit.',\n },\n errorFileAlertDesc: {\n id: 'course-authoring.course-outline.page-alert.paste-alert.error-files.description',\n defaultMessage: 'The following required {errorFilesLen, plural, one {file} other {files}} could not be added to the course: {errorFilesStr}',\n description: 'This description is displayed when there are errors during the import of files and lists the files that could not be imported.',\n },\n conflictingFileAlertTitle: {\n id: 'course-authoring.course-outline.page-alert.paste-alert.conflicting-files.title',\n defaultMessage: 'You may need to update {conflictingFilesLen, plural, one {a file} other {files}} manually',\n description: 'This alert title is displayed when files being imported conflict with existing files in the course.',\n },\n conflictingFileAlertDesc: {\n id: 'course-authoring.course-outline.page-alert.paste-alert.new-conflicting.description',\n defaultMessage: 'The following {conflictingFilesLen, plural, one {file} other {files}} already exist in this course but don\\'t match the version used by the component you pasted: {conflictingFilesStr}',\n description: 'This alert description is displayed when files being imported conflict with existing files in the course and advises the user to update the conflicting files manually.',\n },\n serverErrorAlert: {\n id: 'course-authoring.course-outline.page-alert.server-error.title',\n defaultMessage: 'Request failed with status: {status}',\n description: 'Generic server error alert title.',\n },\n networkErrorAlert: {\n id: 'course-authoring.course-outline.page-alert.network-error.title',\n defaultMessage: 'Network error',\n description: 'Generic network error alert.',\n },\n});\n\nexport default messages;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { getConfig } from '@edx/frontend-platform';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n';\nimport { ErrorAlert } from '@edx/frontend-lib-content-components';\nimport {\n Campaign as CampaignIcon,\n InfoOutline as InfoOutlineIcon,\n Warning as WarningIcon,\n Error as ErrorIcon,\n} from '@openedx/paragon/icons';\nimport {\n Alert, Button, Hyperlink, Truncate,\n} from '@openedx/paragon';\nimport { Link } from 'react-router-dom';\n\nimport { RequestStatus } from '../../data/constants';\nimport AlertMessage from '../../generic/alert-message';\nimport AlertProctoringError from '../../generic/AlertProctoringError';\nimport messages from './messages';\nimport advancedSettingsMessages from '../../advanced-settings/messages';\nimport { getPasteFileNotices } from '../data/selectors';\nimport { dismissError, removePasteFileNotices } from '../data/slice';\nimport { API_ERROR_TYPES } from '../constants';\n\nconst PageAlerts = ({\n courseId,\n notificationDismissUrl,\n handleDismissNotification,\n discussionsSettings,\n discussionsIncontextFeedbackUrl,\n discussionsIncontextLearnmoreUrl,\n deprecatedBlocksInfo,\n proctoringErrors,\n mfeProctoredExamSettingsUrl,\n advanceSettingsUrl,\n savingStatus,\n errors,\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const studioBaseUrl = getConfig().STUDIO_BASE_URL;\n const [showConfigAlert, setShowConfigAlert] = useState(true);\n const [showDiscussionAlert, setShowDiscussionAlert] = useState(true);\n const { newFiles, conflictingFiles, errorFiles } = useSelector(getPasteFileNotices);\n\n const getAssetsUrl = () => {\n if (getConfig().ENABLE_ASSETS_PAGE === 'true') {\n return `/course/${courseId}/assets/`;\n }\n return `${getConfig().STUDIO_BASE_URL}/assets/${courseId}`;\n };\n\n const configurationErrors = () => {\n if (!notificationDismissUrl) {\n return null;\n }\n\n const onDismiss = () => {\n setShowConfigAlert(false);\n handleDismissNotification();\n };\n\n return (\n <AlertMessage\n title={intl.formatMessage(messages.configurationErrorTitle)}\n description={intl.formatMessage(messages.configurationErrorText)}\n dismissible\n show={showConfigAlert}\n icon={CampaignIcon}\n variant=\"info\"\n onClose={onDismiss}\n />\n );\n };\n\n const discussionNotification = () => {\n const { providerType } = discussionsSettings || {};\n if (providerType !== 'openedx') {\n return null;\n }\n\n const onDismiss = () => {\n setShowDiscussionAlert(false);\n };\n\n return (\n <Alert\n dismissible\n show={showDiscussionAlert}\n icon={InfoOutlineIcon}\n variant=\"info\"\n onClose={onDismiss}\n actions={[\n <Button\n href={discussionsIncontextLearnmoreUrl}\n target=\"_blank\"\n >\n {intl.formatMessage(messages.discussionNotificationLearnMore)}\n </Button>,\n ]}\n >\n <div className=\"font-weight-normal text-gray mw-md\">\n {intl.formatMessage(messages.discussionNotificationText, {\n platformName: process.env.SITE_NAME,\n })}\n </div>\n <Hyperlink\n showLaunchIcon={false}\n destination={discussionsIncontextFeedbackUrl}\n target=\"_blank\"\n >\n {intl.formatMessage(messages.discussionNotificationFeedback)}\n </Hyperlink>\n </Alert>\n );\n };\n\n const deprecationWarning = () => {\n const {\n blocks,\n deprecatedEnabledBlockTypes,\n } = deprecatedBlocksInfo || {};\n\n if (blocks?.length > 0 || deprecatedEnabledBlockTypes?.length > 0) {\n return (\n <Alert\n icon={WarningIcon}\n variant=\"warning\"\n >\n <Alert.Heading>\n {intl.formatMessage(messages.deprecationWarningTitle)}\n </Alert.Heading>\n {blocks?.length > 0 && (\n <>\n <div>\n {intl.formatMessage(messages.deprecationWarningBlocksText)}\n </div>\n <ul>\n {blocks.map(([parentUrl, name]) => (\n <li key={parentUrl}>\n <Hyperlink\n destination={parentUrl}\n >\n {name || intl.formatMessage(messages.deprecatedComponentName)}\n </Hyperlink>\n </li>\n ))}\n </ul>\n </>\n )}\n {deprecatedEnabledBlockTypes?.length > 0 && (\n <>\n <div>\n <FormattedMessage\n {...messages.deprecationWarningDeprecatedBlockText}\n values={{\n platformName: process.env.SITE_NAME,\n hyperlink: (\n <Hyperlink\n destination={`${studioBaseUrl}${deprecatedBlocksInfo.advanceSettingsUrl}`}\n target=\"_blank\"\n showLaunchIcon={false}\n >\n <FormattedMessage\n {...messages.advancedSettingLinkText}\n />\n </Hyperlink>\n ),\n }}\n />\n </div>\n <ul>\n {deprecatedEnabledBlockTypes.map((name) => (\n <li key={name}>\n {name}\n </li>\n ))}\n </ul>\n </>\n )}\n </Alert>\n );\n }\n\n return null;\n };\n\n const proctoringAlerts = () => {\n if (proctoringErrors?.length > 0) {\n return (\n <AlertProctoringError\n icon={InfoOutlineIcon}\n proctoringErrorsData={proctoringErrors}\n aria-hidden=\"true\"\n aria-labelledby={intl.formatMessage(advancedSettingsMessages.alertProctoringAriaLabelledby)}\n aria-describedby={intl.formatMessage(advancedSettingsMessages.alertProctoringDescribedby)}\n >\n <Alert.Heading>\n {intl.formatMessage(messages.proctoringErrorTitle)}\n </Alert.Heading>\n <div className=\"mb-2\">\n {mfeProctoredExamSettingsUrl\n ? (\n <FormattedMessage\n {...messages.proctoringErrorText}\n values={{\n hyperlink: (\n <Hyperlink\n destination={mfeProctoredExamSettingsUrl}\n target=\"_blank\"\n showLaunchIcon={false}\n >\n <FormattedMessage\n {...messages.proctoredSettingsLinkText}\n />\n </Hyperlink>\n ),\n }}\n />\n ) : (\n <FormattedMessage\n {...messages.proctoringErrorText}\n values={{\n hyperlink: (\n <Hyperlink\n destination={`${studioBaseUrl}${advanceSettingsUrl}`}\n target=\"_blank\"\n showLaunchIcon={false}\n >\n <FormattedMessage\n {...messages.advancedSettingLinkText}\n />\n </Hyperlink>\n ),\n }}\n />\n )}\n </div>\n </AlertProctoringError>\n );\n }\n return null;\n };\n\n const newFilesPasteAlert = () => {\n const onDismiss = () => {\n dispatch(removePasteFileNotices(['newFiles']));\n };\n\n if (newFiles?.length) {\n return (\n <AlertMessage\n title={intl.formatMessage(messages.newFileAlertTitle, { newFilesLen: newFiles.length })}\n description={intl.formatMessage(\n messages.newFileAlertDesc,\n { newFilesLen: newFiles.length, newFilesStr: newFiles.join(', ') },\n )}\n dismissible\n show\n icon={CampaignIcon}\n variant=\"info\"\n onClose={onDismiss}\n actions={[\n <Button\n as={Link}\n to={getAssetsUrl()}\n >\n {intl.formatMessage(messages.newFileAlertAction)}\n </Button>,\n ]}\n />\n );\n }\n return null;\n };\n\n const errorFilesPasteAlert = () => {\n const onDismiss = () => {\n dispatch(removePasteFileNotices(['errorFiles']));\n };\n\n if (errorFiles?.length) {\n return (\n <AlertMessage\n title={intl.formatMessage(messages.errorFileAlertTitle)}\n description={intl.formatMessage(\n messages.errorFileAlertDesc,\n { errorFilesLen: errorFiles.length, errorFilesStr: errorFiles.join(', ') },\n )}\n dismissible\n show\n icon={WarningIcon}\n variant=\"danger\"\n onClose={onDismiss}\n />\n );\n }\n return null;\n };\n\n const conflictingFilesPasteAlert = () => {\n const onDismiss = () => {\n dispatch(removePasteFileNotices(['conflictingFiles']));\n };\n\n if (conflictingFiles?.length) {\n return (\n <AlertMessage\n title={intl.formatMessage(\n messages.conflictingFileAlertTitle,\n { conflictingFilesLen: conflictingFiles.length },\n )}\n description={intl.formatMessage(\n messages.conflictingFileAlertDesc,\n { conflictingFilesLen: conflictingFiles.length, conflictingFilesStr: conflictingFiles.join(', ') },\n )}\n dismissible\n show\n icon={WarningIcon}\n variant=\"warning\"\n onClose={onDismiss}\n actions={[\n <Button\n as={Link}\n to={getAssetsUrl()}\n >\n {intl.formatMessage(messages.newFileAlertAction)}\n </Button>,\n ]}\n />\n );\n }\n return null;\n };\n\n const renderApiErrors = () => {\n const errorList = Object.entries(errors).filter(obj => obj[1] !== null).map(([k, v]) => {\n switch (v.type) {\n case API_ERROR_TYPES.serverError:\n return {\n key: k,\n desc: v.data,\n title: intl.formatMessage(messages.serverErrorAlert, {\n status: v.status,\n }),\n dismissible: v.dismissible,\n };\n case API_ERROR_TYPES.networkError:\n return {\n key: k,\n title: intl.formatMessage(messages.networkErrorAlert),\n dismissible: v.dismissible,\n };\n default:\n return {\n key: k,\n desc: v.data,\n dismissible: v.dismissible,\n };\n }\n });\n if (!errorList?.length) {\n return null;\n }\n return (\n errorList.map((msgObj) => (\n msgObj.dismissible ? (\n <ErrorAlert\n isError\n hideHeading\n key={msgObj.key}\n dismissError={() => dispatch(dismissError(msgObj.key))}\n >\n {msgObj.title\n && (\n <Alert.Heading>{msgObj.title}</Alert.Heading>\n )}\n {msgObj.desc && <Truncate lines={2}>{msgObj.desc}</Truncate>}\n </ErrorAlert>\n ) : (\n <Alert\n variant=\"danger\"\n icon={ErrorIcon}\n key={msgObj.key}\n >\n {msgObj.title\n && (\n <Alert.Heading>{msgObj.title}</Alert.Heading>\n )}\n {msgObj.desc && <Truncate lines={2}>{msgObj.desc}</Truncate>}\n </Alert>\n )\n ))\n );\n };\n\n return (\n <>\n {configurationErrors()}\n {discussionNotification()}\n {deprecationWarning()}\n {proctoringAlerts()}\n <ErrorAlert hideHeading isError={savingStatus === RequestStatus.FAILED}>\n {intl.formatMessage(messages.alertFailedGeneric, { actionName: 'save', type: 'changes' })}\n </ErrorAlert>\n {renderApiErrors()}\n {errorFilesPasteAlert()}\n {conflictingFilesPasteAlert()}\n {newFilesPasteAlert()}\n </>\n );\n};\n\nPageAlerts.defaultProps = {\n notificationDismissUrl: '',\n handleDismissNotification: null,\n discussionsSettings: {},\n discussionsIncontextFeedbackUrl: '',\n discussionsIncontextLearnmoreUrl: '',\n deprecatedBlocksInfo: {},\n proctoringErrors: [],\n mfeProctoredExamSettingsUrl: '',\n advanceSettingsUrl: '',\n savingStatus: '',\n errors: {},\n};\n\nPageAlerts.propTypes = {\n courseId: PropTypes.string.isRequired,\n notificationDismissUrl: PropTypes.string,\n handleDismissNotification: PropTypes.func,\n discussionsSettings: PropTypes.shape({\n providerType: PropTypes.string,\n }),\n discussionsIncontextFeedbackUrl: PropTypes.string,\n discussionsIncontextLearnmoreUrl: PropTypes.string,\n deprecatedBlocksInfo: PropTypes.shape({\n blocks: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)),\n deprecatedEnabledBlockTypes: PropTypes.arrayOf(PropTypes.string),\n advanceSettingsUrl: PropTypes.string,\n }),\n proctoringErrors: PropTypes.arrayOf(PropTypes.shape({\n key: PropTypes.string,\n message: PropTypes.string,\n model: PropTypes.shape({\n deprecated: PropTypes.bool,\n displayName: PropTypes.string,\n help: PropTypes.string,\n hideOnEnabledPublisher: PropTypes.bool,\n }),\n value: PropTypes.string,\n })),\n mfeProctoredExamSettingsUrl: PropTypes.string,\n advanceSettingsUrl: PropTypes.string,\n savingStatus: PropTypes.string,\n errors: PropTypes.shape({\n outlineIndexApi: PropTypes.shape({\n data: PropTypes.string,\n type: PropTypes.string.isRequired,\n }),\n reindexApi: PropTypes.shape({\n data: PropTypes.string,\n type: PropTypes.string.isRequired,\n }),\n sectionLoadingApi: PropTypes.shape({\n data: PropTypes.string,\n type: PropTypes.string.isRequired,\n }),\n courseLaunchApi: PropTypes.shape({\n data: PropTypes.string,\n type: PropTypes.string.isRequired,\n }),\n }),\n};\n\nexport default PageAlerts;\n","import { arrayMove } from '@dnd-kit/sortable';\n\nexport const dragHelpers = {\n copyBlockChildren: (block) => {\n // eslint-disable-next-line no-param-reassign\n block.childInfo = { ...block.childInfo };\n // eslint-disable-next-line no-param-reassign\n block.childInfo.children = [...block.childInfo.children];\n return block;\n },\n setBlockChildren: (block, children) => {\n // eslint-disable-next-line no-param-reassign\n block.childInfo.children = children;\n return block;\n },\n setBlockChild: (block, child, id) => {\n // eslint-disable-next-line no-param-reassign\n block.childInfo.children[id] = child;\n return block;\n },\n insertChild: (block, child, index) => {\n // eslint-disable-next-line no-param-reassign\n block.childInfo.children = [\n ...block.childInfo.children.slice(0, index),\n child,\n ...block.childInfo.children.slice(index, block.childInfo.children.length),\n ];\n return block;\n },\n isBelowOverItem: (active, over) => over\n && active.rect.current.translated\n && active.rect.current.translated.top\n > over.rect.top + over.rect.height,\n};\n\nexport const moveSubsectionOver = (\n prevCopy,\n activeSectionIdx,\n activeSubsectionIdx,\n overSectionIdx,\n newIndex,\n) => {\n let activeSection = dragHelpers.copyBlockChildren({ ...prevCopy[activeSectionIdx] });\n let overSection = dragHelpers.copyBlockChildren({ ...prevCopy[overSectionIdx] });\n const subsection = activeSection.childInfo.children[activeSubsectionIdx];\n\n overSection = dragHelpers.insertChild(overSection, subsection, newIndex);\n\n activeSection = dragHelpers.setBlockChildren(\n activeSection,\n activeSection.childInfo.children.filter((item) => item.id !== subsection.id),\n );\n\n // eslint-disable-next-line no-param-reassign\n prevCopy[activeSectionIdx] = activeSection;\n // eslint-disable-next-line no-param-reassign\n prevCopy[overSectionIdx] = overSection;\n return [prevCopy, overSection.childInfo.children];\n};\n\nexport const moveUnitOver = (\n prevCopy,\n activeSectionIdx,\n activeSubsectionIdx,\n activeUnitIdx,\n overSectionIdx,\n overSubsectionIdx,\n newIndex,\n) => {\n const activeSection = dragHelpers.copyBlockChildren({ ...prevCopy[activeSectionIdx] });\n let activeSubsection = dragHelpers.copyBlockChildren(\n { ...activeSection.childInfo.children[activeSubsectionIdx] },\n );\n\n let overSection = { ...prevCopy[overSectionIdx] };\n if (overSection.id === activeSection.id) {\n overSection = activeSection;\n }\n\n overSection = dragHelpers.copyBlockChildren(overSection);\n let overSubsection = dragHelpers.copyBlockChildren(\n { ...overSection.childInfo.children[overSubsectionIdx] },\n );\n\n const unit = activeSubsection.childInfo.children[activeUnitIdx];\n overSubsection = dragHelpers.insertChild(overSubsection, unit, newIndex);\n overSection = dragHelpers.setBlockChild(overSection, overSubsection, overSubsectionIdx);\n\n activeSubsection = dragHelpers.setBlockChildren(\n activeSubsection,\n activeSubsection.childInfo.children.filter((item) => item.id !== unit.id),\n );\n\n // eslint-disable-next-line no-param-reassign\n prevCopy[activeSectionIdx] = dragHelpers.setBlockChild(activeSection, activeSubsection, activeSubsectionIdx);\n // eslint-disable-next-line no-param-reassign\n prevCopy[overSectionIdx] = overSection;\n return [prevCopy, overSubsection.childInfo.children];\n};\n\nexport const moveSubsection = (\n prevCopy,\n sectionIdx,\n currentIdx,\n newIdx,\n) => {\n let section = dragHelpers.copyBlockChildren({ ...prevCopy[sectionIdx] });\n\n const result = arrayMove(section.childInfo.children, currentIdx, newIdx);\n section = dragHelpers.setBlockChildren(section, result);\n\n // eslint-disable-next-line no-param-reassign\n prevCopy[sectionIdx] = section;\n return [prevCopy, result];\n};\n\nexport const moveUnit = (\n prevCopy,\n sectionIdx,\n subsectionIdx,\n currentIdx,\n newIdx,\n) => {\n let section = dragHelpers.copyBlockChildren({ ...prevCopy[sectionIdx] });\n let subsection = dragHelpers.copyBlockChildren({ ...section.childInfo.children[subsectionIdx] });\n\n const result = arrayMove(subsection.childInfo.children, currentIdx, newIdx);\n subsection = dragHelpers.setBlockChildren(subsection, result);\n section = dragHelpers.setBlockChild(section, subsection, subsectionIdx);\n\n // eslint-disable-next-line no-param-reassign\n prevCopy[sectionIdx] = section;\n return [prevCopy, result];\n};\n\n/**\n * Check if section can be moved by given step.\n * Inner function returns false if the new index after moving by given step\n * is out of bounds of item length.\n * If it is within bounds, returns draggable flag of the item in the new index.\n * This helps us avoid moving the item to a position of unmovable item.\n * @param {Array} items\n * @returns {(id, step) => bool}\n */\nexport const canMoveSection = (sections) => (id, step) => {\n const newId = id + step;\n const indexCheck = newId >= 0 && newId < sections.length;\n if (!indexCheck) {\n return false;\n }\n const newItem = sections[newId];\n return newItem.actions.draggable;\n};\n\nexport const possibleSubsectionMoves = (sections, sectionIndex, section, subsections) => (index, step) => {\n if (!subsections[index]?.actions?.draggable) {\n return {};\n }\n if ((step === -1 && index >= 1) || (step === 1 && subsections.length - index >= 2)) {\n // move subsection inside its own parent section\n return {\n fn: moveSubsection,\n args: [\n sections,\n sectionIndex,\n index,\n index + step,\n ],\n sectionId: section.id,\n };\n } if (step === -1 && index === 0 && sectionIndex > 0) {\n // move subsection to last position of previous section\n if (!sections[sectionIndex + step]?.actions?.childAddable) {\n // return if previous section doesn't allow adding subsections\n return {};\n }\n return {\n fn: moveSubsectionOver,\n args: [\n sections,\n sectionIndex,\n index,\n sectionIndex + step,\n sections[sectionIndex + step].childInfo.children.length + 1,\n ],\n sectionId: sections[sectionIndex + step].id,\n };\n } if (step === 1 && index === subsections.length - 1 && sectionIndex < sections.length - 1) {\n // move subsection to first position of next section\n if (!sections[sectionIndex + step]?.actions?.childAddable) {\n // return if next section doesn't allow adding subsections\n return {};\n }\n return {\n fn: moveSubsectionOver,\n args: [\n sections,\n sectionIndex,\n index,\n sectionIndex + step,\n 0,\n ],\n sectionId: sections[sectionIndex + step].id,\n };\n }\n return {};\n};\n\nexport const possibleUnitMoves = (\n sections,\n sectionIndex,\n subsectionIndex,\n section,\n subsection,\n units,\n) => (index, step) => {\n if (!units[index].actions.draggable) {\n return {};\n }\n if ((step === -1 && index >= 1) || (step === 1 && units.length - index >= 2)) {\n return {\n fn: moveUnit,\n args: [\n sections,\n sectionIndex,\n subsectionIndex,\n index,\n index + step,\n ],\n sectionId: section.id,\n subsectionId: subsection.id,\n };\n } if (step === -1 && index === 0) {\n if (subsectionIndex > 0) {\n // move unit to last position of previous subsection inside same section.\n if (!sections[sectionIndex].childInfo.children[subsectionIndex + step]?.actions?.childAddable) {\n // return if previous subsection doesn't allow adding subsections\n return {};\n }\n return {\n fn: moveUnitOver,\n args: [\n sections,\n sectionIndex,\n subsectionIndex,\n index,\n sectionIndex,\n subsectionIndex + step,\n sections[sectionIndex].childInfo.children[subsectionIndex + step].childInfo.children.length + 1,\n ],\n sectionId: section.id,\n subsectionId: sections[sectionIndex].childInfo.children[subsectionIndex + step].id,\n };\n } if (sectionIndex > 0) {\n // move unit to last position of previous subsection inside previous section.\n const newSectionIndex = sectionIndex + step;\n if (sections[newSectionIndex].childInfo.children.length === 0) {\n // return if previous section has no subsections.\n return {};\n }\n const newSubsectionIndex = sections[newSectionIndex].childInfo.children.length - 1;\n if (!sections[newSectionIndex].childInfo.children[newSubsectionIndex]?.actions?.childAddable) {\n // return if previous subsection doesn't allow adding subsections\n return {};\n }\n return {\n fn: moveUnitOver,\n args: [\n sections,\n sectionIndex,\n subsectionIndex,\n index,\n newSectionIndex,\n newSubsectionIndex,\n sections[newSectionIndex].childInfo.children[newSubsectionIndex].childInfo.children.length + 1,\n ],\n sectionId: sections[newSectionIndex].id,\n subsectionId: sections[newSectionIndex].childInfo.children[newSubsectionIndex].id,\n };\n }\n } else if (step === 1 && index === units.length - 1) {\n if (subsectionIndex < sections[sectionIndex].childInfo.children.length - 1) {\n // move unit to first position of next subsection inside same section.\n if (!sections[sectionIndex].childInfo.children[subsectionIndex + step]?.actions?.childAddable) {\n // return if next subsection doesn't allow adding subsections\n return {};\n }\n return {\n fn: moveUnitOver,\n args: [\n sections,\n sectionIndex,\n subsectionIndex,\n index,\n sectionIndex,\n subsectionIndex + step,\n 0,\n ],\n sectionId: section.id,\n subsectionId: sections[sectionIndex].childInfo.children[subsectionIndex + step].id,\n };\n } if (sectionIndex < sections.length - 1) {\n // move unit to first position of next subsection inside next section.\n const newSectionIndex = sectionIndex + step;\n if (sections[newSectionIndex].childInfo.children.length === 0) {\n // return if next section has no subsections.\n return {};\n }\n const newSubsectionIndex = 0;\n if (!sections[newSectionIndex].childInfo.children[newSubsectionIndex]?.actions?.childAddable) {\n // return if next subsection doesn't allow adding subsections\n return {};\n }\n return {\n fn: moveUnitOver,\n args: [\n sections,\n sectionIndex,\n subsectionIndex,\n index,\n newSectionIndex,\n newSubsectionIndex,\n 0,\n ],\n sectionId: sections[newSectionIndex].id,\n subsectionId: sections[newSectionIndex].childInfo.children[newSubsectionIndex].id,\n };\n }\n }\n return {};\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport {\n DndContext,\n closestCorners,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n sortableKeyboardCoordinates,\n} from '@dnd-kit/sortable';\nimport { restrictToVerticalAxis } from '@dnd-kit/modifiers';\n\nimport DragContextProvider from './DragContextProvider';\nimport { COURSE_BLOCK_NAMES } from '../../constants';\nimport {\n moveSubsectionOver,\n moveUnitOver,\n moveSubsection,\n moveUnit,\n dragHelpers,\n} from './utils';\n\nconst DraggableList = ({\n items,\n setSections,\n restoreSectionList,\n handleSectionDragAndDrop,\n handleSubsectionDragAndDrop,\n handleUnitDragAndDrop,\n children,\n}) => {\n const prevContainerInfo = React.useRef();\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n const [activeId, setActiveId] = React.useState();\n const [currentOverId, setCurrentOverId] = React.useState();\n\n const findItemInfo = (id) => {\n // search id in sections\n const sectionIndex = items.findIndex((section) => section.id === id);\n if (sectionIndex !== -1) {\n return {\n index: sectionIndex,\n item: items[sectionIndex],\n category: COURSE_BLOCK_NAMES.chapter.id,\n parent: 'root',\n };\n }\n\n // search id in subsections\n for (let index = 0; index < items.length; index++) {\n const section = items[index];\n const subsectionIndex = section.childInfo.children.findIndex((subsection) => subsection.id === id);\n if (subsectionIndex !== -1) {\n return {\n index: subsectionIndex,\n item: section.childInfo.children[subsectionIndex],\n category: COURSE_BLOCK_NAMES.sequential.id,\n parentIndex: index,\n parent: section,\n };\n }\n }\n\n // search id in units\n for (let index = 0; index < items.length; index++) {\n const section = items[index];\n for (let subIndex = 0; subIndex < section.childInfo.children.length; subIndex++) {\n const subsection = section.childInfo.children[subIndex];\n const unitIndex = subsection.childInfo.children.findIndex((unit) => unit.id === id);\n if (unitIndex !== -1) {\n return {\n index: unitIndex,\n item: subsection.childInfo.children[unitIndex],\n category: COURSE_BLOCK_NAMES.vertical.id,\n parentIndex: subIndex,\n parent: subsection,\n grandParentIndex: index,\n grandParent: section,\n };\n }\n }\n }\n return null;\n };\n\n // For reasons unknown, onDragEnd is not being triggered by dnd-kit while\n // testing drag over functions. The main functions responsible to move units\n // & subsections across parents are already tested as part of move blocks by\n // index in CourseOutline.test.jsx, just these functions which determine the\n // new index and parent are ignored.\n // See https://github.com/openedx/frontend-app-course-authoring/pull/859#discussion_r1519199622\n // for more details.\n /* istanbul ignore next */\n const subsectionDragOver = (active, over, activeInfo, overInfo) => {\n if (\n activeInfo.parent.id === overInfo.parent.id\n || activeInfo.parent.id === overInfo.item.id\n || (activeInfo.category === overInfo.category && !overInfo.parent.actions.childAddable)\n || (activeInfo.parent.category === overInfo.category && !overInfo.item.actions.childAddable)\n ) {\n return;\n }\n // Find the new index for the item\n let overSectionIndex;\n let newIndex;\n if (overInfo.category === COURSE_BLOCK_NAMES.chapter.id) {\n // We're at the root droppable of a container\n newIndex = overInfo.item.childInfo.children.length + 1;\n overSectionIndex = overInfo.index;\n setCurrentOverId(overInfo.item.id);\n } else {\n const modifier = dragHelpers.isBelowOverItem(active, over) ? 1 : 0;\n newIndex = overInfo.index >= 0 ? overInfo.index + modifier : overInfo.item.childInfo.children.length + 1;\n overSectionIndex = overInfo.parentIndex;\n setCurrentOverId(overInfo.parent.id);\n }\n\n setSections((prev) => {\n const [prevCopy] = moveSubsectionOver(\n [...prev],\n activeInfo.parentIndex,\n activeInfo.index,\n overSectionIndex,\n newIndex,\n );\n return prevCopy;\n });\n if (prevContainerInfo.current === null || prevContainerInfo.current === undefined) {\n prevContainerInfo.current = activeInfo.parent.id;\n }\n };\n\n /* istanbul ignore next */\n const unitDragOver = (active, over, activeInfo, overInfo) => {\n if (\n activeInfo.parent.id === overInfo.parent.id\n || activeInfo.parent.id === overInfo.item.id\n || (activeInfo.category === overInfo.category && !overInfo.parent.actions.childAddable)\n || (activeInfo.parent.category === overInfo.category && !overInfo.item.actions.childAddable)\n ) {\n return;\n }\n let overSubsectionIndex;\n let overSectionIndex;\n // Find the indexes for the items\n let newIndex;\n if (overInfo.category === COURSE_BLOCK_NAMES.sequential.id) {\n // We're at the root droppable of a container\n newIndex = overInfo.item.childInfo.children.length + 1;\n overSubsectionIndex = overInfo.index;\n overSectionIndex = overInfo.parentIndex;\n setCurrentOverId(overInfo.item.id);\n } else {\n const modifier = dragHelpers.isBelowOverItem(active, over) ? 1 : 0;\n newIndex = overInfo.index >= 0 ? overInfo.index + modifier : overInfo.item.childInfo.children.length + 1;\n overSubsectionIndex = overInfo.parentIndex;\n overSectionIndex = overInfo.grandParentIndex;\n setCurrentOverId(overInfo.parent.id);\n }\n\n setSections((prev) => {\n const [prevCopy] = moveUnitOver(\n [...prev],\n activeInfo.grandParentIndex,\n activeInfo.parentIndex,\n activeInfo.index,\n overSectionIndex,\n overSubsectionIndex,\n newIndex,\n );\n return prevCopy;\n });\n if (prevContainerInfo.current === null || prevContainerInfo.current === undefined) {\n prevContainerInfo.current = activeInfo.grandParent.id;\n }\n };\n\n /* istanbul ignore next */\n const handleDragOver = (event) => {\n const { active, over } = event;\n if (!active || !over) {\n return;\n }\n const { id } = active;\n const { id: overId } = over;\n\n // Find the containers\n const activeInfo = findItemInfo(id);\n const overInfo = findItemInfo(overId);\n if (!activeInfo || !overInfo) {\n return;\n }\n switch (activeInfo.category) {\n case COURSE_BLOCK_NAMES.sequential.id:\n subsectionDragOver(active, over, activeInfo, overInfo);\n break;\n case COURSE_BLOCK_NAMES.vertical.id:\n unitDragOver(active, over, activeInfo, overInfo);\n break;\n default:\n break;\n }\n };\n\n const handleDragEnd = (event) => {\n const { active, over } = event;\n if (!active || !over) {\n return;\n }\n setActiveId(null);\n setCurrentOverId(null);\n const { id } = active;\n const { id: overId } = over;\n\n const activeInfo = findItemInfo(id);\n const overInfo = findItemInfo(overId);\n if (!activeInfo || !overInfo) {\n return;\n }\n\n if (\n activeInfo.category !== overInfo.category\n || (activeInfo.parent !== 'root' && activeInfo.parentIndex !== overInfo.parentIndex)\n ) {\n return;\n }\n\n if (activeInfo.index !== overInfo.index || prevContainerInfo.current) {\n switch (activeInfo.category) {\n case COURSE_BLOCK_NAMES.chapter.id:\n setSections((prev) => {\n const result = arrayMove(prev, activeInfo.index, overInfo.index);\n handleSectionDragAndDrop(result.map(section => section.id), restoreSectionList);\n return result;\n });\n break;\n case COURSE_BLOCK_NAMES.sequential.id:\n setSections((prev) => {\n const [prevCopy, result] = moveSubsection(\n [...prev],\n activeInfo.parentIndex,\n activeInfo.index,\n overInfo.index,\n );\n handleSubsectionDragAndDrop(\n activeInfo.parent.id,\n prevContainerInfo.current,\n result.map(subsection => subsection.id),\n restoreSectionList,\n );\n return prevCopy;\n });\n break;\n case COURSE_BLOCK_NAMES.vertical.id:\n setSections((prev) => {\n const [prevCopy, result] = moveUnit(\n [...prev],\n activeInfo.grandParentIndex,\n activeInfo.parentIndex,\n activeInfo.index,\n overInfo.index,\n );\n handleUnitDragAndDrop(\n activeInfo.grandParent.id,\n prevContainerInfo.current,\n activeInfo.parent.id,\n result.map(unit => unit.id),\n restoreSectionList,\n );\n return prevCopy;\n });\n break;\n default:\n break;\n }\n prevContainerInfo.current = null;\n }\n };\n\n const handleDragStart = (event) => {\n const { active } = event;\n const { id } = active;\n\n setActiveId(id);\n };\n\n const customClosestCorners = ({\n active, droppableContainers, droppableRects, ...args\n }) => {\n const activeCategory = active.data?.current?.category;\n const filteredContainers = droppableContainers.filter(\n (container) => {\n switch (activeCategory) {\n case COURSE_BLOCK_NAMES.chapter.id:\n return container.data?.current?.category === activeCategory;\n case COURSE_BLOCK_NAMES.sequential.id:\n return [activeCategory, COURSE_BLOCK_NAMES.chapter.id].includes(container.data?.current?.category);\n case COURSE_BLOCK_NAMES.vertical.id:\n return [activeCategory, COURSE_BLOCK_NAMES.sequential.id].includes(container.data?.current?.category);\n default:\n return true;\n }\n },\n );\n return closestCorners({\n active, droppableContainers: filteredContainers, droppableRects, ...args,\n });\n };\n\n return (\n <DndContext\n modifiers={[restrictToVerticalAxis]}\n sensors={sensors}\n collisionDetection={customClosestCorners}\n onDragOver={handleDragOver}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <DragContextProvider activeId={activeId} overId={currentOverId}>\n {children}\n </DragContextProvider>\n </DndContext>\n );\n};\n\nDraggableList.propTypes = {\n items: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string.isRequired,\n childInfo: PropTypes.shape({\n children: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n childInfo: PropTypes.shape({\n children: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n }),\n ).isRequired,\n }).isRequired,\n }),\n ).isRequired,\n }).isRequired,\n })).isRequired,\n setSections: PropTypes.func.isRequired,\n restoreSectionList: PropTypes.func.isRequired,\n handleSectionDragAndDrop: PropTypes.func.isRequired,\n handleSubsectionDragAndDrop: PropTypes.func.isRequired,\n handleUnitDragAndDrop: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n};\n\nexport default DraggableList;\n","import { logError } from '@edx/frontend-platform/logging';\n\nimport { CLIPBOARD_STATUS, NOTIFICATION_MESSAGES } from '../../constants';\nimport {\n hideProcessingNotification,\n showProcessingNotification,\n} from '../processing-notification/data/slice';\nimport { RequestStatus } from '../../data/constants';\nimport {\n fetchOrganizations,\n updatePostErrors,\n updateLoadingStatuses,\n updateRedirectUrlObj,\n updateCourseRerunData,\n updateSavingStatus,\n updateClipboardData,\n} from './slice';\nimport {\n createOrRerunCourse,\n getOrganizations,\n getCourseRerun,\n updateClipboard,\n getClipboard,\n} from './api';\n\nexport function fetchOrganizationsQuery() {\n return async (dispatch) => {\n try {\n const organizations = await getOrganizations();\n dispatch(fetchOrganizations(organizations));\n dispatch(updateLoadingStatuses({ organizationLoadingStatus: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatuses({ organizationLoadingStatus: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function fetchCourseRerunQuery(courseId) {\n return async (dispatch) => {\n try {\n const courseRerun = await getCourseRerun(courseId);\n dispatch(updateCourseRerunData(courseRerun));\n dispatch(updateLoadingStatuses({ courseRerunLoadingStatus: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatuses({ courseRerunLoadingStatus: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function updateCreateOrRerunCourseQuery(courseData) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n\n try {\n const response = await createOrRerunCourse(courseData);\n dispatch(updateRedirectUrlObj('url' in response ? response : {}));\n dispatch(updatePostErrors('errMsg' in response ? response : {}));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport function copyToClipboard(usageKey) {\n const POLL_INTERVAL_MS = 1000; // Timeout duration for polling in milliseconds\n\n return async (dispatch) => {\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.copying));\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n\n try {\n let clipboardData = await updateClipboard(usageKey);\n\n while (clipboardData.content?.status === CLIPBOARD_STATUS.loading) {\n // eslint-disable-next-line no-await-in-loop,no-promise-executor-return\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n clipboardData = await getClipboard(); // eslint-disable-line no-await-in-loop\n }\n\n if (clipboardData.content?.status === CLIPBOARD_STATUS.ready) {\n dispatch(updateClipboardData(clipboardData));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } else {\n throw new Error(`Unexpected clipboard status \"${clipboardData.content?.status}\" in successful API response.`);\n }\n } catch (error) {\n logError('Error copying to clipboard:', error);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n","/**\n * The utilities are taken from the https://github.com/openedx/studio-frontend repository.\n * Perform a minor refactoring of the functions while preserving their original functionality.\n */\n\nexport const hasWelcomeMessage = (updates) => updates.hasUpdate;\n\nexport const hasGradingPolicy = (grades) => {\n // eslint-disable-next-line no-shadow\n const { hasGradingPolicy, sumOfWeights } = grades;\n\n return hasGradingPolicy && parseFloat(sumOfWeights.toPrecision(2), 10) === 1.0;\n};\n\nexport const hasCertificate = (certificates) => {\n // eslint-disable-next-line no-shadow\n const { isActivated, hasCertificate } = certificates;\n\n return isActivated && hasCertificate;\n};\n\nexport const hasDates = (dates) => {\n const { hasStartDate, hasEndDate } = dates;\n\n return hasStartDate && hasEndDate;\n};\n\nexport const hasAssignmentDeadlines = (assignments, dates) => {\n const {\n totalNumber,\n assignmentsWithDatesBeforeStart,\n assignmentsWithDatesAfterEnd,\n assignmentsWithOraDatesBeforeStart,\n assignmentsWithOraDatesAfterEnd,\n } = assignments;\n\n if (!hasDates(dates)) {\n return false;\n }\n if (totalNumber === 0) {\n return false;\n }\n if (assignmentsWithDatesBeforeStart.length > 0) {\n return false;\n }\n if (assignmentsWithDatesAfterEnd.length > 0) {\n return false;\n }\n if (assignmentsWithOraDatesBeforeStart.length > 0) {\n return false;\n }\n if (assignmentsWithOraDatesAfterEnd.length > 0) {\n return false;\n }\n\n return true;\n};\n\nexport const hasShortVideoDuration = (videos) => {\n const { totalNumber, durations } = videos;\n\n if (totalNumber === 0) {\n return true;\n }\n if (totalNumber > 0 && durations.median <= 600) {\n return true;\n }\n\n return false;\n};\n\nexport const hasMobileFriendlyVideos = (videos) => {\n const { totalNumber, numMobileEncoded } = videos;\n\n if (totalNumber === 0) {\n return true;\n }\n if (totalNumber > 0 && (numMobileEncoded / totalNumber) >= 0.9) {\n return true;\n }\n\n return false;\n};\n\nexport const hasDiverseSequences = (subsections) => {\n const { totalVisible, numWithOneBlockType } = subsections;\n\n if (totalVisible === 0) {\n return false;\n }\n if (totalVisible > 0) {\n return ((numWithOneBlockType / totalVisible) < 0.2);\n }\n\n return false;\n};\n\nexport const hasWeeklyHighlights = (sections) => {\n const { highlightsActiveForCourse, highlightsEnabled } = sections;\n\n return highlightsActiveForCourse && highlightsEnabled;\n};\n\nexport const hasShortUnitDepth = (units) => units.numBlocks.median <= 3;\n\nexport const hasProctoringEscalationEmail = (proctoring) => proctoring.hasProctoringEscalationEmail;\n","import { CHECKLIST_FILTERS } from '../constants';\nimport * as healthValidators from './courseChecklistValidators';\n\n/**\n * The utilities are taken from the https://github.com/openedx/studio-frontend repository.\n * Perform a minor refactoring of the functions while preserving their original functionality.\n */\nconst getChecklistValidatedValue = (data, id) => {\n const {\n updates,\n grades,\n certificates,\n dates,\n assignments,\n videos,\n subsections,\n sections,\n units,\n proctoring,\n } = data;\n\n switch (id) {\n case 'welcomeMessage':\n return healthValidators.hasWelcomeMessage(updates);\n case 'gradingPolicy':\n return healthValidators.hasGradingPolicy(grades);\n case 'certificate':\n return healthValidators.hasCertificate(certificates);\n case 'courseDates':\n return healthValidators.hasDates(dates);\n case 'assignmentDeadlines':\n return healthValidators.hasAssignmentDeadlines(assignments, dates);\n case 'videoDuration':\n return healthValidators.hasShortVideoDuration(videos);\n case 'mobileFriendlyVideo':\n return healthValidators.hasMobileFriendlyVideos(videos);\n case 'diverseSequences':\n return healthValidators.hasDiverseSequences(subsections);\n case 'weeklyHighlights':\n return healthValidators.hasWeeklyHighlights(sections);\n case 'unitDepth':\n return healthValidators.hasShortUnitDepth(units);\n case 'proctoringEmail':\n return healthValidators.hasProctoringEscalationEmail(proctoring);\n default:\n throw new Error(`Unknown validator ${id}.`);\n }\n};\n\nconst getChecklistValues = ({\n checklist,\n isSelfPaced,\n hasCertificatesEnabled,\n hasHighlightsEnabled,\n needsProctoringEscalationEmail,\n}) => {\n let filteredCheckList;\n\n if (isSelfPaced) {\n filteredCheckList = checklist.filter(({ pacingTypeFilter }) => pacingTypeFilter === CHECKLIST_FILTERS.ALL\n || pacingTypeFilter === CHECKLIST_FILTERS.SELF_PACED);\n } else {\n filteredCheckList = checklist.filter(({ pacingTypeFilter }) => pacingTypeFilter === CHECKLIST_FILTERS.ALL\n || pacingTypeFilter === CHECKLIST_FILTERS.INSTRUCTOR_PACED);\n }\n\n filteredCheckList = filteredCheckList.filter(({ id }) => id !== 'certificate'\n || hasCertificatesEnabled);\n\n filteredCheckList = filteredCheckList.filter(({ id }) => id !== 'weeklyHighlights'\n || hasHighlightsEnabled);\n\n filteredCheckList = filteredCheckList.filter(({ id }) => id !== 'proctoringEmail'\n || needsProctoringEscalationEmail);\n\n return filteredCheckList;\n};\n\nexport { getChecklistValues, getChecklistValidatedValue };\n","// @ts-check\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\n\nexport const getCourseOutlineIndexApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/course_index/${courseId}`;\n\nexport const getCourseBestPracticesApiUrl = ({\n courseId,\n excludeGraded,\n all,\n}) => `${getApiBaseUrl()}/api/courses/v1/quality/${courseId}/?exclude_graded=${excludeGraded}&all=${all}`;\n\nexport const getCourseLaunchApiUrl = ({\n courseId,\n gradedOnly,\n validateOras,\n all,\n}) => `${getApiBaseUrl()}/api/courses/v1/validation/${courseId}/?graded_only=${gradedOnly}&validate_oras=${validateOras}&all=${all}`;\n\nexport const getCourseBlockApiUrl = (courseId) => {\n const formattedCourseId = courseId.split('course-v1:')[1];\n return `${getApiBaseUrl()}/xblock/block-v1:${formattedCourseId}+type@course+block@course`;\n};\n\nexport const getCourseReindexApiUrl = (reindexLink) => `${getApiBaseUrl()}${reindexLink}`;\nexport const getXBlockBaseApiUrl = () => `${getApiBaseUrl()}/xblock/`;\nexport const getCourseItemApiUrl = (itemId) => `${getXBlockBaseApiUrl()}${itemId}`;\nexport const getXBlockApiUrl = (blockId) => `${getXBlockBaseApiUrl()}outline/${blockId}`;\nexport const getClipboardUrl = () => `${getApiBaseUrl()}/api/content-staging/v1/clipboard/`;\nexport const exportTags = (courseId) => `${getApiBaseUrl()}/api/content_tagging/v1/object_tags/${courseId}/export/`;\n\n/**\n * @typedef {Object} courseOutline\n * @property {string} courseReleaseDate\n * @property {Object} courseStructure\n * @property {Object} deprecatedBlocksInfo\n * @property {string} discussionsIncontextFeedbackUrl\n * @property {string} discussionsIncontextLearnmoreUrl\n * @property {Object} initialState\n * @property {Object} initialUserClipboard\n * @property {string} languageCode\n * @property {string} lmsLink\n * @property {string} mfeProctoredExamSettingsUrl\n * @property {string} notificationDismissUrl\n * @property {string[]} proctoringErrors\n * @property {string} reindexLink\n * @property {null} rerunNotificationId\n */\n\n/**\n * Get course outline index.\n * @param {string} courseId\n * @returns {Promise<courseOutline>}\n */\nexport async function getCourseOutlineIndex(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseOutlineIndexApiUrl(courseId));\n\n return camelCaseObject(data);\n}\n\n/**\n * Get course best practices.\n * @param {{courseId: string, excludeGraded: boolean, all: boolean}} options\n * @returns {Promise<{isSelfPaced: boolean, sections: any, subsection: any, units: any, videos: any }>}\n */\nexport async function getCourseBestPractices({\n courseId,\n excludeGraded,\n all,\n}) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseBestPracticesApiUrl({ courseId, excludeGraded, all }));\n\n return camelCaseObject(data);\n}\n\n/** @typedef {object} courseLaunchData\n * @property {boolean} isSelfPaced\n * @property {object} dates\n * @property {object} assignments\n * @property {object} grades\n * @property {number} grades.sum_of_weights\n * @property {object} certificates\n * @property {object} updates\n * @property {object} proctoring\n */\n\n/**\n * Get course launch.\n * @param {{courseId: string, gradedOnly: boolean, validateOras: boolean, all: boolean}} options\n * @returns {Promise<courseLaunchData>}\n */\nexport async function getCourseLaunch({\n courseId,\n gradedOnly,\n validateOras,\n all,\n}) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseLaunchApiUrl({\n courseId, gradedOnly, validateOras, all,\n }));\n\n return camelCaseObject(data);\n}\n\n/**\n * Enable course highlights emails\n * @param {string} courseId\n * @returns {Promise<Object>}\n */\nexport async function enableCourseHighlightsEmails(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getCourseBlockApiUrl(courseId), {\n publish: 'republish',\n metadata: {\n highlights_enabled_for_messaging: true,\n },\n });\n\n return data;\n}\n\n/**\n * Restart reindex course\n * @param {string} reindexLink\n * @returns {Promise<Object>}\n */\nexport async function restartIndexingOnCourse(reindexLink) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseReindexApiUrl(reindexLink));\n\n return camelCaseObject(data);\n}\n\n/**\n * @typedef {Object} section\n * @property {string} id\n * @property {string} displayName\n * @property {string} category\n * @property {boolean} hasChildren\n * @property {string} editedOn\n * @property {boolean} published\n * @property {string} publishedOn\n * @property {string} studioUrl\n * @property {boolean} releasedToStudents\n * @property {string} releaseDate\n * @property {string} visibilityState\n * @property {boolean} hasExplicitStaffLock\n * @property {string} start\n * @property {boolean} graded\n * @property {string} dueDate\n * @property {null} due\n * @property {null} relativeWeeksDue\n * @property {null} format\n * @property {string[]} courseGraders\n * @property {boolean} hasChanges\n * @property {object} actions\n * @property {null} explanatoryMessage\n * @property {object[]} userPartitions\n * @property {string} showCorrectness\n * @property {string[]} highlights\n * @property {boolean} highlightsEnabled\n * @property {boolean} highlightsPreviewOnly\n * @property {string} highlightsDocUrl\n * @property {object} childInfo\n * @property {boolean} ancestorHasStaffLock\n * @property {boolean} staffOnlyMessage\n * @property {boolean} hasPartitionGroupComponents\n * @property {object} userPartitionInfo\n * @property {boolean} enableCopyPasteUnits\n */\n\n/**\n * Get course section\n * @param {string} itemId\n * @returns {Promise<section>}\n */\nexport async function getCourseItem(itemId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getXBlockApiUrl(itemId));\n return camelCaseObject(data);\n}\n\n/**\n * Update course section highlights\n * @param {string} sectionId\n * @param {Array<string>} highlights\n * @returns {Promise<Object>}\n */\nexport async function updateCourseSectionHighlights(sectionId, highlights) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getCourseItemApiUrl(sectionId), {\n publish: 'republish',\n metadata: {\n highlights,\n },\n });\n\n return data;\n}\n\n/**\n * Publish course section\n * @param {string} sectionId\n * @returns {Promise<Object>}\n */\nexport async function publishCourseSection(sectionId) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getCourseItemApiUrl(sectionId), {\n publish: 'make_public',\n });\n\n return data;\n}\n\n/**\n * Configure course section\n * @param {string} sectionId\n * @param {boolean} isVisibleToStaffOnly\n * @param {string} startDatetime\n * @returns {Promise<Object>}\n */\nexport async function configureCourseSection(sectionId, isVisibleToStaffOnly, startDatetime) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getCourseItemApiUrl(sectionId), {\n publish: 'republish',\n metadata: {\n // The backend expects metadata.visible_to_staff_only to either true or null\n visible_to_staff_only: isVisibleToStaffOnly ? true : null,\n start: startDatetime,\n },\n });\n\n return data;\n}\n\n/**\n * Configure course section\n * @param {string} itemId\n * @param {string} isVisibleToStaffOnly\n * @param {string} releaseDate\n * @param {string} graderType\n * @param {string} dueDate\n * @param {boolean} isProctoredExam,\n * @param {boolean} isOnboardingExam,\n * @param {boolean} isPracticeExam,\n * @param {string} examReviewRules,\n * @param {boolean} isTimeLimited\n * @param {number} defaultTimeLimitMin\n * @param {string} hideAfterDue\n * @param {string} showCorrectness\n * @param {boolean} isPrereq,\n * @param {string} prereqUsageKey,\n * @param {number} prereqMinScore,\n * @param {number} prereqMinCompletion,\n * @returns {Promise<Object>}\n */\nexport async function configureCourseSubsection(\n itemId,\n isVisibleToStaffOnly,\n releaseDate,\n graderType,\n dueDate,\n isTimeLimited,\n isProctoredExam,\n isOnboardingExam,\n isPracticeExam,\n examReviewRules,\n defaultTimeLimitMin,\n hideAfterDue,\n showCorrectness,\n isPrereq,\n prereqUsageKey,\n prereqMinScore,\n prereqMinCompletion,\n) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getCourseItemApiUrl(itemId), {\n publish: 'republish',\n graderType,\n isPrereq,\n prereqUsageKey,\n prereqMinScore,\n prereqMinCompletion,\n metadata: {\n // The backend expects metadata.visible_to_staff_only to either true or null\n visible_to_staff_only: isVisibleToStaffOnly ? true : null,\n due: dueDate,\n hide_after_due: hideAfterDue,\n show_correctness: showCorrectness,\n is_practice_exam: isPracticeExam,\n is_time_limited: isTimeLimited,\n is_proctored_enabled: isProctoredExam || isPracticeExam || isOnboardingExam,\n exam_review_rules: examReviewRules,\n default_time_limit_minutes: defaultTimeLimitMin,\n is_onboarding_exam: isOnboardingExam,\n start: releaseDate,\n },\n });\n return data;\n}\n\n/**\n * Configure course unit\n * @param {string} unitId\n * @param {boolean} isVisibleToStaffOnly\n * @param {object} groupAccess\n * @returns {Promise<Object>}\n */\nexport async function configureCourseUnit(unitId, isVisibleToStaffOnly, groupAccess) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getCourseItemApiUrl(unitId), {\n publish: 'republish',\n metadata: {\n // The backend expects metadata.visible_to_staff_only to either true or null\n visible_to_staff_only: isVisibleToStaffOnly ? true : null,\n group_access: groupAccess,\n },\n });\n\n return data;\n}\n\n/**\n * Edit course section\n * @param {string} itemId\n * @param {string} displayName\n * @returns {Promise<Object>}\n */\nexport async function editItemDisplayName(itemId, displayName) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getCourseItemApiUrl(itemId), {\n metadata: {\n display_name: displayName,\n },\n });\n\n return data;\n}\n\n/**\n * Delete course section\n * @param {string} itemId\n * @returns {Promise<Object>}\n */\nexport async function deleteCourseItem(itemId) {\n const { data } = await getAuthenticatedHttpClient()\n .delete(getCourseItemApiUrl(itemId));\n\n return data;\n}\n\n/**\n * Duplicate course section\n * @param {string} itemId\n * @param {string} parentId\n * @returns {Promise<Object>}\n */\nexport async function duplicateCourseItem(itemId, parentId) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getXBlockBaseApiUrl(), {\n duplicate_source_locator: itemId,\n parent_locator: parentId,\n });\n\n return data;\n}\n\n/**\n * Add new course item like section, subsection or unit.\n * @param {string} parentLocator\n * @param {string} category\n * @param {string} displayName\n * @returns {Promise<Object>}\n */\nexport async function addNewCourseItem(parentLocator, category, displayName) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getXBlockBaseApiUrl(), {\n parent_locator: parentLocator,\n category,\n display_name: displayName,\n });\n\n return data;\n}\n\n/**\n * Set order for the list of the sections\n * @param {string} courseId\n * @param {Array<string>} children list of sections id's\n * @returns {Promise<Object>}\n*/\nexport async function setSectionOrderList(courseId, children) {\n const { data } = await getAuthenticatedHttpClient()\n .put(getCourseBlockApiUrl(courseId), {\n children,\n });\n\n return data;\n}\n\n/**\n * Set order for the list of the subsections\n * @param {string} itemId Subsection or unit ID\n * @param {Array<string>} children list of sections id's\n * @returns {Promise<Object>}\n*/\nexport async function setCourseItemOrderList(itemId, children) {\n const { data } = await getAuthenticatedHttpClient()\n .put(getCourseItemApiUrl(itemId), {\n children,\n });\n\n return data;\n}\n\n/**\n * Set video sharing setting\n * @param {string} courseId\n * @param {string} videoSharingOption\n * @returns {Promise<Object>}\n*/\nexport async function setVideoSharingOption(courseId, videoSharingOption) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getCourseBlockApiUrl(courseId), {\n metadata: {\n video_sharing_options: videoSharingOption,\n },\n });\n\n return data;\n}\n\n/**\n * Paste block to clipboard\n * @param {string} parentLocator\n * @returns {Promise<Object>}\n*/\nexport async function pasteBlock(parentLocator) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getXBlockBaseApiUrl(), {\n parent_locator: parentLocator,\n staged_content: 'clipboard',\n });\n\n return camelCaseObject(data);\n}\n\n/**\n * Dismiss notification\n * @param {string} url\n * @returns void\n*/\nexport async function dismissNotification(url) {\n await getAuthenticatedHttpClient()\n .delete(url);\n}\n\n/**\n * Downloads the file of the exported tags\n * @param {string} courseId The ID of the content\n * @returns void\n */\nexport async function getTagsExportFile(courseId, courseName) {\n // Gets exported tags and builds the blob to download CSV file.\n // This can be done with this code:\n // `window.location.href = exportTags(contentId);`\n // but it is done in this way so we know when the operation ends to close the toast.\n const response = await getAuthenticatedHttpClient().get(exportTags(courseId), {\n responseType: 'blob',\n });\n\n /* istanbul ignore next */\n if (response.status !== 200) {\n throw response.statusText;\n }\n\n const blob = new Blob([response.data], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n\n const a = document.createElement('a');\n a.href = url;\n a.download = `${courseName}.csv`;\n a.click();\n\n window.URL.revokeObjectURL(url);\n}\n","import { RequestStatus } from '../../data/constants';\nimport { updateClipboardData } from '../../generic/data/slice';\nimport { NOTIFICATION_MESSAGES } from '../../constants';\nimport { API_ERROR_TYPES, COURSE_BLOCK_NAMES } from '../constants';\nimport {\n hideProcessingNotification,\n showProcessingNotification,\n} from '../../generic/processing-notification/data/slice';\nimport {\n getCourseBestPracticesChecklist,\n getCourseLaunchChecklist,\n} from '../utils/getChecklistForStatusBar';\nimport {\n addNewCourseItem,\n deleteCourseItem,\n duplicateCourseItem,\n editItemDisplayName,\n enableCourseHighlightsEmails,\n getCourseBestPractices,\n getCourseLaunch,\n getCourseOutlineIndex,\n getCourseItem,\n publishCourseSection,\n configureCourseSection,\n configureCourseSubsection,\n configureCourseUnit,\n restartIndexingOnCourse,\n updateCourseSectionHighlights,\n setSectionOrderList,\n setVideoSharingOption,\n setCourseItemOrderList,\n pasteBlock,\n dismissNotification,\n} from './api';\nimport {\n addSection,\n addSubsection,\n fetchOutlineIndexSuccess,\n updateOutlineIndexLoadingStatus,\n updateReindexLoadingStatus,\n updateStatusBar,\n updateCourseActions,\n fetchStatusBarChecklistSuccess,\n fetchStatusBarSelPacedSuccess,\n updateSavingStatus,\n updateSectionList,\n updateFetchSectionLoadingStatus,\n deleteSection,\n deleteSubsection,\n deleteUnit,\n duplicateSection,\n reorderSectionList,\n setPasteFileNotices,\n updateCourseLaunchQueryStatus,\n} from './slice';\n\nconst getErrorDetails = (error, dismissible = true) => {\n const errorInfo = { dismissible };\n if (error.response?.data) {\n errorInfo.data = JSON.stringify(error.response.data);\n errorInfo.status = error.response.status;\n errorInfo.type = API_ERROR_TYPES.serverError;\n } else if (error.request) {\n errorInfo.type = API_ERROR_TYPES.networkError;\n } else {\n errorInfo.type = API_ERROR_TYPES.unknown;\n errorInfo.data = error.message;\n }\n return errorInfo;\n};\n\nexport function fetchCourseOutlineIndexQuery(courseId) {\n return async (dispatch) => {\n dispatch(updateOutlineIndexLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const outlineIndex = await getCourseOutlineIndex(courseId);\n const {\n courseReleaseDate,\n courseStructure: {\n highlightsEnabledForMessaging,\n videoSharingEnabled,\n videoSharingOptions,\n actions,\n },\n } = outlineIndex;\n dispatch(fetchOutlineIndexSuccess(outlineIndex));\n dispatch(updateClipboardData(outlineIndex.initialUserClipboard));\n dispatch(updateStatusBar({\n courseReleaseDate,\n highlightsEnabledForMessaging,\n videoSharingOptions,\n videoSharingEnabled,\n }));\n dispatch(updateCourseActions(actions));\n\n dispatch(updateOutlineIndexLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateOutlineIndexLoadingStatus({\n status: RequestStatus.FAILED,\n errors: getErrorDetails(error, false),\n }));\n }\n };\n}\n\nexport function fetchCourseLaunchQuery({\n courseId,\n gradedOnly = true,\n validateOras = true,\n all = true,\n}) {\n return async (dispatch) => {\n dispatch(updateCourseLaunchQueryStatus({ status: RequestStatus.IN_PROGRESS }));\n try {\n const data = await getCourseLaunch({\n courseId, gradedOnly, validateOras, all,\n });\n dispatch(fetchStatusBarSelPacedSuccess({ isSelfPaced: data.isSelfPaced }));\n dispatch(fetchStatusBarChecklistSuccess(getCourseLaunchChecklist(data)));\n\n dispatch(updateCourseLaunchQueryStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateCourseLaunchQueryStatus({\n status: RequestStatus.FAILED,\n errors: getErrorDetails(error),\n }));\n }\n };\n}\n\nexport function fetchCourseBestPracticesQuery({\n courseId,\n excludeGraded = true,\n all = true,\n}) {\n return async (dispatch) => {\n try {\n const data = await getCourseBestPractices({ courseId, excludeGraded, all });\n dispatch(fetchStatusBarChecklistSuccess(getCourseBestPracticesChecklist(data)));\n\n return true;\n } catch (error) {\n return false;\n }\n };\n}\n\nexport function enableCourseHighlightsEmailsQuery(courseId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await enableCourseHighlightsEmails(courseId);\n dispatch(fetchCourseOutlineIndexQuery(courseId));\n\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(hideProcessingNotification());\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function setVideoSharingOptionQuery(courseId, option) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await setVideoSharingOption(courseId, option);\n dispatch(updateStatusBar({ videoSharingOptions: option }));\n\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(hideProcessingNotification());\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function fetchCourseReindexQuery(courseId, reindexLink) {\n return async (dispatch) => {\n dispatch(updateReindexLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n await restartIndexingOnCourse(reindexLink);\n dispatch(updateReindexLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateReindexLoadingStatus({\n status: RequestStatus.FAILED,\n errors: getErrorDetails(error),\n }));\n }\n };\n}\n\nexport function fetchCourseSectionQuery(sectionIds, shouldScroll = false) {\n return async (dispatch) => {\n dispatch(updateFetchSectionLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n try {\n const sections = {};\n const results = await Promise.all(sectionIds.map((sectionId) => getCourseItem(sectionId)));\n results.forEach((data) => {\n // eslint-disable-next-line no-param-reassign\n data.shouldScroll = shouldScroll;\n sections[data.id] = data;\n });\n dispatch(updateSectionList(sections));\n dispatch(updateFetchSectionLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateFetchSectionLoadingStatus({\n status: RequestStatus.FAILED,\n errors: getErrorDetails(error),\n }));\n }\n };\n}\n\nexport function updateCourseSectionHighlightsQuery(sectionId, highlights) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await updateCourseSectionHighlights(sectionId, highlights).then(async (result) => {\n if (result) {\n await dispatch(fetchCourseSectionQuery([sectionId]));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(hideProcessingNotification());\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function publishCourseItemQuery(itemId, sectionId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await publishCourseSection(itemId).then(async (result) => {\n if (result) {\n await dispatch(fetchCourseSectionQuery([sectionId]));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function configureCourseItemQuery(sectionId, configureFn) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await configureFn().then(async (result) => {\n if (result) {\n await dispatch(fetchCourseSectionQuery([sectionId]));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function configureCourseSectionQuery(sectionId, isVisibleToStaffOnly, startDatetime) {\n return async (dispatch) => {\n dispatch(configureCourseItemQuery(\n sectionId,\n async () => configureCourseSection(sectionId, isVisibleToStaffOnly, startDatetime),\n ));\n };\n}\n\nexport function configureCourseSubsectionQuery(\n itemId,\n sectionId,\n isVisibleToStaffOnly,\n releaseDate,\n graderType,\n dueDate,\n isTimeLimited,\n isProctoredExam,\n isOnboardingExam,\n isPracticeExam,\n examReviewRules,\n defaultTimeLimitMin,\n hideAfterDue,\n showCorrectness,\n isPrereq,\n prereqUsageKey,\n prereqMinScore,\n prereqMinCompletion,\n) {\n return async (dispatch) => {\n dispatch(configureCourseItemQuery(\n sectionId,\n async () => configureCourseSubsection(\n itemId,\n isVisibleToStaffOnly,\n releaseDate,\n graderType,\n dueDate,\n isTimeLimited,\n isProctoredExam,\n isOnboardingExam,\n isPracticeExam,\n examReviewRules,\n defaultTimeLimitMin,\n hideAfterDue,\n showCorrectness,\n isPrereq,\n prereqUsageKey,\n prereqMinScore,\n prereqMinCompletion,\n ),\n ));\n };\n}\n\nexport function configureCourseUnitQuery(itemId, sectionId, isVisibleToStaffOnly, groupAccess) {\n return async (dispatch) => {\n dispatch(configureCourseItemQuery(\n sectionId,\n async () => configureCourseUnit(itemId, isVisibleToStaffOnly, groupAccess),\n ));\n };\n}\n\nexport function editCourseItemQuery(itemId, sectionId, displayName) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await editItemDisplayName(itemId, displayName).then(async (result) => {\n if (result) {\n await dispatch(fetchCourseSectionQuery([sectionId]));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\n/**\n * Generic function to delete course item, see below wrapper funcs for specific implementations.\n * @param {string} itemId\n * @param {() => {}} deleteItemFn\n * @returns {}\n */\nfunction deleteCourseItemQuery(itemId, deleteItemFn) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.deleting));\n\n try {\n await deleteCourseItem(itemId);\n dispatch(deleteItemFn());\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function deleteCourseSectionQuery(sectionId) {\n return async (dispatch) => {\n dispatch(deleteCourseItemQuery(\n sectionId,\n () => deleteSection({ itemId: sectionId }),\n ));\n };\n}\n\nexport function deleteCourseSubsectionQuery(subsectionId, sectionId) {\n return async (dispatch) => {\n dispatch(deleteCourseItemQuery(\n subsectionId,\n () => deleteSubsection({ itemId: subsectionId, sectionId }),\n ));\n };\n}\n\nexport function deleteCourseUnitQuery(unitId, subsectionId, sectionId) {\n return async (dispatch) => {\n dispatch(deleteCourseItemQuery(\n unitId,\n () => deleteUnit({ itemId: unitId, subsectionId, sectionId }),\n ));\n };\n}\n\n/**\n * Generic function to duplicate any course item. See wrapper functions below for specific implementations.\n * @param {string} itemId\n * @param {string} parentLocator\n * @param {(locator) => Promise<any>} duplicateFn\n * @returns {}\n */\nfunction duplicateCourseItemQuery(itemId, parentLocator, duplicateFn) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.duplicating));\n\n try {\n await duplicateCourseItem(itemId, parentLocator).then(async (result) => {\n if (result) {\n await duplicateFn(result.locator);\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function duplicateSectionQuery(sectionId, courseBlockId) {\n return async (dispatch) => {\n dispatch(duplicateCourseItemQuery(\n sectionId,\n courseBlockId,\n async (locator) => {\n const duplicatedItem = await getCourseItem(locator);\n // Page should scroll to newly duplicated item.\n duplicatedItem.shouldScroll = true;\n dispatch(duplicateSection({ id: sectionId, duplicatedItem }));\n },\n ));\n };\n}\n\nexport function duplicateSubsectionQuery(subsectionId, sectionId) {\n return async (dispatch) => {\n dispatch(duplicateCourseItemQuery(\n subsectionId,\n sectionId,\n async () => dispatch(fetchCourseSectionQuery([sectionId], true)),\n ));\n };\n}\n\nexport function duplicateUnitQuery(unitId, subsectionId, sectionId) {\n return async (dispatch) => {\n dispatch(duplicateCourseItemQuery(\n unitId,\n subsectionId,\n async () => dispatch(fetchCourseSectionQuery([sectionId], true)),\n ));\n };\n}\n\n/**\n * Generic function to add any course item. See wrapper functions below for specific implementations.\n * @param {string} parentLocator\n * @param {string} category\n * @param {string} displayName\n * @param {(data) => {}} addItemFn\n * @returns {}\n */\nfunction addNewCourseItemQuery(parentLocator, category, displayName, addItemFn) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await addNewCourseItem(\n parentLocator,\n category,\n displayName,\n ).then(async (result) => {\n if (result) {\n await addItemFn(result);\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(hideProcessingNotification());\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function addNewSectionQuery(parentLocator) {\n return async (dispatch) => {\n dispatch(addNewCourseItemQuery(\n parentLocator,\n COURSE_BLOCK_NAMES.chapter.id,\n COURSE_BLOCK_NAMES.chapter.name,\n async (result) => {\n const data = await getCourseItem(result.locator);\n // Page should scroll to newly created section.\n data.shouldScroll = true;\n dispatch(addSection(data));\n },\n ));\n };\n}\n\nexport function addNewSubsectionQuery(parentLocator) {\n return async (dispatch) => {\n dispatch(addNewCourseItemQuery(\n parentLocator,\n COURSE_BLOCK_NAMES.sequential.id,\n COURSE_BLOCK_NAMES.sequential.name,\n async (result) => {\n const data = await getCourseItem(result.locator);\n // Page should scroll to newly created subsection.\n data.shouldScroll = true;\n dispatch(addSubsection({ parentLocator, data }));\n },\n ));\n };\n}\n\nexport function addNewUnitQuery(parentLocator, callback) {\n return async (dispatch) => {\n dispatch(addNewCourseItemQuery(\n parentLocator,\n COURSE_BLOCK_NAMES.vertical.id,\n COURSE_BLOCK_NAMES.vertical.name,\n async (result) => callback(result.locator),\n ));\n };\n}\n\nfunction setBlockOrderListQuery(\n parentId,\n blockIds,\n apiFn,\n restoreCallback,\n successCallback,\n) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await apiFn(parentId, blockIds).then(async (result) => {\n if (result) {\n successCallback();\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(hideProcessingNotification());\n }\n });\n } catch (error) {\n restoreCallback();\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function setSectionOrderListQuery(courseId, sectionListIds, restoreCallback) {\n return async (dispatch) => {\n dispatch(setBlockOrderListQuery(\n courseId,\n sectionListIds,\n setSectionOrderList,\n restoreCallback,\n () => dispatch(reorderSectionList(sectionListIds)),\n ));\n };\n}\n\nexport function setSubsectionOrderListQuery(\n sectionId,\n prevSectionId,\n subsectionListIds,\n restoreCallback,\n) {\n return async (dispatch) => {\n dispatch(setBlockOrderListQuery(\n sectionId,\n subsectionListIds,\n setCourseItemOrderList,\n restoreCallback,\n () => {\n const sectionIds = [sectionId];\n if (prevSectionId && prevSectionId !== sectionId) {\n sectionIds.push(prevSectionId);\n }\n dispatch(fetchCourseSectionQuery(sectionIds));\n },\n ));\n };\n}\n\nexport function setUnitOrderListQuery(\n sectionId,\n subsectionId,\n prevSectionId,\n unitListIds,\n restoreCallback,\n) {\n return async (dispatch) => {\n dispatch(setBlockOrderListQuery(\n subsectionId,\n unitListIds,\n setCourseItemOrderList,\n restoreCallback,\n () => {\n const sectionIds = [sectionId];\n if (prevSectionId && prevSectionId !== sectionId) {\n sectionIds.push(prevSectionId);\n }\n dispatch(fetchCourseSectionQuery(sectionIds));\n },\n ));\n };\n}\n\nexport function pasteClipboardContent(parentLocator, sectionId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.pasting));\n\n try {\n await pasteBlock(parentLocator).then(async (result) => {\n if (result) {\n dispatch(fetchCourseSectionQuery([sectionId], true));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(hideProcessingNotification());\n dispatch(setPasteFileNotices(result?.staticFileNotices));\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function dismissNotificationQuery(url) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n\n try {\n await dismissNotification(url).then(async () => {\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n });\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n","import { LAUNCH_CHECKLIST, BEST_PRACTICES_CHECKLIST } from '../constants';\nimport { getChecklistValues, getChecklistValidatedValue } from './getChecklistValues';\n\n/**\n * Get status bar course launch checklist values\n * @param {object} data - course launch data\n * @returns {\n * totalCourseLaunchChecks: {number},\n * completedCourseLaunchChecks: {number}\n * } - total and completed launch checklist items\n */\nconst getCourseLaunchChecklist = (data) => {\n if (Object.keys(data).length > 0) {\n const { isSelfPaced, certificates } = data;\n\n const filteredCourseLaunchChecks = getChecklistValues({\n checklist: LAUNCH_CHECKLIST.data,\n isSelfPaced,\n hasCertificatesEnabled: certificates.isEnabled,\n hasHighlightsEnabled: false,\n });\n\n const completedCourseLaunchChecks = filteredCourseLaunchChecks.reduce((result, currentValue) => {\n const value = getChecklistValidatedValue(data, currentValue.id);\n return value ? result + 1 : result;\n }, 0);\n\n return {\n totalCourseLaunchChecks: filteredCourseLaunchChecks.length,\n completedCourseLaunchChecks,\n };\n }\n\n return {\n totalCourseLaunchChecks: 0,\n completedCourseLaunchChecks: 0,\n };\n};\n\n/**\n * Get status bar course best practices checklist values\n * @param {object} data - course best practices data\n * @returns {\n * totalCourseBestPracticesChecks: {number},\n * completedCourseBestPracticesChecks: {number}\n * } - total and completed launch checklist items\n */\nconst getCourseBestPracticesChecklist = (data) => {\n if (Object.keys(data).length > 0) {\n const { isSelfPaced, sections } = data;\n\n const filteredBestPracticesChecks = getChecklistValues({\n checklist: BEST_PRACTICES_CHECKLIST.data,\n isSelfPaced,\n hasCertificatesEnabled: false,\n hasHighlightsEnabled: sections.highlightsEnadled,\n });\n\n const completedCourseBestPracticesChecks = filteredBestPracticesChecks.reduce((result, currentValue) => {\n const value = getChecklistValidatedValue(data, currentValue.id);\n return value ? result + 1 : result;\n }, 0);\n\n return {\n totalCourseBestPracticesChecks: filteredBestPracticesChecks.length,\n completedCourseBestPracticesChecks,\n };\n }\n\n return {\n totalCourseBestPracticesChecks: 0,\n completedCourseBestPracticesChecks: 0,\n };\n};\n\nexport {\n getCourseLaunchChecklist,\n getCourseBestPracticesChecklist,\n};\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\nimport { useToggle } from '@openedx/paragon';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport { copyToClipboard } from '../generic/data/thunks';\nimport { getSavingStatus as getGenericSavingStatus } from '../generic/data/selectors';\nimport { RequestStatus } from '../data/constants';\nimport { COURSE_BLOCK_NAMES } from './constants';\nimport {\n setCurrentItem,\n setCurrentSection,\n updateSavingStatus,\n} from './data/slice';\nimport {\n getLoadingStatus,\n getOutlineIndexData,\n getSavingStatus,\n getStatusBarData,\n getSectionsList,\n getCourseActions,\n getCurrentItem,\n getCurrentSection,\n getCurrentSubsection,\n getCustomRelativeDatesActiveFlag,\n getErrors,\n} from './data/selectors';\nimport {\n addNewSectionQuery,\n addNewSubsectionQuery,\n addNewUnitQuery,\n deleteCourseSectionQuery,\n deleteCourseSubsectionQuery,\n deleteCourseUnitQuery,\n editCourseItemQuery,\n duplicateSectionQuery,\n duplicateSubsectionQuery,\n duplicateUnitQuery,\n enableCourseHighlightsEmailsQuery,\n fetchCourseBestPracticesQuery,\n fetchCourseLaunchQuery,\n fetchCourseOutlineIndexQuery,\n fetchCourseReindexQuery,\n publishCourseItemQuery,\n updateCourseSectionHighlightsQuery,\n configureCourseSectionQuery,\n configureCourseSubsectionQuery,\n configureCourseUnitQuery,\n setSectionOrderListQuery,\n setVideoSharingOptionQuery,\n setSubsectionOrderListQuery,\n setUnitOrderListQuery,\n pasteClipboardContent,\n dismissNotificationQuery,\n} from './data/thunk';\n\nconst useCourseOutline = ({ courseId }) => {\n const dispatch = useDispatch();\n const navigate = useNavigate();\n\n const {\n reindexLink,\n courseStructure,\n lmsLink,\n notificationDismissUrl,\n discussionsSettings,\n discussionsIncontextFeedbackUrl,\n discussionsIncontextLearnmoreUrl,\n deprecatedBlocksInfo,\n proctoringErrors,\n mfeProctoredExamSettingsUrl,\n advanceSettingsUrl,\n } = useSelector(getOutlineIndexData);\n const { outlineIndexLoadingStatus, reIndexLoadingStatus } = useSelector(getLoadingStatus);\n const statusBarData = useSelector(getStatusBarData);\n const savingStatus = useSelector(getSavingStatus);\n const courseActions = useSelector(getCourseActions);\n const sectionsList = useSelector(getSectionsList);\n const currentItem = useSelector(getCurrentItem);\n const currentSection = useSelector(getCurrentSection);\n const currentSubsection = useSelector(getCurrentSubsection);\n const isCustomRelativeDatesActive = useSelector(getCustomRelativeDatesActiveFlag);\n const genericSavingStatus = useSelector(getGenericSavingStatus);\n const errors = useSelector(getErrors);\n\n const [isEnableHighlightsModalOpen, openEnableHighlightsModal, closeEnableHighlightsModal] = useToggle(false);\n const [isSectionsExpanded, setSectionsExpanded] = useState(true);\n const [isDisabledReindexButton, setDisableReindexButton] = useState(false);\n const [showSuccessAlert, setShowSuccessAlert] = useState(false);\n const [isHighlightsModalOpen, openHighlightsModal, closeHighlightsModal] = useToggle(false);\n const [isPublishModalOpen, openPublishModal, closePublishModal] = useToggle(false);\n const [isConfigureModalOpen, openConfigureModal, closeConfigureModal] = useToggle(false);\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useToggle(false);\n\n const isSavingStatusFailed = savingStatus === RequestStatus.FAILED || genericSavingStatus === RequestStatus.FAILED;\n\n const handleCopyToClipboardClick = (usageKey) => {\n dispatch(copyToClipboard(usageKey));\n };\n\n const handlePasteClipboardClick = (parentLocator, sectionId) => {\n dispatch(pasteClipboardContent(parentLocator, sectionId));\n };\n\n const handleNewSectionSubmit = () => {\n dispatch(addNewSectionQuery(courseStructure.id));\n };\n\n const handleNewSubsectionSubmit = (sectionId) => {\n dispatch(addNewSubsectionQuery(sectionId));\n };\n\n const getUnitUrl = (locator) => {\n if (getConfig().ENABLE_UNIT_PAGE === 'true') {\n return `/course/${courseId}/container/${locator}`;\n }\n return `${getConfig().STUDIO_BASE_URL}/container/${locator}`;\n };\n\n const openUnitPage = (locator) => {\n const url = getUnitUrl(locator);\n if (getConfig().ENABLE_UNIT_PAGE === 'true') {\n navigate(url);\n } else {\n window.location.assign(url);\n }\n };\n\n const handleNewUnitSubmit = (subsectionId) => {\n dispatch(addNewUnitQuery(subsectionId, openUnitPage));\n };\n\n const headerNavigationsActions = {\n handleNewSection: handleNewSectionSubmit,\n handleReIndex: () => {\n setDisableReindexButton(true);\n setShowSuccessAlert(false);\n\n dispatch(fetchCourseReindexQuery(courseId, reindexLink)).then(() => {\n setDisableReindexButton(false);\n });\n },\n handleExpandAll: () => {\n setSectionsExpanded((prevState) => !prevState);\n },\n lmsLink,\n };\n\n const handleEnableHighlightsSubmit = () => {\n dispatch(enableCourseHighlightsEmailsQuery(courseId));\n closeEnableHighlightsModal();\n };\n\n const handleInternetConnectionFailed = () => {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n };\n\n const handleOpenHighlightsModal = (section) => {\n dispatch(setCurrentItem(section));\n dispatch(setCurrentSection(section));\n openHighlightsModal();\n };\n\n const handleHighlightsFormSubmit = (highlights) => {\n const dataToSend = Object.values(highlights).filter(Boolean);\n dispatch(updateCourseSectionHighlightsQuery(currentItem.id, dataToSend));\n\n closeHighlightsModal();\n };\n\n const handlePublishItemSubmit = () => {\n dispatch(publishCourseItemQuery(currentItem.id, currentSection.id));\n\n closePublishModal();\n };\n\n const handleConfigureModalClose = () => {\n closeConfigureModal();\n // reset the currentItem so the ConfigureModal's state is also reset\n dispatch(setCurrentItem({}));\n };\n\n const handleConfigureItemSubmit = (...arg) => {\n switch (currentItem.category) {\n case COURSE_BLOCK_NAMES.chapter.id:\n dispatch(configureCourseSectionQuery(currentSection.id, ...arg));\n break;\n case COURSE_BLOCK_NAMES.sequential.id:\n dispatch(configureCourseSubsectionQuery(currentItem.id, currentSection.id, ...arg));\n break;\n case COURSE_BLOCK_NAMES.vertical.id:\n dispatch(configureCourseUnitQuery(currentItem.id, currentSection.id, ...arg));\n break;\n default:\n return;\n }\n handleConfigureModalClose();\n };\n\n const handleEditSubmit = (itemId, sectionId, displayName) => {\n dispatch(editCourseItemQuery(itemId, sectionId, displayName));\n };\n\n const handleDeleteItemSubmit = () => {\n switch (currentItem.category) {\n case COURSE_BLOCK_NAMES.chapter.id:\n dispatch(deleteCourseSectionQuery(currentItem.id));\n break;\n case COURSE_BLOCK_NAMES.sequential.id:\n dispatch(deleteCourseSubsectionQuery(currentItem.id, currentSection.id));\n break;\n case COURSE_BLOCK_NAMES.vertical.id:\n dispatch(deleteCourseUnitQuery(\n currentItem.id,\n currentSubsection.id,\n currentSection.id,\n ));\n break;\n default:\n return;\n }\n closeDeleteModal();\n };\n\n const handleDuplicateSectionSubmit = () => {\n dispatch(duplicateSectionQuery(currentSection.id, courseStructure.id));\n };\n\n const handleDuplicateSubsectionSubmit = () => {\n dispatch(duplicateSubsectionQuery(currentSubsection.id, currentSection.id));\n };\n\n const handleDuplicateUnitSubmit = () => {\n dispatch(duplicateUnitQuery(currentItem.id, currentSubsection.id, currentSection.id));\n };\n\n const handleVideoSharingOptionChange = (value) => {\n dispatch(setVideoSharingOptionQuery(courseId, value));\n };\n\n const handleDismissNotification = () => {\n dispatch(dismissNotificationQuery(notificationDismissUrl));\n };\n\n const handleSectionDragAndDrop = (\n sectionListIds,\n restoreSectionList,\n ) => {\n dispatch(setSectionOrderListQuery(\n courseId,\n sectionListIds,\n restoreSectionList,\n ));\n };\n\n const handleSubsectionDragAndDrop = (\n sectionId,\n prevSectionId,\n subsectionListIds,\n restoreSectionList,\n ) => {\n dispatch(setSubsectionOrderListQuery(\n sectionId,\n prevSectionId,\n subsectionListIds,\n restoreSectionList,\n ));\n };\n\n const handleUnitDragAndDrop = (\n sectionId,\n prevSectionId,\n subsectionId,\n unitListIds,\n restoreSectionList,\n ) => {\n dispatch(setUnitOrderListQuery(\n sectionId,\n subsectionId,\n prevSectionId,\n unitListIds,\n restoreSectionList,\n ));\n };\n\n useEffect(() => {\n dispatch(fetchCourseOutlineIndexQuery(courseId));\n dispatch(fetchCourseBestPracticesQuery({ courseId }));\n dispatch(fetchCourseLaunchQuery({ courseId }));\n }, [courseId]);\n\n useEffect(() => {\n setShowSuccessAlert(reIndexLoadingStatus === RequestStatus.SUCCESSFUL);\n }, [reIndexLoadingStatus]);\n\n return {\n courseActions,\n savingStatus,\n sectionsList,\n isCustomRelativeDatesActive,\n isLoading: outlineIndexLoadingStatus === RequestStatus.IN_PROGRESS,\n isReIndexShow: Boolean(reindexLink),\n showSuccessAlert,\n isDisabledReindexButton,\n isSectionsExpanded,\n isPublishModalOpen,\n openPublishModal,\n closePublishModal,\n isConfigureModalOpen,\n openConfigureModal,\n handleConfigureModalClose,\n headerNavigationsActions,\n handleEnableHighlightsSubmit,\n handleHighlightsFormSubmit,\n handleConfigureItemSubmit,\n handlePublishItemSubmit,\n handleEditSubmit,\n statusBarData,\n isEnableHighlightsModalOpen,\n openEnableHighlightsModal,\n closeEnableHighlightsModal,\n isInternetConnectionAlertFailed: isSavingStatusFailed,\n handleInternetConnectionFailed,\n handleOpenHighlightsModal,\n isHighlightsModalOpen,\n closeHighlightsModal,\n courseName: courseStructure?.displayName,\n isDeleteModalOpen,\n closeDeleteModal,\n openDeleteModal,\n handleDeleteItemSubmit,\n handleDuplicateSectionSubmit,\n handleDuplicateSubsectionSubmit,\n handleDuplicateUnitSubmit,\n handleNewSectionSubmit,\n handleNewSubsectionSubmit,\n getUnitUrl,\n openUnitPage,\n handleNewUnitSubmit,\n handleVideoSharingOptionChange,\n handleCopyToClipboardClick,\n handlePasteClipboardClick,\n notificationDismissUrl,\n discussionsSettings,\n discussionsIncontextFeedbackUrl,\n discussionsIncontextLearnmoreUrl,\n deprecatedBlocksInfo,\n proctoringErrors,\n mfeProctoredExamSettingsUrl,\n handleDismissNotification,\n advanceSettingsUrl,\n genericSavingStatus,\n handleSectionDragAndDrop,\n handleSubsectionDragAndDrop,\n handleUnitDragAndDrop,\n errors,\n };\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { useCourseOutline };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.course-outline.headingTitle',\n defaultMessage: 'Course outline',\n },\n headingSubtitle: {\n id: 'course-authoring.course-outline.subTitle',\n defaultMessage: 'Content',\n },\n alertSuccessTitle: {\n id: 'course-authoring.course-outline.reindex.alert.success.title',\n defaultMessage: 'Course index',\n },\n alertSuccessDescription: {\n id: 'course-authoring.course-outline.reindex.alert.success.description',\n defaultMessage: 'Course has been successfully reindexed.',\n },\n alertSuccessAriaLabelledby: {\n id: 'course-authoring.course-outline.reindex.alert.success.aria.labelledby',\n defaultMessage: 'alert-confirmation-title',\n },\n alertSuccessAriaDescribedby: {\n id: 'course-authoring.course-outline.reindex.alert.success.aria.describedby',\n defaultMessage: 'alert-confirmation-description',\n },\n newSectionButton: {\n id: 'course-authoring.course-outline.section-list.button.new-section',\n defaultMessage: 'New section',\n },\n exportTagsCreatingToastMessage: {\n id: 'course-authoring.course-outline.export-tags.toast.creating.message',\n defaultMessage: 'Please wait. Creating export file for course tags...',\n description: 'In progress message in toast when exporting tags of a course',\n },\n exportTagsSuccessToastMessage: {\n id: 'course-authoring.course-outline.export-tags.toast.success.message',\n defaultMessage: 'Course tags exported successfully',\n description: 'Success message in toast when exporting tags of a course',\n },\n exportTagsErrorToastMessage: {\n id: 'course-authoring.course-outline.export-tags.toast.error.message',\n defaultMessage: 'An error has occurred creating the file',\n description: 'Error message in toast when exporting tags of a course',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Button,\n Container,\n Layout,\n Row,\n TransitionReplace,\n Toast,\n} from '@openedx/paragon';\nimport { Helmet } from 'react-helmet';\nimport {\n Add as IconAdd,\n CheckCircle as CheckCircleIcon,\n} from '@openedx/paragon/icons';\nimport { useSelector } from 'react-redux';\nimport {\n arrayMove,\n SortableContext,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { useLocation } from 'react-router-dom';\n\nimport { LoadingSpinner } from '../generic/Loading';\nimport { getProcessingNotification } from '../generic/processing-notification/data/selectors';\nimport { RequestStatus } from '../data/constants';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport ProcessingNotification from '../generic/processing-notification';\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport DeleteModal from '../generic/delete-modal/DeleteModal';\nimport ConfigureModal from '../generic/configure-modal/ConfigureModal';\nimport AlertMessage from '../generic/alert-message';\nimport getPageHeadTitle from '../generic/utils';\nimport { getCurrentItem, getProctoredExamsFlag } from './data/selectors';\nimport { COURSE_BLOCK_NAMES } from './constants';\nimport HeaderNavigations from './header-navigations/HeaderNavigations';\nimport OutlineSideBar from './outline-sidebar/OutlineSidebar';\nimport StatusBar from './status-bar/StatusBar';\nimport EnableHighlightsModal from './enable-highlights-modal/EnableHighlightsModal';\nimport SectionCard from './section-card/SectionCard';\nimport SubsectionCard from './subsection-card/SubsectionCard';\nimport UnitCard from './unit-card/UnitCard';\nimport HighlightsModal from './highlights-modal/HighlightsModal';\nimport EmptyPlaceholder from './empty-placeholder/EmptyPlaceholder';\nimport PublishModal from './publish-modal/PublishModal';\nimport PageAlerts from './page-alerts/PageAlerts';\nimport DraggableList from '../generic/drag-helper/DraggableList';\nimport {\n canMoveSection,\n possibleUnitMoves,\n possibleSubsectionMoves,\n} from '../generic/drag-helper/utils';\nimport { useCourseOutline } from './hooks';\nimport messages from './messages';\nimport { getTagsExportFile } from './data/api';\n\nconst CourseOutline = ({ courseId }) => {\n const intl = useIntl();\n const location = useLocation();\n\n const {\n courseName,\n savingStatus,\n statusBarData,\n courseActions,\n sectionsList,\n isCustomRelativeDatesActive,\n isLoading,\n isReIndexShow,\n showSuccessAlert,\n isSectionsExpanded,\n isEnableHighlightsModalOpen,\n isInternetConnectionAlertFailed,\n isDisabledReindexButton,\n isHighlightsModalOpen,\n isPublishModalOpen,\n isConfigureModalOpen,\n isDeleteModalOpen,\n closeHighlightsModal,\n closePublishModal,\n handleConfigureModalClose,\n closeDeleteModal,\n openPublishModal,\n openConfigureModal,\n openDeleteModal,\n headerNavigationsActions,\n openEnableHighlightsModal,\n closeEnableHighlightsModal,\n handleEnableHighlightsSubmit,\n handleInternetConnectionFailed,\n handleOpenHighlightsModal,\n handleHighlightsFormSubmit,\n handleConfigureItemSubmit,\n handlePublishItemSubmit,\n handleEditSubmit,\n handleDeleteItemSubmit,\n handleDuplicateSectionSubmit,\n handleDuplicateSubsectionSubmit,\n handleDuplicateUnitSubmit,\n handleNewSectionSubmit,\n handleNewSubsectionSubmit,\n handleNewUnitSubmit,\n getUnitUrl,\n handleVideoSharingOptionChange,\n handleCopyToClipboardClick,\n handlePasteClipboardClick,\n notificationDismissUrl,\n discussionsSettings,\n discussionsIncontextFeedbackUrl,\n discussionsIncontextLearnmoreUrl,\n deprecatedBlocksInfo,\n proctoringErrors,\n mfeProctoredExamSettingsUrl,\n handleDismissNotification,\n advanceSettingsUrl,\n handleSectionDragAndDrop,\n handleSubsectionDragAndDrop,\n handleUnitDragAndDrop,\n errors,\n } = useCourseOutline({ courseId });\n\n // Use `setToastMessage` to show the toast.\n const [toastMessage, setToastMessage] = useState(/** @type{null|string} */ (null));\n\n useEffect(() => {\n if (location.hash === '#export-tags') {\n setToastMessage(intl.formatMessage(messages.exportTagsCreatingToastMessage));\n getTagsExportFile(courseId, courseName).then(() => {\n setToastMessage(intl.formatMessage(messages.exportTagsSuccessToastMessage));\n }).catch(() => {\n setToastMessage(intl.formatMessage(messages.exportTagsErrorToastMessage));\n });\n\n // Delete `#export-tags` from location\n window.location.href = '#';\n }\n }, [location]);\n\n const [sections, setSections] = useState(sectionsList);\n\n const restoreSectionList = () => {\n setSections(() => [...sectionsList]);\n };\n\n const {\n isShow: isShowProcessingNotification,\n title: processingNotificationTitle,\n } = useSelector(getProcessingNotification);\n\n const currentItemData = useSelector(getCurrentItem);\n const deleteCategory = COURSE_BLOCK_NAMES[currentItemData.category]?.name.toLowerCase();\n\n const enableProctoredExams = useSelector(getProctoredExamsFlag);\n\n /**\n * Move section to new index\n * @param {any} currentIndex\n * @param {any} newIndex\n */\n const updateSectionOrderByIndex = (currentIndex, newIndex) => {\n if (currentIndex === newIndex) {\n return;\n }\n setSections((prevSections) => {\n const newSections = arrayMove(prevSections, currentIndex, newIndex);\n handleSectionDragAndDrop(newSections.map(section => section.id));\n return newSections;\n });\n };\n\n /**\n * Uses details from move information and moves subsection\n * @param {any} section\n * @param {any} moveDetails\n * @returns {void}\n */\n const updateSubsectionOrderByIndex = (section, moveDetails) => {\n const { fn, args, sectionId } = moveDetails;\n if (!args) {\n return;\n }\n const [sectionsCopy, newSubsections] = fn(...args);\n if (newSubsections && sectionId) {\n setSections(sectionsCopy);\n handleSubsectionDragAndDrop(\n sectionId,\n section.id,\n newSubsections.map(subsection => subsection.id),\n restoreSectionList,\n );\n }\n };\n\n /**\n * Uses details from move information and moves unit\n * @param {any} section\n * @param {any} moveDetails\n * @returns {void}\n */\n const updateUnitOrderByIndex = (section, moveDetails) => {\n const {\n fn, args, sectionId, subsectionId,\n } = moveDetails;\n if (!args) {\n return;\n }\n const [sectionsCopy, newUnits] = fn(...args);\n if (newUnits && sectionId && subsectionId) {\n setSections(sectionsCopy);\n handleUnitDragAndDrop(\n sectionId,\n section.id,\n subsectionId,\n newUnits.map(unit => unit.id),\n restoreSectionList,\n );\n }\n };\n\n useEffect(() => {\n setSections(sectionsList);\n }, [sectionsList]);\n\n if (isLoading) {\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return (\n <Row className=\"m-0 mt-4 justify-content-center\">\n <LoadingSpinner />\n </Row>\n );\n }\n\n return (\n <>\n <Helmet>\n <title>{getPageHeadTitle(courseName, intl.formatMessage(messages.headingTitle))}\n \n \n
\n \n \n {showSuccessAlert ? (\n \n ) : null}\n \n \n )}\n />\n \n \n
\n
\n
\n \n {!errors?.outlineIndexApi && (\n
\n {sections.length ? (\n <>\n \n \n {sections.map((section, sectionIndex) => (\n \n \n {section.childInfo.children.map((subsection, subsectionIndex) => (\n \n \n {subsection.childInfo.children.map((unit, unitIndex) => (\n \n ))}\n \n \n ))}\n \n \n ))}\n \n \n {courseActions.childAddable && (\n \n {intl.formatMessage(messages.newSectionButton)}\n \n )}\n \n ) : (\n \n )}\n
\n )}\n
\n
\n
\n
\n \n \n \n \n \n
\n \n \n \n \n
\n
\n \n \n
\n {toastMessage && (\n setToastMessage(null)}\n data-testid=\"taxonomy-toast\"\n >\n {toastMessage}\n \n )}\n \n );\n};\n\nCourseOutline.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default CourseOutline;\n","/* eslint-disable import/prefer-default-export */\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\nimport { convertObjectToSnakeCase } from '../../utils';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getCourseDetailsApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/course_details/${courseId}`;\nexport const getCourseSettingsApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/course_settings/${courseId}`;\nexport const getUploadAssetsUrl = (courseId) => `${getApiBaseUrl()}/assets/${courseId}/`;\n\n/**\n * Get course details.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getCourseDetails(courseId) {\n const { data } = await getAuthenticatedHttpClient().get(\n `${getCourseDetailsApiUrl(courseId)}`,\n );\n return camelCaseObject(data);\n}\n\n/**\n * Update course details.\n * @param {string} courseId\n * @param {object} details\n * @returns {Promise}\n */\nexport async function updateCourseDetails(courseId, details) {\n const { data } = await getAuthenticatedHttpClient().put(\n `${getCourseDetailsApiUrl(courseId)}`,\n convertObjectToSnakeCase(details, true),\n );\n return camelCaseObject(data);\n}\n\n/**\n * Get course settings.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getCourseSettings(courseId) {\n const { data } = await getAuthenticatedHttpClient().get(\n `${getCourseSettingsApiUrl(courseId)}`,\n );\n return camelCaseObject(data);\n}\n","import { RequestStatus } from '../../data/constants';\nimport {\n getCourseDetails,\n updateCourseDetails,\n getCourseSettings,\n} from './api';\nimport {\n updateSavingStatus,\n updateLoadingDetailsStatus,\n updateLoadingSettingsStatus,\n fetchCourseDetailsSuccess,\n updateCourseDetailsSuccess,\n fetchCourseSettingsSuccess,\n} from './slice';\n\nexport function fetchCourseDetailsQuery(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingDetailsStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const detailsValues = await getCourseDetails(courseId);\n dispatch(fetchCourseDetailsSuccess(detailsValues));\n dispatch(updateLoadingDetailsStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateLoadingDetailsStatus({ courseId, status: RequestStatus.DENIED }));\n } else {\n dispatch(updateLoadingDetailsStatus({ status: RequestStatus.FAILED }));\n }\n }\n };\n}\n\nexport function updateCourseDetailsQuery(courseId, details) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const detailsValues = await updateCourseDetails(courseId, details);\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(updateCourseDetailsSuccess(detailsValues));\n return true;\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport function fetchCourseSettingsQuery(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingSettingsStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const settingsValues = await getCourseSettings(courseId);\n dispatch(fetchCourseSettingsSuccess(settingsValues));\n dispatch(updateLoadingSettingsStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateLoadingSettingsStatus({ courseId, status: RequestStatus.DENIED }));\n } else {\n dispatch(updateLoadingSettingsStatus({ status: RequestStatus.FAILED }));\n }\n return false;\n }\n };\n}\n","export const getLoadingDetailsStatus = (state) => state.scheduleAndDetails.loadingDetailsStatus;\nexport const getLoadingSettingsStatus = (state) => state.scheduleAndDetails.loadingSettingsStatus;\nexport const getSavingStatus = (state) => state.scheduleAndDetails.savingStatus;\nexport const getCourseDetails = state => state.scheduleAndDetails.courseDetails;\nexport const getCourseSettings = (state) => state.scheduleAndDetails.courseSettings;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst SectionSubHeader = ({ title, description }) => (\n
\n

{title}

\n {description}\n
\n);\n\nSectionSubHeader.defaultProps = {\n description: '',\n};\n\nSectionSubHeader.propTypes = {\n title: PropTypes.string.isRequired,\n description: PropTypes.string,\n};\n\nexport default SectionSubHeader;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n basicTitle: {\n id: 'course-authoring.schedule.basic.title',\n defaultMessage: 'Basic information',\n },\n basicDescription: {\n id: 'course-authoring.schedule.basic.description',\n defaultMessage: 'The nuts and bolts of this course',\n },\n basicEmailIcon: {\n id: 'course-authoring.schedule.basic.email-icon',\n defaultMessage: 'Invite your students email icon',\n },\n courseOrganization: {\n id: 'course-authoring.schedule.basic.organization',\n defaultMessage: 'Organization',\n },\n courseNumber: {\n id: 'course-authoring.schedule.basic.course-number',\n defaultMessage: 'Course number',\n },\n courseRun: {\n id: 'course-authoring.schedule.basic.course-run',\n defaultMessage: 'Course run',\n },\n basicBannerTitle: {\n id: 'course-authoring.schedule.basic.banner.title',\n defaultMessage: 'Promoting your course with edX',\n },\n basicBannerText: {\n id: 'course-authoring.schedule.basic.banner.text',\n defaultMessage: 'Your course summary page will not be viewable until your course has been announced. To provide content for the page and preview it, follow the instructions provided by your Program Manager. Please note that changes here may take up to a business day to appear on your course summary page.',\n },\n basicPromotionButton: {\n id: 'course-authoring.schedule.basic.promotion.button',\n defaultMessage: 'Invite your students',\n },\n});\n\nexport default messages;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport {\n PageBanner, Button, Card, MailtoLink, Hyperlink,\n} from '@openedx/paragon';\nimport { Email as EmailIcon } from '@openedx/paragon/icons';\n\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport { INVITE_STUDENTS_LINK_ID } from './constants';\nimport messages from './messages';\n\nconst BasicSection = ({\n org,\n courseNumber,\n run,\n lmsLinkForAboutPage,\n marketingEnabled,\n courseDisplayName,\n platformName,\n}) => {\n const intl = useIntl();\n const [showPageBanner, setShowPageBanner] = useState(true);\n const emailSubject = intl.formatMessage(\n {\n id: 'course-authoring.schedule.basic.email.subject',\n defaultMessage: 'Enroll in {courseDisplayName}.',\n },\n { courseDisplayName },\n );\n\n const emailBody = intl.formatMessage(\n {\n id: 'course-authoring.schedule.basic.email.body',\n defaultMessage:\n 'The course {courseDisplayName}, provided by {platformName}, is open for enrollment. Please navigate to this course at {lmsLinkForAboutPage} to enroll.',\n },\n {\n courseDisplayName,\n platformName,\n lmsLinkForAboutPage,\n },\n );\n\n const promotionTitle = (\n (for student enrollment and access),\n }}\n />\n );\n\n const courseBasicInfo = [\n {\n label: `${intl.formatMessage(messages.courseOrganization)}`,\n prefix: 'basic-organization',\n value: org,\n },\n {\n label: `${intl.formatMessage(messages.courseNumber)}`,\n prefix: 'basic-course-number',\n value: courseNumber,\n },\n {\n label: `${intl.formatMessage(messages.courseRun)}`,\n prefix: 'basic-course-run',\n value: run,\n },\n ];\n\n const renderBasicInfo = (info) => (\n
  • \n

    {info.label}

    \n {info.value}\n
  • \n );\n\n const renderPageBanner = () => (\n setShowPageBanner(false)}\n className=\"align-items-start\"\n >\n

    {intl.formatMessage(messages.basicBannerTitle)}

    \n \n {intl.formatMessage(messages.basicBannerText)}\n \n \n );\n\n const renderCoursePromotion = () => (\n \n \n \n \n {lmsLinkForAboutPage}\n \n \n \n \n \n \n \n \n \n );\n\n return (\n
    \n \n
      \n {courseBasicInfo.map(renderBasicInfo)}\n
    \n {marketingEnabled ? renderPageBanner() : renderCoursePromotion()}\n
    \n );\n};\n\nBasicSection.propTypes = {\n org: PropTypes.string.isRequired,\n courseNumber: PropTypes.string.isRequired,\n run: PropTypes.string.isRequired,\n lmsLinkForAboutPage: PropTypes.string.isRequired,\n marketingEnabled: PropTypes.bool.isRequired,\n courseDisplayName: PropTypes.string.isRequired,\n platformName: PropTypes.string.isRequired,\n};\n\nexport default BasicSection;\n","/* eslint-disable-next-line import/prefer-default-export */\nexport const INVITE_STUDENTS_LINK_ID = 'invite-students-link';\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n creditTitle: {\n id: 'course-authoring.schedule.credit.title',\n defaultMessage: 'Course credit requirements',\n },\n creditDescription: {\n id: 'course-authoring.schedule.credit.description',\n defaultMessage: 'Steps required to earn course credit',\n },\n creditHelp: {\n id: 'course-authoring.schedule.credit.help',\n defaultMessage:\n 'A requirement appears in this list when you publish the unit that contains the requirement.',\n },\n creditMinimumGrade: {\n id: 'course-authoring.schedule.credit.minimum-grade',\n defaultMessage: 'Minimum grade',\n },\n creditProctoredExam: {\n id: 'course-authoring.schedule.credit.proctored-exam',\n defaultMessage: 'Successful proctored exam',\n },\n creditVerification: {\n id: 'course-authoring.schedule.credit.verification',\n defaultMessage: 'ID Verification',\n },\n creditNotFound: {\n id: 'course-authoring.schedule.credit.not-found',\n defaultMessage: 'No credit requirements found.',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport messages from './messages';\n\nconst CreditSection = ({ creditRequirements }) => {\n const intl = useIntl();\n\n const CREDIT_REQUIREMENTS_TYPES = {\n grade: intl.formatMessage(messages.creditMinimumGrade),\n proctoredExam: intl.formatMessage(messages.creditProctoredExam),\n reverification: intl.formatMessage(messages.creditVerification),\n };\n\n const renderRequirementValue = (requirementValue, key) => {\n const displayValue = key === 'grade'\n ? `${(parseFloat(requirementValue.criteria.minGrade) || 0) * 100}%`\n : requirementValue.displayName;\n return (\n \n {displayValue}\n \n );\n };\n\n const renderCreditRequirements = (requirements) => {\n const creditRequirementsKeys = Object.keys(requirements);\n\n if (creditRequirementsKeys.length) {\n return (\n
      \n {creditRequirementsKeys.map((key) => (\n
    • \n

      \n {CREDIT_REQUIREMENTS_TYPES[key]}\n

      \n
      \n {creditRequirements[key].map((value) => renderRequirementValue(value, key))}\n
      \n
    • \n ))}\n
    \n );\n }\n return

    {intl.formatMessage(messages.creditNotFound)}

    ;\n };\n\n return (\n
    \n \n

    {intl.formatMessage(messages.creditHelp)}

    \n {renderCreditRequirements(creditRequirements)}\n
    \n );\n};\n\nconst creditRequirementsNamespace = PropTypes.shape({\n name: PropTypes.string,\n display_name: PropTypes.string,\n criteria: PropTypes.shape({\n min_grade: PropTypes.number,\n }),\n});\n\nconst creditRequirementsPropTypes = PropTypes.shape({\n proctoredExam: PropTypes.arrayOf(creditRequirementsNamespace),\n grade: PropTypes.arrayOf(creditRequirementsNamespace),\n reverification: PropTypes.arrayOf(creditRequirementsNamespace),\n});\n\nCreditSection.defaultProps = {\n creditRequirements: undefined,\n};\n\nCreditSection.propTypes = {\n creditRequirements: creditRequirementsPropTypes,\n};\n\nexport default CreditSection;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n detailsTitle: {\n id: 'course-authoring.schedule-section.details.title',\n defaultMessage: 'Course details',\n },\n detailsDescription: {\n id: 'course-authoring.schedule-section.details.description',\n defaultMessage: 'Provide useful information about your course',\n },\n dropdownLabel: {\n id: 'course-authoring.schedule-section.details.dropdown.label',\n defaultMessage: 'Course language',\n },\n dropdownHelpText: {\n id: 'course-authoring.schedule-section.details.dropdown.help-text',\n defaultMessage: 'Identify the course language here. This is used to assist users find courses that are taught in a specific language. It is also used to localize the \\'From:\\' field in bulk emails.',\n },\n dropdownEmpty: {\n id: 'course-authoring.schedule-section.details.dropdown.empty',\n defaultMessage: 'Select language',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Form, Dropdown } from '@openedx/paragon';\n\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport messages from './messages';\n\nconst DetailsSection = ({\n language, languageOptions, onChange,\n}) => {\n const intl = useIntl();\n const formattedLanguage = () => {\n const result = languageOptions.find((arr) => arr[0] === language);\n return result ? result[1] : intl.formatMessage(messages.dropdownEmpty);\n };\n\n return (\n
    \n \n \n {intl.formatMessage(messages.dropdownLabel)}\n \n \n {formattedLanguage()}\n \n \n {languageOptions.map((option) => (\n onChange(option[0], 'language')}\n >\n {option[1]}\n \n ))}\n \n \n \n {intl.formatMessage(messages.dropdownHelpText)}\n \n \n
    \n );\n};\n\nDetailsSection.defaultProps = {\n language: '',\n};\n\nDetailsSection.propTypes = {\n language: PropTypes.string,\n languageOptions: PropTypes.arrayOf(\n PropTypes.arrayOf(PropTypes.string.isRequired).isRequired,\n ).isRequired,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default DetailsSection;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n uploadImageHelpText: {\n id: 'course-authoring.schedule-section.introducing.upload-image.help-text',\n defaultMessage: 'Please provide a valid path and name to your {identifierFieldText} (Note: only JPEG or PNG format supported)',\n },\n uploadImageFilesAndUploads: {\n id: 'course-authoring.schedule-section.introducing.upload-image.file-and-uploads',\n defaultMessage: 'files and uploads',\n },\n uploadImageDropzoneText: {\n id: 'course-authoring.schedule-section.introducing.upload-image.dropzone-text',\n defaultMessage: 'Drag and drop your {identifierFieldText} here or click to upload.',\n },\n uploadImageDropzoneAlt: {\n id: 'course-authoring.schedule-section.introducing.upload-image.dropzone-alt',\n defaultMessage: 'Uploaded image for course',\n },\n uploadImageEmpty: {\n id: 'course-authoring.schedule-section.introducing.upload-image.empty',\n defaultMessage: 'Your course currently does not have an image. Please upload one (JPEG or PNG format, and minimum suggested dimensions are 375px wide by 200px tall)',\n },\n uploadImageIconAlt: {\n id: 'course-authoring.schedule-section.introducing.upload-image.icon-alt',\n defaultMessage: 'File upload icon',\n },\n uploadImageBodyFilled: {\n id: 'course-authoring.schedule-section.introducing.upload-image.manage',\n defaultMessage: 'You can manage this image along with all of your other {hyperlink}',\n },\n uploadImageInputPlaceholder: {\n id: 'course-authoring.schedule-section.introducing.upload-image.input.placeholder',\n defaultMessage: 'Your {identifierFieldText} URL',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport _ from 'lodash';\nimport { useParams } from 'react-router-dom';\nimport { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n';\nimport { FileUpload as FileUploadIcon } from '@openedx/paragon/icons';\nimport { getConfig } from '@edx/frontend-platform';\nimport {\n Form,\n Dropzone,\n Image,\n Hyperlink,\n Card,\n Icon,\n IconButton,\n} from '@openedx/paragon';\n\nimport { uploadAssets } from './data/api';\nimport messages from './messages';\n\nconst CourseUploadImage = ({\n label,\n customHelpText,\n assetImagePath,\n imageNameField,\n assetImageField,\n identifierFieldText,\n showImageBodyText,\n customInputPlaceholder,\n onChange,\n}) => {\n const { courseId } = useParams();\n const intl = useIntl();\n const imageAbsolutePath = () => new URL(assetImagePath, getConfig().LMS_BASE_URL);\n const assetsUrl = () => new URL(`/assets/${courseId}`, getConfig().STUDIO_BASE_URL);\n\n const handleChangeImageAsset = (path) => {\n const assetPath = _.last(path.split('/'));\n // If image path is entered directly, we need to strip the asset prefix\n const imageName = _.last(assetPath.split('block@'));\n onChange(path, assetImageField);\n if (imageNameField) {\n onChange(imageName, imageNameField);\n }\n };\n\n const handleProcessUpload = async ({ fileData, handleError }) => {\n try {\n const response = await uploadAssets(courseId, fileData);\n const url = response?.asset?.url;\n if (url) {\n handleChangeImageAsset(url);\n }\n } catch (error) {\n handleError(error);\n }\n };\n\n const inputComponent = assetImagePath ? (\n
    \n \n
    \n ) : (\n <>\n \n

    \n {intl.formatMessage(messages.uploadImageDropzoneText, {\n identifierFieldText,\n })}\n

    \n \n );\n\n const cardImageTextBody = assetImagePath ? (\n \n \n {intl.formatMessage(messages.uploadImageFilesAndUploads)}\n \n ),\n }}\n />\n \n ) : (\n \n {intl.formatMessage(messages.uploadImageEmpty)}\n \n );\n\n return (\n \n {label}\n \n \n \n {showImageBodyText && cardImageTextBody}\n \n \n \n handleChangeImageAsset(e.target.value)}\n placeholder={\n customInputPlaceholder\n || intl.formatMessage(messages.uploadImageInputPlaceholder, {\n identifierFieldText,\n })\n }\n />\n \n \n \n {customHelpText\n || intl.formatMessage(messages.uploadImageHelpText, {\n identifierFieldText,\n })}\n \n \n );\n};\n\nCourseUploadImage.defaultProps = {\n assetImagePath: '',\n customHelpText: '',\n imageNameField: '',\n assetImageField: '',\n showImageBodyText: false,\n identifierFieldText: '',\n customInputPlaceholder: '',\n};\n\nCourseUploadImage.propTypes = {\n label: PropTypes.string.isRequired,\n assetImagePath: PropTypes.string,\n customHelpText: PropTypes.string,\n imageNameField: PropTypes.string,\n assetImageField: PropTypes.string,\n showImageBodyText: PropTypes.bool,\n identifierFieldText: PropTypes.string,\n customInputPlaceholder: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default CourseUploadImage;\n","import { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nexport const getUploadAssetsUrl = (courseId) => new URL(\n `/assets/${courseId}/`,\n getConfig().STUDIO_BASE_URL,\n);\n\n/**\n * Upload assets.\n * @param {string} courseId\n * @param {binary} formData\n * @returns {Promise}\n */\nexport async function uploadAssets(courseId, fileData) {\n const { data } = await getAuthenticatedHttpClient().post(\n `${getUploadAssetsUrl(courseId).href}`,\n fileData,\n );\n return camelCaseObject(data);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect, Provider } from 'react-redux';\nimport { createStore } from 'redux';\nimport { getConfig } from '@edx/frontend-platform';\nimport {\n prepareEditorRef,\n TinyMceWidget,\n} from '@edx/frontend-lib-content-components';\n\nimport { DEFAULT_EMPTY_WYSIWYG_VALUE } from '../constants';\n\nconst store = createStore(() => ({}));\n\nexport const SUPPORTED_TEXT_EDITORS = {\n text: 'text',\n expandable: 'expandable',\n};\n\nconst mapStateToProps = () => ({\n assets: {},\n lmsEndpointUrl: getConfig().LMS_BASE_URL,\n studioEndpointUrl: getConfig().STUDIO_BASE_URL,\n isLibrary: true,\n onEditorChange: () => ({}),\n});\n\nconst Editor = connect(mapStateToProps)(TinyMceWidget);\n\nexport const WysiwygEditor = ({\n initialValue, editorType, onChange, minHeight,\n}) => {\n const { editorRef, refReady, setEditorRef } = prepareEditorRef();\n\n const isEquivalentCodeExtraSpaces = (first, second) => {\n // Utils allows to compare code extra spaces\n const removeWhitespace = (str) => str.replace(/\\s/g, '');\n return removeWhitespace(first) === removeWhitespace(second);\n };\n\n const isEquivalentCodeQuotes = (first, second) => {\n // Utils allows to compare code with single quotes and double quotes\n const normalizeQuotes = (section) => section.replace(/'/g, '\"');\n return normalizeQuotes(first) === normalizeQuotes(second);\n };\n\n // default initial string returned onEditorChange if empty input\n const needToChange = (value) => !isEquivalentCodeQuotes(initialValue, value)\n && !isEquivalentCodeExtraSpaces(initialValue, value)\n && (initialValue !== DEFAULT_EMPTY_WYSIWYG_VALUE || value !== '');\n\n const handleUpdate = (value, editor) => {\n // With bookmarks keep the current cursor position at the end of the line\n // and it inserts new content only at the end of the line.\n const bm = editor.selection.getBookmark();\n const existingContent = editor.getContent({ format: 'raw' });\n if (needToChange(value)) { onChange(value); }\n editor.setContent(existingContent);\n editor.selection.moveToBookmark(bm);\n };\n\n if (!refReady) {\n return null;\n }\n\n return (\n \n ({})}\n />\n \n );\n};\n\nWysiwygEditor.defaultProps = {\n initialValue: '',\n editorType: SUPPORTED_TEXT_EDITORS.text,\n minHeight: 200,\n};\n\nWysiwygEditor.propTypes = {\n initialValue: PropTypes.string,\n editorType: PropTypes.oneOf(Object.values(SUPPORTED_TEXT_EDITORS)),\n onChange: PropTypes.func.isRequired,\n minHeight: PropTypes.number,\n};\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n courseIntroductionVideoLabel: {\n id: 'course-authoring.schedule-section.introducing.introduction-video.label',\n defaultMessage: 'Course introduction video',\n },\n courseIntroductionVideoDelete: {\n id: 'course-authoring.schedule-section.introducing.introduction-video.delete',\n defaultMessage: 'Delete current video',\n },\n courseIntroductionVideoHelpText: {\n id: 'course-authoring.schedule-section.introducing.introduction-video.help-text',\n defaultMessage: 'Enter your YouTube video\\'s ID (along with any restriction parameters)',\n },\n courseIntroductionVideoPlaceholder: {\n id: 'course-authoring.schedule-section.introducing.introduction-video.placeholder',\n defaultMessage: 'YouTube video ID',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Form, Button, Card } from '@openedx/paragon';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\n\nimport messages from './messages';\n\nconst IntroductionVideo = ({ intl, introVideo, onChange }) => {\n const embedVideoUrl = introVideo\n ? `//www.youtube.com/embed/${introVideo}`\n : '';\n\n return (\n \n \n {intl.formatMessage(messages.courseIntroductionVideoLabel)}\n \n \n \n
    \n \n
    \n
    \n \n \n onChange(e.target.value, 'introVideo')}\n />\n onChange('', 'introVideo')}\n disabled={!introVideo}\n >\n {intl.formatMessage(messages.courseIntroductionVideoDelete)}\n \n \n
    \n \n {intl.formatMessage(messages.courseIntroductionVideoHelpText)}\n \n
    \n );\n};\n\nIntroductionVideo.defaultProps = {\n introVideo: '',\n};\n\nIntroductionVideo.propTypes = {\n intl: intlShape.isRequired,\n introVideo: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default injectIntl(IntroductionVideo);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n extendedTitleLabel: {\n id: 'course-authoring.schedule-section.introducing.title.label',\n defaultMessage: 'Course title',\n },\n extendedTitleHelpText: {\n id: 'course-authoring.schedule-section.introducing.title.help-text',\n defaultMessage: 'Displayed as title on the course details page. Limit to 50 characters.',\n },\n extendedTitleAriaLabel: {\n id: 'course-authoring.schedule-section.introducing.title.aria-label',\n defaultMessage: 'Show course title',\n },\n extendedSubtitleLabel: {\n id: 'course-authoring.schedule-section.introducing.subtitle.label',\n defaultMessage: 'Course subtitle',\n },\n extendedSubtitleHelpText: {\n id: 'course-authoring.schedule-section.introducing.subtitle.help-text',\n defaultMessage: 'Displayed as subtitle on the course details page. Limit to 150 characters.',\n },\n extendedSubtitleAriaLabel: {\n id: 'course-authoring.schedule-section.introducing.subtitle.aria-label',\n defaultMessage: 'Show course subtitle',\n },\n extendedDurationLabel: {\n id: 'course-authoring.schedule-section.introducing.duration.label',\n defaultMessage: 'Course duration',\n },\n extendedDurationHelpText: {\n id: 'course-authoring.schedule-section.introducing.duration.help-text',\n defaultMessage: 'Displayed on the course details page. Limit to 50 characters.',\n },\n extendedDurationAriaLabel: {\n id: 'course-authoring.schedule-section.introducing.duration.aria-label',\n defaultMessage: 'Show course duration',\n },\n extendedDescriptionLabel: {\n id: 'course-authoring.schedule-section.introducing.description.label',\n defaultMessage: 'Course description',\n },\n extendedDescriptionHelpText: {\n id: 'course-authoring.schedule-section.introducing.description.help-text',\n defaultMessage: 'Displayed on the course details page. Limit to 1000 characters.',\n },\n extendedDescriptionAriaLabel: {\n id: 'course-authoring.schedule-section.introducing.description.aria-label',\n defaultMessage: 'Show course description',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport TextareaAutosize from 'react-textarea-autosize';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Form } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst ExtendedCourseDetails = ({\n title,\n subtitle,\n duration,\n description,\n onChange,\n}) => {\n const intl = useIntl();\n const paramsForExtendedFields = [\n {\n value: title,\n label: intl.formatMessage(messages.extendedTitleLabel),\n helpText: intl.formatMessage(messages.extendedTitleHelpText),\n ariaLabel: intl.formatMessage(messages.extendedTitleAriaLabel),\n controlName: 'title',\n maxLength: 50,\n },\n {\n value: subtitle,\n label: intl.formatMessage(messages.extendedSubtitleLabel),\n helpText: intl.formatMessage(messages.extendedSubtitleHelpText),\n ariaLabel: intl.formatMessage(messages.extendedSubtitleAriaLabel),\n controlName: 'subtitle',\n maxLength: 150,\n },\n {\n value: duration,\n label: intl.formatMessage(messages.extendedDurationLabel),\n helpText: intl.formatMessage(messages.extendedDurationHelpText),\n ariaLabel: intl.formatMessage(messages.extendedDurationAriaLabel),\n controlName: 'duration',\n maxLength: 50,\n },\n {\n value: description,\n label: intl.formatMessage(messages.extendedDescriptionLabel),\n helpText: intl.formatMessage(messages.extendedDescriptionHelpText),\n ariaLabel: intl.formatMessage(messages.extendedDescriptionAriaLabel),\n controlName: 'description',\n maxLength: 1000,\n asTextarea: true,\n },\n ];\n return (\n <>\n {paramsForExtendedFields.map((param) => (\n \n {param.label}\n onChange(e.target.value, param.controlName)}\n aria-label={param.ariaLabel}\n />\n {param.helpText}\n \n ))}\n \n );\n};\n\nExtendedCourseDetails.defaultProps = {\n title: '',\n subtitle: '',\n duration: '',\n description: '',\n};\n\nExtendedCourseDetails.propTypes = {\n title: PropTypes.string,\n subtitle: PropTypes.string,\n duration: PropTypes.string,\n description: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default ExtendedCourseDetails;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n introducingTitle: {\n id: 'course-authoring.schedule-section.introducing.title',\n defaultMessage: 'Introducing your course',\n },\n introducingDescription: {\n id: 'course-authoring.schedule-section.introducing.description',\n defaultMessage: 'Information for prospective students',\n },\n courseShortDescriptionLabel: {\n id: 'course-authoring.schedule-section.introducing.course-short-description.label',\n defaultMessage: 'Course short description',\n },\n courseShortDescriptionAriaLabel: {\n id: 'course-authoring.schedule-section.introducing.course-short-description.aria-label',\n defaultMessage: 'Show course short description',\n },\n courseShortDescriptionHelpText: {\n id: 'course-authoring.schedule-section.introducing.course-short-description.help-text',\n defaultMessage: 'Appears on the course catalog page when students roll over the course name. Limit to ~150 characters',\n },\n courseOverviewLabel: {\n id: 'course-authoring.schedule-section.introducing.course-overview.label',\n defaultMessage: 'Course overview',\n },\n courseOverviewHelpText: {\n id: 'course-authoring.schedule-section.introducing.course-overview.help-text',\n defaultMessage: 'Introductions, prerequisites, FAQs that are used on {hyperlink} (formatted in HTML)',\n },\n courseAboutHyperlink: {\n id: 'course-authoring.schedule-section.introducing.course-about.hyperlink',\n defaultMessage: 'your course summary page',\n },\n courseAboutSidebarLabel: {\n id: 'course-authoring.schedule-section.introducing.course-about-sidebar.label',\n defaultMessage: 'Course about sidebar HTML',\n },\n courseAboutSidebarHelpText: {\n id: 'course-authoring.schedule-section.introducing.course-about-sidebar.help-text',\n defaultMessage: 'Custom sidebar content for {hyperlink} (formatted in HTML)',\n },\n courseCardImageLabel: {\n id: 'course-authoring.schedule-section.introducing.course-card-image.label',\n defaultMessage: 'Course card image',\n },\n courseCardImageIdentifierText: {\n id: 'course-authoring.schedule-section.introducing.course-card-image.identifier-text',\n defaultMessage: 'course image',\n },\n courseBannerImageLabel: {\n id: 'course-authoring.schedule-section.introducing.course-banner-image.label',\n defaultMessage: 'Course banner image',\n },\n courseBannerImageInsertText: {\n id: 'course-authoring.schedule-section.introducing.course-banner-image.insert-banner',\n defaultMessage: 'banner image',\n },\n courseVideoThumbnailLabel: {\n id: 'course-authoring.schedule-section.introducing.video-thumbnail-image.label',\n defaultMessage: 'Course video thumbnail image',\n },\n courseVideoThumbnailInsertText: {\n id: 'course-authoring.schedule-section.introducing.video-thumbnail-image.insert-card',\n defaultMessage: 'video thumbnail image',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n injectIntl,\n intlShape,\n FormattedMessage,\n} from '@edx/frontend-platform/i18n';\nimport { Form, Hyperlink } from '@openedx/paragon';\n\nimport CourseUploadImage from '../../generic/course-upload-image';\nimport { WysiwygEditor } from '../../generic/WysiwygEditor';\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport IntroductionVideo from './introduction-video';\nimport ExtendedCourseDetails from './extended-course-details';\nimport messages from './messages';\n\nconst IntroducingSection = ({\n intl,\n title,\n subtitle,\n duration,\n overview,\n introVideo,\n description,\n aboutSidebarHtml,\n shortDescription,\n aboutPageEditable,\n sidebarHtmlEnabled,\n lmsLinkForAboutPage,\n courseImageAssetPath,\n bannerImageAssetPath,\n shortDescriptionEditable,\n enableExtendedCourseDetails,\n videoThumbnailImageAssetPath,\n onChange,\n}) => {\n const overviewHelpText = (\n \n {intl.formatMessage(messages.courseAboutHyperlink)}\n \n ),\n }}\n />\n );\n\n const aboutSidebarHelpText = (\n \n {intl.formatMessage(messages.courseAboutHyperlink)}\n \n ),\n }}\n />\n );\n\n return (\n
    \n {aboutPageEditable && (\n \n )}\n {enableExtendedCourseDetails && (\n \n )}\n {shortDescriptionEditable && (\n \n \n {intl.formatMessage(messages.courseShortDescriptionLabel)}\n \n onChange(e.target.value, 'shortDescription')}\n aria-label={intl.formatMessage(\n messages.courseShortDescriptionAriaLabel,\n )}\n maxLength={150}\n />\n \n {intl.formatMessage(messages.courseShortDescriptionHelpText)}\n \n \n )}\n {aboutPageEditable && (\n <>\n \n {intl.formatMessage(messages.courseOverviewLabel)}\n onChange(value, 'overview')}\n />\n {overviewHelpText}\n \n {sidebarHtmlEnabled && (\n \n {intl.formatMessage(messages.courseAboutSidebarLabel)}\n onChange(value, 'aboutSidebarHtml')}\n />\n {aboutSidebarHelpText}\n \n )}\n \n \n )}\n {enableExtendedCourseDetails && (\n <>\n \n \n \n )}\n {aboutPageEditable && (\n \n )}\n
    \n );\n};\n\nIntroducingSection.defaultProps = {\n title: '',\n subtitle: '',\n duration: '',\n description: '',\n introVideo: '',\n shortDescription: '',\n aboutSidebarHtml: '',\n courseImageAssetPath: '',\n bannerImageAssetPath: '',\n videoThumbnailImageAssetPath: '',\n overview: '',\n};\n\nIntroducingSection.propTypes = {\n intl: intlShape.isRequired,\n title: PropTypes.string,\n subtitle: PropTypes.string,\n duration: PropTypes.string,\n description: PropTypes.string,\n overview: PropTypes.string,\n introVideo: PropTypes.string,\n aboutSidebarHtml: PropTypes.string,\n shortDescription: PropTypes.string,\n aboutPageEditable: PropTypes.bool.isRequired,\n sidebarHtmlEnabled: PropTypes.bool.isRequired,\n lmsLinkForAboutPage: PropTypes.string.isRequired,\n courseImageAssetPath: PropTypes.string,\n bannerImageAssetPath: PropTypes.string,\n shortDescriptionEditable: PropTypes.bool.isRequired,\n enableExtendedCourseDetails: PropTypes.bool.isRequired,\n videoThumbnailImageAssetPath: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default injectIntl(IntroducingSection);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n pacingTitle: {\n id: 'course-authoring.schedule.pacing.title',\n defaultMessage: 'Course pacing',\n },\n pacingDescription: {\n id: 'course-authoring.schedule.pacing.description',\n defaultMessage: 'Set the pacing for this course',\n },\n pacingRestriction: {\n id: 'course-authoring.schedule.pacing.restriction',\n defaultMessage: 'Course pacing cannot be changed once a course has started',\n },\n pacingTypeInstructorLabel: {\n id: 'course-authoring.schedule.pacing.radio.instructor.label',\n defaultMessage: 'Instructor-paced',\n },\n pacingTypeInstructorDescription: {\n id: 'course-authoring.schedule.pacing.radio.instructor.description',\n defaultMessage:\n 'Instructor-paced courses progress at the pace that the course author sets. You can configure release dates for course content and due dates for assignments.',\n },\n pacingTypeSelfLabel: {\n id: 'course-authoring.schedule.pacing.radio.self-paced.label',\n defaultMessage: 'Self-paced',\n },\n pacingTypeSelfDescription: {\n id: 'course-authoring.schedule.pacing.radio.self-paced.description',\n defaultMessage: 'Self-paced courses offer suggested due dates for assignments or exams based on the learner’s enrollment date and the expected course duration. These courses offer learners flexibility to modify the assignment dates as needed.',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Form } from '@openedx/paragon';\n\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport messages from './messages';\n\nconst PacingSection = ({\n selfPaced, startDate, onChange,\n}) => {\n const intl = useIntl();\n const canTogglePace = new Date() <= new Date(startDate);\n\n return (\n
    \n \n \n {!canTogglePace && (\n \n {intl.formatMessage(messages.pacingRestriction)}\n \n )}\n onChange(e.target.value, e.target.name)}\n value={selfPaced.toString()}\n >\n \n {intl.formatMessage(messages.pacingTypeInstructorLabel)}\n \n \n {intl.formatMessage(messages.pacingTypeSelfLabel)}\n \n \n \n
    \n );\n};\n\nPacingSection.defaultProps = {\n selfPaced: '',\n startDate: '',\n};\n\nPacingSection.propTypes = {\n startDate: PropTypes.string,\n selfPaced: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n onChange: PropTypes.func.isRequired,\n};\n\nexport default PacingSection;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { DatepickerControl, DATEPICKER_TYPES } from '../../../generic/datepicker-control';\n\nexport const SCHEDULE_ROW_TYPES = {\n datetime: 'datetime',\n dropdown: 'dropdown',\n};\n\nexport const ScheduleRow = ({\n value,\n labels,\n helpText,\n readonly,\n controlName,\n errorFeedback,\n onChange,\n}) => (\n
  • \n
    \n onChange(date, controlName)}\n />\n onChange(date, controlName)}\n showUTC\n />\n
    \n {errorFeedback && (\n {errorFeedback}\n )}\n
  • \n);\n\nScheduleRow.defaultProps = {\n value: '',\n helpText: '',\n readonly: false,\n errorFeedback: '',\n};\n\nScheduleRow.propTypes = {\n value: PropTypes.string,\n labels: PropTypes.arrayOf(PropTypes.string).isRequired,\n helpText: PropTypes.string,\n readonly: PropTypes.bool,\n controlName: PropTypes.string.isRequired,\n errorFeedback: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default ScheduleRow;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n certificateBehaviorLabel: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.label',\n defaultMessage: 'Certificate display behavior',\n },\n certificateBehaviorHelpText: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.help-text',\n defaultMessage: 'Certificates are awarded at the end of a course run',\n },\n certificateAvailableDateLabel: {\n id: 'course-authoring.schedule.schedule-section.certificate-available-date.label',\n defaultMessage: 'Certificate available date',\n },\n certificateDisplayBehaviorToggleTitle: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.toggle.title',\n defaultMessage: 'Read more about this setting',\n },\n certificateDisplayBehaviorToggleParagraph: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.toggle.paragraph',\n defaultMessage: 'In all configurations of this setting, certificates are generated for learners as soon as they achieve the passing threshold in the course (which can occur before a final assignment based on course design).',\n },\n certificateDisplayBehaviorToggleHeading1: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.toggle.heading-1',\n defaultMessage: 'Immediately upon passing',\n },\n certificateDisplayBehaviorToggleParagraph1: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.toggle.paragraph-1',\n defaultMessage: 'Learners can access their certificate as soon as they achieve a passing grade above the course grade threshold. Note: learners can achieve a passing grade before encountering all assignments in some course configurations.',\n },\n certificateDisplayBehaviorToggleHeading2: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.toggle.heading-2',\n defaultMessage: 'On course end date',\n },\n certificateDisplayBehaviorToggleParagraph2: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.toggle.paragraph-2',\n defaultMessage: 'Learners with passing grades can access their certificate once the end date of the course has elapsed.',\n },\n certificateDisplayBehaviorToggleHeading3: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.toggle.heading-3',\n defaultMessage: 'A date after the course end date',\n },\n certificateDisplayBehaviorToggleParagraph3: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.toggle.paragraph-3',\n defaultMessage: 'Learners with passing grades can access their certificate after the date that you set has elapsed.',\n },\n certificateBehaviorDropdownOption1: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.dropdown.option-1',\n defaultMessage: 'Immediately upon passing',\n },\n certificateBehaviorDropdownOption2: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.dropdown.option-2',\n defaultMessage: 'End date of course',\n },\n certificateBehaviorDropdownOption3: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.dropdown.option-3',\n defaultMessage: 'A date after the course end date',\n },\n certificateBehaviorDropdownEmpty: {\n id: 'course-authoring.schedule.schedule-section.certificate-behavior.dropdown.empty',\n defaultMessage: 'Select certificate display behavior',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Dropdown, Form, Collapsible, Icon,\n} from '@openedx/paragon';\nimport { InfoOutline } from '@openedx/paragon/icons';\n\nimport { getLabelById } from '../../../utils';\nimport { DatepickerControl, DATEPICKER_TYPES } from '../../../generic/datepicker-control';\nimport messages from './messages';\n\nexport const CERTIFICATE_DISPLAY_BEHAVIOR = {\n earlyNoInfo: 'early_no_info',\n end: 'end',\n endWithDate: 'end_with_date',\n};\n\nconst CertificateDisplayRow = ({\n certificateAvailableDate,\n availableDateErrorFeedback,\n certificatesDisplayBehavior,\n displayBehaviorErrorFeedback,\n onChange,\n}) => {\n const intl = useIntl();\n const dropdownOptions = [\n {\n id: CERTIFICATE_DISPLAY_BEHAVIOR.earlyNoInfo,\n label: intl.formatMessage(messages.certificateBehaviorDropdownOption1),\n },\n {\n id: CERTIFICATE_DISPLAY_BEHAVIOR.end,\n label: intl.formatMessage(messages.certificateBehaviorDropdownOption2),\n },\n {\n id: CERTIFICATE_DISPLAY_BEHAVIOR.endWithDate,\n label: intl.formatMessage(messages.certificateBehaviorDropdownOption3),\n },\n ];\n\n const formatCertificateDisplayBehavior = (value) => {\n if (!value) {\n return '';\n }\n\n if (Object.values(CERTIFICATE_DISPLAY_BEHAVIOR).includes(value)) {\n return value;\n }\n\n return value.split('.')[1].toLowerCase();\n };\n\n const handleOnChange = (optionId) => {\n if (optionId !== CERTIFICATE_DISPLAY_BEHAVIOR.endWithDate) {\n onChange('', 'certificateAvailableDate');\n }\n onChange(optionId, 'certificatesDisplayBehavior');\n };\n\n const formattedCertificateBehavior = formatCertificateDisplayBehavior(\n certificatesDisplayBehavior,\n );\n\n const certificateDisplayValue = getLabelById(dropdownOptions, formattedCertificateBehavior)\n || intl.formatMessage(messages.certificateBehaviorDropdownEmpty);\n\n const showAvailableDate = formattedCertificateBehavior === CERTIFICATE_DISPLAY_BEHAVIOR.endWithDate;\n\n const renderReadMoreToggle = () => {\n const readMore = [\n {\n heading: intl.formatMessage(\n messages.certificateDisplayBehaviorToggleHeading1,\n ),\n paragraph: intl.formatMessage(\n messages.certificateDisplayBehaviorToggleParagraph1,\n ),\n },\n {\n heading: intl.formatMessage(\n messages.certificateDisplayBehaviorToggleHeading2,\n ),\n paragraph: intl.formatMessage(\n messages.certificateDisplayBehaviorToggleParagraph2,\n ),\n },\n {\n heading: intl.formatMessage(\n messages.certificateDisplayBehaviorToggleHeading3,\n ),\n paragraph: intl.formatMessage(\n messages.certificateDisplayBehaviorToggleParagraph3,\n ),\n },\n ];\n\n return (\n \n \n \n {intl.formatMessage(messages.certificateDisplayBehaviorToggleTitle)}\n \n \n

    \n {intl.formatMessage(\n messages.certificateDisplayBehaviorToggleParagraph,\n )}\n

    \n {readMore.map(({ heading, paragraph }) => (\n
    \n

    {heading}

    \n

    {paragraph}

    \n
    \n ))}\n
    \n
    \n );\n };\n\n return (\n
  • \n
    \n \n \n {intl.formatMessage(messages.certificateBehaviorLabel)}\n \n \n \n {certificateDisplayValue}\n \n \n {dropdownOptions.map(({ id, label }) => (\n handleOnChange(id)}>\n {label}\n \n ))}\n \n \n \n {intl.formatMessage(messages.certificateBehaviorHelpText)}\n \n {showAvailableDate && (\n onChange(date, 'certificateAvailableDate')}\n isInvalid={!!availableDateErrorFeedback}\n controlName=\"certificateAvailableDate\"\n />\n )}\n {availableDateErrorFeedback && (\n \n {availableDateErrorFeedback}\n \n )}\n {displayBehaviorErrorFeedback && (\n \n {displayBehaviorErrorFeedback}\n \n )}\n {renderReadMoreToggle()}\n \n
    \n
  • \n );\n};\n\nCertificateDisplayRow.defaultProps = {\n certificateAvailableDate: '',\n availableDateErrorFeedback: '',\n certificatesDisplayBehavior: '',\n displayBehaviorErrorFeedback: '',\n};\n\nCertificateDisplayRow.propTypes = {\n certificateAvailableDate: PropTypes.string,\n availableDateErrorFeedback: PropTypes.string,\n certificatesDisplayBehavior: PropTypes.string,\n displayBehaviorErrorFeedback: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default CertificateDisplayRow;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n scheduleTitle: {\n id: 'course-authoring.schedule.schedule-section.title',\n defaultMessage: 'Course schedule',\n },\n scheduleDescription: {\n id: 'course-authoring.schedule.schedule-section.description',\n defaultMessage: 'Dates that control when your course can be viewed',\n },\n scheduleCourseStartDateLabel: {\n id: 'course-authoring.schedule.schedule-section.course-start.date.label',\n defaultMessage: 'Course start date',\n },\n scheduleCourseStartDateHelpText: {\n id: 'course-authoring.schedule.schedule-section.course-start.date.help-text',\n defaultMessage: 'First day the course begins',\n },\n scheduleCourseStartTimeLabel: {\n id: 'course-authoring.schedule.schedule-section.course-start.time.label',\n defaultMessage: 'Course start time',\n },\n scheduleCourseEndDateLabel: {\n id: 'course-authoring.schedule.schedule-section.course-end.date.label',\n defaultMessage: 'Course end date',\n },\n scheduleCourseEndDateHelpText: {\n id: 'course-authoring.schedule.schedule-section.course-end.date.help-text',\n defaultMessage: 'Last day your course is active',\n },\n scheduleCourseEndTimeLabel: {\n id: 'course-authoring.schedule.schedule-section.course-end.time.label',\n defaultMessage: 'Course end time',\n },\n scheduleEnrollmentStartDateLabel: {\n id: 'course-authoring.schedule.schedule-section.enrollment-start.date.label',\n defaultMessage: 'Enrollment start date',\n },\n scheduleEnrollmentStartDateHelpText: {\n id: 'course-authoring.schedule.schedule-section.enrollment-start.help-text',\n defaultMessage: 'First day students can enroll',\n },\n scheduleEnrollmentStartTimeLabel: {\n id: 'course-authoring.schedule.schedule-section.enrollment-start.time.label',\n defaultMessage: 'Enrollment start time',\n },\n scheduleEnrollmentEndDateLabel: {\n id: 'course-authoring.schedule.schedule-section.enrollment-end.date.label',\n defaultMessage: 'Enrollment end date',\n },\n scheduleEnrollmentEndDateHelpText: {\n id: 'course-authoring.schedule.schedule-section.enrollment-end.date.help-text',\n defaultMessage: 'Last day students can enroll.',\n },\n scheduleEnrollmentEndDateRestrictedHelpText: {\n id: 'course-authoring.schedule.schedule-section.enrollment-end.date.restricted.help-text',\n defaultMessage: 'Contact your {platformName} partner manager to update these settings.',\n },\n scheduleEnrollmentEndTimeLabel: {\n id: 'course-authoring.schedule.schedule-section.enrollment-end.time.label',\n defaultMessage: 'Enrollment end time',\n },\n scheduleUpgradeDeadlineDateLabel: {\n id: 'course-authoring.schedule.schedule-section.upgrade-deadline.date.label',\n defaultMessage: 'Upgrade deadline date',\n },\n scheduleUpgradeDeadlineDateHelpText: {\n id: 'course-authoring.schedule.schedule-section.upgrade-deadline.date.help-text',\n defaultMessage: 'Last day students can upgrade to a verified enrollment. Contact your {platformName} partner manager to update these settings.',\n },\n scheduleUpgradeDeadlineTimeLabel: {\n id: 'course-authoring.schedule.schedule-section.upgrade-deadline.time.label',\n defaultMessage: 'Upgrade deadline time',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport { ScheduleRow, SCHEDULE_ROW_TYPES } from './schedule-row';\nimport { CertificateDisplayRow } from './certificate-display-row';\nimport messages from './messages';\n\nconst ScheduleSection = ({\n endDate,\n startDate,\n errorFields,\n platformName,\n enrollmentEnd,\n enrollmentStart,\n upgradeDeadline,\n enrollmentEndEditable,\n certificateAvailableDate,\n certificatesDisplayBehavior,\n canShowCertificateAvailableDateField,\n onChange,\n}) => {\n const intl = useIntl();\n const enrollmentEndHelpText = intl.formatMessage(\n messages.scheduleEnrollmentEndDateHelpText,\n );\n const enrollmentEndHelpTexRestricted = intl.formatMessage(\n messages.scheduleEnrollmentEndDateRestrictedHelpText,\n { platformName },\n );\n const computedEnrollmentEndHelpText = `${enrollmentEndHelpText} ${\n !enrollmentEndEditable ? enrollmentEndHelpTexRestricted : ''\n }`;\n\n const propsForScheduleFields = [\n {\n value: startDate,\n labels: [\n intl.formatMessage(messages.scheduleCourseStartDateLabel),\n intl.formatMessage(messages.scheduleCourseStartTimeLabel),\n ],\n rowType: SCHEDULE_ROW_TYPES.datetime,\n helpText: intl.formatMessage(messages.scheduleCourseStartDateHelpText),\n controlName: 'startDate',\n errorFeedback: errorFields?.startDate,\n },\n {\n labels: [\n intl.formatMessage(messages.scheduleCourseEndDateLabel),\n intl.formatMessage(messages.scheduleCourseEndTimeLabel),\n ],\n value: endDate,\n rowType: SCHEDULE_ROW_TYPES.datetime,\n helpText: intl.formatMessage(messages.scheduleCourseEndDateHelpText),\n controlName: 'endDate',\n errorFeedback: errorFields?.endDate,\n },\n {\n skip: !canShowCertificateAvailableDateField,\n key: 'certificate-display-row',\n rowType: SCHEDULE_ROW_TYPES.dropdown,\n certificateAvailableDate,\n availableDateErrorFeedback: errorFields?.certificateAvailableDate,\n certificatesDisplayBehavior,\n displayBehaviorErrorFeedback: errorFields?.certificatesDisplayBehavior,\n },\n {\n labels: [\n intl.formatMessage(messages.scheduleEnrollmentStartDateLabel),\n intl.formatMessage(messages.scheduleEnrollmentStartTimeLabel),\n ],\n value: enrollmentStart,\n rowType: SCHEDULE_ROW_TYPES.datetime,\n helpText: intl.formatMessage(messages.scheduleEnrollmentStartDateHelpText),\n controlName: 'enrollmentStart',\n errorFeedback: errorFields?.enrollmentStart,\n },\n {\n labels: [\n intl.formatMessage(messages.scheduleEnrollmentEndDateLabel),\n intl.formatMessage(messages.scheduleEnrollmentEndTimeLabel),\n ],\n value: enrollmentEnd,\n rowType: SCHEDULE_ROW_TYPES.datetime,\n helpText: computedEnrollmentEndHelpText,\n readonly: !enrollmentEndEditable,\n controlName: 'enrollmentEnd',\n errorFeedback: errorFields?.enrollmentEnd,\n },\n {\n skip: !upgradeDeadline,\n labels: [\n intl.formatMessage(messages.scheduleUpgradeDeadlineDateLabel),\n intl.formatMessage(messages.scheduleUpgradeDeadlineTimeLabel),\n ],\n value: upgradeDeadline,\n rowType: SCHEDULE_ROW_TYPES.datetime,\n helpText: intl.formatMessage(\n messages.scheduleUpgradeDeadlineDateHelpText,\n {\n platformName,\n },\n ),\n readonly: true,\n controlName: 'upgradeDeadline',\n errorFeedback: errorFields?.upgradeDeadline,\n },\n ];\n\n return (\n
    \n \n
      \n {propsForScheduleFields\n .filter((field) => !field.skip)\n .map((fieldProps) => {\n if (fieldProps.rowType === SCHEDULE_ROW_TYPES.datetime) {\n const { skip, rowType, ...restProps } = fieldProps;\n return (\n \n );\n }\n const { rowType, key, ...restProps } = fieldProps;\n return (\n \n );\n })}\n
    \n
    \n );\n};\n\nScheduleSection.defaultProps = {\n endDate: '',\n startDate: '',\n errorFields: {},\n enrollmentEnd: '',\n enrollmentStart: '',\n upgradeDeadline: '',\n certificateAvailableDate: '',\n};\n\nScheduleSection.propTypes = {\n endDate: PropTypes.string,\n startDate: PropTypes.string,\n errorFields: PropTypes.objectOf(PropTypes.string),\n platformName: PropTypes.string.isRequired,\n enrollmentEnd: PropTypes.string,\n enrollmentStart: PropTypes.string,\n upgradeDeadline: PropTypes.string,\n enrollmentEndEditable: PropTypes.bool.isRequired,\n certificateAvailableDate: PropTypes.string,\n certificatesDisplayBehavior: PropTypes.string.isRequired,\n canShowCertificateAvailableDateField: PropTypes.bool.isRequired,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default ScheduleSection;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n outcomesTitle: {\n id: 'course-authoring.schedule.learning-outcomes-section.title',\n defaultMessage: 'Learning outcomes',\n },\n outcomesDescription: {\n id: 'course-authoring.schedule.learning-outcomes-section.description',\n defaultMessage: 'Add the learning outcomes for this course',\n },\n outcomesDelete: {\n id: 'course-authoring.schedule.learning-outcomes-section.delete',\n defaultMessage: 'Delete',\n },\n outcomesAdd: {\n id: 'course-authoring.schedule.learning-outcomes-section.add',\n defaultMessage: 'Add learning outcome',\n },\n outcomesInputPlaceholder: {\n id: 'course-authoring.schedule.learning-outcomes-section.input.placeholder',\n defaultMessage: 'Add a learning outcome here',\n },\n outcomesLabelIncrement: {\n id: 'course-authoring.schedule.learning-outcomes-section.label-increment',\n defaultMessage: 'Learning outcome',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Form, Button } from '@openedx/paragon';\nimport { Add as AddIcon } from '@openedx/paragon/icons';\n\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport messages from './messages';\n\nconst LearningOutcomesSection = ({ learningInfo, onChange }) => {\n const intl = useIntl();\n\n const handleInputChange = (value, index) => {\n const updatedInfo = [...learningInfo];\n updatedInfo[index] = value;\n onChange(updatedInfo, 'learningInfo');\n };\n\n const handleDelete = (index) => {\n const updatedInfo = [...learningInfo];\n updatedInfo.splice(index, 1);\n onChange(updatedInfo, 'learningInfo');\n };\n\n const handleAdd = () => {\n const updatedInfo = [...learningInfo, ''];\n onChange(updatedInfo, 'learningInfo');\n };\n\n const renderLearningOutcomeItem = (text, idx) => (\n \n \n {intl.formatMessage(messages.outcomesLabelIncrement)} {idx + 1}\n \n handleInputChange(e.target.value, idx)}\n />\n handleDelete(idx)}\n >\n {intl.formatMessage(messages.outcomesDelete)}\n \n \n );\n\n return (\n
    \n \n
      \n {learningInfo.map(renderLearningOutcomeItem)}\n
    \n \n
    \n );\n};\n\nLearningOutcomesSection.defaultProps = {\n learningInfo: [],\n};\n\nLearningOutcomesSection.propTypes = {\n learningInfo: PropTypes.arrayOf(PropTypes.string),\n onChange: PropTypes.func.isRequired,\n};\n\nexport default LearningOutcomesSection;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n instructorNameLabel: {\n id: 'course-authoring.schedule-section.instructor.name.label',\n defaultMessage: 'Name',\n },\n instructorNameHelpText: {\n id: 'course-authoring.schedule-section.instructor.name.help-text',\n defaultMessage: 'Please add the instructor\\'s name',\n },\n instructorNameInputPlaceholder: {\n id: 'course-authoring.schedule-section.instructor.name.input.placeholder',\n defaultMessage: 'Instructor name',\n },\n instructorTitleLabel: {\n id: 'course-authoring.schedule-section.instructor.title.label',\n defaultMessage: 'Title',\n },\n instructorTitleHelpText: {\n id: 'course-authoring.schedule-section.instructor.title.help-text',\n defaultMessage: 'Please add the instructor\\'s title',\n },\n instructorTitleInputPlaceholder: {\n id: 'course-authoring.schedule-section.instructor.title.input.placeholder',\n defaultMessage: 'Instructor title',\n },\n instructorOrganizationLabel: {\n id: 'course-authoring.schedule-section.instructor.organization.label',\n defaultMessage: 'Organization',\n },\n instructorOrganizationHelpText: {\n id: 'course-authoring.schedule-section.instructor.organization.help-text',\n defaultMessage: 'Please add the institute where the instructor is associated',\n },\n instructorOrganizationInputPlaceholder: {\n id: 'course-authoring.schedule-section.instructor.organization.input.placeholder',\n defaultMessage: 'Instructor organization',\n },\n instructorBioLabel: {\n id: 'course-authoring.schedule-section.instructor.bio.label',\n defaultMessage: 'Biography',\n },\n instructorBioHelpText: {\n id: 'course-authoring.schedule-section.instructor.bio.help-text',\n defaultMessage: 'Please add the instructor\\'s biography',\n },\n instructorBioInputPlaceholder: {\n id: 'course-authoring.schedule-section.instructor.bio.input.placeholder',\n defaultMessage: 'Instructor biography',\n },\n instructorPhotoLabel: {\n id: 'course-authoring.schedule-section.instructor.photo.label',\n defaultMessage: 'Photo',\n },\n instructorPhotoHelpText: {\n id: 'course-authoring.schedule-section.instructor.photo.help-text',\n defaultMessage: 'Please add a photo of the instructor (Note: only JPEG or PNG format supported)',\n },\n instructorPhotoInputPlaceholder: {\n id: 'course-authoring.schedule-section.instructor.photo.input.placeholder',\n defaultMessage: 'Instructor photo URL',\n },\n instructorDelete: {\n id: 'course-authoring.schedule-section.instructor.delete',\n defaultMessage: 'Delete',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport TextareaAutosize from 'react-textarea-autosize';\nimport {\n Card, Form, Col, Button,\n} from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport CourseUploadImage from '../../../generic/course-upload-image';\nimport messages from './messages';\n\nconst InstructorContainer = ({\n instructor, idx, onDelete, onChange,\n}) => {\n const intl = useIntl();\n return (\n \n \n
    \n \n \n \n {intl.formatMessage(messages.instructorNameLabel)}\n \n onChange(e.target.value, idx, 'name')}\n />\n \n {intl.formatMessage(messages.instructorNameHelpText)}\n \n \n\n \n \n {intl.formatMessage(messages.instructorTitleLabel)}\n \n onChange(e.target.value, idx, 'title')}\n />\n \n {intl.formatMessage(messages.instructorTitleHelpText)}\n \n \n\n \n \n {intl.formatMessage(messages.instructorOrganizationLabel)}\n \n onChange(e.target.value, idx, 'organization')}\n />\n \n {intl.formatMessage(messages.instructorOrganizationHelpText)}\n \n \n \n \n \n \n {intl.formatMessage(messages.instructorBioLabel)}\n \n onChange(e.target.value, idx, 'bio')}\n />\n \n {intl.formatMessage(messages.instructorBioHelpText)}\n \n \n \n \n onChange(value, idx, field)}\n />\n \n
    \n
    \n \n \n \n \n
    \n );\n};\n\nInstructorContainer.defaultProps = {\n instructor: {},\n};\n\nInstructorContainer.propTypes = {\n instructor: PropTypes.shape({\n bio: PropTypes.string,\n image: PropTypes.string,\n name: PropTypes.string,\n organization: PropTypes.string,\n title: PropTypes.string,\n }),\n idx: PropTypes.number.isRequired,\n onDelete: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default InstructorContainer;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n instructorsTitle: {\n id: 'course-authoring.schedule-section.instructors.title',\n defaultMessage: 'Instructors',\n },\n instructorsDescription: {\n id: 'course-authoring.schedule-section.instructors.description',\n defaultMessage: 'Add details about the instructors for this course',\n },\n instructorAdd: {\n id: 'course-authoring.schedule-section.instructors.add-instructor',\n defaultMessage: 'Add Instructor',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { v4 as uuid } from 'uuid';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Button } from '@openedx/paragon';\nimport { Add as AddIcon } from '@openedx/paragon/icons';\n\nimport InstructorContainer from './instructor-container';\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport messages from './messages';\n\nconst InstructorsSection = ({ instructors, onChange }) => {\n const intl = useIntl();\n const newInstructor = {\n bio: '',\n image: '',\n name: '',\n organization: '',\n title: '',\n };\n\n const handleChange = (value, idx, field) => {\n const updatedInstructors = instructors.map((instructor, index) => {\n if (index === idx) {\n return {\n ...instructor,\n [field]: value,\n };\n }\n return instructor;\n });\n\n const updatedInstructorInfo = {\n instructors: updatedInstructors,\n };\n onChange(updatedInstructorInfo, 'instructorInfo');\n };\n\n const handleDelete = (idx) => {\n const updatedInstructorInfo = {\n instructors: [...instructors],\n };\n updatedInstructorInfo.instructors.splice(idx, 1);\n onChange(updatedInstructorInfo, 'instructorInfo');\n };\n\n const handleAdd = () => {\n const updatedInstructorInfo = {\n instructors: [...instructors, newInstructor],\n };\n\n onChange(updatedInstructorInfo, 'instructorInfo');\n };\n\n return (\n
    \n \n
      \n {instructors.map((instructor, idx) => (\n \n ))}\n
    \n \n
    \n );\n};\n\nInstructorsSection.defaultProps = {\n instructors: [],\n};\n\nInstructorsSection.propTypes = {\n instructors: PropTypes.arrayOf(\n PropTypes.shape({\n bio: PropTypes.string,\n image: PropTypes.string,\n name: PropTypes.string,\n organization: PropTypes.string,\n title: PropTypes.string,\n }),\n ),\n onChange: PropTypes.func.isRequired,\n};\n\nexport default InstructorsSection;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n requirementsEntranceCollapseLabel: {\n id: 'course-authoring.schedule-section.requirements.entrance.collapse.label',\n defaultMessage: 'Grade requirements',\n },\n requirementsEntranceCollapseHelpText: {\n id: 'course-authoring.schedule-section.requirements.entrance.collapse.help-text',\n defaultMessage:\n 'The score student must meet in order to successfully complete the entrance exam.',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Form, Stack } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst GradeRequirements = ({\n errorEffort,\n entranceExamMinimumScorePct,\n onChange,\n}) => (\n \n \n \n \n \n onChange(e.target.value, 'entranceExamMinimumScorePct')}\n trailingElement=\"%\"\n />\n \n {errorEffort && (\n \n {errorEffort}\n \n )}\n \n \n \n \n);\n\nGradeRequirements.defaultProps = {\n errorEffort: '',\n entranceExamMinimumScorePct: '',\n};\n\nGradeRequirements.propTypes = {\n errorEffort: PropTypes.string,\n entranceExamMinimumScorePct: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default GradeRequirements;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n requirementsEntrance: {\n id: 'course-authoring.schedule-section.requirements.entrance.label',\n defaultMessage: 'Entrance exam',\n },\n requirementsEntranceCollapseTitle: {\n id: 'course-authoring.schedule-section.requirements.entrance.collapse.title',\n defaultMessage: 'Require students to pass an exam before beginning the course.',\n },\n requirementsEntranceCollapseParagraph: {\n id: 'course-authoring.schedule-section.requirements.entrance.collapse.paragraph',\n defaultMessage: 'You can now view and author your course entrance exam from the {hyperlink}.',\n },\n requirementsEntranceCollapseHyperlink: {\n id: 'course-authoring.schedule-section.requirements.entrance.collapse.hyperlink',\n defaultMessage: 'course outline',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useParams } from 'react-router-dom';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Form, Card, Hyperlink } from '@openedx/paragon';\n\nimport { getPagePath } from '../../../utils';\nimport GradeRequirements from '../grade-requirements';\nimport messages from './messages';\n\nconst EntranceExam = ({\n errorEffort,\n isCheckedString,\n entranceExamMinimumScorePct,\n onChange,\n}) => {\n const { courseId } = useParams();\n const showEntranceExam = isCheckedString === 'true';\n const toggleEntranceExam = () => onChange((!showEntranceExam).toString(), 'entranceExamEnabled');\n const courseOutlineDestination = getPagePath(\n courseId,\n 'false',\n 'course',\n );\n\n return (\n \n \n \n \n \n \n \n \n \n \n {showEntranceExam && (\n <>\n \n \n

    \n \n \n \n ),\n }}\n />\n

    \n \n
    \n \n )}\n
    \n
    \n );\n};\n\nEntranceExam.defaultProps = {\n errorEffort: '',\n isCheckedString: '',\n entranceExamMinimumScorePct: '',\n};\n\nEntranceExam.propTypes = {\n errorEffort: PropTypes.string,\n isCheckedString: PropTypes.string,\n entranceExamMinimumScorePct: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default EntranceExam;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n requirementsTitle: {\n id: 'course-authoring.schedule-section.requirements.title',\n defaultMessage: 'Requirements',\n },\n requirementsDescription: {\n id: 'course-authoring.schedule-section.requirements.description',\n defaultMessage: 'Expectations of the students taking this course',\n },\n timepickerLabel: {\n id: 'course-authoring.schedule-section.requirements.timepicker.label',\n defaultMessage: 'Hours of effort per week',\n },\n timepickerHelpText: {\n id: 'course-authoring.schedule-section.requirements.timepicker.help-text',\n defaultMessage: 'Time spent on all course work',\n },\n dropdownLabel: {\n id: 'course-authoring.schedule-section.requirements.dropdown.label',\n defaultMessage: 'Prerequisite course',\n },\n dropdownHelpText: {\n id: 'course-authoring.schedule-section.requirements.dropdown.help-text',\n defaultMessage: 'Course that students must complete before beginning this course',\n },\n dropdownEmptyText: {\n id: 'course-authoring.schedule-section.requirements.dropdown.empty-text',\n defaultMessage: 'None',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Form, Dropdown } from '@openedx/paragon';\n\nimport { TIME_FORMAT } from '../../constants';\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport EntranceExam from './entrance-exam';\nimport messages from './messages';\n\nconst RequirementsSection = ({\n effort,\n errorFields,\n aboutPageEditable,\n preRequisiteCourses,\n entranceExamEnabled,\n isEntranceExamsEnabled,\n possiblePreRequisiteCourses,\n entranceExamMinimumScorePct,\n isPrerequisiteCoursesEnabled,\n onChange,\n}) => {\n const intl = useIntl();\n const selectedItem = possiblePreRequisiteCourses?.find(\n (course) => course.courseKey === preRequisiteCourses[0],\n );\n const formattedSelectedItem = selectedItem?.displayName || intl.formatMessage(messages.dropdownEmptyText);\n\n const renderPrerequisiteDropdown = () => (\n \n {intl.formatMessage(messages.dropdownLabel)}\n \n \n {formattedSelectedItem}\n \n \n onChange([], 'preRequisiteCourses')}\n >\n {intl.formatMessage(messages.dropdownEmptyText)}\n \n {possiblePreRequisiteCourses.map((course) => (\n onChange([course.courseKey], 'preRequisiteCourses')}\n >\n {course.displayName}\n \n ))}\n \n \n \n {intl.formatMessage(messages.dropdownHelpText)}\n \n \n );\n\n return (\n
    \n \n {aboutPageEditable && (\n \n \n {intl.formatMessage(messages.timepickerLabel)}\n \n onChange(e.target.value, 'effort')}\n />\n \n {intl.formatMessage(messages.timepickerHelpText)}\n \n \n )}\n {isPrerequisiteCoursesEnabled && renderPrerequisiteDropdown()}\n {isEntranceExamsEnabled && (\n \n )}\n
    \n );\n};\n\nconst preRequisitesCourse = {\n courseKey: PropTypes.string,\n displayName: PropTypes.string,\n lmsLink: PropTypes.string,\n number: PropTypes.string,\n org: PropTypes.string,\n rerunLink: PropTypes.string,\n run: PropTypes.string,\n url: PropTypes.string,\n};\n\nRequirementsSection.defaultProps = {\n effort: '',\n errorFields: {},\n entranceExamEnabled: '',\n preRequisiteCourses: [],\n entranceExamMinimumScorePct: '',\n};\n\nRequirementsSection.propTypes = {\n effort: PropTypes.string,\n errorFields: PropTypes.objectOf(PropTypes.string),\n aboutPageEditable: PropTypes.bool.isRequired,\n preRequisiteCourses: PropTypes.arrayOf(PropTypes.string),\n entranceExamEnabled: PropTypes.string,\n isEntranceExamsEnabled: PropTypes.bool.isRequired,\n possiblePreRequisiteCourses: PropTypes.arrayOf(\n PropTypes.shape(preRequisitesCourse),\n ).isRequired,\n entranceExamMinimumScorePct: PropTypes.string,\n isPrerequisiteCoursesEnabled: PropTypes.bool.isRequired,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default RequirementsSection;\n","const creativeCommonsLicensesURL = 'https://creativecommons.org/licenses';\nconst creativeCommonsVersion = '4.0';\n\nconst LICENSE_TYPE = {\n allRightsReserved: 'all-rights-reserved',\n creativeCommons: 'creative-commons',\n};\n\nconst LICENSE_COMMONS_OPTIONS = {\n attribution: 'BY',\n nonCommercial: 'NC',\n noDerivatives: 'ND',\n shareAlike: 'SA',\n};\n\nexport {\n LICENSE_TYPE, LICENSE_COMMONS_OPTIONS, creativeCommonsLicensesURL, creativeCommonsVersion,\n};\n","const ApplyWrapper = ({ condition, wrapper, children }) => (condition ? wrapper(children) : children);\n\nexport default ApplyWrapper;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n allRightReservedLabel: {\n id: 'course-authoring.schedule-section.license.all-right-reserved.label',\n defaultMessage: 'All rights reserved',\n },\n creativeCommonsReservedLabel: {\n id: 'course-authoring.schedule-section.license.creative-commons.label',\n defaultMessage: 'Some rights reserved',\n },\n});\n\nexport default messages;\n","/* eslint-disable react/no-unstable-nested-components */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Icon, Stack, Hyperlink } from '@openedx/paragon';\nimport {\n Attribution, Copyright, Cc, Nd, Nc, Sa,\n} from '@openedx/paragon/icons';\n\nimport ApplyWrapper from '../../../generic/ApplyWrapper';\nimport { LICENSE_TYPE } from '../constants';\nimport messages from './messages';\n\nconst LicenseIcons = ({ licenseType, licenseDetails, licenseURL }) => (\n (\n \n {children}\n \n )}\n >\n \n {[LICENSE_TYPE.allRightsReserved, null].includes(licenseType) && (\n \n )}\n {licenseType === LICENSE_TYPE.creativeCommons && (\n \n )}\n {licenseDetails?.attribution && (\n \n )}\n {licenseDetails?.nonCommercial && (\n \n )}\n {licenseDetails?.noDerivatives && (\n \n )}\n {licenseDetails?.shareAlike && (\n \n )}\n {[LICENSE_TYPE.allRightsReserved, null].includes(licenseType) && (\n \n \n \n )}\n {licenseType === LICENSE_TYPE.creativeCommons && (\n \n \n \n )}\n \n \n);\n\nLicenseIcons.defaultProps = {\n licenseURL: '',\n licenseType: null,\n};\n\nLicenseIcons.propTypes = {\n licenseType: PropTypes.oneOf(Object.values(LICENSE_TYPE)),\n licenseDetails: PropTypes.shape({\n attribution: PropTypes.bool,\n nonCommercial: PropTypes.bool,\n noDerivatives: PropTypes.bool,\n shareAlike: PropTypes.bool,\n }).isRequired,\n licenseURL: PropTypes.string,\n};\n\nexport default LicenseIcons;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n licenseDisplayLabel: {\n id: 'course-authoring.schedule-section.license.license-display.label',\n defaultMessage: 'License display',\n },\n licenseDisplayParagraph: {\n id: 'course-authoring.schedule-section.license.license-display.paragraph',\n defaultMessage: 'The following message will be displayed at the bottom of the courseware pages within your course:',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Form } from '@openedx/paragon';\n\nimport { LICENSE_TYPE } from '../constants';\nimport LicenseIcons from '../license-icons';\nimport messages from './messages';\n\nconst LicenseDisplay = ({ licenseType, licenseDetails, licenseURL }) => (\n \n

    \n \n

    \n

    \n \n

    \n \n
    \n);\n\nLicenseDisplay.defaultProps = {\n licenseURL: '',\n licenseType: null,\n licenseDetails: {},\n};\n\nLicenseDisplay.propTypes = {\n licenseType: PropTypes.oneOf(Object.values(LICENSE_TYPE)),\n licenseDetails: PropTypes.shape({\n attribution: PropTypes.bool,\n nonCommercial: PropTypes.bool,\n noDerivatives: PropTypes.bool,\n shareAlike: PropTypes.bool,\n }),\n licenseURL: PropTypes.string,\n};\n\nexport default LicenseDisplay;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n licenseType: {\n id: 'course-authoring.schedule-section.license.type',\n defaultMessage: 'License type',\n },\n licenseChoice1: {\n id: 'course-authoring.schedule-section.license.choice-1',\n defaultMessage: 'All rights reserved',\n },\n licenseChoice2: {\n id: 'course-authoring.schedule-section.license.choice-2',\n defaultMessage: 'Creative commons',\n },\n licenseTooltip1: {\n id: 'course-authoring.schedule-section.license.tooltip-1',\n defaultMessage: 'You reserve all rights for your work',\n },\n licenseTooltip2: {\n id: 'course-authoring.schedule-section.license.tooltip-2',\n defaultMessage: 'You waive some rights for your work, such that others can use it too',\n },\n creativeCommonsURLParagraph: {\n id: 'course-authoring.schedule-section.license.creative-commons.url',\n defaultMessage: 'Learn more about creative commons',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport {\n Form,\n ButtonGroup,\n Button,\n OverlayTrigger,\n Tooltip,\n} from '@openedx/paragon';\n\nimport { LICENSE_TYPE } from '../constants';\nimport messages from './messages';\n\nconst LicenseSelector = ({ licenseType, onChangeLicenseType }) => {\n const LICENSE_BUTTON_GROUP_LABELS = {\n [LICENSE_TYPE.allRightsReserved]: {\n label: ,\n tooltip: ,\n },\n [LICENSE_TYPE.creativeCommons]: {\n label: ,\n tooltip: ,\n },\n };\n\n const renderButton = (type) => {\n const isActive = licenseType === type;\n\n return (\n {LICENSE_BUTTON_GROUP_LABELS[type].tooltip}\n }\n >\n onChangeLicenseType(type, 'license')}\n >\n {LICENSE_BUTTON_GROUP_LABELS[type].label}\n \n \n );\n };\n\n return (\n \n

    \n \n

    \n \n {renderButton(LICENSE_TYPE.allRightsReserved)}\n {renderButton(LICENSE_TYPE.creativeCommons)}\n \n
    \n );\n};\n\nLicenseSelector.defaultProps = {\n licenseType: null,\n};\n\nLicenseSelector.propTypes = {\n licenseType: PropTypes.oneOf(Object.values(LICENSE_TYPE)),\n onChangeLicenseType: PropTypes.func.isRequired,\n};\n\nexport default LicenseSelector;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n licenseCreativeOptionsLabel: {\n id: 'course-authoring.schedule-section.license.creative-commons.options.label',\n defaultMessage: 'Options for creative commons',\n },\n licenseCreativeOptionsHelpText: {\n id: 'course-authoring.schedule-section.license.creative-commons.options.help-text',\n defaultMessage: 'The following options are available for the creative commons license.',\n },\n licenseCreativeOptionBYLabel: {\n id: 'course-authoring.schedule-section.license.creative-commons.option.BY.label',\n defaultMessage: 'Attribution',\n },\n licenseCreativeOptionBYDescription: {\n id: 'course-authoring.schedule-section.license.creative-commons.option.BY.description',\n defaultMessage: 'Allow others to copy, distribute, display and perform your copyrighted work but only if they give credit the way you request. Currently, this option is required.',\n },\n licenseCreativeOptionNCLabel: {\n id: 'course-authoring.schedule-section.license.creative-commons.option.NC.label',\n defaultMessage: 'Noncommercial',\n },\n licenseCreativeOptionNCDescription: {\n id: 'course-authoring.schedule-section.license.creative-commons.option.NC.description',\n defaultMessage: ' Allow others to copy, distribute, display and perform your work - and derivative works based upon it - but for noncommercial purposes only.',\n },\n licenseCreativeOptionNDLabel: {\n id: 'course-authoring.schedule-section.license.creative-commons.option.ND.label',\n defaultMessage: 'No derivatives',\n },\n licenseCreativeOptionNDDescription: {\n id: 'course-authoring.schedule-section.license.creative-commons.option.ND.description',\n defaultMessage: 'Allow others to copy, distribute, display and perform only verbatim copies of your work, not derivative works based upon it. This option is incompatible with \"Share Alike\".',\n },\n licenseCreativeOptionSALabel: {\n id: 'course-authoring.schedule-section.license.creative-commons.option.SA.label',\n defaultMessage: 'Share alike',\n },\n licenseCreativeOptionSADescription: {\n id: 'course-authoring.schedule-section.license.creative-commons.option.SA.description',\n defaultMessage: 'Allow others to distribute derivative works only under a license identical to the license that governs your work. This option is incompatible with \"No Derivatives\".',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow, Form, Stack, CheckboxControl,\n} from '@openedx/paragon';\n\nimport { LICENSE_COMMONS_OPTIONS } from '../constants';\nimport messages from './messages';\n\nconst LicenseCommonsOptions = ({ licenseDetails, onToggleCheckbox }) => {\n const optionDetails = [\n {\n id: LICENSE_COMMONS_OPTIONS.attribution,\n label: messages.licenseCreativeOptionBYLabel,\n description: messages.licenseCreativeOptionBYDescription,\n disabled: true,\n checked: licenseDetails.attribution,\n },\n {\n id: LICENSE_COMMONS_OPTIONS.nonCommercial,\n label: messages.licenseCreativeOptionNCLabel,\n description: messages.licenseCreativeOptionNCDescription,\n disabled: false,\n checked: licenseDetails.nonCommercial,\n },\n {\n id: LICENSE_COMMONS_OPTIONS.noDerivatives,\n label: messages.licenseCreativeOptionNDLabel,\n description: messages.licenseCreativeOptionNDDescription,\n disabled: false,\n checked: licenseDetails.noDerivatives,\n },\n {\n id: LICENSE_COMMONS_OPTIONS.shareAlike,\n label: messages.licenseCreativeOptionSALabel,\n description: messages.licenseCreativeOptionSADescription,\n disabled: false,\n checked: licenseDetails.shareAlike,\n },\n ];\n\n const handleCheckboxClick = (option) => {\n if (!option.disabled) {\n onToggleCheckbox(option.id);\n }\n };\n\n return (\n
    \n

    \n \n

    \n

    \n \n

    \n \n {optionDetails.map((option) => (\n handleCheckboxClick(option)}\n >\n \n \n

    \n \n

    \n \n

    \n \n

    \n
    \n \n ))}\n
    \n
    \n );\n};\n\nLicenseCommonsOptions.propTypes = {\n licenseDetails: PropTypes.shape({\n attribution: PropTypes.bool.isRequired,\n nonCommercial: PropTypes.bool.isRequired,\n noDerivatives: PropTypes.bool.isRequired,\n shareAlike: PropTypes.bool.isRequired,\n }).isRequired,\n onToggleCheckbox: PropTypes.func.isRequired,\n};\n\nexport default LicenseCommonsOptions;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n licenseTitle: {\n id: 'course-authoring.schedule-section.license.title',\n defaultMessage: 'Course content license',\n },\n licenseDescription: {\n id: 'course-authoring.schedule-section.license.description',\n defaultMessage: 'Select the default license for course content',\n },\n});\n\nexport default messages;\n","import { useEffect, useState } from 'react';\n\nimport { LICENSE_TYPE, LICENSE_COMMONS_OPTIONS, creativeCommonsVersion } from './constants';\nimport { generateLicenseURL } from './utils';\n\nconst useLicenseDetails = (license, onChange) => {\n const [licenseType, setLicenseType] = useState(null);\n const [licenseDetails, setLicenseDetails] = useState({});\n const [licenseURL, setLicenseURL] = useState('');\n\n const {\n attribution, nonCommercial, noDerivatives, shareAlike,\n } = LICENSE_COMMONS_OPTIONS;\n\n const defaultLicenseDetails = {\n attribution: true,\n nonCommercial: true,\n noDerivatives: true,\n shareAlike: false,\n };\n\n const updateLicense = () => {\n if (licenseType === LICENSE_TYPE.allRightsReserved) {\n onChange(LICENSE_TYPE.allRightsReserved, 'license');\n }\n\n if (licenseType === LICENSE_TYPE.creativeCommons) {\n const orderedDetails = Object.entries(licenseDetails)\n .filter(([, value]) => value)\n .map(([key]) => LICENSE_COMMONS_OPTIONS[key]);\n\n const updatedString = `${\n LICENSE_TYPE.creativeCommons\n }: ver=${creativeCommonsVersion} ${orderedDetails.join(' ')}`;\n onChange(updatedString, 'license');\n }\n };\n\n useEffect(() => {\n if (license?.includes(LICENSE_TYPE.creativeCommons)) {\n setLicenseType(LICENSE_TYPE.creativeCommons);\n setLicenseDetails((prevLicenseDetails) => ({\n ...prevLicenseDetails,\n attribution: license.includes(attribution),\n nonCommercial: license.includes(nonCommercial),\n noDerivatives: license.includes(noDerivatives),\n shareAlike: license.includes(shareAlike),\n }));\n } else if (license?.includes(LICENSE_TYPE.allRightsReserved)) {\n setLicenseType(LICENSE_TYPE.allRightsReserved);\n setLicenseDetails({});\n } else {\n setLicenseType(null);\n setLicenseDetails({});\n }\n }, [license]);\n\n useEffect(() => {\n setLicenseURL(\n licenseType === LICENSE_TYPE.creativeCommons\n ? generateLicenseURL(licenseDetails)\n : '',\n );\n updateLicense();\n }, [licenseType, licenseDetails]);\n\n const handleToggleCheckbox = (option) => {\n const toggledLicenseDetail = Object.keys(LICENSE_COMMONS_OPTIONS).find(\n (key) => LICENSE_COMMONS_OPTIONS[key] === option,\n );\n\n setLicenseDetails((prev) => {\n if (option === noDerivatives) {\n return {\n ...prev,\n noDerivatives: !prev.noDerivatives,\n shareAlike: false,\n };\n }\n\n if (option === shareAlike) {\n return {\n ...prev,\n shareAlike: !prev.shareAlike,\n noDerivatives: false,\n };\n }\n\n return {\n ...prev,\n [toggledLicenseDetail]: !prev[toggledLicenseDetail],\n };\n });\n };\n\n const handleChangeLicenseType = (type) => {\n setLicenseType(type);\n setLicenseDetails(\n type === LICENSE_TYPE.creativeCommons ? defaultLicenseDetails : {},\n );\n };\n\n return {\n licenseURL,\n licenseType,\n licenseDetails,\n handleToggleCheckbox,\n handleChangeLicenseType,\n };\n};\n\n/* eslint-disable-next-line import/prefer-default-export */\nexport { useLicenseDetails };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport SectionSubHeader from '../../generic/section-sub-header';\nimport LicenseDisplay from './license-display';\nimport LicenseSelector from './license-selector';\nimport LicenseCommonsOptions from './license-commons-options';\nimport { LICENSE_TYPE } from './constants';\nimport messages from './messages';\nimport { useLicenseDetails } from './hooks';\n\nconst LicenseSection = ({ license, onChange }) => {\n const intl = useIntl();\n const {\n licenseURL,\n licenseType,\n licenseDetails,\n handleToggleCheckbox,\n handleChangeLicenseType,\n } = useLicenseDetails(license, onChange);\n\n return (\n
    \n \n \n {licenseType === LICENSE_TYPE.creativeCommons && (\n \n )}\n \n
    \n );\n};\n\nLicenseSection.defaultProps = {\n license: null,\n};\n\nLicenseSection.propTypes = {\n license: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n};\n\nexport default LicenseSection;\n","import {\n LICENSE_COMMONS_OPTIONS,\n creativeCommonsLicensesURL,\n creativeCommonsVersion,\n} from './constants';\n\nconst generateLicenseURL = (details) => {\n const detailsString = Object.entries(details)\n .filter(([, value]) => value)\n .map(([key]) => LICENSE_COMMONS_OPTIONS[key].toLowerCase())\n .join('-');\n\n return `${creativeCommonsLicensesURL}/${detailsString}/${creativeCommonsVersion}`;\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { generateLicenseURL };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n scheduleSidebarTitle: {\n id: 'course-authoring.schedule.sidebar.about.title',\n defaultMessage: 'How are these settings used?',\n },\n scheduleSidebarAbout: {\n id: 'course-authoring.schedule.sidebar.about.text',\n defaultMessage: \"Your course's schedule determines when students can enroll in and begin a course. Other information from this page appears on the About page for your course. This information includes the course overview, course image, introduction video, and estimated time requirements. Students use About pages to choose new courses to take.\",\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\n\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport messages from './messages';\n\nconst ScheduleSidebar = ({ courseId, proctoredExamSettingsUrl }) => {\n const intl = useIntl();\n return (\n \n

    \n {intl.formatMessage(messages.scheduleSidebarTitle)}\n

    \n

    \n {intl.formatMessage(messages.scheduleSidebarAbout)}\n

    \n \n );\n};\n\nScheduleSidebar.defaultProps = {\n proctoredExamSettingsUrl: '',\n};\n\nScheduleSidebar.propTypes = {\n courseId: PropTypes.string.isRequired,\n proctoredExamSettingsUrl: PropTypes.string,\n};\n\nexport default ScheduleSidebar;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.schedule.heading.title',\n defaultMessage: 'Schedule & details',\n },\n headingSubtitle: {\n id: 'course-authoring.schedule.heading.subtitle',\n defaultMessage: 'Settings',\n },\n buttonSaveText: {\n id: 'course-authoring.schedule.alert.button.save',\n defaultMessage: 'Save changes',\n },\n buttonSavingText: {\n id: 'course-authoring.schedule.alert.button.saving',\n defaultMessage: 'Saving',\n },\n buttonCancelText: {\n id: 'course-authoring.schedule.alert.button.cancel',\n defaultMessage: 'Cancel',\n },\n alertWarningAriaLabelledby: {\n id: 'course-authoring.schedule.alert.warning.aria.labelledby',\n defaultMessage: 'notification-warning-title',\n },\n alertWarningAriaDescribedby: {\n id: 'course-authoring.schedule.alert.warning.aria.describedby',\n defaultMessage: 'notification-warning-description',\n },\n alertWarning: {\n id: 'course-authoring.schedule.alert.warning',\n defaultMessage: 'You\\'ve made some changes',\n },\n alertWarningOnSaveWithError: {\n id: 'course-authoring.schedule.alert.warning.save.error',\n defaultMessage: 'You\\'ve made some changes, but there are some errors',\n },\n alertWarningDescriptions: {\n id: 'course-authoring.schedule.alert.warning.descriptions',\n defaultMessage: 'Your changes will not take effect until you save your progress.',\n },\n alertWarningDescriptionsOnSaveWithError: {\n id: 'course-authoring.schedule.alert.warning.save.descriptions.error',\n defaultMessage: 'Please address the errors on this page first, and then save your progress.',\n },\n alertSuccessAriaLabelledby: {\n id: 'course-authoring.schedule.alert.success.aria.labelledby',\n defaultMessage: 'alert-confirmation-title',\n },\n alertSuccessAriaDescribedby: {\n id: 'course-authoring.schedule.alert.success.aria.describedby',\n defaultMessage: 'alert-confirmation-description',\n },\n alertSuccess: {\n id: 'course-authoring.schedule.alert.success',\n defaultMessage: 'Your changes have been saved.',\n },\n alertLoadFailAriaLabelledby: {\n id: 'course-authoring.schedule.alert.load.fail.aria.labelledby',\n defaultMessage: 'alert-confirmation-title',\n },\n alertLoadFailAriaDescribedby: {\n id: 'course-authoring.schedule.alert.load.fail.aria.describedby',\n defaultMessage: 'alert-confirmation-description',\n },\n alertLoadFail: {\n id: 'course-authoring.schedule.alert.load.fail',\n defaultMessage: 'We encountered an error when loading your settings.',\n },\n alertFailAriaLabelledby: {\n id: 'course-authoring.schedule.alert.fail.aria.labelledby',\n defaultMessage: 'alert-confirmation-title',\n },\n alertFailAriaDescribedby: {\n id: 'course-authoring.schedule.alert.fail.aria.describedby',\n defaultMessage: 'alert-confirmation-description',\n },\n alertFail: {\n id: 'course-authoring.schedule.alert.fail',\n defaultMessage: 'We encountered an error when saving your changes.',\n },\n errorMessage1: {\n id: 'course-authoring.schedule.schedule-section.error-message-1',\n defaultMessage: 'The certificates display behavior must be \\'A date after the course end date\\' if certificate available date is set.',\n },\n errorMessage2: {\n id: 'course-authoring.schedule.schedule-section.error-message-2',\n defaultMessage: 'The enrollment end date cannot be after the course end date.',\n },\n errorMessage3: {\n id: 'course-authoring.schedule.schedule-section.error-message-3',\n defaultMessage: 'The enrollment start date cannot be after the enrollment end date.',\n },\n errorMessage4: {\n id: 'course-authoring.schedule.schedule-section.error-message-4',\n defaultMessage: 'The course start date must be later than the enrollment start date.',\n },\n errorMessage5: {\n id: 'course-authoring.schedule.schedule-section.error-message-5',\n defaultMessage: 'The course end date must be later than the course start date.',\n },\n errorMessage6: {\n id: 'course-authoring.schedule.schedule-section.error-message-6',\n defaultMessage: 'The certificate available date must be later than the course end date.',\n },\n errorMessage7: {\n id: 'course-authoring.schedule.schedule-section.error-message-7',\n defaultMessage: 'The course must have an assigned start date.',\n },\n errorMessage8: {\n id: 'course-authoring.schedule.schedule-section.error-message-8',\n defaultMessage: 'Please enter an integer between %(min)s and %(max)s.',\n },\n});\n\nexport default messages;\n","import { CERTIFICATE_DISPLAY_BEHAVIOR } from './schedule-section/certificate-display-row';\nimport { defaultEntranceExamMinimumScorePct } from './constants';\nimport messages from './messages';\n\nconst isDateBeforeOrEqual = (\n dateFormer,\n dateLatter,\n allowEqual = false,\n checkExists = true,\n) => {\n if (checkExists && (!dateFormer || !dateLatter)) {\n return false;\n }\n if (allowEqual) {\n return new Date(dateFormer) < new Date(dateLatter);\n }\n\n return new Date(dateFormer) <= new Date(dateLatter);\n};\n\nconst validateScheduleAndDetails = (courseDetails, canShowCertificateAvailableDate, intl) => {\n const errors = {};\n const {\n endDate,\n startDate,\n enrollmentEnd,\n enrollmentStart,\n certificateAvailableDate,\n entranceExamMinimumScorePct,\n certificatesDisplayBehavior,\n } = courseDetails;\n\n if (!startDate) {\n errors.startDate = intl.formatMessage(messages.errorMessage7);\n }\n\n if (isDateBeforeOrEqual(certificateAvailableDate, endDate) && canShowCertificateAvailableDate) {\n errors.certificateAvailableDate = intl.formatMessage(messages.errorMessage6);\n }\n\n if (isDateBeforeOrEqual(endDate, startDate)) {\n errors.endDate = intl.formatMessage(messages.errorMessage5);\n }\n\n if (isDateBeforeOrEqual(startDate, enrollmentStart, true)) {\n errors.enrollmentStart = intl.formatMessage(messages.errorMessage4);\n }\n\n if (isDateBeforeOrEqual(enrollmentEnd, enrollmentStart)) {\n errors.enrollmentStart = intl.formatMessage(messages.errorMessage3);\n }\n\n if (isDateBeforeOrEqual(endDate, enrollmentEnd, true)) {\n errors.enrollmentEnd = intl.formatMessage(messages.errorMessage2);\n }\n\n if (\n certificatesDisplayBehavior === CERTIFICATE_DISPLAY_BEHAVIOR.endWithDate\n && !certificateAvailableDate\n ) {\n errors.certificateAvailableDate = intl.formatMessage(messages.errorMessage1);\n }\n\n if (entranceExamMinimumScorePct) {\n const number = Number(entranceExamMinimumScorePct);\n if (Number.isNaN(number) || number < 1 || number > 100) {\n errors.entranceExamMinimumScorePct = intl.formatMessage(messages.errorMessage8);\n }\n }\n\n return errors;\n};\n\nconst updateWithDefaultValues = (values) => {\n const { entranceExamMinimumScorePct } = values;\n if (entranceExamMinimumScorePct === '') {\n return {\n ...values,\n entranceExamMinimumScorePct: defaultEntranceExamMinimumScorePct,\n };\n }\n\n return values;\n};\n\nexport { updateWithDefaultValues, validateScheduleAndDetails };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\nimport {\n Container, Button, Layout, StatefulButton,\n} from '@openedx/paragon';\nimport {\n CheckCircle as CheckCircleIcon,\n ErrorOutline as ErrorOutlineIcon,\n Warning as WarningIcon,\n} from '@openedx/paragon/icons';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport Placeholder from '@edx/frontend-lib-content-components';\n\nimport { RequestStatus } from '../data/constants';\nimport { useModel } from '../generic/model-store';\nimport AlertMessage from '../generic/alert-message';\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport { STATEFUL_BUTTON_STATES } from '../constants';\nimport getPageHeadTitle from '../generic/utils';\nimport { useScrollToHashElement } from '../hooks';\nimport {\n fetchCourseSettingsQuery,\n fetchCourseDetailsQuery,\n updateCourseDetailsQuery,\n} from './data/thunks';\nimport {\n getCourseSettings,\n getCourseDetails,\n getLoadingDetailsStatus,\n getLoadingSettingsStatus,\n} from './data/selectors';\nimport BasicSection from './basic-section';\nimport CreditSection from './credit-section';\nimport DetailsSection from './details-section';\nimport IntroducingSection from './introducing-section';\nimport PacingSection from './pacing-section';\nimport ScheduleSection from './schedule-section';\nimport LearningOutcomesSection from './learning-outcomes-section';\nimport InstructorsSection from './instructors-section';\nimport RequirementsSection from './requirements-section';\nimport LicenseSection from './license-section';\nimport ScheduleSidebar from './schedule-sidebar';\nimport messages from './messages';\nimport { useLoadValuesPrompt, useSaveValuesPrompt } from './hooks';\n\nconst ScheduleAndDetails = ({ intl, courseId }) => {\n const courseSettings = useSelector(getCourseSettings);\n const courseDetails = useSelector(getCourseDetails);\n const loadingDetailsStatus = useSelector(getLoadingDetailsStatus);\n const loadingSettingsStatus = useSelector(getLoadingSettingsStatus);\n const isLoading = loadingDetailsStatus === RequestStatus.IN_PROGRESS\n || loadingSettingsStatus === RequestStatus.IN_PROGRESS;\n\n const course = useModel('courseDetails', courseId);\n document.title = getPageHeadTitle(course?.name, intl.formatMessage(messages.headingTitle));\n\n const {\n platformName,\n isCreditCourse,\n upgradeDeadline,\n languageOptions,\n marketingEnabled,\n licensingEnabled,\n aboutPageEditable,\n courseDisplayName,\n sidebarHtmlEnabled,\n lmsLinkForAboutPage,\n enrollmentEndEditable,\n isEntranceExamsEnabled,\n creditEligibilityEnabled,\n shortDescriptionEditable,\n enableExtendedCourseDetails,\n isPrerequisiteCoursesEnabled,\n mfeProctoredExamSettingsUrl,\n possiblePreRequisiteCourses,\n canShowCertificateAvailableDateField,\n } = courseSettings;\n\n const {\n showLoadFailedAlert,\n } = useLoadValuesPrompt(\n courseId,\n fetchCourseDetailsQuery,\n fetchCourseSettingsQuery,\n );\n\n const {\n errorFields,\n savingStatus,\n editedValues,\n isQueryPending,\n isEditableState,\n showModifiedAlert,\n showSuccessfulAlert,\n showFailedAlert,\n handleResetValues,\n handleValuesChange,\n handleUpdateValues,\n handleQueryProcessing,\n handleInternetConnectionFailed,\n } = useSaveValuesPrompt(\n courseId,\n updateCourseDetailsQuery,\n canShowCertificateAvailableDateField,\n courseDetails,\n );\n\n const {\n org,\n courseId: courseNumber,\n run,\n title,\n effort,\n endDate,\n license,\n language,\n subtitle,\n overview,\n duration,\n selfPaced,\n startDate,\n introVideo,\n description,\n learningInfo,\n enrollmentEnd,\n instructorInfo,\n enrollmentStart,\n shortDescription,\n aboutSidebarHtml,\n preRequisiteCourses,\n entranceExamEnabled,\n courseImageAssetPath,\n bannerImageAssetPath,\n certificateAvailableDate,\n entranceExamMinimumScorePct,\n certificatesDisplayBehavior,\n videoThumbnailImageAssetPath,\n } = editedValues;\n\n useScrollToHashElement({ isLoading });\n\n if (isLoading) {\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return <>;\n }\n\n if (loadingDetailsStatus === RequestStatus.DENIED || loadingSettingsStatus === RequestStatus.DENIED) {\n return (\n
    \n \n
    \n );\n }\n\n const showCreditSection = creditEligibilityEnabled && isCreditCourse;\n const showRequirementsSection = aboutPageEditable || isPrerequisiteCoursesEnabled || isEntranceExamsEnabled;\n const hasErrors = !!Object.keys(errorFields).length;\n const updateValuesButtonState = {\n labels: {\n default: intl.formatMessage(messages.buttonSaveText),\n pending: intl.formatMessage(messages.buttonSavingText),\n },\n disabledStates: [STATEFUL_BUTTON_STATES.pending],\n };\n const alertWhileSavingTitle = hasErrors\n ? intl.formatMessage(messages.alertWarningOnSaveWithError)\n : intl.formatMessage(messages.alertWarning);\n\n const alertWhileSavingDescription = hasErrors\n ? intl.formatMessage(messages.alertWarningDescriptionsOnSaveWithError)\n : intl.formatMessage(messages.alertWarningDescriptions);\n\n return (\n <>\n \n
    \n \n \n \n
    \n \n {intl.formatMessage(messages.headingSubtitle)}\n \n

    \n {intl.formatMessage(messages.headingTitle)}\n

    \n
    \n
    \n
    \n \n \n
    \n
    \n \n {showCreditSection && (\n \n )}\n \n \n {aboutPageEditable && (\n \n )}\n \n {enableExtendedCourseDetails && (\n <>\n \n \n \n )}\n {showRequirementsSection && (\n \n )}\n {licensingEnabled && (\n \n )}\n
    \n
    \n
    \n \n \n \n \n
    \n
    \n
    \n {!isEditableState && (\n \n )}\n \n {intl.formatMessage(messages.buttonCancelText)}\n \n ),\n ,\n ].filter(Boolean)}\n variant=\"warning\"\n icon={WarningIcon}\n title={alertWhileSavingTitle}\n description={alertWhileSavingDescription}\n />\n
    \n \n );\n};\n\nScheduleAndDetails.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(ScheduleAndDetails);\n","import { useState, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { RequestStatus } from '../data/constants';\nimport { getLoadingDetailsStatus, getLoadingSettingsStatus, getSavingStatus } from './data/selectors';\nimport { validateScheduleAndDetails, updateWithDefaultValues } from './utils';\n\nconst useLoadValuesPrompt = (\n courseId,\n fetchCourseDetailsQuery,\n fetchCourseSettingsQuery,\n) => {\n const dispatch = useDispatch();\n const loadingDetailsStatus = useSelector(getLoadingDetailsStatus);\n const loadingSettingsStatus = useSelector(getLoadingSettingsStatus);\n const [showLoadFailedAlert, setShowLoadFailedAlert] = useState(false);\n\n useEffect(() => {\n dispatch(fetchCourseDetailsQuery(courseId));\n dispatch(fetchCourseSettingsQuery(courseId));\n }, [courseId]);\n\n useEffect(() => {\n if (loadingDetailsStatus === RequestStatus.FAILED || loadingSettingsStatus === RequestStatus.FAILED) {\n setShowLoadFailedAlert(true);\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }, [loadingDetailsStatus, loadingSettingsStatus]);\n\n return {\n showLoadFailedAlert,\n };\n};\n\nconst useSaveValuesPrompt = (\n courseId,\n updateDataQuery,\n canShowCertificateAvailableDateField,\n initialEditedData = {},\n) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const savingStatus = useSelector(getSavingStatus);\n const [editedValues, setEditedValues] = useState(initialEditedData);\n const [showSuccessfulAlert, setShowSuccessfulAlert] = useState(false);\n const [showFailedAlert, setShowFailedAlert] = useState(false);\n const [showModifiedAlert, setShowModifiedAlert] = useState(false);\n const [isQueryPending, setIsQueryPending] = useState(false);\n const [isEditableState, setIsEditableState] = useState(false);\n const [errorFields, setErrorFields] = useState({});\n\n useEffect(() => {\n if (!isQueryPending && !isEditableState) {\n setEditedValues(initialEditedData);\n }\n }, [initialEditedData]);\n\n useEffect(() => {\n const errors = validateScheduleAndDetails(editedValues, canShowCertificateAvailableDateField, intl);\n setErrorFields(errors);\n }, [editedValues]);\n\n const handleValuesChange = (value, fieldName) => {\n setIsEditableState(true);\n setShowSuccessfulAlert(false);\n setShowFailedAlert(false);\n\n if (editedValues[fieldName] !== value) {\n setEditedValues((prevEditedValues) => ({\n ...prevEditedValues,\n [fieldName]: value || '',\n }));\n\n if (!showModifiedAlert) {\n setShowModifiedAlert(true);\n }\n }\n };\n\n const handleResetValues = () => {\n setIsEditableState(false);\n setEditedValues(initialEditedData || {});\n setShowModifiedAlert(false);\n setShowSuccessfulAlert(false);\n setShowFailedAlert(false);\n };\n\n const handleUpdateValues = () => {\n setIsQueryPending(true);\n setIsEditableState(false);\n };\n\n const handleInternetConnectionFailed = () => {\n setShowModifiedAlert(false);\n setShowSuccessfulAlert(false);\n setShowFailedAlert(false);\n setIsQueryPending(false);\n };\n\n const handleQueryProcessing = () => {\n setShowSuccessfulAlert(false);\n setShowFailedAlert(false);\n dispatch(updateDataQuery(courseId, updateWithDefaultValues(editedValues)));\n };\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n setIsQueryPending(false);\n setShowSuccessfulAlert(true);\n setShowFailedAlert(false);\n setTimeout(() => setShowSuccessfulAlert(false), 15000);\n window.scrollTo({ top: 0, behavior: 'smooth' });\n\n if (!isEditableState) {\n setShowModifiedAlert(false);\n }\n } else if (savingStatus === RequestStatus.FAILED) {\n setIsQueryPending(false);\n setShowSuccessfulAlert(false);\n setShowFailedAlert(true);\n window.scrollTo({ top: 0, behavior: 'smooth' });\n\n if (!isEditableState) {\n setShowModifiedAlert(false);\n }\n }\n }, [savingStatus]);\n\n return {\n errorFields,\n savingStatus,\n editedValues,\n isQueryPending,\n isEditableState,\n showModifiedAlert,\n showSuccessfulAlert,\n showFailedAlert,\n dispatch,\n setErrorFields,\n handleResetValues,\n handleValuesChange,\n handleUpdateValues,\n handleQueryProcessing,\n handleInternetConnectionFailed,\n };\n};\n\n/* eslint-disable-next-line import/prefer-default-export */\nexport { useLoadValuesPrompt, useSaveValuesPrompt };\n","// eslint-disable-next-line import/prefer-default-export\nexport const defaultEntranceExamMinimumScorePct = '50';\n","const getLoadingStatus = (state) => state.gradingSettings.loadingStatus;\nconst getGradingSettings = (state) => state.gradingSettings.gradingSettings.courseDetails;\nconst getCourseAssignmentLists = (state) => state.gradingSettings.gradingSettings.courseAssignmentLists;\nconst getSavingStatus = (state) => state.gradingSettings.savingStatus;\nconst getCourseSettings = (state) => state.gradingSettings.courseSettings;\n\nexport {\n getLoadingStatus,\n getGradingSettings,\n getCourseAssignmentLists,\n getSavingStatus,\n getCourseSettings,\n};\n","/* eslint-disable import/prefer-default-export */\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nimport { deepConvertingKeysToCamelCase, deepConvertingKeysToSnakeCase } from '../../utils';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getGradingSettingsApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/course_grading/${courseId}`;\nexport const getCourseSettingsApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/course_settings/${courseId}`;\n\n/**\n * Get's grading setting for a course.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getGradingSettings(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getGradingSettingsApiUrl(courseId));\n return deepConvertingKeysToCamelCase(data);\n}\n\n/**\n * Send`s grading setting for a course.\n * @param {string} courseId\n * @param {object} settings\n * @returns {Promise}\n */\nexport async function sendGradingSettings(courseId, settings) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getGradingSettingsApiUrl(courseId), deepConvertingKeysToSnakeCase(settings));\n return camelCaseObject(data);\n}\n\n/**\n * Get course settings.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getCourseSettings(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseSettingsApiUrl(courseId));\n return camelCaseObject(data);\n}\n","import { RequestStatus } from '../../data/constants';\nimport {\n getGradingSettings,\n sendGradingSettings,\n getCourseSettings,\n} from './api';\nimport {\n sendGradingSettingsSuccess,\n updateLoadingStatus,\n updateSavingStatus,\n fetchGradingSettingsSuccess,\n fetchCourseSettingsSuccess,\n} from './slice';\n\nexport function fetchGradingSettings(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n try {\n const settingValues = await getGradingSettings(courseId);\n dispatch(fetchGradingSettingsSuccess(settingValues));\n dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function sendGradingSetting(courseId, settings) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n try {\n const settingValues = await sendGradingSettings(courseId, settings);\n dispatch(sendGradingSettingsSuccess(settingValues));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function fetchCourseSettingsQuery(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const settingsValues = await getCourseSettings(courseId);\n dispatch(fetchCourseSettingsSuccess(settingsValues));\n dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n","/* eslint-disable */\nimport React from 'react';\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) { return {}; }\n const target = {};\n const sourceKeys = Object.keys(source);\n let key; let\n i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) { continue; }\n target[key] = source[key];\n }\n\n return target;\n}\n\nconst getBoundingClientRect = function getBoundingClientRect(element) {\n const rect = element.getBoundingClientRect();\n return {\n left: Math.ceil(rect.left),\n width: Math.ceil(rect.width),\n };\n};\n\nconst sortNumList = function sortNumList(arr) {\n return [].concat(arr).sort((a, b) => Number(a) - Number(b));\n};\n\nconst useGetLatest = function useGetLatest(val) {\n const ref = React.useRef(val);\n ref.current = val;\n return React.useCallback(() => ref.current, []);\n};\n\nconst linearInterpolator = {\n getPercentageForValue: function getPercentageForValue(val, min, max) {\n return Math.max(0, Math.min(100, (val - min) / (max - min) * 100));\n },\n getValueForClientX: function getValueForClientX(clientX, trackDims, min, max) {\n const { left } = trackDims;\n const { width } = trackDims;\n const percentageValue = (clientX - left) / width;\n const value = (max - min) * percentageValue;\n return value + min;\n },\n};\nfunction useRanger(_ref) {\n const _ref$interpolator = _ref.interpolator;\n const interpolator = _ref$interpolator === void 0 ? linearInterpolator : _ref$interpolator;\n const _ref$tickSize = _ref.tickSize;\n const tickSize = _ref$tickSize === void 0 ? 10 : _ref$tickSize;\n const { values } = _ref;\n const { min } = _ref;\n const { max } = _ref;\n const controlledTicks = _ref.ticks;\n const { steps } = _ref;\n const { onChange } = _ref;\n const { onDrag } = _ref;\n const { stepSize } = _ref;\n\n const _React$useState = React.useState(null);\n const activeHandleIndex = _React$useState[0];\n const setActiveHandleIndex = _React$useState[1];\n\n const _React$useState2 = React.useState();\n const tempValues = _React$useState2[0];\n const setTempValues = _React$useState2[1];\n\n const getLatest = useGetLatest({\n activeHandleIndex,\n onChange,\n onDrag,\n values,\n tempValues,\n });\n const trackElRef = React.useRef();\n const getValueForClientX = React.useCallback((clientX) => {\n const trackDims = getBoundingClientRect(trackElRef.current);\n return interpolator.getValueForClientX(clientX, trackDims, min, max);\n }, [interpolator, max, min]);\n const getNextStep = React.useCallback((val, direction) => {\n if (steps) {\n const currIndex = steps.indexOf(val);\n const nextIndex = currIndex + direction;\n\n if (nextIndex >= 0 && nextIndex < steps.length) {\n return steps[nextIndex];\n }\n return val;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (typeof stepSize === 'undefined') {\n throw new Error('Warning: The option `stepSize` is expected in `useRanger`, but its value is `undefined`');\n }\n }\n\n const nextVal = val + stepSize * direction;\n\n if (nextVal >= min && nextVal <= max) {\n return nextVal;\n }\n return val;\n }, [max, min, stepSize, steps]);\n const roundToStep = React.useCallback((val) => {\n let left = min;\n let right = max;\n\n if (steps) {\n steps.forEach((step) => {\n if (step <= val && step > left) {\n left = step;\n }\n\n if (step >= val && step < right) {\n right = step;\n }\n });\n } else {\n if (process.env.NODE_ENV !== 'production') {\n if (typeof stepSize === 'undefined') {\n throw new Error('Warning: The option `stepSize` is expected in `useRanger`, but its value is `undefined`');\n }\n }\n\n while (left < val && left + stepSize < val) {\n left += stepSize;\n }\n\n right = Math.min(left + stepSize, max);\n }\n\n if (val - left < right - val) {\n return left;\n }\n\n return right;\n }, [max, min, stepSize, steps]);\n const handleDrag = React.useCallback((e) => {\n const _getLatest = getLatest();\n const { activeHandleIndex } = _getLatest;\n const { onDrag } = _getLatest;\n\n const clientX = e.type === 'touchmove' ? e.changedTouches[0].clientX : e.clientX;\n const newValue = getValueForClientX(clientX);\n const newRoundedValue = roundToStep(newValue);\n const newValues = []\n .concat(values.slice(0, activeHandleIndex), [newRoundedValue], values.slice(activeHandleIndex + 1));\n\n if (onDrag) {\n onDrag(newValues);\n } else {\n setTempValues(newValues);\n }\n }, [getLatest, getValueForClientX, roundToStep, values]);\n const handleKeyDown = React.useCallback((e, i) => {\n const _getLatest2 = getLatest();\n const { values } = _getLatest2;\n const _getLatest2$onChange = _getLatest2.onChange;\n const onChange = _getLatest2$onChange === void 0\n ? function () {} : _getLatest2$onChange; // Left Arrow || Right Arrow\n\n if (e.keyCode === 37 || e.keyCode === 39) {\n setActiveHandleIndex(i);\n const direction = e.keyCode === 37 ? -1 : 1;\n const newValue = getNextStep(values[i], direction);\n const newValues = [].concat(values.slice(0, i), [newValue], values.slice(i + 1));\n const sortedValues = sortNumList(newValues);\n onChange(sortedValues);\n }\n }, [getLatest, getNextStep]);\n const handlePress = React.useCallback((e, i) => {\n setActiveHandleIndex(i);\n\n const handleRelease = function handleRelease(e) {\n const _getLatest3 = getLatest();\n const { tempValues } = _getLatest3;\n const { values } = _getLatest3;\n const _getLatest3$onChange = _getLatest3.onChange;\n const onChange = _getLatest3$onChange === void 0 ? function () {} : _getLatest3$onChange;\n const _getLatest3$onDrag = _getLatest3.onDrag;\n const onDrag = _getLatest3$onDrag === void 0 ? function () {} : _getLatest3$onDrag;\n\n document.removeEventListener('mousemove', handleDrag);\n document.removeEventListener('touchmove', handleDrag);\n document.removeEventListener('mouseup', handleRelease);\n document.removeEventListener('touchend', handleRelease);\n const sortedValues = sortNumList(tempValues || values);\n onChange(sortedValues);\n onDrag(sortedValues);\n setActiveHandleIndex(null);\n setTempValues();\n };\n\n document.addEventListener('mousemove', handleDrag);\n document.addEventListener('touchmove', handleDrag);\n document.addEventListener('mouseup', handleRelease);\n document.addEventListener('touchend', handleRelease);\n }, [getLatest, handleDrag]);\n const getPercentageForValue = React.useCallback((val) =>\n interpolator.getPercentageForValue(val, min, max), [interpolator, max, min]); // Build the ticks\n\n const ticks = React.useMemo(() => {\n let ticks = controlledTicks || steps;\n\n if (!ticks) {\n ticks = [min];\n\n while (ticks[ticks.length - 1] < max - tickSize) {\n ticks.push(ticks[ticks.length - 1] + tickSize);\n }\n\n ticks.push(max);\n }\n\n return ticks.map((value, i) => ({\n value,\n getTickProps: function getTickProps(_temp) {\n const _ref2 = _temp === void 0 ? {} : _temp;\n const _ref2$key = _ref2.key;\n const key = _ref2$key === void 0 ? i : _ref2$key;\n const _ref2$style = _ref2.style;\n const style = _ref2$style === void 0 ? {} : _ref2$style;\n const rest = _objectWithoutPropertiesLoose(_ref2, ['key', 'style']);\n\n return {\n key,\n style: {\n position: 'absolute',\n width: 0,\n left: `${getPercentageForValue(value) }%`,\n transform: 'translateX(-50%)',\n ...style,\n },\n ...rest,\n };\n },\n }));\n }, [controlledTicks, getPercentageForValue, max, min, steps, tickSize]);\n const segments = React.useMemo(() => {\n const sortedValues = sortNumList(tempValues || values);\n return [].concat(sortedValues, [max]).map((value, i) => ({\n value,\n getSegmentProps: function getSegmentProps(_temp2) {\n const _ref3 = _temp2 === void 0 ? {} : _temp2;\n const _ref3$key = _ref3.key;\n const key = _ref3$key === void 0 ? i : _ref3$key;\n const _ref3$style = _ref3.style;\n const style = _ref3$style === void 0 ? {} : _ref3$style;\n const rest = _objectWithoutPropertiesLoose(_ref3, ['key', 'style']);\n\n const left = getPercentageForValue(sortedValues[i - 1] ? sortedValues[i - 1] : min);\n const width = getPercentageForValue(value) - left;\n return {\n key,\n style: {\n position: 'absolute',\n left: `${left }%`,\n width: `${width }%`,\n ...style,\n },\n ...rest,\n };\n },\n }));\n }, [getPercentageForValue, max, min, tempValues, values]);\n const handles = React.useMemo(() => (tempValues || values).map((value, i) => ({\n value,\n active: i === activeHandleIndex,\n getHandleProps: function getHandleProps(_temp3) {\n const _ref4 = _temp3 === void 0 ? {} : _temp3;\n const _ref4$key = _ref4.key;\n const key = _ref4$key === void 0 ? i : _ref4$key;\n const { ref } = _ref4;\n const _ref4$innerRef = _ref4.innerRef;\n const _onKeyDown = _ref4.onKeyDown;\n const _onMouseDown = _ref4.onMouseDown;\n const _onTouchStart = _ref4.onTouchStart;\n const _ref4$style = _ref4.style;\n const style = _ref4$style === void 0 ? {} : _ref4$style;\n const rest = _objectWithoutPropertiesLoose(_ref4, [\n 'key', 'ref', 'innerRef', 'onKeyDown', 'onMouseDown', 'onTouchStart', 'style',\n ]);\n\n return {\n key,\n onKeyDown: function onKeyDown(e) {\n e.persist();\n handleKeyDown(e, i);\n if (_onKeyDown) { _onKeyDown(e); }\n },\n onMouseDown: function onMouseDown(e) {\n e.persist();\n handlePress(e, i);\n if (_onMouseDown) { _onMouseDown(e); }\n },\n onTouchStart: function onTouchStart(e) {\n e.persist();\n handlePress(e, i);\n if (_onTouchStart) { _onTouchStart(e); }\n },\n role: 'slider',\n 'aria-valuemin': min,\n 'aria-valuemax': max,\n 'aria-valuenow': value,\n style: {\n position: 'absolute',\n top: '50%',\n left: `${getPercentageForValue(value) }%`,\n zIndex: i === activeHandleIndex ? '1' : '0',\n transform: 'translate(-50%, -50%)',\n ...style,\n },\n ...rest,\n };\n },\n })), [activeHandleIndex, getPercentageForValue, handleKeyDown, handlePress, min, max, tempValues, values]);\n\n const getTrackProps = function getTrackProps(_temp4) {\n const _ref5 = _temp4 === void 0 ? {} : _temp4;\n const _ref5$style = _ref5.style;\n const style = _ref5$style === void 0 ? {} : _ref5$style;\n const _ref6 = _ref5.ref;\n const rest = _objectWithoutPropertiesLoose(_ref5, ['style', 'ref']);\n\n return {\n ref: function ref(el) {\n trackElRef.current = el;\n\n if (_ref6) {\n if (typeof _ref6 === 'function') {\n _ref6(el);\n } else {\n _ref6.current = el;\n }\n }\n },\n style: {\n position: 'relative',\n userSelect: 'none',\n ...style,\n },\n ...rest,\n };\n };\n\n return {\n activeHandleIndex,\n getTrackProps,\n ticks,\n segments,\n handles,\n };\n}\n\nexport { useRanger };\n// # sourceMappingURL=react-ranger.mjs.map\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n addNewSegmentButtonAltText: {\n id: 'course-authoring.grading-settings.add-new-segment.btn.text',\n defaultMessage: 'Add new grading segment',\n },\n removeSegmentButtonText: {\n id: 'course-authoring.grading-settings.remove-segment.btn.text',\n defaultMessage: 'Remove',\n },\n segmentFailGradingText: {\n id: 'course-authoring.grading-settings.fail-segment.text',\n defaultMessage: 'Fail',\n },\n defaultPassText: {\n id: 'course-authoring.grading-settings.default.pass.text',\n defaultMessage: 'Pass',\n },\n});\n\nexport default messages;\n","import messages from './messages';\n\nexport const MAXIMUM_SCALE_LENGTH = 100;\n\n/**\n * Converting fractional numbers to integers.\n *\n * @param {object} cutoffs - The object containing the settings to grading cutoffs.\n * @returns {array} - Converted grading cutoffs.\n */\nexport const getGradingValues = (cutoffs) => Object.values(cutoffs)\n .map(number => Math.round(number * MAXIMUM_SCALE_LENGTH));\n\n/**\n * Initially, the data comes in the format { a: 0.8 },\n * this function converts the data structure to the required { current: 100, previous: 80 } format.\n *\n * @param {object} gradeValues - The object containing the settings to grading cutoffs.\n * @returns {object} - New grading cutoffs.\n */\nexport const getSortedGrades = (gradeValues) => gradeValues.reduce((sortedArray, current, idx) => {\n if (idx === (gradeValues.length - 1)) {\n sortedArray.push({ current: gradeValues[idx - 1] || MAXIMUM_SCALE_LENGTH, previous: gradeValues[idx] });\n sortedArray.push({ current: gradeValues[idx], previous: 0 });\n } else if (idx === 0) {\n sortedArray.push({ current: MAXIMUM_SCALE_LENGTH, previous: current });\n } else {\n const previous = gradeValues[idx - 1];\n sortedArray.push({ current: previous, previous: current });\n }\n\n return sortedArray;\n}, []);\n\n/**\n * Changes the start and end values of the segments when there are two segments.\n *\n * @param {number} idx - Segment index.\n * @param {array} letters - Names of grading segments.\n * @param {array} gradingSegments - Grading cutoffs.\n * @returns {string} - Segment display name.\n */\nexport const getLettersOnLongScale = (idx, letters, gradingSegments) => {\n const END_OF_SCALE_NAME = 'F';\n\n if (idx === 0) {\n return letters[0];\n }\n\n if ((idx - 1) === (gradingSegments.length - 1)) {\n return END_OF_SCALE_NAME;\n }\n\n return letters[idx - 1];\n};\n\n/**\n * Changes the positions of segment names if there are more than two segments.\n *\n * @param {number} idx - Segment index.\n * @param {array} letters - Names of grading segments.\n * @returns {string} - Segment display name.\n */\nexport const getLettersOnShortScale = (idx, letters, intl) => {\n const END_OF_SCALE_NAME = intl.formatMessage(messages.segmentFailGradingText);\n\n return (idx === 1 ? letters[idx - 1] : END_OF_SCALE_NAME);\n};\n\n/**\n * Converts the data to the original format with fractional numbers { a: 0.8 }.\n *\n * @param {array} letters - Names of grading segments.\n * @param {array} gradingSegments - Grading cutoffs.\n * @param {func} setConvertedResult - Changing the state of the converted result.\n * @returns {void}\n */\nexport const convertGradeData = (letters, gradingSegments, setConvertedResult) => {\n const convertedData = {};\n\n if (!gradingSegments.length) {\n return;\n }\n\n letters.forEach((letter, idx) => {\n convertedData[letter] = gradingSegments[idx].previous / MAXIMUM_SCALE_LENGTH;\n });\n\n setConvertedResult(convertedData);\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { MAXIMUM_SCALE_LENGTH } from '../utils';\n\nconst GradingScaleHandle = ({\n idx, value, gradingSegments, getHandleProps,\n}) => (\n \n);\n\nGradingScaleHandle.propTypes = {\n idx: PropTypes.number.isRequired,\n value: PropTypes.number.isRequired,\n getHandleProps: PropTypes.func.isRequired,\n gradingSegments: PropTypes.arrayOf(\n PropTypes.shape({\n current: PropTypes.number.isRequired,\n previous: PropTypes.number.isRequired,\n }),\n ).isRequired,\n};\n\nexport default GradingScaleHandle;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst GradingScaleTick = ({ getTickProps, value }) => (\n
    \n
    {value}
    \n
    \n);\n\nGradingScaleTick.propTypes = {\n value: PropTypes.number.isRequired,\n getTickProps: PropTypes.func.isRequired,\n};\n\nexport default GradingScaleTick;\n","import { Button } from '@openedx/paragon';\nimport React from 'react';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\n\nimport { getLettersOnLongScale, getLettersOnShortScale } from '../utils';\nimport messages from '../messages';\n\nconst GradingScaleSegment = ({\n intl,\n idx,\n value,\n getSegmentProps,\n handleLetterChange,\n letters,\n gradingSegments,\n removeGradingSegment,\n}) => (\n \n
    \n {gradingSegments.length === 2 && (\n handleLetterChange(e, idx)}\n disabled={idx === gradingSegments.length}\n />\n )}\n {gradingSegments.length > 2 && (\n handleLetterChange(e, idx)}\n disabled={idx === gradingSegments.length}\n />\n )}\n \n {gradingSegments[idx === 0 ? 0 : idx - 1]?.previous} - {value === 100 ? value : value - 1}\n \n
    \n {idx !== gradingSegments.length && idx - 1 !== 0 && (\n removeGradingSegment(idx)}\n >\n {intl.formatMessage(messages.removeSegmentButtonText)}\n \n )}\n \n);\n\nGradingScaleSegment.propTypes = {\n intl: intlShape.isRequired,\n idx: PropTypes.number.isRequired,\n value: PropTypes.number.isRequired,\n getSegmentProps: PropTypes.func.isRequired,\n handleLetterChange: PropTypes.func.isRequired,\n removeGradingSegment: PropTypes.func.isRequired,\n gradingSegments: PropTypes.arrayOf(\n PropTypes.shape({\n current: PropTypes.number.isRequired,\n previous: PropTypes.number.isRequired,\n }),\n ).isRequired,\n letters: PropTypes.arrayOf(PropTypes.string).isRequired,\n};\n\nexport default injectIntl(GradingScaleSegment);\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Icon, IconButtonWithTooltip } from '@openedx/paragon';\nimport { Add as IconAdd } from '@openedx/paragon/icons';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\n\nimport { useRanger } from './react-ranger';\nimport messages from './messages';\nimport { convertGradeData, MAXIMUM_SCALE_LENGTH } from './utils';\nimport { GradingScaleTicks, GradingScaleHandle, GradingScaleSegment } from './components';\n\nconst DEFAULT_LETTERS = ['A', 'B', 'C', 'D'];\nconst getDefaultPassText = intl => intl.formatMessage(messages.defaultPassText);\n\nconst GradingScale = ({\n intl,\n showSavePrompt,\n gradeCutoffs,\n setShowSuccessAlert,\n setGradingData,\n resetDataRef,\n gradeLetters,\n sortedGrades,\n setOverrideInternetConnectionAlert,\n setEligibleGrade,\n}) => {\n const [gradingSegments, setGradingSegments] = useState(sortedGrades);\n const [letters, setLetters] = useState(gradeLetters);\n const [convertedResult, setConvertedResult] = useState({});\n const gradingSegmentsValues = Object.values(gradingSegments);\n const eligibleValue = gradingSegmentsValues[gradingSegmentsValues.length - 1];\n\n useEffect(() => {\n if (resetDataRef.current) {\n setGradingSegments(sortedGrades);\n setLetters(gradeLetters);\n // eslint-disable-next-line no-param-reassign\n resetDataRef.current = false;\n }\n }, [gradeCutoffs]);\n\n useEffect(() => {\n setGradingSegments(sortedGrades);\n setLetters(gradeLetters);\n }, [sortedGrades.length]);\n\n useEffect(() => {\n setGradingData(prevData => ({ ...prevData, gradeCutoffs: convertedResult }));\n setEligibleGrade(eligibleValue?.current);\n }, [JSON.stringify(convertedResult)]);\n\n useEffect(() => {\n convertGradeData(letters, gradingSegments, setConvertedResult);\n }, [gradingSegments, letters]);\n\n const addNewGradingSegment = () => {\n setGradingSegments(prevSegments => {\n const firstSegment = prevSegments[prevSegments.length - 1];\n const secondSegment = prevSegments[prevSegments.length - 2];\n const newCurrentValue = Math.ceil((secondSegment.current - secondSegment.previous) / 2);\n\n const newSegment = {\n current: (firstSegment.current + newCurrentValue),\n previous: firstSegment.current,\n };\n\n const updatedSecondSegment = {\n ...secondSegment,\n previous: (firstSegment.current + newCurrentValue),\n };\n\n showSavePrompt(true);\n setShowSuccessAlert(false);\n setOverrideInternetConnectionAlert(false);\n\n return [\n ...prevSegments.slice(0, prevSegments.length - 2),\n updatedSecondSegment,\n newSegment,\n firstSegment,\n ];\n });\n\n const nextIndex = (letters.length % DEFAULT_LETTERS.length);\n\n if (gradingSegments.length === 2) {\n setLetters([DEFAULT_LETTERS[0], DEFAULT_LETTERS[nextIndex]]);\n } else {\n setLetters(prevLetters => [...prevLetters, DEFAULT_LETTERS[nextIndex]]);\n }\n };\n\n const updateGradingSegments = (newGradingSegmentData, activeHandleIndex) => {\n const gapToSegment = 1;\n const sortedSegments = newGradingSegmentData.sort((currentValue, previousValue) => currentValue - previousValue);\n const newSegmentValue = sortedSegments[sortedSegments.length - 1 - activeHandleIndex];\n const prevSegmentBoundary = (gradingSegments[activeHandleIndex + 1]\n && gradingSegments[activeHandleIndex + 1].current) || 0;\n const nextSegmentBoundary = gradingSegments[activeHandleIndex - 1].current;\n\n showSavePrompt(true);\n\n setGradingSegments(gradingSegments.map((gradingSegment, idx) => {\n const upperBoundaryValue = (newSegmentValue < nextSegmentBoundary - gapToSegment)\n ? newSegmentValue : (nextSegmentBoundary - gapToSegment);\n const lowerBoundaryValue = (upperBoundaryValue > prevSegmentBoundary + gapToSegment)\n ? upperBoundaryValue : (prevSegmentBoundary + gapToSegment);\n\n if (idx === activeHandleIndex - 1) {\n return {\n previous: lowerBoundaryValue,\n current: gradingSegment.current,\n };\n }\n\n if (idx === activeHandleIndex) {\n return {\n current: lowerBoundaryValue,\n previous: gradingSegment.previous,\n };\n }\n\n return gradingSegment;\n }));\n };\n\n const removeGradingSegment = (gradingSegmentIndex) => {\n setGradingSegments(prevSegments => {\n const updatedSegments = [...prevSegments];\n const removedSegment = updatedSegments.splice(gradingSegmentIndex - 1, 1)[0];\n const previousSegment = updatedSegments[gradingSegmentIndex - 2];\n\n if (previousSegment) {\n previousSegment.previous = removedSegment.previous;\n }\n\n return updatedSegments;\n });\n\n showSavePrompt(true);\n setShowSuccessAlert(false);\n setOverrideInternetConnectionAlert(false);\n\n setLetters(prevLetters => {\n const updatedLetters = [...prevLetters];\n updatedLetters.splice(updatedLetters.length - 1, 1);\n\n return updatedLetters.length === 1 ? [getDefaultPassText(intl)] : updatedLetters;\n });\n };\n\n const handleLetterChange = (e, idx) => {\n const { value } = e.target;\n\n showSavePrompt(true);\n setShowSuccessAlert(false);\n setOverrideInternetConnectionAlert(false);\n\n setLetters(prevLetters => {\n const updatedLetters = [...prevLetters];\n const emptyString = '\\u200B';\n updatedLetters[idx - 1] = value || emptyString;\n\n return updatedLetters;\n });\n };\n\n const handleSegmentChange = () => {\n setShowSuccessAlert(false);\n setOverrideInternetConnectionAlert(false);\n setGradingData(prevData => ({ ...prevData, gradeCutoffs: convertedResult }));\n };\n\n const {\n getTrackProps,\n ticks,\n segments,\n handles,\n activeHandleIndex,\n } = useRanger({\n min: 0,\n max: MAXIMUM_SCALE_LENGTH,\n stepSize: 1,\n values: gradingSegments?.map(segment => segment.current),\n onDrag: (segmentDataArray) => updateGradingSegments(segmentDataArray, activeHandleIndex),\n onChange: handleSegmentChange,\n });\n\n return (\n
    \n = 5}\n data-testid=\"grading-scale-btn-add-segment\"\n className=\"mr-3\"\n src={IconAdd}\n iconAs={Icon}\n alt={intl.formatMessage(messages.addNewSegmentButtonAltText)}\n onClick={addNewGradingSegment}\n />\n
    \n {ticks.map(({ value, getTickProps }) => (\n \n ))}\n {segments.reverse().map(({ value, getSegmentProps }, idx = 1) => (\n \n ))}\n {handles.map(({ value, getHandleProps }, idx) => (\n \n ))}\n
    \n
    \n );\n};\n\nGradingScale.propTypes = {\n intl: intlShape.isRequired,\n showSavePrompt: PropTypes.func.isRequired,\n gradeCutoffs: PropTypes.objectOf(PropTypes.number).isRequired,\n gradeLetters: PropTypes.arrayOf(PropTypes.string).isRequired,\n setShowSuccessAlert: PropTypes.func.isRequired,\n setGradingData: PropTypes.func.isRequired,\n setOverrideInternetConnectionAlert: PropTypes.func.isRequired,\n resetDataRef: PropTypes.objectOf(PropTypes.bool).isRequired,\n sortedGrades: PropTypes.arrayOf(\n PropTypes.shape({\n current: PropTypes.number.isRequired,\n previous: PropTypes.number.isRequired,\n }),\n ).isRequired,\n setEligibleGrade: PropTypes.func.isRequired,\n};\n\nexport default injectIntl(GradingScale);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n gradingSidebarTitle: {\n id: 'course-authoring.grading-settings.sidebar.about.title',\n defaultMessage: 'What can I do on this page?',\n },\n gradingSidebarAbout1: {\n id: 'course-authoring.grading-settings.sidebar.about.text-1',\n defaultMessage: 'You can use the slider under Overall Grade Range to specify whether your course is pass/fail or graded by letter, and to establish the thresholds for each grade.',\n },\n gradingSidebarAbout2: {\n id: 'course-authoring.grading-settings.sidebar.about.text-2',\n defaultMessage: 'You can specify whether your course offers students a grace period for late assignments.',\n },\n gradingSidebarAbout3: {\n id: 'course-authoring.grading-settings.sidebar.about.text-3',\n defaultMessage: 'You can also create assignment types, such as homework, labs, quizzes, and exams, and specify how much of a student\\'s grade each assignment type is worth.',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\n\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport messages from './messages';\n\nconst GradingSidebar = ({ intl, courseId, proctoredExamSettingsUrl }) => (\n \n

    \n {intl.formatMessage(messages.gradingSidebarTitle)}\n

    \n

    \n {intl.formatMessage(messages.gradingSidebarAbout1)}\n

    \n

    \n {intl.formatMessage(messages.gradingSidebarAbout2)}\n

    \n

    \n {intl.formatMessage(messages.gradingSidebarAbout3)}\n

    \n \n);\n\nGradingSidebar.defaultProps = {\n proctoredExamSettingsUrl: '',\n};\n\nGradingSidebar.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n proctoredExamSettingsUrl: PropTypes.string,\n};\n\nexport default injectIntl(GradingSidebar);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.grading-settings.heading.title',\n defaultMessage: 'Grading',\n },\n headingSubtitle: {\n id: 'course-authoring.grading-settings.heading.subtitle',\n defaultMessage: 'Settings',\n },\n policy: {\n id: 'course-authoring.grading-settings.policies.title',\n defaultMessage: 'Overall grade range',\n },\n policiesDescription: {\n id: 'course-authoring.grading-settings.policies.description',\n defaultMessage: 'Your overall grading scale for student final grades',\n },\n alertWarning: {\n id: 'course-authoring.grading-settings.alert.warning',\n defaultMessage: \"You've made some changes\",\n },\n alertWarningDescriptions: {\n id: 'course-authoring.grading-settings.alert.warning.descriptions',\n defaultMessage: 'Your changes will not take effect until you save your progress. Take care with key and value formatting, as validation is not implemented.',\n },\n alertSuccess: {\n id: 'course-authoring.grading-settings.alert.success',\n defaultMessage: 'Your changes have been saved.',\n },\n buttonSaveText: {\n id: 'course-authoring.grading-settings.alert.button.save',\n defaultMessage: 'Save changes',\n },\n buttonSavingText: {\n id: 'course-authoring.grading-settings.alert.button.saving',\n defaultMessage: 'Saving',\n },\n buttonCancelText: {\n id: 'course-authoring.grading-settings.alert.button.cancel',\n defaultMessage: 'Cancel',\n },\n alertWarningAriaLabelledby: {\n id: 'course-authoring.grading-settings.alert.warning.aria.labelledby',\n defaultMessage: 'notification-warning-title',\n },\n alertWarningAriaDescribedby: {\n id: 'course-authoring.grading-settings.alert.warning.aria.describedby',\n defaultMessage: 'notification-warning-description',\n },\n alertSuccessAriaLabelledby: {\n id: 'course-authoring.grading-settings.alert.success.aria.labelledby',\n defaultMessage: 'alert-confirmation-title',\n },\n alertSuccessAriaDescribedby: {\n id: 'course-authoring.grading-settings.alert.success.aria.describedby',\n defaultMessage: 'alert-confirmation-description',\n },\n creditEligibilitySectionTitle: {\n id: 'course-authoring.grading-settings.credit-eligibility.title',\n defaultMessage: 'Credit eligibility',\n },\n creditEligibilitySectionDescription: {\n id: 'course-authoring.grading-settings.credit-eligibility.description',\n defaultMessage: 'Settings for course credit eligibility',\n },\n gradingRulesPoliciesSectionTitle: {\n id: 'course-authoring.grading-settings.grading-rules-policies.title',\n defaultMessage: 'Grading rules & policies',\n },\n gradingRulesPoliciesSectionDescription: {\n id: 'course-authoring.grading-settings.grading-rules-policies.description',\n defaultMessage: 'Deadlines, requirements, and logistics around grading student work',\n },\n assignmentTypeSectionTitle: {\n id: 'course-authoring.grading-settings.assignment-type.title',\n defaultMessage: 'Assignment types',\n },\n assignmentTypeSectionDescription: {\n id: 'course-authoring.grading-settings.assignment-type.description',\n defaultMessage: 'Categories and labels for any exercises that are gradable',\n },\n addNewAssignmentTypeBtn: {\n id: 'course-authoring.grading-settings.add-new-assignment-type.btn',\n defaultMessage: 'New assignment type',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\n\nexport const DUPLICATE_ASSIGNMENT_NAME = 'duplicateAssignmentName';\n\nexport const ASSIGNMENT_TYPES = {\n type: 'type',\n weight: 'weight',\n minCount: 'minCount',\n dropCount: 'dropCount',\n};\n\nexport const defaultAssignmentsPropTypes = {\n type: PropTypes.string,\n minCount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n dropCount: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n shortLabel: PropTypes.string,\n weight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n","import { DUPLICATE_ASSIGNMENT_NAME } from './enum';\n\n/**\n * Updates the error list for the job and sets the save warning display flag.\n *\n * @param {string} assignmentName - The name of the field being validated.\n * @param {number} assignmentId - Assignment id.\n * @param {string, boolean} assignmentValue - The value of the field being validated.\n * @param {function} setErrorList - Function to update the error list state.\n * @param {function} setShowSavePrompt - Function to update the visibility of the save prompt.\n * @returns {void}\n */\nexport const updateAssignmentErrorList = (\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n assignmentValue = true,\n) => {\n setErrorList(prevState => ({ ...prevState, [`${assignmentName}-${assignmentId}`]: assignmentValue }));\n if (assignmentValue) {\n setShowSavePrompt(false);\n }\n};\n\n/**\n * Validates assignment fields.\n *\n * @param {number} assignmentId - Assignment id.\n * @param {string} assignmentName - The name of the field being validated.\n * @param {string} assignmentType - The type of the assignment.\n * @param {string} assignmentValue - The value of the field being validated.\n * @param {function} setErrorList - Function to update the error list state.\n * @param {function} setShowSavePrompt - Function to update the visibility of the save prompt.\n * @param {array} courseGraders - An array of existing grading data.\n * @param {number} weightOfTotalGrade - The weight of the assignment.\n * @param {number} assignmentMinCount - The minimum count of the assignment.\n * @param {number} assignmentDropCount - The drop count of the assignment.\n * @returns {void}\n */\nexport const validationAssignmentFields = (\n assignmentId,\n assignmentName,\n assignmentType,\n assignmentValue,\n setErrorList,\n setShowSavePrompt,\n courseGraders,\n weightOfTotalGrade,\n assignmentMinCount,\n assignmentDropCount,\n) => {\n const courseGradingTypes = courseGraders?.map(grade => grade.type);\n\n switch (assignmentName) {\n case assignmentType:\n if (assignmentValue === '') {\n updateAssignmentErrorList(assignmentName, assignmentId, setErrorList, setShowSavePrompt);\n return;\n }\n if (courseGradingTypes.includes(assignmentValue)) {\n updateAssignmentErrorList(\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n DUPLICATE_ASSIGNMENT_NAME,\n );\n return;\n }\n updateAssignmentErrorList(\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n false,\n );\n break;\n case weightOfTotalGrade:\n if (assignmentValue < 0 || assignmentValue > 100 || assignmentValue === '-0') {\n updateAssignmentErrorList(\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n );\n return;\n }\n updateAssignmentErrorList(\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n false,\n );\n break;\n case assignmentMinCount:\n if (assignmentValue <= 0 || assignmentValue === '' || assignmentValue === '-0') {\n updateAssignmentErrorList(\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n );\n return;\n }\n updateAssignmentErrorList(\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n false,\n );\n break;\n case assignmentDropCount:\n if (assignmentValue < 0 || assignmentValue === '' || assignmentValue === '-0') {\n updateAssignmentErrorList(\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n );\n return;\n }\n updateAssignmentErrorList(\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n false,\n );\n break;\n default:\n updateAssignmentErrorList(\n assignmentName,\n assignmentId,\n setErrorList,\n setShowSavePrompt,\n false,\n );\n }\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Form } from '@openedx/paragon';\n\nimport { defaultAssignmentsPropTypes } from '../utils/enum';\n\nconst AssignmentItem = ({\n title,\n descriptions,\n type,\n min,\n max,\n errorMsg,\n className,\n name,\n onChange,\n value,\n errorEffort,\n secondErrorMsg,\n gradeField,\n trailingElement,\n}) => (\n
  • \n \n {title}\n \n \n {descriptions}\n \n {errorEffort && (\n \n {errorMsg}\n \n )}\n {gradeField?.dropCount !== 0 && gradeField?.dropCount > gradeField?.minCount && (\n \n {secondErrorMsg}\n \n )}\n \n
  • \n);\n\nAssignmentItem.defaultProps = {\n max: undefined,\n errorMsg: undefined,\n min: undefined,\n value: '',\n secondErrorMsg: undefined,\n errorEffort: false,\n gradeField: undefined,\n trailingElement: undefined,\n};\n\nAssignmentItem.propTypes = {\n title: PropTypes.string.isRequired,\n descriptions: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired,\n min: PropTypes.number,\n max: PropTypes.number,\n errorMsg: PropTypes.string,\n name: PropTypes.string.isRequired,\n className: PropTypes.string.isRequired,\n secondErrorMsg: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n errorEffort: PropTypes.bool,\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n gradeField: PropTypes.shape(defaultAssignmentsPropTypes),\n trailingElement: PropTypes.string,\n};\n\nexport default AssignmentItem;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n assignmentTypeNameTitle: {\n id: 'course-authoring.grading-settings.assignment.type-name.title',\n defaultMessage: 'Assignment type name',\n },\n assignmentTypeNameDescription: {\n id: 'course-authoring.grading-settings.assignment.type-name.description',\n defaultMessage: 'The general category for this type of assignment, for example, Homework or Midterm Exam. This name is visible to learners.',\n },\n assignmentTypeNameErrorMessage1: {\n id: 'course-authoring.grading-settings.assignment.type-name.error.message-1',\n defaultMessage: 'The assignment type must have a name.',\n },\n assignmentTypeNameErrorMessage2: {\n id: 'course-authoring.grading-settings.assignment.type-name.error.message-2',\n defaultMessage: 'For grading to work, you must change all {initialAssignmentName} subsections to {value}.',\n },\n assignmentTypeNameErrorMessage3: {\n id: 'course-authoring.grading-settings.assignment.type-name.error.message-3',\n defaultMessage: \"There's already another assignment type with this name.\",\n },\n abbreviationTitle: {\n id: 'course-authoring.grading-settings.assignment.abbreviation.title',\n defaultMessage: 'Abbreviation',\n },\n abbreviationDescription: {\n id: 'course-authoring.grading-settings.assignment.abbreviation.description',\n defaultMessage: \"This short name for the assignment type (for example, HW or Midterm) appears next to assignments on a learner's Progress page.\",\n },\n weightOfTotalGradeTitle: {\n id: 'course-authoring.grading-settings.assignment.weight-of-total-grade.title',\n defaultMessage: 'Weight of total grade',\n },\n weightOfTotalGradeDescription: {\n id: 'course-authoring.grading-settings.assignment.weight-of-total-grade.description',\n defaultMessage: 'The weight of all assignments of this type as a percentage of the total grade, for example, 40. Do not include the percent symbol.',\n },\n weightOfTotalGradeErrorMessage: {\n id: 'course-authoring.grading-settings.assignment.weight-of-total-grade.error.message',\n defaultMessage: 'Please enter an integer between 0 and 100.',\n },\n totalNumberTitle: {\n id: 'course-authoring.grading-settings.assignment.total-number.title',\n defaultMessage: 'Total number',\n },\n totalNumberDescription: {\n id: 'course-authoring.grading-settings.assignment.total-number.description',\n defaultMessage: 'The number of subsections in the course that contain problems of this assignment type.',\n },\n totalNumberErrorMessage: {\n id: 'course-authoring.grading-settings.assignment.total-number.error.message',\n defaultMessage: 'Please enter an integer greater than 0.',\n },\n numberOfDroppableTitle: {\n id: 'course-authoring.grading-settings.assignment.number-of-droppable.title',\n defaultMessage: 'Number of droppable',\n },\n numberOfDroppableDescription: {\n id: 'course-authoring.grading-settings.assignment.number-of-droppable.description',\n defaultMessage: 'The number of assignments of this type that will be dropped. The lowest scoring assignments are dropped first.',\n },\n numberOfDroppableErrorMessage: {\n id: 'course-authoring.grading-settings.assignment.number-of-droppable.error.message',\n defaultMessage: 'Please enter non-negative integer.',\n },\n numberOfDroppableSecondErrorMessage: {\n id: 'course-authoring.grading-settings.assignment.number-of-droppable.second.error.message',\n defaultMessage: 'Cannot drop more {type} assignments than are assigned.',\n },\n assignmentAlertWarningTitle: {\n id: 'course-authoring.grading-settings.assignment.alert.warning.title',\n defaultMessage: 'Warning: The number of {type} assignments defined here does not match the current number of {type} assignments in the course:',\n },\n assignmentAlertWarningDescription: {\n id: 'course-authoring.grading-settings.assignment.alert.warning.description',\n defaultMessage: 'There are no assignments of this type in the course.',\n },\n assignmentAlertWarningUsageTitle: {\n id: 'course-authoring.grading-settings.assignment.alert.warning.usage.title',\n defaultMessage: 'Warning: The number of {type} assignments defined here does not match the current number of {type} assignments in the course:',\n },\n assignmentAlertWarningSuccess: {\n id: 'course-authoring.grading-settings.assignment.alert.success.title',\n defaultMessage: 'The number of {type} assignments in the course matches the number defined here.',\n },\n assignmentDeleteButton: {\n id: 'course-authoring.grading-settings.assignment.delete.button',\n defaultMessage: 'Delete',\n },\n});\n\nexport default messages;\n","import React, { useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Form } from '@openedx/paragon';\n\nimport { ASSIGNMENT_TYPES, DUPLICATE_ASSIGNMENT_NAME } from '../utils/enum';\nimport messages from '../messages';\n\nconst AssignmentTypeName = ({\n intl, value, errorEffort, onChange,\n}) => {\n const initialAssignmentName = useRef(value);\n\n return (\n
  • \n \n \n {intl.formatMessage(messages.assignmentTypeNameTitle)}\n \n \n \n {intl.formatMessage(messages.assignmentTypeNameDescription)}\n \n {errorEffort && errorEffort !== DUPLICATE_ASSIGNMENT_NAME && (\n \n {intl.formatMessage(messages.assignmentTypeNameErrorMessage1)}\n \n )}\n {value !== initialAssignmentName.current && initialAssignmentName.current !== '' && (\n \n {intl.formatMessage(messages.assignmentTypeNameErrorMessage2, {\n initialAssignmentName: initialAssignmentName.current,\n value,\n })}\n \n )}\n {errorEffort === DUPLICATE_ASSIGNMENT_NAME && (\n \n {intl.formatMessage(messages.assignmentTypeNameErrorMessage3)}\n \n )}\n \n
  • \n );\n};\n\nAssignmentTypeName.defaultProps = {\n errorEffort: false,\n};\n\nAssignmentTypeName.propTypes = {\n intl: intlShape.isRequired,\n onChange: PropTypes.func.isRequired,\n errorEffort: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]).isRequired,\n};\n\nexport default injectIntl(AssignmentTypeName);\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Button } from '@openedx/paragon';\nimport { CheckCircle, Warning } from '@openedx/paragon/icons';\n\nimport AlertMessage from '../../generic/alert-message';\nimport { validationAssignmentFields } from './utils/validation';\nimport AssignmentItem from './assignments/AssignmentItem';\nimport AssignmentTypeName from './assignments/AssignmentTypeName';\nimport { defaultAssignmentsPropTypes, ASSIGNMENT_TYPES } from './utils/enum';\nimport messages from './messages';\n\nconst MIN_NUMBER_VALUE = 0;\nconst MAX_NUMBER_VALUE = 100;\n\nconst AssignmentSection = ({\n intl,\n handleRemoveAssignment,\n setShowSavePrompt,\n graders,\n setGradingData,\n courseAssignmentLists,\n setShowSuccessAlert,\n}) => {\n const [errorList, setErrorList] = useState({});\n const {\n type, weight, minCount, dropCount,\n } = ASSIGNMENT_TYPES;\n const isFieldsWithoutErrors = Object.values(errorList).every(field => field !== true);\n\n if (!isFieldsWithoutErrors) {\n setShowSavePrompt(false);\n }\n\n const handleAssignmentChange = (e, assignmentId) => {\n const { name, value, type: inputType } = e.target;\n\n let inputValue = value;\n if (inputType === 'number') {\n inputValue = parseInt(value, 10);\n }\n\n setShowSavePrompt(true);\n\n setGradingData(prevState => ({\n ...prevState,\n graders: graders.map(grader => {\n if (grader.id === assignmentId) {\n return { ...grader, [name]: inputValue };\n }\n return grader;\n }),\n }));\n\n validationAssignmentFields(\n assignmentId,\n name,\n type,\n value,\n setErrorList,\n setShowSavePrompt,\n graders,\n weight,\n minCount,\n dropCount,\n );\n setShowSuccessAlert(false);\n };\n\n return (\n
    \n {graders?.map((gradeField) => {\n const courseAssignmentUsage = courseAssignmentLists[gradeField.type];\n const showDefinedCaseAlert = gradeField.minCount !== courseAssignmentUsage?.length\n && Boolean(courseAssignmentUsage?.length);\n const showNotDefinedCaseAlert = !courseAssignmentUsage?.length && Boolean(gradeField.type);\n\n return (\n
    \n
      \n handleAssignmentChange(e, gradeField.id)}\n />\n handleAssignmentChange(e, gradeField.id)}\n />\n handleAssignmentChange(e, gradeField.id)}\n errorEffort={errorList[`${weight}-${gradeField.id}`]}\n trailingElement=\"%\"\n />\n handleAssignmentChange(e, gradeField.id)}\n errorEffort={errorList[`${minCount}-${gradeField.id}`]}\n />\n handleAssignmentChange(e, gradeField.id)}\n secondErrorMsg={intl.formatMessage(messages.numberOfDroppableSecondErrorMessage, {\n type: gradeField.type,\n })}\n errorEffort={errorList[`${dropCount}-${gradeField.id}`]}\n />\n
    \n {showDefinedCaseAlert && (\n \n \n {courseAssignmentUsage.length} Final assignment(s) found:\n \n
      \n {courseAssignmentUsage.map(assignmentItem => (\n
    1. {assignmentItem}
    2. \n ))}\n
    \n \n )}\n aria-hidden=\"true\"\n />\n )}\n {showNotDefinedCaseAlert && (\n \n {intl.formatMessage(messages.assignmentAlertWarningDescription)}\n \n )}\n aria-hidden=\"true\"\n />\n )}\n {gradeField.minCount === courseAssignmentUsage?.length && (\n \n )}\n handleRemoveAssignment(gradeField.id)}\n >\n {intl.formatMessage(messages.assignmentDeleteButton)}\n \n
    \n );\n })}\n
    \n );\n};\n\nAssignmentSection.defaultProps = {\n courseAssignmentLists: undefined,\n graders: undefined,\n};\n\nAssignmentSection.propTypes = {\n intl: intlShape.isRequired,\n handleRemoveAssignment: PropTypes.func.isRequired,\n setGradingData: PropTypes.func.isRequired,\n setShowSavePrompt: PropTypes.func.isRequired,\n setShowSuccessAlert: PropTypes.func.isRequired,\n courseAssignmentLists: PropTypes.shape(defaultAssignmentsPropTypes),\n graders: PropTypes.arrayOf(\n PropTypes.shape(defaultAssignmentsPropTypes),\n ),\n};\n\nexport default injectIntl(AssignmentSection);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n creditEligibilityLabel: {\n id: 'course-authoring.grading-settings.credit.eligibility.label',\n defaultMessage: 'Minimum credit-eligible grade:',\n },\n creditEligibilityDescription: {\n id: 'course-authoring.grading-settings.credit.eligibility.description',\n defaultMessage: '% Must be greater than or equal to the course passing grade',\n },\n creditEligibilityErrorMsg: {\n id: 'course-authoring.grading-settings.credit.eligibility.error.msg',\n defaultMessage: 'Not able to set passing grade to less than:',\n },\n});\n\nexport default messages;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Form } from '@openedx/paragon';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\n\nimport messages from './messages';\n\nconst CreditSection = ({\n intl, eligibleGrade, setShowSavePrompt, minimumGradeCredit, setGradingData, setShowSuccessAlert,\n}) => {\n const [errorEffort, setErrorEffort] = useState(false);\n\n const handleCreditChange = (e) => {\n const { value } = e.target;\n\n setGradingData(prevData => ({\n ...prevData,\n minimumGradeCredit: value / 100,\n }));\n\n if (value <= eligibleGrade) {\n setErrorEffort(true);\n setShowSavePrompt(false);\n return;\n }\n\n setShowSavePrompt(true);\n setErrorEffort(false);\n setShowSuccessAlert(false);\n };\n\n return (\n \n \n {intl.formatMessage(messages.creditEligibilityLabel)}\n \n \n \n {intl.formatMessage(messages.creditEligibilityDescription)}\n \n {errorEffort && (\n \n {intl.formatMessage(messages.creditEligibilityErrorMsg)} {eligibleGrade}.\n \n )}\n \n );\n};\n\nCreditSection.propTypes = {\n intl: intlShape.isRequired,\n eligibleGrade: PropTypes.number.isRequired,\n setShowSavePrompt: PropTypes.func.isRequired,\n setGradingData: PropTypes.func.isRequired,\n setShowSuccessAlert: PropTypes.func.isRequired,\n minimumGradeCredit: PropTypes.number.isRequired,\n};\n\nexport default injectIntl(CreditSection);\n","/**\n * Time format conversions for values (hours or minutes) that are less than 10.\n *\n * @param {number} time - incoming time data.\n * @returns {string} - formatted time string.\n */\nexport function formatTime(time) {\n return (time >= 10 ? time.toString() : `0${time}`);\n}\n\n/**\n * Validates inputStr as a time in HH:MM format.\n *\n * @param {string} inputStr - the input string to validate.\n * @param {function} setShowSavePrompt - a function to control save prompt display.\n * @param {function} setIsError - a function to set error state.\n * @returns {boolean} - returns `true` if `inputStr` is a valid time, else `false`.\n */\nexport function timerValidation(inputStr, setShowSavePrompt, setIsError) {\n const timePattern = /^(?:[01]\\d|2[0-3]):[0-5]\\d$/;\n\n const isValid = timePattern.test(inputStr);\n setShowSavePrompt(isValid);\n setIsError(!isValid);\n\n return isValid;\n}\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n gracePeriodOnDeadlineLabel: {\n id: 'course-authoring.grading-settings.deadline.label',\n defaultMessage: 'Grace period on deadline:',\n },\n gracePeriodOnDeadlineDescription: {\n id: 'course-authoring.grading-settings.deadline.description',\n defaultMessage: 'Leeway on due dates',\n },\n gracePeriodOnDeadlineErrorMsg: {\n id: 'course-authoring.grading-settings.deadline.error.message',\n defaultMessage: 'Grace period must be specified in {timeFormat} format.',\n },\n});\n\nexport default messages;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { Form } from '@openedx/paragon';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport classNames from 'classnames';\n\nimport { DEFAULT_TIME_STAMP, TIME_FORMAT } from '../../constants';\nimport { formatTime, timerValidation } from './utils';\nimport messages from './messages';\n\nconst DeadlineSection = ({\n intl, setShowSavePrompt, gracePeriod, setGradingData, setShowSuccessAlert,\n}) => {\n const timeStampValue = gracePeriod\n ? `${formatTime(gracePeriod.hours)}:${formatTime(gracePeriod.minutes)}`\n : DEFAULT_TIME_STAMP;\n const [newDeadlineValue, setNewDeadlineValue] = useState(timeStampValue);\n const [isError, setIsError] = useState(false);\n\n useEffect(() => {\n setNewDeadlineValue(timeStampValue);\n }, [gracePeriod]);\n\n const handleDeadlineChange = (e) => {\n const { value } = e.target;\n const [hours, minutes] = value.split(':');\n\n setNewDeadlineValue(value);\n\n if (timerValidation(value, setShowSavePrompt, setIsError)) {\n setGradingData(prevData => ({\n ...prevData,\n gracePeriod: {\n hours: +hours,\n minutes: +minutes,\n },\n }));\n setShowSuccessAlert(false);\n }\n };\n\n return (\n \n \n {intl.formatMessage(messages.gracePeriodOnDeadlineLabel)}\n \n \n \n {intl.formatMessage(messages.gracePeriodOnDeadlineDescription)}\n \n {isError && (\n \n {intl.formatMessage(messages.gracePeriodOnDeadlineErrorMsg, { timeFormat: TIME_FORMAT.toUpperCase() })}\n \n )}\n \n );\n};\n\nDeadlineSection.defaultProps = {\n gracePeriod: null,\n};\n\nDeadlineSection.propTypes = {\n intl: intlShape.isRequired,\n setShowSavePrompt: PropTypes.func.isRequired,\n setGradingData: PropTypes.func.isRequired,\n setShowSuccessAlert: PropTypes.func.isRequired,\n gracePeriod: PropTypes.shape({\n hours: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n minutes: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n }),\n};\n\nexport default injectIntl(DeadlineSection);\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Container, Layout, Button, StatefulButton,\n} from '@openedx/paragon';\nimport { CheckCircle, Warning, Add as IconAdd } from '@openedx/paragon/icons';\n\nimport { useModel } from '../generic/model-store';\nimport AlertMessage from '../generic/alert-message';\nimport { RequestStatus } from '../data/constants';\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport SectionSubHeader from '../generic/section-sub-header';\nimport { STATEFUL_BUTTON_STATES } from '../constants';\nimport {\n getGradingSettings,\n getCourseAssignmentLists,\n getSavingStatus,\n getLoadingStatus,\n getCourseSettings,\n} from './data/selectors';\nimport { fetchGradingSettings, sendGradingSetting, fetchCourseSettingsQuery } from './data/thunks';\nimport GradingScale from './grading-scale/GradingScale';\nimport GradingSidebar from './grading-sidebar';\nimport messages from './messages';\nimport AssignmentSection from './assignment-section';\nimport CreditSection from './credit-section';\nimport DeadlineSection from './deadline-section';\nimport { useConvertGradeCutoffs, useUpdateGradingData } from './hooks';\nimport getPageHeadTitle from '../generic/utils';\n\nconst GradingSettings = ({ intl, courseId }) => {\n const gradingSettingsData = useSelector(getGradingSettings);\n const courseSettingsData = useSelector(getCourseSettings);\n const courseAssignmentLists = useSelector(getCourseAssignmentLists);\n const savingStatus = useSelector(getSavingStatus);\n const loadingStatus = useSelector(getLoadingStatus);\n const [showSuccessAlert, setShowSuccessAlert] = useState(false);\n const dispatch = useDispatch();\n const isLoading = loadingStatus === RequestStatus.IN_PROGRESS;\n const [isQueryPending, setIsQueryPending] = useState(false);\n const [showOverrideInternetConnectionAlert, setOverrideInternetConnectionAlert] = useState(false);\n const [eligibleGrade, setEligibleGrade] = useState(null);\n\n const courseDetails = useModel('courseDetails', courseId);\n document.title = getPageHeadTitle(courseDetails?.name, intl.formatMessage(messages.headingTitle));\n\n const {\n graders,\n resetDataRef,\n setGradingData,\n gradingData,\n gradeCutoffs,\n gracePeriod,\n minimumGradeCredit,\n showSavePrompt,\n setShowSavePrompt,\n handleResetPageData,\n handleAddAssignment,\n handleRemoveAssignment,\n } = useUpdateGradingData(gradingSettingsData, setOverrideInternetConnectionAlert, setShowSuccessAlert);\n\n const {\n gradeLetters,\n gradeValues,\n sortedGrades,\n } = useConvertGradeCutoffs(gradeCutoffs);\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n setShowSuccessAlert(!showSuccessAlert);\n setShowSavePrompt(!showSavePrompt);\n setTimeout(() => setShowSuccessAlert(false), 15000);\n setIsQueryPending(!isQueryPending);\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }, [savingStatus]);\n\n useEffect(() => {\n dispatch(fetchGradingSettings(courseId));\n dispatch(fetchCourseSettingsQuery(courseId));\n }, [courseId]);\n\n if (isLoading) {\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return <>;\n }\n\n const handleQueryProcessing = () => {\n setShowSuccessAlert(false);\n dispatch(sendGradingSetting(courseId, gradingData));\n };\n\n const handleSendGradingSettingsData = () => {\n setIsQueryPending(true);\n setOverrideInternetConnectionAlert(true);\n };\n\n const handleInternetConnectionFailed = () => {\n setShowSavePrompt(false);\n setShowSuccessAlert(false);\n setIsQueryPending(false);\n setOverrideInternetConnectionAlert(true);\n };\n\n const updateValuesButtonState = {\n labels: {\n default: intl.formatMessage(messages.buttonSaveText),\n pending: intl.formatMessage(messages.buttonSavingText),\n },\n disabledStates: [RequestStatus.PENDING],\n };\n\n return (\n <>\n \n
    \n \n
    \n
    \n
    \n \n \n
    \n \n
    \n \n
    \n {courseSettingsData.creditEligibilityEnabled && courseSettingsData.isCreditCourse && (\n
    \n \n \n
    \n )}\n
    \n \n \n
    \n
    \n
    \n

    \n {intl.formatMessage(messages.assignmentTypeSectionTitle)}\n

    \n \n {intl.formatMessage(messages.assignmentTypeSectionDescription)}\n \n
    \n \n \n {intl.formatMessage(messages.addNewAssignmentTypeBtn)}\n \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n
    \n
    \n {showOverrideInternetConnectionAlert && (\n \n )}\n \n {intl.formatMessage(messages.buttonCancelText)}\n \n ),\n ,\n ].filter(Boolean)}\n variant=\"warning\"\n icon={Warning}\n title={intl.formatMessage(messages.alertWarning)}\n description={intl.formatMessage(messages.alertWarningDescriptions)}\n />\n
    \n \n );\n};\n\nGradingSettings.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(GradingSettings);\n","import { useEffect, useRef, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { getGradingValues, getSortedGrades } from './grading-scale/utils';\n\nconst useConvertGradeCutoffs = (\n gradeCutoffs,\n) => {\n const gradeLetters = gradeCutoffs && Object.keys(gradeCutoffs);\n const gradeValues = gradeCutoffs && getGradingValues(gradeCutoffs);\n const sortedGrades = gradeCutoffs && getSortedGrades(gradeValues);\n\n return {\n gradeLetters,\n gradeValues,\n sortedGrades,\n };\n};\n\nconst useUpdateGradingData = (gradingSettingsData, setOverrideInternetConnectionAlert, setShowSuccessAlert) => {\n const uniqueId = uuidv4();\n const [gradingData, setGradingData] = useState({});\n const [showSavePrompt, setShowSavePrompt] = useState(false);\n const resetDataRef = useRef(false);\n const {\n gradeCutoffs = {},\n gracePeriod = { hours: '', minutes: '' },\n minimumGradeCredit,\n graders,\n } = gradingData;\n\n useEffect(() => {\n if (gradingSettingsData !== undefined) {\n setGradingData(gradingSettingsData);\n }\n }, [gradingSettingsData]);\n\n const handleResetPageData = () => {\n setShowSavePrompt(!showSavePrompt);\n setShowSuccessAlert(false);\n setGradingData(gradingSettingsData);\n resetDataRef.current = true;\n setOverrideInternetConnectionAlert(false);\n };\n\n const handleAddAssignment = () => {\n setGradingData(prevState => ({\n ...prevState,\n graders: [...prevState.graders, {\n id: uniqueId,\n dropCount: 0,\n minCount: 1,\n shortLabel: '',\n type: '',\n weight: 0,\n }],\n }));\n setShowSuccessAlert(false);\n };\n\n const handleRemoveAssignment = (assignmentId) => {\n setGradingData((prevState) => ({\n ...prevState,\n graders: prevState.graders.filter((grade) => grade.id !== assignmentId),\n }));\n setShowSuccessAlert(false);\n setShowSavePrompt(true);\n };\n\n return {\n graders,\n resetDataRef,\n setGradingData,\n gradingData,\n gradeCutoffs,\n gracePeriod,\n minimumGradeCredit,\n showSavePrompt,\n setShowSavePrompt,\n handleResetPageData,\n handleAddAssignment,\n handleRemoveAssignment,\n };\n};\n\nexport { useConvertGradeCutoffs, useUpdateGradingData };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.course-team.headingTitle',\n defaultMessage: 'Course team',\n },\n headingSubtitle: {\n id: 'course-authoring.course-team.subTitle',\n defaultMessage: 'Settings',\n },\n addNewMemberButton: {\n id: 'course-authoring.course-team.button.new-team-member',\n defaultMessage: 'New team member',\n },\n});\n\nexport default messages;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n sidebarTitle: {\n id: 'course-authoring.course-team.sidebar.title',\n defaultMessage: 'Course team roles',\n },\n sidebarAbout_1: {\n id: 'course-authoring.course-team.sidebar.about-1',\n defaultMessage: 'Course team members with the Staff role are course co-authors. They have full writing and editing privileges on all course content.',\n },\n sidebarAbout_2: {\n id: 'course-authoring.course-team.sidebar.about-2',\n defaultMessage: 'Admins are course team members who can add and remove other course team members.',\n },\n sidebarAbout_3: {\n id: 'course-authoring.course-team.sidebar.about-3',\n defaultMessage: 'All course team members can access content in Studio, the LMS, and Insights, but are not automatically enrolled in the course.',\n },\n ownershipTitle: {\n id: 'course-authoring.course-team.sidebar.ownership.title',\n defaultMessage: 'Transferring ownership',\n },\n ownershipDescription: {\n id: 'course-authoring.course-team.sidebar.ownership.description',\n defaultMessage: 'Every course must have an Admin. If you are the Admin and you want to transfer ownership of the course, click {strong} to make another user the Admin, then ask that user to remove you from the Course Team list.',\n },\n addAdminAccess: {\n id: 'course-authoring.course-team.sidebar.ownership.addAdminAccess',\n defaultMessage: 'Add admin access',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport messages from './messages';\n\nconst CourseTeamSideBar = ({ courseId, isOwnershipHint, isShowInitialSidebar }) => {\n const intl = useIntl();\n\n return (\n \n \n

    \n {intl.formatMessage(messages.sidebarTitle)}\n

    \n

    \n {intl.formatMessage(messages.sidebarAbout_1)}\n

    \n

    \n {intl.formatMessage(messages.sidebarAbout_2)}\n

    \n

    \n {intl.formatMessage(messages.sidebarAbout_3)}\n

    \n \n {isOwnershipHint && (\n <>\n
    \n \n

    \n {intl.formatMessage(messages.ownershipTitle)}\n

    \n

    \n {intl.formatMessage(\n messages.ownershipDescription,\n { strong: {intl.formatMessage(messages.addAdminAccess)} },\n )}\n

    \n \n \n )}\n \n );\n};\n\nCourseTeamSideBar.defaultProps = {\n isShowInitialSidebar: false,\n};\n\nCourseTeamSideBar.propTypes = {\n courseId: PropTypes.string.isRequired,\n isOwnershipHint: PropTypes.bool.isRequired,\n isShowInitialSidebar: PropTypes.bool,\n};\n\nexport default CourseTeamSideBar;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n formTitle: {\n id: 'course-authoring.course-team.form.title',\n defaultMessage: 'Add a user to your course\\'s team',\n },\n formLabel: {\n id: 'course-authoring.course-team.form.label',\n defaultMessage: 'User\\'s email address',\n },\n formPlaceholder: {\n id: 'course-authoring.course-team.form.placeholder',\n defaultMessage: 'example: {email}',\n },\n formHelperText: {\n id: 'course-authoring.course-team.form.helperText',\n defaultMessage: 'Provide the email address of the user you want to add as Staff',\n },\n addUserButton: {\n id: 'course-authoring.course-team.form.button.addUser',\n defaultMessage: 'Add user',\n },\n cancelButton: {\n id: 'course-authoring.course-team.form.button.cancel',\n defaultMessage: 'Cancel',\n },\n\n});\n\nexport default messages;\n","export const MODAL_TYPES = {\n error: 'error',\n delete: 'delete',\n warning: 'warning',\n};\n\nexport const BADGE_STATES = {\n admin: 'primary-700',\n staff: 'gray-500',\n};\n\nexport const USER_ROLES = {\n admin: 'instructor',\n staff: 'staff',\n};\n\nexport const EXAMPLE_USER_EMAIL = 'username@domain.com';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Button,\n Form,\n ActionRow,\n} from '@openedx/paragon';\nimport { Formik } from 'formik';\n\nimport messages from './messages';\nimport FormikControl from '../../generic/FormikControl';\nimport { EXAMPLE_USER_EMAIL } from '../constants';\n\nconst AddUserForm = ({ onSubmit, onCancel }) => {\n const intl = useIntl();\n\n return (\n
    \n \n {({ handleSubmit, values }) => (\n <>\n \n

    {intl.formatMessage(messages.formTitle)}

    \n \n {intl.formatMessage(messages.formLabel)}\n \n \n \n {intl.formatMessage(messages.formHelperText)}\n \n
    \n \n \n \n {intl.formatMessage(messages.addUserButton)}\n \n \n \n )}\n \n
    \n );\n};\n\nAddUserForm.propTypes = {\n onSubmit: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n};\n\nexport default AddUserForm;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.course-team.add-team-member.title',\n defaultMessage: 'Add team members to this course',\n },\n description: {\n id: 'course-authoring.course-team.add-team-member.description',\n defaultMessage: 'Adding team members makes course authoring collaborative. Users must be signed up for Studio and have an active account.',\n },\n button: {\n id: 'course-authoring.course-team.add-team-member.button',\n defaultMessage: 'Add a new team member',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Add as IconAdd } from '@openedx/paragon/icons';\nimport { Button } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst AddTeamMember = ({ onFormOpen, isButtonDisable }) => {\n const intl = useIntl();\n\n return (\n
    \n
    \n

    {intl.formatMessage(messages.title)}

    \n {intl.formatMessage(messages.description)}\n
    \n \n {intl.formatMessage(messages.button)}\n \n
    \n );\n};\n\nAddTeamMember.propTypes = {\n onFormOpen: PropTypes.func.isRequired,\n isButtonDisable: PropTypes.bool,\n};\n\nAddTeamMember.defaultProps = {\n isButtonDisable: false,\n};\n\nexport default AddTeamMember;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n roleAdmin: {\n id: 'course-authoring.course-team.member.role.admin',\n defaultMessage: 'Admin',\n },\n roleStaff: {\n id: 'course-authoring.course-team.member.role.staff',\n defaultMessage: 'Staff',\n },\n roleYou: {\n id: 'course-authoring.course-team.member.role.you',\n defaultMessage: 'You!',\n },\n hint: {\n id: 'course-authoring.course-team.member.hint',\n defaultMessage: 'Promote another member to Admin to remove your admin rights',\n },\n addButton: {\n id: 'course-authoring.course-team.member.button.add',\n defaultMessage: 'Add admin access',\n },\n removeButton: {\n id: 'course-authoring.course-team.member.button.remove',\n defaultMessage: 'Remove admin access',\n },\n deleteUserButton: {\n id: 'course-authoring.course-team.member.button.delete',\n defaultMessage: 'Delete user',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Badge,\n Button,\n Icon,\n IconButtonWithTooltip,\n MailtoLink,\n} from '@openedx/paragon';\nimport { DeleteOutline } from '@openedx/paragon/icons';\n\nimport messages from './messages';\nimport { USER_ROLES, BADGE_STATES } from '../constants';\n\nconst CourseTeamMember = ({\n userName,\n role,\n email,\n onChangeRole,\n onDelete,\n currentUserEmail,\n isHideActions,\n isAllowActions,\n}) => {\n const intl = useIntl();\n const isAdminRole = role === USER_ROLES.admin;\n const badgeColor = isAdminRole ? BADGE_STATES.admin : BADGE_STATES.staff;\n\n return (\n
    \n
    \n \n {isAdminRole\n ? intl.formatMessage(messages.roleAdmin)\n : intl.formatMessage(messages.roleStaff)}\n {currentUserEmail === email && (\n {intl.formatMessage(messages.roleYou)}\n )}\n \n {userName}\n {email}\n
    \n {/* eslint-disable-next-line no-nested-ternary */}\n {isAllowActions && (\n !isHideActions ? (\n
    \n onChangeRole(email, isAdminRole ? USER_ROLES.staff : USER_ROLES.admin)}\n >\n {isAdminRole ? intl.formatMessage(messages.removeButton) : intl.formatMessage(messages.addButton)}\n \n onDelete(email)}\n iconAs={Icon}\n alt={intl.formatMessage(messages.deleteUserButton)}\n data-testid=\"delete-button\"\n />\n
    \n ) : (\n
    \n {intl.formatMessage(messages.hint)}\n
    \n )\n )}\n
    \n );\n};\n\nCourseTeamMember.propTypes = {\n userName: PropTypes.string.isRequired,\n role: PropTypes.string.isRequired,\n email: PropTypes.string.isRequired,\n onChangeRole: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n currentUserEmail: PropTypes.string.isRequired,\n isHideActions: PropTypes.bool.isRequired,\n isAllowActions: PropTypes.bool.isRequired,\n};\n\nexport default CourseTeamMember;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n deleteModalTitle: {\n id: 'course-authoring.course-team.member.button.remove',\n defaultMessage: 'Delete course team member',\n },\n deleteModalMessage: {\n id: 'course-authoring.course-team.delete-modal.message',\n defaultMessage: 'Are you sure you want to delete {email} from the course team for “{courseName}”?',\n },\n deleteModalDeleteButton: {\n id: 'course-authoring.course-team.delete-modal.button.delete',\n defaultMessage: 'Delete',\n },\n deleteModalCancelButton: {\n id: 'course-authoring.course-team.delete-modal.button.cancel',\n defaultMessage: 'Cancel',\n },\n errorModalTitle: {\n id: 'course-authoring.course-team.error-modal.title',\n defaultMessage: 'Error adding user',\n },\n errorModalOkButton: {\n id: 'course-authoring.course-team.error-modal.button.ok',\n defaultMessage: 'Ok',\n },\n warningModalTitle: {\n id: 'course-authoring.course-team.warning-modal.title',\n defaultMessage: 'Already a course team member',\n },\n warningModalMessage: {\n id: 'course-authoring.course-team.warning-modal.message',\n defaultMessage: '{email} is already on the {courseName} team. Recheck the email address if you want to add a new member.',\n },\n warningModalReturnButton: {\n id: 'course-authoring.course-team.warning-modal.button.return',\n defaultMessage: 'Return to team listing',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n ActionRow,\n Button,\n AlertModal,\n} from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { MODAL_TYPES } from '../constants';\nimport { getInfoModalSettings } from '../utils';\n\nconst InfoModal = ({\n modalType,\n isOpen,\n close,\n onDeleteSubmit,\n currentEmail,\n errorMessage,\n courseName,\n}) => {\n const intl = useIntl();\n\n const {\n title,\n message,\n variant,\n closeButtonText,\n submitButtonText,\n closeButtonVariant,\n } = getInfoModalSettings(modalType, currentEmail, errorMessage, courseName, intl);\n\n const isEmptyErrorMessage = modalType === MODAL_TYPES.error && !errorMessage;\n\n return (\n \n \n {modalType === MODAL_TYPES.delete && (\n {\n e.preventDefault();\n onDeleteSubmit();\n }}\n >\n {submitButtonText}\n \n )}\n \n )}\n >\n

    {message}

    \n \n );\n};\n\nInfoModal.propTypes = {\n modalType: PropTypes.string.isRequired,\n isOpen: PropTypes.bool.isRequired,\n close: PropTypes.func.isRequired,\n currentEmail: PropTypes.string.isRequired,\n errorMessage: PropTypes.string.isRequired,\n courseName: PropTypes.string.isRequired,\n onDeleteSubmit: PropTypes.func.isRequired,\n};\n\nexport default InfoModal;\n","import { MODAL_TYPES } from './constants';\nimport messages from './info-modal/messages';\n\n/**\n * Create an info modal settings dependent on modal type\n * @param {typeof MODAL_TYPES} modalType - one of MODAL_TYPES\n * @param {string} currentEmail - email in current user\n * @param {string} errorEmail - email from wrong request\n * @param {string} courseName - current course name\n * @returns {{\n * title: string,\n * message: string,\n * variant: string,\n * closeButtonText: string,\n * submitButtonText: string,\n * closeButtonVariant: string\n * }}\n */\n\nconst getInfoModalSettings = (modalType, currentEmail, errorMessage, courseName, intl) => {\n switch (modalType) {\n case MODAL_TYPES.delete:\n return {\n title: intl.formatMessage(messages.deleteModalTitle),\n message: intl.formatMessage(messages.deleteModalMessage, { email: currentEmail, courseName }),\n variant: '',\n closeButtonText: intl.formatMessage(messages.deleteModalCancelButton),\n submitButtonText: intl.formatMessage(messages.deleteModalDeleteButton),\n closeButtonVariant: 'tertiary',\n };\n case MODAL_TYPES.error:\n return {\n title: intl.formatMessage(messages.errorModalTitle),\n message: errorMessage,\n variant: 'danger',\n closeButtonText: intl.formatMessage(messages.errorModalOkButton),\n closeButtonVariant: 'primary',\n };\n case MODAL_TYPES.warning:\n return {\n title: intl.formatMessage(messages.warningModalTitle),\n message: intl.formatMessage(messages.warningModalMessage, { email: currentEmail, courseName }),\n variant: 'warning',\n closeButtonText: intl.formatMessage(messages.warningModalReturnButton),\n mainButtonVariant: 'primary',\n };\n default:\n return '';\n }\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { getInfoModalSettings };\n","import { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nimport { USER_ROLES } from '../../constants';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getCourseTeamApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/course_team/${courseId}`;\nexport const updateCourseTeamUserApiUrl = (courseId, email) => `${getApiBaseUrl()}/course_team/${courseId}/${email}`;\n\n/**\n * Get course team.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getCourseTeam(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseTeamApiUrl(courseId));\n\n return camelCaseObject(data);\n}\n\n/**\n * Create course team user.\n * @param {string} courseId\n * @param {string} email\n * @returns {Promise}\n */\nexport async function createTeamUser(courseId, email) {\n await getAuthenticatedHttpClient()\n .post(updateCourseTeamUserApiUrl(courseId, email), { role: USER_ROLES.staff });\n}\n\n/**\n * Change role course team user.\n * @param {string} courseId\n * @param {string} email\n * @param {string} role\n * @returns {Promise}\n */\nexport async function changeRoleTeamUser(courseId, email, role) {\n await getAuthenticatedHttpClient()\n .put(updateCourseTeamUserApiUrl(courseId, email), { role });\n}\n\n/**\n * Delete course team user.\n * @param {string} courseId\n * @param {string} email\n * @returns {Promise}\n */\nexport async function deleteTeamUser(courseId, email) {\n await getAuthenticatedHttpClient()\n .delete(updateCourseTeamUserApiUrl(courseId, email));\n}\n","export const getCourseTeamUsers = (state) => state.courseTeam.users;\nexport const getCourseTeamLoadingStatus = (state) => state.courseTeam.loadingCourseTeamStatus;\nexport const getErrorMessage = (state) => state.courseTeam.errorMessage;\nexport const getIsAllowActions = (state) => state.courseTeam.allowActions;\nexport const getIsOwnershipHint = (state) => state.courseTeam.showTransferOwnershipHint;\nexport const getSavingStatus = (state) => state.courseTeam.savingStatus;\n","import { useDispatch, useSelector } from 'react-redux';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { useEffect, useState } from 'react';\nimport { useToggle } from '@openedx/paragon';\n\nimport { USER_ROLES } from '../constants';\nimport { RequestStatus } from '../data/constants';\nimport { useModel } from '../generic/model-store';\nimport {\n changeRoleTeamUserQuery,\n createCourseTeamQuery,\n deleteCourseTeamQuery,\n fetchCourseTeamQuery,\n} from './data/thunk';\nimport {\n getCourseTeamLoadingStatus,\n getCourseTeamUsers,\n getErrorMessage,\n getIsAllowActions,\n getIsOwnershipHint, getSavingStatus,\n} from './data/selectors';\nimport { setErrorMessage } from './data/slice';\nimport { MODAL_TYPES } from './constants';\n\nconst useCourseTeam = ({ courseId }) => {\n const dispatch = useDispatch();\n\n const { email: currentUserEmail } = getAuthenticatedUser();\n const courseDetails = useModel('courseDetails', courseId);\n\n const [modalType, setModalType] = useState(MODAL_TYPES.delete);\n const [isInfoModalOpen, openInfoModal, closeInfoModal] = useToggle(false);\n const [isFormVisible, openForm, hideForm] = useToggle(false);\n const [currentEmail, setCurrentEmail] = useState('');\n const [isQueryPending, setIsQueryPending] = useState(false);\n const courseTeamUsers = useSelector(getCourseTeamUsers);\n const errorMessage = useSelector(getErrorMessage);\n const savingStatus = useSelector(getSavingStatus);\n const isAllowActions = useSelector(getIsAllowActions);\n const isOwnershipHint = useSelector(getIsOwnershipHint);\n const loadingCourseTeamStatus = useSelector(getCourseTeamLoadingStatus);\n\n const isSingleAdmin = courseTeamUsers.filter((user) => user.role === USER_ROLES.admin).length === 1;\n\n const handleOpenInfoModal = (type, email) => {\n setCurrentEmail(email);\n setModalType(type);\n openInfoModal();\n };\n\n const handleCloseInfoModal = () => {\n dispatch(setErrorMessage(''));\n closeInfoModal();\n };\n\n const handleAddUserSubmit = (data) => {\n setIsQueryPending(true);\n\n const { email } = data;\n const isUserContains = courseTeamUsers.some((user) => user.email === email);\n\n if (isUserContains) {\n handleOpenInfoModal(MODAL_TYPES.warning, email);\n return;\n }\n\n dispatch(createCourseTeamQuery(courseId, email)).then((result) => {\n if (result) {\n hideForm();\n dispatch(setErrorMessage(''));\n return;\n }\n\n handleOpenInfoModal(MODAL_TYPES.error, email);\n });\n };\n\n const handleDeleteUserSubmit = () => {\n setIsQueryPending(true);\n dispatch(deleteCourseTeamQuery(courseId, currentEmail));\n handleCloseInfoModal();\n };\n\n const handleChangeRoleUserSubmit = (email, role) => {\n setIsQueryPending(true);\n dispatch(changeRoleTeamUserQuery(courseId, email, role));\n };\n\n const handleInternetConnectionFailed = () => {\n setIsQueryPending(false);\n };\n\n const handleOpenDeleteModal = (email) => {\n handleOpenInfoModal(MODAL_TYPES.delete, email);\n };\n\n useEffect(() => {\n dispatch(fetchCourseTeamQuery(courseId));\n }, [courseId]);\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n setIsQueryPending(false);\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }, [savingStatus]);\n\n return {\n modalType,\n errorMessage,\n courseName: courseDetails?.name || '',\n currentEmail,\n courseTeamUsers,\n currentUserEmail,\n isLoading: loadingCourseTeamStatus === RequestStatus.IN_PROGRESS,\n isSingleAdmin,\n isFormVisible,\n isAllowActions,\n isInfoModalOpen,\n isOwnershipHint,\n isQueryPending,\n isInternetConnectionAlertFailed: savingStatus === RequestStatus.FAILED,\n isShowAddTeamMember: courseTeamUsers.length === 1 && isAllowActions,\n isShowInitialSidebar: !courseTeamUsers.length && !isFormVisible,\n isShowUserFilledSidebar: Boolean(courseTeamUsers.length) || isFormVisible,\n openForm,\n hideForm,\n closeInfoModal,\n handleAddUserSubmit,\n handleOpenInfoModal,\n handleOpenDeleteModal,\n handleDeleteUserSubmit,\n handleChangeRoleUserSubmit,\n handleInternetConnectionFailed,\n };\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { useCourseTeam };\n","import { RequestStatus } from '../../data/constants';\nimport {\n getCourseTeam,\n deleteTeamUser,\n createTeamUser,\n changeRoleTeamUser,\n} from './api';\nimport {\n fetchCourseTeamSuccess,\n updateLoadingCourseTeamStatus,\n deleteCourseTeamUser,\n updateSavingStatus,\n setErrorMessage,\n} from './slice';\n\nexport function fetchCourseTeamQuery(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingCourseTeamStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const courseTeam = await getCourseTeam(courseId);\n dispatch(fetchCourseTeamSuccess(courseTeam));\n\n dispatch(updateLoadingCourseTeamStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateLoadingCourseTeamStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport function createCourseTeamQuery(courseId, email) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n await createTeamUser(courseId, email);\n const courseTeam = await getCourseTeam(courseId);\n dispatch(fetchCourseTeamSuccess(courseTeam));\n\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n const message = error?.response?.data?.error || '';\n dispatch(setErrorMessage(message));\n\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport function changeRoleTeamUserQuery(courseId, email, role) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n await changeRoleTeamUser(courseId, email, role);\n const courseTeam = await getCourseTeam(courseId);\n dispatch(fetchCourseTeamSuccess(courseTeam));\n\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch ({ message }) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport function deleteCourseTeamQuery(courseId, email) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n await deleteTeamUser(courseId, email);\n dispatch(deleteCourseTeamUser(email));\n\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl, injectIntl } from '@edx/frontend-platform/i18n';\nimport {\n Button,\n Container,\n Layout,\n} from '@openedx/paragon';\nimport { Add as IconAdd } from '@openedx/paragon/icons';\n\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport { useModel } from '../generic/model-store';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport { USER_ROLES } from '../constants';\nimport messages from './messages';\nimport CourseTeamSideBar from './course-team-sidebar/CourseTeamSidebar';\nimport AddUserForm from './add-user-form/AddUserForm';\nimport AddTeamMember from './add-team-member/AddTeamMember';\nimport CourseTeamMember from './course-team-member/CourseTeamMember';\nimport InfoModal from './info-modal/InfoModal';\nimport { useCourseTeam } from './hooks';\nimport getPageHeadTitle from '../generic/utils';\n\nconst CourseTeam = ({ courseId }) => {\n const intl = useIntl();\n\n const courseDetails = useModel('courseDetails', courseId);\n document.title = getPageHeadTitle(courseDetails?.name, intl.formatMessage(messages.headingTitle));\n\n const {\n modalType,\n errorMessage,\n courseName,\n currentEmail,\n courseTeamUsers,\n currentUserEmail,\n isLoading,\n isSingleAdmin,\n isFormVisible,\n isQueryPending,\n isAllowActions,\n isInfoModalOpen,\n isOwnershipHint,\n isShowAddTeamMember,\n isShowInitialSidebar,\n isShowUserFilledSidebar,\n isInternetConnectionAlertFailed,\n openForm,\n hideForm,\n closeInfoModal,\n handleAddUserSubmit,\n handleOpenDeleteModal,\n handleDeleteUserSubmit,\n handleChangeRoleUserSubmit,\n handleInternetConnectionFailed,\n } = useCourseTeam({ intl, courseId });\n\n if (isLoading) {\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return <>;\n }\n\n return (\n <>\n \n
    \n \n \n
    \n
    \n \n {intl.formatMessage(messages.addNewMemberButton)}\n \n )}\n />\n
    \n
    \n {isFormVisible && (\n \n )}\n {courseTeamUsers.length ? courseTeamUsers.map(({ username, role, email }) => (\n \n )) : null}\n {isShowAddTeamMember && (\n \n )}\n
    \n {isShowInitialSidebar && (\n
    \n \n
    \n )}\n \n
    \n
    \n
    \n
    \n \n {isShowUserFilledSidebar && (\n \n )}\n \n \n
    \n
    \n
    \n \n
    \n \n );\n};\n\nCourseTeam.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(CourseTeam);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n handoutsTitle: {\n id: 'course-authoring.course-updates.handouts.title',\n defaultMessage: 'Course handouts',\n },\n editButton: {\n id: 'course-authoring.course-updates.actions.edit',\n defaultMessage: 'Edit',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Icon, IconButtonWithTooltip } from '@openedx/paragon';\nimport { EditOutline } from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport messages from './messages';\n\nconst CourseHandouts = ({ contentForHandouts, onEdit, isDisabledButtons }) => {\n const intl = useIntl();\n\n return (\n
    \n
    \n

    {intl.formatMessage(messages.handoutsTitle)}

    \n \n
    \n \n
    \n );\n};\n\nCourseHandouts.propTypes = {\n contentForHandouts: PropTypes.string.isRequired,\n onEdit: PropTypes.func.isRequired,\n isDisabledButtons: PropTypes.bool.isRequired,\n};\n\nexport default CourseHandouts;\n","import moment from 'moment';\n\nimport { COMMA_SEPARATED_DATE_FORMAT } from '../../constants';\n\n/**\n * Check is valid date format in course update\n * @param {string} date - date for update\n * @returns {boolean} - is valid date format\n */\nconst isDateForUpdateValid = (date) => {\n const parsedDate = moment(date, COMMA_SEPARATED_DATE_FORMAT, true);\n\n return parsedDate.isValid() && parsedDate.format(COMMA_SEPARATED_DATE_FORMAT) === date;\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { isDateForUpdateValid };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n editButton: {\n id: 'course-authoring.course-updates.button.edit',\n defaultMessage: 'Edit',\n },\n deleteButton: {\n id: 'course-authoring.course-updates.button.delete',\n defaultMessage: 'Delete',\n },\n errorMessage: {\n id: 'course-authoring.course-updates.date-invalid',\n defaultMessage: 'Action required: Enter a valid date.',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Icon, IconButtonWithTooltip } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { DeleteOutline, EditOutline, Error as ErrorIcon } from '@openedx/paragon/icons';\n\nimport { isDateForUpdateValid } from './utils';\nimport messages from './messages';\n\nconst CourseUpdate = ({\n dateForUpdate,\n contentForUpdate,\n onEdit,\n onDelete,\n isDisabledButtons,\n}) => {\n const intl = useIntl();\n\n return (\n
    \n
    \n {dateForUpdate}\n {!isDateForUpdateValid(dateForUpdate) && (\n
    \n \n

    {intl.formatMessage(messages.errorMessage)}

    \n
    \n )}\n
    \n \n \n
    \n
    \n {Boolean(contentForUpdate) && (\n \n )}\n
    \n );\n};\n\nCourseUpdate.propTypes = {\n dateForUpdate: PropTypes.string.isRequired,\n contentForUpdate: PropTypes.string.isRequired,\n onEdit: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n isDisabledButtons: PropTypes.bool.isRequired,\n};\n\nexport default CourseUpdate;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n deleteModalTitle: {\n id: 'course-authoring.course-updates.delete-modal.title',\n defaultMessage: 'Are you sure you want to delete this update?',\n },\n deleteModalDescription: {\n id: 'course-authoring.course-updates.delete-modal.description',\n defaultMessage: 'This action cannot be undone.',\n },\n cancelButton: {\n id: 'course-authoring.course-updates.actions.cancel',\n defaultMessage: 'Cancel',\n },\n deleteButton: {\n id: 'course-authoring.course-updates.button.delete',\n defaultMessage: 'Delete',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n ActionRow,\n Button,\n AlertModal,\n} from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport messages from './messages';\n\nconst DeleteModal = ({ isOpen, close, onDeleteSubmit }) => {\n const intl = useIntl();\n\n return (\n \n \n {\n e.preventDefault();\n onDeleteSubmit();\n }}\n >\n {intl.formatMessage(messages.deleteButton)}\n \n \n )}\n >\n

    {intl.formatMessage(messages.deleteModalDescription)}

    \n \n );\n};\n\nDeleteModal.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n close: PropTypes.func.isRequired,\n onDeleteSubmit: PropTypes.func.isRequired,\n};\n\nexport default DeleteModal;\n","// eslint-disable-next-line import/prefer-default-export\nexport const REQUEST_TYPES = {\n add_new_update: 'add_new_update',\n edit_update: 'edit_update',\n edit_handouts: 'edit_handouts',\n delete_update: 'delete_update',\n};\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n updateFormDate: {\n id: 'course-authoring.course-updates.update-form.date',\n defaultMessage: 'Date',\n },\n updateFormInValid: {\n id: 'course-authoring.course-updates.update-form.inValid',\n defaultMessage: 'Action required: Enter a valid date.',\n },\n updateFormCalendarAltText: {\n id: 'course-authoring.course-updates.update-form.calendar-alt-text',\n defaultMessage: 'Calendar for datepicker input',\n },\n updateFormErrorAltText: {\n id: 'course-authoring.course-updates.update-form.error-alt-text',\n defaultMessage: 'Error icon',\n },\n addNewUpdateTitle: {\n id: 'course-authoring.course-updates.update-form.new-update-title',\n defaultMessage: 'Add new update',\n },\n editUpdateTitle: {\n id: 'course-authoring.course-updates.update-form.edit-update-title',\n defaultMessage: 'Edit update',\n },\n editHandoutsTitle: {\n id: 'course-authoring.course-updates.update-form.edit-handouts-title',\n defaultMessage: 'Edit handouts',\n },\n saveButton: {\n id: 'course-authoring.course-updates.actions.save',\n defaultMessage: 'Save',\n },\n postButton: {\n id: 'course-authoring.course-updates.actions.post',\n defaultMessage: 'Post',\n },\n cancelButton: {\n id: 'course-authoring.course-updates.actions.cancel',\n defaultMessage: 'Cancel',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n ActionRow,\n Button,\n Form,\n Icon,\n} from '@openedx/paragon';\nimport classNames from 'classnames';\nimport DatePicker from 'react-datepicker/dist';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Calendar as CalendarIcon, Error as ErrorIcon } from '@openedx/paragon/icons';\nimport { Formik } from 'formik';\n\nimport {\n convertToStringFromDate,\n convertToDateFromString,\n isValidDate,\n} from '../../utils';\nimport { DATE_FORMAT, DEFAULT_EMPTY_WYSIWYG_VALUE } from '../../constants';\nimport { WysiwygEditor } from '../../generic/WysiwygEditor';\nimport { REQUEST_TYPES } from '../constants';\nimport { geUpdateFormSettings } from './utils';\nimport messages from './messages';\n\nconst UpdateForm = ({\n close,\n requestType,\n onSubmit,\n courseUpdatesInitialValues,\n isInnerForm,\n isFirstUpdate,\n}) => {\n const intl = useIntl();\n\n const {\n currentContent,\n formTitle,\n validationSchema,\n contentFieldName,\n submitButtonText,\n } = geUpdateFormSettings(requestType, courseUpdatesInitialValues, intl);\n\n return (\n
    \n \n {({\n values, handleSubmit, isValid, setFieldValue,\n }) => (\n <>\n

    {formTitle}

    \n {(requestType !== REQUEST_TYPES.edit_handouts) && (\n \n \n {intl.formatMessage(messages.updateFormDate)}\n \n
    \n \n {\n if (!isValidDate(value)) {\n return;\n }\n setFieldValue('date', convertToStringFromDate(value));\n }}\n />\n
    \n {!isValid && (\n
    \n \n {intl.formatMessage(messages.updateFormInValid)}\n
    \n )}\n
    \n )}\n \n {\n setFieldValue(contentFieldName, value || DEFAULT_EMPTY_WYSIWYG_VALUE);\n }}\n />\n \n \n \n \n \n \n )}\n \n
    \n );\n};\n\nUpdateForm.defaultProps = {\n isInnerForm: false,\n isFirstUpdate: false,\n};\n\nUpdateForm.propTypes = {\n // eslint-disable-next-line react/forbid-prop-types\n courseUpdatesInitialValues: PropTypes.object.isRequired,\n close: PropTypes.func.isRequired,\n requestType: PropTypes.string.isRequired,\n onSubmit: PropTypes.func.isRequired,\n isInnerForm: PropTypes.bool,\n isFirstUpdate: PropTypes.bool,\n};\n\nexport default UpdateForm;\n","import * as Yup from 'yup';\n\nimport { REQUEST_TYPES } from '../constants';\nimport messages from './messages';\n\n/**\n * Get Update form settings depending on requestType\n * @param {typeof REQUEST_TYPES} requestType - one of REQUEST_TYPES\n * @param {object} courseUpdatesInitialValues - form initial values depending on requestType\n * @returns {{\n * currentContent: string,\n * validationSchema: object,\n * formTitle: string,\n * submitButtonText: string,\n * contentFieldName: string\n * }}\n */\nconst geUpdateFormSettings = (requestType, courseUpdatesInitialValues, intl) => {\n const updatesValidationSchema = Yup.object().shape({\n id: Yup.number().required(),\n date: Yup.date().required(),\n content: Yup.string(),\n });\n\n switch (requestType) {\n case REQUEST_TYPES.edit_handouts:\n return {\n currentContent: courseUpdatesInitialValues.data,\n formTitle: intl.formatMessage(messages.editHandoutsTitle),\n validationSchema: Yup.object().shape(),\n contentFieldName: 'data',\n submitButtonText: intl.formatMessage(messages.saveButton),\n };\n case REQUEST_TYPES.add_new_update:\n return {\n currentContent: courseUpdatesInitialValues.content,\n formTitle: intl.formatMessage(messages.addNewUpdateTitle),\n validationSchema: updatesValidationSchema,\n contentFieldName: 'content',\n submitButtonText: intl.formatMessage(messages.postButton),\n };\n case REQUEST_TYPES.edit_update:\n return {\n currentContent: courseUpdatesInitialValues.content,\n formTitle: intl.formatMessage(messages.editUpdateTitle),\n validationSchema: updatesValidationSchema,\n contentFieldName: 'content',\n submitButtonText: intl.formatMessage(messages.postButton),\n };\n default:\n return '';\n }\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { geUpdateFormSettings };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.course-updates.header.title',\n defaultMessage: 'Course updates',\n },\n headingSubtitle: {\n id: 'course-authoring.course-updates.header.subtitle',\n defaultMessage: 'Content',\n },\n sectionInfo: {\n id: 'course-authoring.course-updates.section-info',\n defaultMessage: 'Use course updates to notify students of important dates or exams, highlight particular discussions in the forums, announce schedule changes, and respond to student questions.',\n },\n newUpdateButton: {\n id: 'course-authoring.course-updates.actions.new-update',\n defaultMessage: 'New update',\n },\n});\n\nexport default messages;\n","export const getCourseUpdates = (state) => state.courseUpdates.courseUpdates;\nexport const getCourseHandouts = (state) => state.courseUpdates.courseHandouts;\nexport const getSavingStatuses = (state) => state.courseUpdates.savingStatuses;\nexport const getLoadingStatuses = (state) => state.courseUpdates.loadingStatuses;\n","import { getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getCourseUpdatesApiUrl = (courseId) => `${getApiBaseUrl()}/course_info_update/${courseId}/`;\nexport const updateCourseUpdatesApiUrl = (courseId, updateId) => `${getApiBaseUrl()}/course_info_update/${courseId}/${updateId}`;\nexport const getCourseHandoutApiUrl = (courseId) => {\n const formattedCourseId = courseId.split('course-v1:')[1];\n return `${getApiBaseUrl()}/xblock/block-v1:${formattedCourseId}+type@course_info+block@handouts`;\n};\n\n/**\n * Get course updates.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getCourseUpdates(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseUpdatesApiUrl(courseId));\n\n return data;\n}\n\n/**\n * Create new course update.\n * @param {string} courseId\n * @param {object} courseUpdate\n * @returns {Promise}\n */\nexport async function createUpdate(courseId, courseUpdate) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getCourseUpdatesApiUrl(courseId), courseUpdate);\n\n return data;\n}\n\n/**\n * Edit course update.\n * @param {string} courseId\n * @param {object} courseUpdate\n * @returns {Promise}\n */\nexport async function editUpdate(courseId, courseUpdate) {\n const { data } = await getAuthenticatedHttpClient()\n .put(updateCourseUpdatesApiUrl(courseId, courseUpdate.id), courseUpdate);\n\n return data;\n}\n\n/**\n * Delete course update.\n * @param {string} courseId\n * @param {number} updateId\n1 */\nexport async function deleteUpdate(courseId, updateId) {\n const { data } = await getAuthenticatedHttpClient()\n .delete(updateCourseUpdatesApiUrl(courseId, updateId));\n\n return data;\n}\n\n/**\n * Get course handouts.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getCourseHandouts(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseHandoutApiUrl(courseId));\n return data;\n}\n\n/**\n * Edit course handouts.\n * @param {string} courseId\n * @param {object} courseHandouts\n * @returns {Promise}\n */\nexport async function editHandouts(courseId, courseHandouts) {\n const { data } = await getAuthenticatedHttpClient()\n .put(getCourseHandoutApiUrl(courseId), courseHandouts);\n\n return data;\n}\n","import { useDispatch, useSelector } from 'react-redux';\nimport moment from 'moment/moment';\nimport { useEffect, useState } from 'react';\nimport { useToggle } from '@openedx/paragon';\n\nimport { COMMA_SEPARATED_DATE_FORMAT } from '../constants';\nimport { convertToDateFromString } from '../utils';\nimport { getCourseHandouts, getCourseUpdates } from './data/selectors';\nimport { REQUEST_TYPES } from './constants';\nimport {\n createCourseUpdateQuery,\n deleteCourseUpdateQuery,\n editCourseHandoutsQuery,\n editCourseUpdateQuery,\n fetchCourseHandoutsQuery,\n fetchCourseUpdatesQuery,\n} from './data/thunk';\n\nconst useCourseUpdates = ({ courseId }) => {\n const dispatch = useDispatch();\n const initialUpdate = { id: 0, date: moment().utc().toDate(), content: '' };\n\n const [requestType, setRequestType] = useState('');\n const [isUpdateFormOpen, openUpdateForm, closeUpdateForm] = useToggle(false);\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useToggle(false);\n const [currentUpdate, setCurrentUpdate] = useState(initialUpdate);\n\n const courseUpdates = useSelector(getCourseUpdates);\n const courseHandouts = useSelector(getCourseHandouts);\n\n const courseUpdatesInitialValues = requestType === REQUEST_TYPES.edit_handouts\n ? courseHandouts\n : currentUpdate;\n\n const handleOpenUpdateForm = (type, courseUpdate) => {\n setRequestType(type);\n\n switch (type) {\n case REQUEST_TYPES.add_new_update:\n setCurrentUpdate(initialUpdate);\n break;\n case REQUEST_TYPES.edit_update:\n setCurrentUpdate(courseUpdate);\n break;\n default:\n window.scrollTo(0, 0);\n }\n\n openUpdateForm();\n };\n\n const handleOpenDeleteForm = (courseUpdate) => {\n setRequestType(REQUEST_TYPES.delete_update);\n setCurrentUpdate(courseUpdate);\n openDeleteModal();\n };\n\n const handleUpdatesSubmit = (data) => {\n const dateWithoutTimezone = convertToDateFromString(data.date);\n const dataToSend = {\n ...data,\n date: moment(dateWithoutTimezone).format(COMMA_SEPARATED_DATE_FORMAT),\n };\n const { id, date, content } = dataToSend;\n\n const handleQuerySubmit = (handler) => {\n closeUpdateForm();\n setCurrentUpdate(initialUpdate);\n return handler();\n };\n\n switch (requestType) {\n case REQUEST_TYPES.add_new_update:\n return handleQuerySubmit(dispatch(createCourseUpdateQuery(courseId, { date, content })));\n case REQUEST_TYPES.edit_update:\n return handleQuerySubmit(dispatch(editCourseUpdateQuery(courseId, { id, date, content })));\n case REQUEST_TYPES.edit_handouts:\n return handleQuerySubmit(dispatch(editCourseHandoutsQuery(courseId, { ...data, data: data?.data || '' })));\n default:\n return true;\n }\n };\n\n const handleDeleteUpdateSubmit = () => {\n const { id } = currentUpdate;\n\n dispatch(deleteCourseUpdateQuery(courseId, id));\n setCurrentUpdate(initialUpdate);\n closeDeleteModal();\n };\n\n useEffect(() => {\n dispatch(fetchCourseUpdatesQuery(courseId));\n dispatch(fetchCourseHandoutsQuery(courseId));\n }, [courseId]);\n\n return {\n requestType,\n courseUpdates,\n courseHandouts,\n courseUpdatesInitialValues,\n isMainFormOpen: isUpdateFormOpen && requestType !== REQUEST_TYPES.edit_update,\n isInnerFormOpen: (id) => isUpdateFormOpen && currentUpdate.id === id && requestType === REQUEST_TYPES.edit_update,\n isUpdateFormOpen,\n isDeleteModalOpen,\n closeUpdateForm,\n closeDeleteModal,\n handleUpdatesSubmit,\n handleOpenUpdateForm,\n handleDeleteUpdateSubmit,\n handleOpenDeleteForm,\n };\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { useCourseUpdates };\n","// eslint-disable-next-line import/prefer-default-export\nexport const matchesAnyStatus = (statuses, status) => Object.values(statuses).some(s => s === status);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Button,\n Container,\n Layout,\n} from '@openedx/paragon';\nimport { Add as AddIcon } from '@openedx/paragon/icons';\nimport { useSelector } from 'react-redux';\n\nimport { useModel } from '../generic/model-store';\nimport { getProcessingNotification } from '../generic/processing-notification/data/selectors';\nimport ProcessingNotification from '../generic/processing-notification';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport { RequestStatus } from '../data/constants';\nimport CourseHandouts from './course-handouts/CourseHandouts';\nimport CourseUpdate from './course-update/CourseUpdate';\nimport DeleteModal from './delete-modal/DeleteModal';\nimport UpdateForm from './update-form/UpdateForm';\nimport { REQUEST_TYPES } from './constants';\nimport messages from './messages';\nimport { useCourseUpdates } from './hooks';\nimport { getLoadingStatuses, getSavingStatuses } from './data/selectors';\nimport { matchesAnyStatus } from './utils';\nimport getPageHeadTitle from '../generic/utils';\n\nconst CourseUpdates = ({ courseId }) => {\n const intl = useIntl();\n\n const courseDetails = useModel('courseDetails', courseId);\n document.title = getPageHeadTitle(courseDetails?.name, intl.formatMessage(messages.headingTitle));\n\n const {\n requestType,\n courseUpdates,\n courseHandouts,\n courseUpdatesInitialValues,\n isMainFormOpen,\n isInnerFormOpen,\n isUpdateFormOpen,\n isDeleteModalOpen,\n closeUpdateForm,\n closeDeleteModal,\n handleUpdatesSubmit,\n handleOpenUpdateForm,\n handleOpenDeleteForm,\n handleDeleteUpdateSubmit,\n } = useCourseUpdates({ courseId });\n\n const {\n isShow: isShowProcessingNotification,\n title: processingNotificationTitle,\n } = useSelector(getProcessingNotification);\n\n const loadingStatuses = useSelector(getLoadingStatuses);\n const savingStatuses = useSelector(getSavingStatuses);\n\n const anyStatusFailed = matchesAnyStatus({ ...loadingStatuses, ...savingStatuses }, RequestStatus.FAILED);\n const anyStatusInProgress = matchesAnyStatus({ ...loadingStatuses, ...savingStatuses }, RequestStatus.IN_PROGRESS);\n const anyStatusPending = matchesAnyStatus({ ...loadingStatuses, ...savingStatuses }, RequestStatus.PENDING);\n\n return (\n <>\n \n
    \n \n \n
    \n
    \n handleOpenUpdateForm(REQUEST_TYPES.add_new_update)}\n disabled={isUpdateFormOpen}\n >\n {intl.formatMessage(messages.newUpdateButton)}\n \n )}\n />\n
    \n {isMainFormOpen && (\n \n )}\n
    \n
    \n {courseUpdates.length ? courseUpdates.map((courseUpdate, index) => (\n isInnerFormOpen(courseUpdate.id) ? (\n \n ) : (\n handleOpenUpdateForm(REQUEST_TYPES.edit_update, courseUpdate)}\n onDelete={() => handleOpenDeleteForm(courseUpdate)}\n isDisabledButtons={isUpdateFormOpen}\n />\n ))) : null}\n
    \n
    \n handleOpenUpdateForm(REQUEST_TYPES.edit_handouts)}\n isDisabledButtons={isUpdateFormOpen}\n />\n
    \n \n {isShowProcessingNotification && (\n \n )}\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n null}\n />\n
    \n \n );\n};\n\nCourseUpdates.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default CourseUpdates;\n","import { NOTIFICATION_MESSAGES } from '../../constants';\nimport { RequestStatus } from '../../data/constants';\nimport { hideProcessingNotification, showProcessingNotification } from '../../generic/processing-notification/data/slice';\nimport {\n getCourseUpdates,\n getCourseHandouts,\n createUpdate,\n editUpdate,\n deleteUpdate,\n editHandouts,\n} from './api';\nimport {\n fetchCourseUpdatesSuccess,\n createCourseUpdate,\n editCourseUpdate,\n deleteCourseUpdate,\n fetchCourseHandoutsSuccess,\n editCourseHandouts,\n updateLoadingStatuses,\n updateSavingStatuses,\n} from './slice';\n\nexport function fetchCourseUpdatesQuery(courseId) {\n return async (dispatch) => {\n try {\n dispatch(updateLoadingStatuses({ fetchCourseHandoutsQuery: RequestStatus.IN_PROGRESS }));\n const courseUpdates = await getCourseUpdates(courseId);\n dispatch(fetchCourseUpdatesSuccess(courseUpdates));\n dispatch(updateLoadingStatuses({ fetchCourseHandoutsQuery: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatuses({ fetchCourseHandoutsQuery: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function createCourseUpdateQuery(courseId, data) {\n return async (dispatch) => {\n try {\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n const courseUpdate = await createUpdate(courseId, data);\n dispatch(createCourseUpdate(courseUpdate));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function editCourseUpdateQuery(courseId, data) {\n return async (dispatch) => {\n try {\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n const courseUpdate = await editUpdate(courseId, data);\n dispatch(editCourseUpdate(courseUpdate));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function deleteCourseUpdateQuery(courseId, updateId) {\n return async (dispatch) => {\n try {\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.deleting));\n const courseUpdates = await deleteUpdate(courseId, updateId);\n dispatch(deleteCourseUpdate(courseUpdates));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function fetchCourseHandoutsQuery(courseId) {\n return async (dispatch) => {\n try {\n dispatch(updateLoadingStatuses({ fetchCourseHandoutsQuery: RequestStatus.IN_PROGRESS }));\n const courseHandouts = await getCourseHandouts(courseId);\n dispatch(fetchCourseHandoutsSuccess(courseHandouts));\n dispatch(updateLoadingStatuses({ fetchCourseHandoutsQuery: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatuses({ fetchCourseHandoutsQuery: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function editCourseHandoutsQuery(courseId, data) {\n return async (dispatch) => {\n try {\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n const courseHandouts = await editHandouts(courseId, data);\n dispatch(editCourseHandouts(courseHandouts));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatuses({ createCourseUpdateQuery: RequestStatus.FAILED }));\n }\n };\n}\n","import { createSelector } from '@reduxjs/toolkit';\nimport { RequestStatus } from 'CourseAuthoring/data/constants';\n\nexport const getCourseUnitData = (state) => state.courseUnit.unit;\nexport const getCanEdit = (state) => state.courseUnit.canEdit;\nexport const getStaticFileNotices = (state) => state.courseUnit.staticFileNotices;\nexport const getCourseUnit = (state) => state.courseUnit;\nexport const getSavingStatus = (state) => state.courseUnit.savingStatus;\nexport const getErrorMessage = (state) => state.courseUnit.errorMessage;\nexport const getSequenceStatus = (state) => state.courseUnit.sequenceStatus;\nexport const getSequenceIds = (state) => state.courseUnit.courseSectionVertical.courseSequenceIds;\nexport const getCourseSectionVertical = (state) => state.courseUnit.courseSectionVertical;\nexport const getCourseId = (state) => state.courseDetail.courseId;\nexport const getSequenceId = (state) => state.courseUnit.sequenceId;\nexport const getCourseVerticalChildren = (state) => state.courseUnit.courseVerticalChildren;\nconst getLoadingStatuses = (state) => state.courseUnit.loadingStatus;\nexport const getIsLoading = createSelector(\n [getLoadingStatuses],\n loadingStatus => Object.values(loadingStatus)\n .some((status) => status === RequestStatus.IN_PROGRESS),\n);\n","import PropTypes from 'prop-types';\nimport { Icon } from '@openedx/paragon';\nimport { EditNote as EditNoteIcon } from '@openedx/paragon/icons';\n\nimport { COMPONENT_TYPES, COMPONENT_TYPE_ICON_MAP } from '../../constants';\n\nconst AddComponentIcon = ({ type }) => {\n const icon = COMPONENT_TYPE_ICON_MAP[type] || EditNoteIcon;\n\n return ;\n};\n\nAddComponentIcon.propTypes = {\n type: PropTypes.oneOf(Object.values(COMPONENT_TYPES)).isRequired,\n};\n\nexport default AddComponentIcon;\n","import PropTypes from 'prop-types';\nimport { Button } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport messages from '../messages';\nimport AddComponentIcon from './AddComponentIcon';\n\nconst AddComponentButton = ({ type, displayName, onClick }) => {\n const intl = useIntl();\n\n return (\n \n \n {intl.formatMessage(messages.buttonText)}\n {displayName}\n \n );\n};\n\nAddComponentButton.propTypes = {\n type: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n onClick: PropTypes.func.isRequired,\n};\n\nexport default AddComponentButton;\n","import PropTypes from 'prop-types';\nimport { ActionRow, Button, StandardModal } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport messages from '../messages';\n\nconst ModalContainer = ({\n title, isOpen, close, children, btnText, size, onSubmit, hasValue, resetDisabled,\n}) => {\n const intl = useIntl();\n\n const handleSubmit = () => {\n onSubmit();\n close();\n };\n\n const handleClose = () => {\n resetDisabled();\n close();\n };\n\n return (\n \n \n \n \n \n )}\n >\n {children}\n \n );\n};\n\nModalContainer.propTypes = {\n title: PropTypes.string.isRequired,\n isOpen: PropTypes.bool.isRequired,\n close: PropTypes.func.isRequired,\n children: PropTypes.node.isRequired,\n btnText: PropTypes.string.isRequired,\n size: PropTypes.string,\n onSubmit: PropTypes.func.isRequired,\n hasValue: PropTypes.bool.isRequired,\n resetDisabled: PropTypes.func.isRequired,\n};\n\nModalContainer.defaultProps = {\n size: 'md',\n};\n\nexport default ModalContainer;\n","import { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { Form, OverlayTrigger, Tooltip } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { updateQueryPendingStatus } from '../../data/slice';\nimport { getXBlockSupportMessages } from '../../constants';\nimport AddComponentButton from '../add-component-btn';\nimport messages from '../messages';\nimport ModalContainer from './ModalContainer';\n\nconst ComponentModalView = ({\n component,\n modalParams,\n handleCreateNewXBlock,\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const [moduleTitle, setModuleTitle] = useState('');\n const { open, close, isOpen } = modalParams;\n const {\n type, displayName, templates, supportLegend,\n } = component;\n const supportLabels = getXBlockSupportMessages(intl);\n\n const handleSubmit = () => {\n handleCreateNewXBlock(type, moduleTitle);\n dispatch(updateQueryPendingStatus(true));\n setModuleTitle('');\n };\n\n return (\n <>\n
  • \n \n
  • \n setModuleTitle('')}\n hasValue={!moduleTitle.length}\n >\n \n setModuleTitle(e.target.value)}\n >\n {templates.map((componentTemplate) => {\n const value = componentTemplate.boilerplateName || componentTemplate.category;\n const isDisplaySupportLabel = supportLegend.showLegend && supportLabels[componentTemplate.supportLevel];\n\n return (\n
    \n \n {componentTemplate.displayName}\n \n {isDisplaySupportLabel && (\n \n {supportLabels[componentTemplate.supportLevel].tooltip}\n \n )}\n >\n \n {supportLabels[componentTemplate.supportLevel].label}\n \n \n )}\n
    \n );\n })}\n \n
    \n \n \n );\n};\n\nComponentModalView.propTypes = {\n modalParams: PropTypes.shape({\n open: PropTypes.func,\n close: PropTypes.func,\n isOpen: PropTypes.bool,\n }).isRequired,\n handleCreateNewXBlock: PropTypes.func.isRequired,\n component: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n category: PropTypes.string,\n type: PropTypes.string.isRequired,\n templates: PropTypes.arrayOf(\n PropTypes.shape({\n boilerplateName: PropTypes.string,\n category: PropTypes.string,\n displayName: PropTypes.string.isRequired,\n supportLevel: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n }),\n ),\n supportLegend: PropTypes.shape({\n allowUnsupportedXblocks: PropTypes.bool,\n documentationLabel: PropTypes.string,\n showLegend: PropTypes.bool,\n }),\n }).isRequired,\n};\n\nexport default ComponentModalView;\n","import PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useToggle } from '@openedx/paragon';\n\nimport { getCourseSectionVertical } from '../data/selectors';\nimport { COMPONENT_TYPES } from '../constants';\nimport ComponentModalView from './add-component-modals/ComponentModalView';\nimport AddComponentButton from './add-component-btn';\nimport messages from './messages';\n\nconst AddComponent = ({ blockId, handleCreateNewCourseXBlock }) => {\n const navigate = useNavigate();\n const intl = useIntl();\n const [isOpenAdvanced, openAdvanced, closeAdvanced] = useToggle(false);\n const [isOpenHtml, openHtml, closeHtml] = useToggle(false);\n const [isOpenOpenAssessment, openOpenAssessment, closeOpenAssessment] = useToggle(false);\n const { componentTemplates } = useSelector(getCourseSectionVertical);\n\n const handleCreateNewXBlock = (type, moduleName) => {\n switch (type) {\n case COMPONENT_TYPES.discussion:\n case COMPONENT_TYPES.dragAndDrop:\n handleCreateNewCourseXBlock({ type, parentLocator: blockId });\n break;\n case COMPONENT_TYPES.problem:\n case COMPONENT_TYPES.video:\n handleCreateNewCourseXBlock({ type, parentLocator: blockId }, ({ courseKey, locator }) => {\n navigate(`/course/${courseKey}/editor/${type}/${locator}`);\n });\n break;\n // TODO: The library functional will be a bit different of current legacy (CMS)\n // behaviour and this ticket is on hold (blocked by other development team).\n case COMPONENT_TYPES.library:\n handleCreateNewCourseXBlock({ type, category: 'library_content', parentLocator: blockId });\n break;\n case COMPONENT_TYPES.advanced:\n handleCreateNewCourseXBlock({\n type: moduleName, category: moduleName, parentLocator: blockId,\n });\n break;\n case COMPONENT_TYPES.openassessment:\n handleCreateNewCourseXBlock({\n boilerplate: moduleName, category: type, parentLocator: blockId,\n });\n break;\n case COMPONENT_TYPES.html:\n handleCreateNewCourseXBlock({\n type,\n boilerplate: moduleName,\n parentLocator: blockId,\n }, ({ courseKey, locator }) => {\n navigate(`/course/${courseKey}/editor/html/${locator}`);\n });\n break;\n default:\n }\n };\n\n if (!Object.keys(componentTemplates).length) {\n return null;\n }\n\n return (\n
    \n
    {intl.formatMessage(messages.title)}
    \n
      \n {componentTemplates.map((component) => {\n const { type, displayName } = component;\n let modalParams;\n\n if (!component.templates.length) {\n return null;\n }\n\n switch (type) {\n case COMPONENT_TYPES.advanced:\n modalParams = {\n open: openAdvanced,\n close: closeAdvanced,\n isOpen: isOpenAdvanced,\n };\n break;\n case COMPONENT_TYPES.html:\n modalParams = {\n open: openHtml,\n close: closeHtml,\n isOpen: isOpenHtml,\n };\n break;\n case COMPONENT_TYPES.openassessment:\n modalParams = {\n open: openOpenAssessment,\n close: closeOpenAssessment,\n isOpen: isOpenOpenAssessment,\n };\n break;\n default:\n return (\n
    • \n handleCreateNewXBlock(type)}\n displayName={displayName}\n type={type}\n />\n
    • \n );\n }\n\n return (\n \n );\n })}\n
    \n
    \n );\n};\n\nAddComponent.propTypes = {\n blockId: PropTypes.string.isRequired,\n handleCreateNewCourseXBlock: PropTypes.func.isRequired,\n};\n\nexport default AddComponent;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n blockAltButtonEdit: {\n id: 'course-authoring.course-unit.xblock.button.edit.alt',\n defaultMessage: 'Edit',\n description: 'The xblock edit button text',\n },\n blockActionsDropdownAlt: {\n id: 'course-authoring.course-unit.xblock.button.actions.alt',\n defaultMessage: 'Actions',\n description: 'The xblock three dots dropdown alt text',\n },\n blockLabelButtonCopy: {\n id: 'course-authoring.course-unit.xblock.button.copy.label',\n defaultMessage: 'Copy',\n description: 'The xblock copy button text',\n },\n blockLabelButtonDuplicate: {\n id: 'course-authoring.course-unit.xblock.button.duplicate.label',\n defaultMessage: 'Duplicate',\n description: 'The xblock duplicate button text',\n },\n blockLabelButtonMove: {\n id: 'course-authoring.course-unit.xblock.button.move.label',\n defaultMessage: 'Move',\n description: 'The xblock move button text',\n },\n blockLabelButtonCopyToClipboard: {\n id: 'course-authoring.course-unit.xblock.button.copyToClipboard.label',\n defaultMessage: 'Copy to clipboard',\n },\n blockLabelButtonManageAccess: {\n id: 'course-authoring.course-unit.xblock.button.manageAccess.label',\n defaultMessage: 'Manage access',\n description: 'The xblock manage access button text',\n },\n blockLabelButtonDelete: {\n id: 'course-authoring.course-unit.xblock.button.delete.label',\n defaultMessage: 'Delete',\n description: 'The xblock delete button text',\n },\n visibilityMessage: {\n id: 'course-authoring.course-unit.xblock.visibility.message',\n defaultMessage: 'Access restricted to: {selectedGroupsLabel}',\n description: 'Group visibility accessibility text for xblock',\n },\n validationSummary: {\n id: 'course-authoring.course-unit.xblock.validation.summary',\n defaultMessage: 'This component has validation issues.',\n description: 'The alert text of the visibility validation issues',\n },\n});\n\nexport default messages;\n","// eslint-disable-next-line import/prefer-default-export\nexport const MESSAGE_ERROR_TYPES = {\n error: 'error',\n warning: 'warning',\n};\n","import PropTypes from 'prop-types';\nimport { Alert } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Info as InfoIcon, WarningFilled as WarningIcon } from '@openedx/paragon/icons';\n\nimport messages from '../messages';\nimport { MESSAGE_ERROR_TYPES } from '../constants';\nimport { getMessagesBlockType } from './utils';\n\nconst XBlockMessages = ({ validationMessages }) => {\n const intl = useIntl();\n const type = getMessagesBlockType(validationMessages);\n const { warning } = MESSAGE_ERROR_TYPES;\n const alertVariant = type === warning ? 'warning' : 'danger';\n const alertIcon = type === warning ? WarningIcon : InfoIcon;\n\n if (!validationMessages.length) {\n return null;\n }\n\n return (\n \n \n {intl.formatMessage(messages.validationSummary)}\n \n
      \n {validationMessages.map(({ text }) => (\n
    • {text}
    • \n ))}\n
    \n \n );\n};\n\nXBlockMessages.defaultProps = {\n validationMessages: [],\n};\n\nXBlockMessages.propTypes = {\n validationMessages: PropTypes.arrayOf(PropTypes.shape({\n type: PropTypes.string,\n text: PropTypes.string,\n })),\n};\n\nexport default XBlockMessages;\n","import { MESSAGE_ERROR_TYPES } from '../constants';\n\n/**\n * Determines the block type based on the types of messages in the given array.\n * @param {Array} messages - An array of message objects.\n * @param {Object[]} messages.type - The type of each message (e.g., MESSAGE_ERROR_TYPES.error).\n * @returns {string} - The block type determined by the messages (e.g., 'warning' or 'error').\n */\n// eslint-disable-next-line import/prefer-default-export\nexport const getMessagesBlockType = (messages) => {\n let type = MESSAGE_ERROR_TYPES.warning;\n if (messages.some((message) => message.type === MESSAGE_ERROR_TYPES.error)) {\n type = MESSAGE_ERROR_TYPES.error;\n }\n return type;\n};\n","import { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n ActionRow, Card, Dropdown, Icon, IconButton, useToggle,\n} from '@openedx/paragon';\nimport { EditOutline as EditIcon, MoreVert as MoveVertIcon } from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\n\nimport { getCanEdit, getCourseId } from 'CourseAuthoring/course-unit/data/selectors';\nimport DeleteModal from '../../generic/delete-modal/DeleteModal';\nimport ConfigureModal from '../../generic/configure-modal/ConfigureModal';\nimport SortableItem from '../../generic/drag-helper/SortableItem';\nimport { scrollToElement } from '../../course-outline/utils';\nimport { COURSE_BLOCK_NAMES } from '../../constants';\nimport { copyToClipboard } from '../../generic/data/thunks';\nimport { COMPONENT_TYPES } from '../constants';\nimport XBlockMessages from './xblock-messages/XBlockMessages';\nimport messages from './messages';\n\nconst CourseXBlock = ({\n id, title, type, unitXBlockActions, shouldScroll, userPartitionInfo,\n handleConfigureSubmit, validationMessages, ...props\n}) => {\n const courseXBlockElementRef = useRef(null);\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useToggle(false);\n const [isConfigureModalOpen, openConfigureModal, closeConfigureModal] = useToggle(false);\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const canEdit = useSelector(getCanEdit);\n const courseId = useSelector(getCourseId);\n const intl = useIntl();\n\n const [searchParams] = useSearchParams();\n const locatorId = searchParams.get('show');\n const isScrolledToElement = locatorId === id;\n\n const visibilityMessage = userPartitionInfo.selectedGroupsLabel\n ? intl.formatMessage(messages.visibilityMessage, { selectedGroupsLabel: userPartitionInfo.selectedGroupsLabel })\n : null;\n\n const currentItemData = {\n category: COURSE_BLOCK_NAMES.component.id,\n displayName: title,\n userPartitionInfo,\n showCorrectness: 'always',\n };\n\n const onDeleteSubmit = () => {\n unitXBlockActions.handleDelete(id);\n closeDeleteModal();\n };\n\n const handleEdit = () => {\n switch (type) {\n case COMPONENT_TYPES.html:\n case COMPONENT_TYPES.problem:\n case COMPONENT_TYPES.video:\n navigate(`/course/${courseId}/editor/${type}/${id}`);\n break;\n default:\n }\n };\n\n const onConfigureSubmit = (...arg) => {\n handleConfigureSubmit(id, ...arg, closeConfigureModal);\n };\n\n useEffect(() => {\n // if this item has been newly added, scroll to it.\n if (courseXBlockElementRef.current && (shouldScroll || isScrolledToElement)) {\n scrollToElement(courseXBlockElementRef.current);\n }\n }, [isScrolledToElement]);\n\n return (\n \n \n \n \n \n \n \n unitXBlockActions.handleDuplicate(id)}>\n {intl.formatMessage(messages.blockLabelButtonDuplicate)}\n \n \n {intl.formatMessage(messages.blockLabelButtonMove)}\n \n {canEdit && (\n dispatch(copyToClipboard(id))}>\n {intl.formatMessage(messages.blockLabelButtonCopyToClipboard)}\n \n )}\n \n {intl.formatMessage(messages.blockLabelButtonManageAccess)}\n \n \n {intl.formatMessage(messages.blockLabelButtonDelete)}\n \n \n \n \n \n \n )}\n />\n \n \n
    \n \n \n
    \n );\n};\n\nCourseXBlock.defaultProps = {\n validationMessages: [],\n shouldScroll: false,\n};\n\nCourseXBlock.propTypes = {\n id: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired,\n shouldScroll: PropTypes.bool,\n validationMessages: PropTypes.arrayOf(PropTypes.shape({\n type: PropTypes.string,\n text: PropTypes.string,\n })),\n unitXBlockActions: PropTypes.shape({\n handleDelete: PropTypes.func,\n handleDuplicate: PropTypes.func,\n }).isRequired,\n userPartitionInfo: PropTypes.shape({\n selectablePartitions: PropTypes.arrayOf(PropTypes.shape({\n groups: PropTypes.arrayOf(PropTypes.shape({\n deleted: PropTypes.bool,\n id: PropTypes.number,\n name: PropTypes.string,\n selected: PropTypes.bool,\n })),\n id: PropTypes.number,\n name: PropTypes.string,\n scheme: PropTypes.string,\n })),\n selectedPartitionIndex: PropTypes.number,\n selectedGroupsLabel: PropTypes.string,\n }).isRequired,\n handleConfigureSubmit: PropTypes.func.isRequired,\n};\n\nexport default CourseXBlock;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n altButtonEdit: {\n id: 'course-authoring.course-unit.heading.button.edit.alt',\n defaultMessage: 'Edit',\n description: 'The unit edit button text',\n },\n ariaLabelButtonEdit: {\n id: 'course-authoring.course-unit.heading.button.edit.aria-label',\n defaultMessage: 'Edit field',\n description: 'The unit edit button aria label',\n },\n altButtonSettings: {\n id: 'course-authoring.course-unit.heading.button.settings.alt',\n defaultMessage: 'Settings',\n description: 'The unit settings button text',\n },\n definedVisibilityMessage: {\n id: 'course-authoring.course-unit.heading.visibility.defined.message',\n defaultMessage: 'Access to this unit is restricted to: {selectedGroupsLabel}',\n description: 'Group visibility accessibility text for Unit',\n },\n commonVisibilityMessage: {\n id: 'course-authoring.course-unit.heading.visibility.common.message',\n defaultMessage: 'Access to some content in this unit is restricted to specific groups of learners.',\n description: 'The label text of some content restriction in this unit',\n },\n});\n\nexport default messages;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Form, IconButton, useToggle } from '@openedx/paragon';\nimport {\n EditOutline as EditIcon,\n Settings as SettingsIcon,\n} from '@openedx/paragon/icons';\n\nimport ConfigureModal from '../../generic/configure-modal/ConfigureModal';\nimport { getCourseUnitData } from '../data/selectors';\nimport { updateQueryPendingStatus } from '../data/slice';\nimport messages from './messages';\n\nconst HeaderTitle = ({\n unitTitle,\n isTitleEditFormOpen,\n handleTitleEdit,\n handleTitleEditSubmit,\n handleConfigureSubmit,\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const [titleValue, setTitleValue] = useState(unitTitle);\n const currentItemData = useSelector(getCourseUnitData);\n const [isConfigureModalOpen, openConfigureModal, closeConfigureModal] = useToggle(false);\n const { selectedPartitionIndex, selectedGroupsLabel } = currentItemData.userPartitionInfo;\n\n const onConfigureSubmit = (...arg) => {\n handleConfigureSubmit(currentItemData.id, ...arg, closeConfigureModal);\n };\n\n const getVisibilityMessage = () => {\n let message;\n\n if (selectedPartitionIndex !== -1 && !Number.isNaN(selectedPartitionIndex) && selectedGroupsLabel) {\n message = intl.formatMessage(messages.definedVisibilityMessage, { selectedGroupsLabel });\n } else if (currentItemData.hasPartitionGroupComponents) {\n message = intl.formatMessage(messages.commonVisibilityMessage);\n }\n\n return message ? (

    {message}

    ) : null;\n };\n\n useEffect(() => {\n setTitleValue(unitTitle);\n dispatch(updateQueryPendingStatus(true));\n }, [unitTitle]);\n\n return (\n <>\n
    \n {isTitleEditFormOpen ? (\n \n e && e.focus()}\n value={titleValue}\n name=\"displayName\"\n onChange={(e) => setTitleValue(e.target.value)}\n aria-label={intl.formatMessage(messages.ariaLabelButtonEdit)}\n onBlur={() => handleTitleEditSubmit(titleValue)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleTitleEditSubmit(titleValue);\n }\n }}\n />\n \n ) : unitTitle}\n \n \n \n
    \n {getVisibilityMessage()}\n \n );\n};\n\nHeaderTitle.propTypes = {\n unitTitle: PropTypes.string.isRequired,\n isTitleEditFormOpen: PropTypes.bool.isRequired,\n handleTitleEdit: PropTypes.func.isRequired,\n handleTitleEditSubmit: PropTypes.func.isRequired,\n handleConfigureSubmit: PropTypes.func.isRequired,\n};\n\nexport default HeaderTitle;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n altIconChevron: {\n id: 'course-authoring.course-unit.heading.icon.chevron.alt',\n defaultMessage: 'Toggle dropdown menu',\n },\n loading: {\n id: 'course-authoring.course-unit.heading.breadcrumbs.loading',\n defaultMessage: 'Loading...',\n description: 'Message displayed while loading breadcrumbs content',\n },\n});\n\nexport default messages;\n","import { useSelector } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Dropdown, Icon } from '@openedx/paragon';\nimport {\n ArrowDropDown as ArrowDropDownIcon,\n ChevronRight as ChevronRightIcon,\n} from '@openedx/paragon/icons';\n\nimport { createCorrectInternalRoute } from '../../utils';\nimport { getCourseSectionVertical } from '../data/selectors';\nimport messages from './messages';\n\nconst Breadcrumbs = () => {\n const intl = useIntl();\n const { ancestorXblocks } = useSelector(getCourseSectionVertical);\n const [section, subsection] = ancestorXblocks ?? [];\n\n return (\n \n );\n};\n\nexport default Breadcrumbs;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n viewLiveButton: {\n id: 'course-authoring.course-unit.button.view-live',\n defaultMessage: 'View live version',\n },\n previewButton: {\n id: 'course-authoring.course-unit.button.preview',\n defaultMessage: 'Preview',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Button } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst HeaderNavigations = ({ headerNavigationsActions }) => {\n const intl = useIntl();\n const { handleViewLive, handlePreview } = headerNavigationsActions;\n\n return (\n \n );\n};\n\nHeaderNavigations.propTypes = {\n headerNavigationsActions: PropTypes.shape({\n handleViewLive: PropTypes.func.isRequired,\n handlePreview: PropTypes.func.isRequired,\n }).isRequired,\n};\n\nexport default HeaderNavigations;\n","import { useSelector } from 'react-redux';\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { useWindowSize } from '@openedx/paragon';\n\nimport { useModel } from '../../generic/model-store';\nimport { getCourseSectionVertical, getSequenceIds } from '../data/selectors';\n\nexport function useSequenceNavigationMetadata(courseId, currentSequenceId, currentUnitId) {\n const { nextUrl, prevUrl } = useSelector(getCourseSectionVertical);\n const sequence = useModel('sequences', currentSequenceId);\n const isFirstUnit = !prevUrl;\n const isLastUnit = !nextUrl;\n const sequenceIds = useSelector(getSequenceIds);\n const sequenceIndex = sequenceIds.indexOf(currentSequenceId);\n const unitIndex = sequence.unitIds.indexOf(currentUnitId);\n\n const nextSequenceId = sequenceIndex < sequenceIds.length - 1 ? sequenceIds[sequenceIndex + 1] : null;\n const previousSequenceId = sequenceIndex > 0 ? sequenceIds[sequenceIndex - 1] : null;\n\n let nextLink;\n const nextIndex = unitIndex + 1;\n\n if (nextIndex < sequence.unitIds.length) {\n const nextUnitId = sequence.unitIds[nextIndex];\n nextLink = `/course/${courseId}/container/${nextUnitId}/${currentSequenceId}`;\n } else if (nextSequenceId) {\n const pathToNextUnit = decodeURIComponent(nextUrl);\n nextLink = `/course/${courseId}${pathToNextUnit}/${nextSequenceId}`;\n }\n\n let previousLink;\n const previousIndex = unitIndex - 1;\n\n if (previousIndex >= 0) {\n const previousUnitId = sequence.unitIds[previousIndex];\n previousLink = `/course/${courseId}/container/${previousUnitId}/${currentSequenceId}`;\n } else if (previousSequenceId) {\n const pathToPreviousUnit = decodeURIComponent(prevUrl);\n previousLink = `/course/${courseId}${pathToPreviousUnit}/${previousSequenceId}`;\n }\n\n return {\n isFirstUnit, isLastUnit, nextLink, previousLink,\n };\n}\n\nconst invisibleStyle = {\n position: 'absolute',\n left: 0,\n pointerEvents: 'none',\n visibility: 'hidden',\n};\n\n/**\n * This hook will find the index of the last child of a containing element\n * that fits within its bounding rectangle. This is done by summing the widths\n * of the children until they exceed the width of the container.\n *\n * The hook returns an array containing:\n * [indexOfLastVisibleChild, containerElementRef, invisibleStyle, overflowElementRef]\n *\n * indexOfLastVisibleChild - the index of the last visible child\n * containerElementRef - a ref to be added to the containing html node\n * invisibleStyle - a set of styles to be applied to child of the containing node\n * if it needs to be hidden. These styles remove the element visually, from\n * screen readers, and from normal layout flow. But, importantly, these styles\n * preserve the width of the element, so that future width calculations will\n * still be accurate.\n * overflowElementRef - a ref to be added to an html node inside the container\n * that is likely to be used to contain a \"More\" type dropdown or other\n * mechanism to reveal hidden children. The width of this element is always\n * included when determining which children will fit or not. Usage of this ref\n * is optional.\n */\nexport function useIndexOfLastVisibleChild() {\n const containerElementRef = useRef(null);\n const overflowElementRef = useRef(null);\n const containingRectRef = useRef({});\n const [indexOfLastVisibleChild, setIndexOfLastVisibleChild] = useState(-1);\n const windowSize = useWindowSize();\n\n useLayoutEffect(() => {\n const containingRect = containerElementRef.current.getBoundingClientRect();\n\n // No-op if the width is unchanged.\n // (Assumes tabs themselves don't change count or width).\n if (!containingRect.width === containingRectRef.current.width) {\n return;\n }\n // Update for future comparison\n containingRectRef.current = containingRect;\n\n // Get array of child nodes from NodeList form\n const childNodesArr = Array.prototype.slice.call(containerElementRef.current.children);\n const { nextIndexOfLastVisibleChild } = childNodesArr\n // filter out the overflow element\n .filter(childNode => childNode !== overflowElementRef.current)\n // sum the widths to find the last visible element's index\n .reduce((acc, childNode, index) => {\n // use floor to prevent rounding errors\n acc.sumWidth += Math.floor(childNode.getBoundingClientRect().width);\n if (acc.sumWidth <= containingRect.width) {\n acc.nextIndexOfLastVisibleChild = index;\n }\n return acc;\n }, {\n // Include the overflow element's width to begin with. Doing this means\n // sometimes we'll show a dropdown with one item in it when it would fit,\n // but allowing this case dramatically simplifies the calculations we need\n // to do above.\n sumWidth: overflowElementRef.current ? overflowElementRef.current.getBoundingClientRect().width : 0,\n nextIndexOfLastVisibleChild: -1,\n });\n\n setIndexOfLastVisibleChild(nextIndexOfLastVisibleChild);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [windowSize, containerElementRef.current]);\n\n return [indexOfLastVisibleChild, containerElementRef, invisibleStyle, overflowElementRef];\n}\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n prevBtnText: {\n id: 'course-authoring.course-unit.prev-btn-text',\n defaultMessage: 'Previous',\n },\n nextBtnText: {\n id: 'course-authoring.course-unit.next-btn-text',\n defaultMessage: 'Next',\n },\n newUnitBtnText: {\n id: 'course-authoring.course-unit.new-unit-btn-text',\n defaultMessage: 'New unit',\n },\n sequenceNavLabelText: {\n id: 'course-authoring.course-unit.sequence-nav-label-text',\n defaultMessage: 'Sequence navigation',\n },\n sequenceLoadFailure: {\n id: 'course-authoring.course-unit.sequence.load.failure',\n defaultMessage: 'There was an error loading this course.',\n },\n sequenceNoContent: {\n id: 'course-authoring.course-unit.sequence.no.content',\n defaultMessage: 'There is no content here.',\n },\n sequenceDropdownTitle: {\n id: 'course-authoring.course-unit.sequence.navigation.menu',\n defaultMessage: '{current} of {total}',\n },\n pasteAsNewUnitLink: {\n id: 'course-authoring.course-unit.sequence.navigation.menu.copy-unit.past-unit-link',\n defaultMessage: 'Paste as new unit',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport { Icon } from '@openedx/paragon';\nimport { BookOpen as BookOpenIcon } from '@openedx/paragon/icons';\n\nimport { TYPE_ICONS_MAP, UNIT_ICON_TYPES } from '../../constants';\n\nconst UnitIcon = ({ type }) => {\n const icon = TYPE_ICONS_MAP[type] || BookOpenIcon;\n\n return ;\n};\n\nUnitIcon.propTypes = {\n type: PropTypes.oneOf(UNIT_ICON_TYPES).isRequired,\n};\n\nexport default UnitIcon;\n","import PropTypes from 'prop-types';\nimport { connect, useSelector } from 'react-redux';\nimport { Button } from '@openedx/paragon';\nimport { Link } from 'react-router-dom';\n\nimport UnitIcon from './UnitIcon';\nimport { getCourseId, getSequenceId } from '../../data/selectors';\n\nconst UnitButton = ({\n title, contentType, isActive, unitId, className, showTitle,\n}) => {\n const courseId = useSelector(getCourseId);\n const sequenceId = useSelector(getSequenceId);\n\n return (\n \n \n {showTitle && {title}}\n \n );\n};\n\nUnitButton.propTypes = {\n className: PropTypes.string,\n contentType: PropTypes.string.isRequired,\n isActive: PropTypes.bool,\n showTitle: PropTypes.bool,\n title: PropTypes.string.isRequired,\n unitId: PropTypes.string.isRequired,\n};\n\nUnitButton.defaultProps = {\n className: undefined,\n isActive: false,\n showTitle: false,\n};\n\nconst mapStateToProps = (state, props) => {\n if (props.unitId) {\n return {\n ...state.models.units[props.unitId],\n };\n }\n return {};\n};\n\nexport default connect(mapStateToProps)(UnitButton);\n","import PropTypes from 'prop-types';\nimport { Button, Dropdown } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Plus as PlusIcon, ContentPasteGo as ContentPasteGoIcon } from '@openedx/paragon/icons/';\n\nimport messages from '../messages';\nimport UnitButton from './UnitButton';\n\nconst SequenceNavigationDropdown = ({\n unitId,\n unitIds,\n handleAddNewSequenceUnit,\n handlePasteNewSequenceUnit,\n showPasteUnit,\n}) => {\n const intl = useIntl();\n\n return (\n \n \n {intl.formatMessage(messages.sequenceDropdownTitle, {\n current: unitIds.indexOf(unitId) + 1,\n total: unitIds.length,\n })}\n \n \n {unitIds.map(buttonUnitId => (\n \n ))}\n \n {intl.formatMessage(messages.newUnitBtnText)}\n \n {showPasteUnit && (\n \n {intl.formatMessage(messages.pasteAsNewUnitLink)}\n \n )}\n \n \n );\n};\n\nSequenceNavigationDropdown.propTypes = {\n unitId: PropTypes.string.isRequired,\n unitIds: PropTypes.arrayOf(PropTypes.string).isRequired,\n handleAddNewSequenceUnit: PropTypes.func.isRequired,\n handlePasteNewSequenceUnit: PropTypes.func.isRequired,\n showPasteUnit: PropTypes.bool.isRequired,\n};\n\nexport default SequenceNavigationDropdown;\n","import { useDispatch, useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { useNavigate } from 'react-router-dom';\nimport { Button } from '@openedx/paragon';\nimport { Plus as PlusIcon, ContentPasteGo as ContentPasteGoIcon } from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { changeEditTitleFormOpen, updateQueryPendingStatus } from '../../data/slice';\nimport { getCourseId, getSequenceId } from '../../data/selectors';\nimport messages from '../messages';\nimport { useIndexOfLastVisibleChild } from '../hooks';\nimport SequenceNavigationDropdown from './SequenceNavigationDropdown';\nimport UnitButton from './UnitButton';\n\nconst SequenceNavigationTabs = ({\n unitIds, unitId, handleCreateNewCourseXBlock, showPasteUnit,\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const sequenceId = useSelector(getSequenceId);\n const courseId = useSelector(getCourseId);\n\n const [\n indexOfLastVisibleChild,\n containerRef,\n invisibleStyle,\n ] = useIndexOfLastVisibleChild();\n const shouldDisplayDropdown = indexOfLastVisibleChild === -1;\n\n const handleAddNewSequenceUnit = () => {\n dispatch(updateQueryPendingStatus(true));\n handleCreateNewCourseXBlock({ parentLocator: sequenceId, category: 'vertical', displayName: 'Unit' }, ({ courseKey, locator }) => {\n navigate(`/course/${courseKey}/container/${locator}/${sequenceId}`, courseId);\n dispatch(changeEditTitleFormOpen(true));\n });\n };\n\n const handlePasteNewSequenceUnit = () => {\n dispatch(updateQueryPendingStatus(true));\n handleCreateNewCourseXBlock({ parentLocator: sequenceId, stagedContent: 'clipboard' }, ({ courseKey, locator }) => {\n navigate(`/course/${courseKey}/container/${locator}/${sequenceId}`, courseId);\n dispatch(changeEditTitleFormOpen(true));\n }, unitId);\n };\n\n return (\n
    \n
    \n \n {unitIds.map((buttonUnitId) => (\n \n ))}\n \n {intl.formatMessage(messages.newUnitBtnText)}\n \n {showPasteUnit && (\n \n {intl.formatMessage(messages.pasteAsNewUnitLink)}\n \n )}\n
    \n
    \n {shouldDisplayDropdown && (\n \n )}\n \n );\n};\n\nSequenceNavigationTabs.propTypes = {\n unitId: PropTypes.string.isRequired,\n unitIds: PropTypes.arrayOf(PropTypes.string).isRequired,\n handleCreateNewCourseXBlock: PropTypes.func.isRequired,\n showPasteUnit: PropTypes.bool.isRequired,\n};\n\nexport default SequenceNavigationTabs;\n","import { Link } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n injectIntl, intlShape, isRtl, getLocale,\n} from '@edx/frontend-platform/i18n';\nimport { Button, useWindowSize, breakpoints } from '@openedx/paragon';\nimport {\n ChevronLeft as ChevronLeftIcon,\n ChevronRight as ChevronRightIcon,\n} from '@openedx/paragon/icons';\n\nimport { useModel } from '../../../generic/model-store';\nimport { RequestStatus } from '../../../data/constants';\nimport { getSequenceStatus } from '../../data/selectors';\nimport { useSequenceNavigationMetadata } from '../hooks';\nimport messages from '../messages';\nimport SequenceNavigationTabs from './SequenceNavigationTabs';\n\nconst SequenceNavigation = ({\n intl,\n courseId,\n unitId,\n sequenceId,\n className,\n handleCreateNewCourseXBlock,\n showPasteUnit,\n}) => {\n const sequenceStatus = useSelector(getSequenceStatus);\n const {\n isFirstUnit, isLastUnit, nextLink, previousLink,\n } = useSequenceNavigationMetadata(courseId, sequenceId, unitId);\n const sequence = useModel('sequences', sequenceId);\n\n const shouldDisplayNotificationTriggerInSequence = useWindowSize().width < breakpoints.small.minWidth;\n const renderUnitButtons = () => {\n if (sequence.unitIds?.length === 0 || unitId === null) {\n return (\n
    \n );\n }\n\n return (\n \n );\n };\n\n const renderPreviousButton = () => {\n const buttonText = intl.formatMessage(messages.prevBtnText);\n const prevArrow = isRtl(getLocale()) ? ChevronRightIcon : ChevronLeftIcon;\n\n if (!isFirstUnit) {\n return (\n \n {shouldDisplayNotificationTriggerInSequence ? null : buttonText}\n \n );\n }\n\n return null;\n };\n\n const renderNextButton = () => {\n const buttonText = intl.formatMessage(messages.nextBtnText);\n const nextArrow = isRtl(getLocale()) ? ChevronLeftIcon : ChevronRightIcon;\n\n if (!isLastUnit) {\n return (\n \n {shouldDisplayNotificationTriggerInSequence ? null : buttonText}\n \n );\n }\n\n return null;\n };\n\n return sequenceStatus === RequestStatus.SUCCESSFUL && (\n \n {renderPreviousButton()}\n {renderUnitButtons()}\n {renderNextButton()}\n \n );\n};\n\nSequenceNavigation.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n unitId: PropTypes.string,\n className: PropTypes.string,\n sequenceId: PropTypes.string,\n handleCreateNewCourseXBlock: PropTypes.func.isRequired,\n showPasteUnit: PropTypes.bool.isRequired,\n};\n\nSequenceNavigation.defaultProps = {\n sequenceId: null,\n unitId: null,\n className: undefined,\n};\n\nexport default injectIntl(SequenceNavigation);\n","import PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\nimport classNames from 'classnames';\nimport { breakpoints, useWindowSize } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport Loading from '../../generic/Loading';\nimport { RequestStatus } from '../../data/constants';\nimport SequenceNavigation from './sequence-navigation/SequenceNavigation';\nimport messages from './messages';\n\nconst Sequence = ({\n courseId,\n sequenceId,\n unitId,\n handleCreateNewCourseXBlock,\n showPasteUnit,\n}) => {\n const intl = useIntl();\n const { IN_PROGRESS, FAILED, SUCCESSFUL } = RequestStatus;\n const shouldDisplayNotificationTriggerInSequence = useWindowSize().width < breakpoints.small.minWidth;\n const { sequenceStatus, sequenceMightBeUnit } = useSelector(state => state.courseUnit);\n\n const defaultContent = (\n
    \n
    \n \n
    \n
    \n );\n\n // If sequence might be a unit, we want to keep showing a spinner - the courseware container will redirect us when\n // it knows which sequence to actually go to.\n const isLoading = sequenceStatus === IN_PROGRESS || (sequenceStatus === FAILED && sequenceMightBeUnit);\n if (isLoading) {\n if (!sequenceId) {\n return (
    {intl.formatMessage(messages.sequenceNoContent)}
    );\n }\n\n return ;\n }\n\n if (sequenceStatus === SUCCESSFUL) {\n return defaultContent;\n }\n\n // sequence status 'failed' and any other unexpected sequence status.\n return (\n

    \n {intl.formatMessage(messages.sequenceLoadFailure)}\n

    \n );\n};\n\nSequence.propTypes = {\n unitId: PropTypes.string,\n courseId: PropTypes.string.isRequired,\n sequenceId: PropTypes.string,\n handleCreateNewCourseXBlock: PropTypes.func.isRequired,\n showPasteUnit: PropTypes.bool.isRequired,\n};\n\nSequence.defaultProps = {\n sequenceId: null,\n unitId: null,\n};\n\nexport default Sequence;\n","import PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Card } from '@openedx/paragon';\n\nconst Sidebar = ({ className, children, ...props }) => (\n \n {children}\n \n);\n\nSidebar.propTypes = {\n className: PropTypes.string,\n children: PropTypes.node,\n};\n\nSidebar.defaultProps = {\n className: null,\n children: null,\n};\n\nexport default Sidebar;\n","import { camelCaseObject } from '@edx/frontend-platform';\n\nimport { NOTIFICATION_MESSAGES } from '../../constants';\nimport { PUBLISH_TYPES } from '../constants';\n\n// eslint-disable-next-line import/prefer-default-export\nexport function normalizeCourseSectionVerticalData(metadata) {\n const data = camelCaseObject(metadata);\n return {\n ...data,\n sequence: {\n id: data.subsectionLocation,\n title: data.xblock.displayName,\n unitIds: data.xblockInfo.ancestorInfo.ancestors[0].childInfo.children.map((item) => item.id),\n },\n units: data.xblockInfo.ancestorInfo.ancestors[0].childInfo.children.map((unit) => ({\n id: unit.id,\n sequenceId: data.subsectionLocation,\n bookmarked: unit.bookmarked,\n complete: unit.complete,\n title: unit.displayName,\n contentType: unit.xblockType,\n graded: unit.graded,\n containsContentTypeGatedContent: unit.contains_content_type_gated_content,\n })),\n };\n}\n\n/**\n * Get the notification message based on the publishing type and visibility.\n * @param {string} type - The publishing type.\n * @param {boolean} isVisible - The visibility status.\n * @param {boolean} isModalView - The modal view status.\n * @returns {string} The corresponding notification message.\n */\nexport const getNotificationMessage = (type, isVisible, isModalView) => {\n let notificationMessage;\n\n if (type === PUBLISH_TYPES.discardChanges) {\n notificationMessage = NOTIFICATION_MESSAGES.discardChanges;\n } else if (type === PUBLISH_TYPES.makePublic) {\n notificationMessage = NOTIFICATION_MESSAGES.publishing;\n } else if (type === PUBLISH_TYPES.republish && isModalView) {\n notificationMessage = NOTIFICATION_MESSAGES.saving;\n } else if (type === PUBLISH_TYPES.republish && !isVisible) {\n notificationMessage = NOTIFICATION_MESSAGES.makingVisibleToStudents;\n } else if (type === PUBLISH_TYPES.republish && isVisible) {\n notificationMessage = NOTIFICATION_MESSAGES.hidingFromStudents;\n }\n\n return notificationMessage;\n};\n\n/**\n * Updates the 'id' property of objects in the data structure using the 'blockId' value where present.\n * @param {Object} data - The original data structure to be updated.\n * @returns {Object} - The updated data structure with updated 'id' values.\n */\nexport const updateXBlockBlockIdToId = (data) => {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map(updateXBlockBlockIdToId);\n }\n\n const updatedData = {};\n\n Object.keys(data).forEach(key => {\n const value = data[key];\n\n if (key === 'children' || key === 'selectablePartitions' || key === 'groups') {\n updatedData[key] = updateXBlockBlockIdToId(value);\n } else {\n // Copy other properties unchanged\n updatedData[key] = value;\n }\n });\n\n // Special handling for objects with both 'id' and 'blockId' to ensure 'blockId' takes precedence\n if ('blockId' in data) {\n updatedData.id = data.blockId;\n }\n\n return updatedData;\n};\n","// @ts-check\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nimport { PUBLISH_TYPES } from '../constants';\nimport { normalizeCourseSectionVerticalData, updateXBlockBlockIdToId } from './utils';\n\nconst getStudioBaseUrl = () => getConfig().STUDIO_BASE_URL;\n\nexport const getCourseUnitApiUrl = (itemId) => `${getStudioBaseUrl()}/xblock/container/${itemId}`;\nexport const getXBlockBaseApiUrl = (itemId) => `${getStudioBaseUrl()}/xblock/${itemId}`;\nexport const getCourseSectionVerticalApiUrl = (itemId) => `${getStudioBaseUrl()}/api/contentstore/v1/container_handler/${itemId}`;\nexport const getCourseVerticalChildrenApiUrl = (itemId) => `${getStudioBaseUrl()}/api/contentstore/v1/container/vertical/${itemId}/children`;\nexport const postXBlockBaseApiUrl = () => `${getStudioBaseUrl()}/xblock/`;\n\n/**\n * Get course unit.\n * @param {string} unitId\n * @returns {Promise}\n */\nexport async function getCourseUnitData(unitId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseUnitApiUrl(unitId));\n\n return camelCaseObject(data);\n}\n\n/**\n * Edit course unit display name.\n * @param {string} unitId\n * @param {string} displayName\n * @returns {Promise}\n */\nexport async function editUnitDisplayName(unitId, displayName) {\n const { data } = await getAuthenticatedHttpClient()\n .post(getXBlockBaseApiUrl(unitId), {\n metadata: {\n display_name: displayName,\n },\n });\n\n return data;\n}\n\n/**\n * Get an object containing course section vertical data.\n * @param {string} unitId\n * @returns {Promise}\n */\nexport async function getCourseSectionVerticalData(unitId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseSectionVerticalApiUrl(unitId));\n\n return normalizeCourseSectionVerticalData(data);\n}\n\n/**\n * Creates a new course XBlock.\n * @param {Object} options - The options for creating the XBlock.\n * @param {string} options.type - The type of the XBlock.\n * @param {string} [options.category] - The category of the XBlock. Defaults to the type if not provided.\n * @param {string} options.parentLocator - The parent locator.\n * @param {string} [options.displayName] - The display name.\n * @param {string} [options.boilerplate] - The boilerplate.\n * @param {string} [options.stagedContent] - The staged content.\n */\nexport async function createCourseXblock({\n type, category, parentLocator, displayName, boilerplate, stagedContent,\n}) {\n const body = {\n type,\n boilerplate,\n category: category || type,\n parent_locator: parentLocator,\n display_name: displayName,\n staged_content: stagedContent,\n };\n\n const { data } = await getAuthenticatedHttpClient()\n .post(postXBlockBaseApiUrl(), body);\n\n return data;\n}\n\n/**\n * Handles the visibility and data of a course unit, such as publishing, resetting to default values,\n * and toggling visibility to students.\n * @param {string} unitId - The ID of the course unit.\n * @param {string} type - The action type (e.g., PUBLISH_TYPES.discardChanges).\n * @param {boolean} isVisible - The visibility status for students.\n * @param {boolean} groupAccess - Access group key set.\n * @returns {Promise} A promise that resolves with the response data.\n */\nexport async function handleCourseUnitVisibilityAndData(unitId, type, isVisible, groupAccess) {\n const body = {\n publish: groupAccess ? null : type,\n ...(type === PUBLISH_TYPES.republish ? {\n metadata: {\n visible_to_staff_only: isVisible ? true : null,\n group_access: groupAccess || null,\n },\n } : {}),\n };\n\n const { data } = await getAuthenticatedHttpClient()\n .post(getXBlockBaseApiUrl(unitId), body);\n\n return camelCaseObject(data);\n}\n\n/**\n * Get an object containing course section vertical children data.\n * @param {string} itemId\n * @returns {Promise}\n */\nexport async function getCourseVerticalChildren(itemId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseVerticalChildrenApiUrl(itemId));\n const camelCaseData = camelCaseObject(data);\n\n return updateXBlockBlockIdToId(camelCaseData);\n}\n\n/**\n * Delete a unit item.\n * @param {string} itemId\n * @returns {Promise}\n */\nexport async function deleteUnitItem(itemId) {\n const { data } = await getAuthenticatedHttpClient()\n .delete(getXBlockBaseApiUrl(itemId));\n\n return data;\n}\n\n/**\n * Duplicate a unit item.\n * @param {string} itemId\n * @param {string} XBlockId\n * @returns {Promise}\n */\nexport async function duplicateUnitItem(itemId, XBlockId) {\n const { data } = await getAuthenticatedHttpClient()\n .post(postXBlockBaseApiUrl(), {\n parent_locator: itemId,\n duplicate_source_locator: XBlockId,\n });\n\n return data;\n}\n\n/**\n * Sets the order list of XBlocks.\n * @param {string} blockId - The identifier of the course unit.\n * @param {Object[]} children - The array of child elements representing the updated order of XBlocks.\n * @returns {Promise} - A promise that resolves to the updated data after setting the XBlock order.\n */\nexport async function setXBlockOrderList(blockId, children) {\n const { data } = await getAuthenticatedHttpClient()\n .put(getXBlockBaseApiUrl(blockId), { children });\n\n return data;\n}\n","import { camelCaseObject } from '@edx/frontend-platform';\n\nimport {\n hideProcessingNotification,\n showProcessingNotification,\n} from '../../generic/processing-notification/data/slice';\nimport { handleResponseErrors } from '../../generic/saving-error-alert';\nimport { RequestStatus } from '../../data/constants';\nimport { NOTIFICATION_MESSAGES } from '../../constants';\nimport { updateModel, updateModels } from '../../generic/model-store';\nimport { updateClipboardData } from '../../generic/data/slice';\nimport {\n getCourseUnitData,\n editUnitDisplayName,\n getCourseSectionVerticalData,\n createCourseXblock,\n getCourseVerticalChildren,\n handleCourseUnitVisibilityAndData,\n deleteUnitItem,\n duplicateUnitItem,\n setXBlockOrderList,\n} from './api';\nimport {\n updateLoadingCourseUnitStatus,\n fetchCourseItemSuccess,\n updateSavingStatus,\n fetchSequenceRequest,\n fetchSequenceFailure,\n fetchSequenceSuccess,\n fetchCourseSectionVerticalDataSuccess,\n updateLoadingCourseSectionVerticalDataStatus,\n updateLoadingCourseXblockStatus,\n updateCourseVerticalChildren,\n updateCourseVerticalChildrenLoadingStatus,\n updateQueryPendingStatus,\n deleteXBlock,\n duplicateXBlock,\n fetchStaticFileNoticesSuccess,\n reorderXBlockList,\n} from './slice';\nimport { getNotificationMessage } from './utils';\n\nexport function fetchCourseUnitQuery(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingCourseUnitStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const courseUnit = await getCourseUnitData(courseId);\n dispatch(fetchCourseItemSuccess(courseUnit));\n dispatch(updateLoadingCourseUnitStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateLoadingCourseUnitStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport function fetchCourseSectionVerticalData(courseId, sequenceId) {\n return async (dispatch) => {\n dispatch(updateLoadingCourseSectionVerticalDataStatus({ status: RequestStatus.IN_PROGRESS }));\n dispatch(fetchSequenceRequest({ sequenceId }));\n\n try {\n const courseSectionVerticalData = await getCourseSectionVerticalData(courseId);\n dispatch(fetchCourseSectionVerticalDataSuccess(courseSectionVerticalData));\n dispatch(updateLoadingCourseSectionVerticalDataStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(updateModel({\n modelType: 'sequences',\n model: courseSectionVerticalData.sequence,\n }));\n dispatch(updateModels({\n modelType: 'units',\n models: courseSectionVerticalData.units,\n }));\n dispatch(fetchStaticFileNoticesSuccess(JSON.parse(localStorage.getItem('staticFileNotices'))));\n localStorage.removeItem('staticFileNotices');\n dispatch(updateClipboardData(courseSectionVerticalData.userClipboard));\n dispatch(fetchSequenceSuccess({ sequenceId }));\n return true;\n } catch (error) {\n dispatch(updateLoadingCourseSectionVerticalDataStatus({ status: RequestStatus.FAILED }));\n dispatch(fetchSequenceFailure({ sequenceId }));\n return false;\n }\n };\n}\n\nexport function editCourseItemQuery(itemId, displayName, sequenceId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await editUnitDisplayName(itemId, displayName).then(async (result) => {\n if (result) {\n const courseUnit = await getCourseUnitData(itemId);\n const courseSectionVerticalData = await getCourseSectionVerticalData(itemId);\n dispatch(fetchCourseSectionVerticalDataSuccess(courseSectionVerticalData));\n dispatch(updateLoadingCourseSectionVerticalDataStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(updateModel({\n modelType: 'sequences',\n model: courseSectionVerticalData.sequence,\n }));\n dispatch(updateModels({\n modelType: 'units',\n models: courseSectionVerticalData.units,\n }));\n dispatch(fetchSequenceSuccess({ sequenceId }));\n dispatch(fetchCourseItemSuccess(courseUnit));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n handleResponseErrors(error, dispatch, updateSavingStatus);\n }\n };\n}\n\nexport function editCourseUnitVisibilityAndData(itemId, type, isVisible, groupAccess, isModalView, blockId = itemId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(updateQueryPendingStatus(true));\n const notification = getNotificationMessage(type, isVisible, isModalView);\n dispatch(showProcessingNotification(notification));\n\n try {\n await handleCourseUnitVisibilityAndData(itemId, type, isVisible, groupAccess).then(async (result) => {\n if (result) {\n const courseUnit = await getCourseUnitData(blockId);\n dispatch(fetchCourseItemSuccess(courseUnit));\n const courseVerticalChildrenData = await getCourseVerticalChildren(blockId);\n dispatch(updateCourseVerticalChildren(courseVerticalChildrenData));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n handleResponseErrors(error, dispatch, updateSavingStatus);\n }\n };\n}\n\nexport function createNewCourseXBlock(body, callback, blockId) {\n return async (dispatch) => {\n dispatch(updateLoadingCourseXblockStatus({ status: RequestStatus.IN_PROGRESS }));\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n\n if (body.stagedContent) {\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.pasting));\n } else {\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.adding));\n }\n\n try {\n await createCourseXblock(body).then(async (result) => {\n if (result) {\n const formattedResult = camelCaseObject(result);\n if (body.category === 'vertical') {\n const courseSectionVerticalData = await getCourseSectionVerticalData(formattedResult.locator);\n dispatch(fetchCourseSectionVerticalDataSuccess(courseSectionVerticalData));\n }\n if (body.stagedContent) {\n localStorage.setItem('staticFileNotices', JSON.stringify(formattedResult.staticFileNotices));\n dispatch(fetchStaticFileNoticesSuccess(formattedResult.staticFileNotices));\n\n if (body.parentLocator.includes('vertical')) {\n localStorage.removeItem('staticFileNotices');\n }\n }\n const courseVerticalChildrenData = await getCourseVerticalChildren(blockId);\n dispatch(updateCourseVerticalChildren(courseVerticalChildrenData));\n dispatch(hideProcessingNotification());\n dispatch(updateLoadingCourseXblockStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n if (callback) {\n callback(result);\n }\n const currentBlockId = body.category === 'vertical' ? formattedResult.locator : blockId;\n const courseUnit = await getCourseUnitData(currentBlockId);\n dispatch(fetchCourseItemSuccess(courseUnit));\n }\n });\n } catch (error) {\n dispatch(hideProcessingNotification());\n dispatch(updateLoadingCourseXblockStatus({ status: RequestStatus.FAILED }));\n handleResponseErrors(error, dispatch, updateSavingStatus);\n }\n };\n}\n\nexport function fetchCourseVerticalChildrenData(itemId) {\n return async (dispatch) => {\n dispatch(updateCourseVerticalChildrenLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const courseVerticalChildrenData = await getCourseVerticalChildren(itemId);\n dispatch(updateCourseVerticalChildren(courseVerticalChildrenData));\n dispatch(updateCourseVerticalChildrenLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateCourseVerticalChildrenLoadingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function deleteUnitItemQuery(itemId, xblockId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.deleting));\n\n try {\n await deleteUnitItem(xblockId);\n dispatch(deleteXBlock(xblockId));\n const { userClipboard } = await getCourseSectionVerticalData(itemId);\n dispatch(updateClipboardData(userClipboard));\n const courseUnit = await getCourseUnitData(itemId);\n dispatch(fetchCourseItemSuccess(courseUnit));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(hideProcessingNotification());\n handleResponseErrors(error, dispatch, updateSavingStatus);\n }\n };\n}\n\nexport function duplicateUnitItemQuery(itemId, xblockId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.duplicating));\n\n try {\n const { locator } = await duplicateUnitItem(itemId, xblockId);\n const newCourseVerticalChildren = await getCourseVerticalChildren(itemId);\n dispatch(duplicateXBlock({\n newId: locator,\n newCourseVerticalChildren,\n }));\n const courseUnit = await getCourseUnitData(itemId);\n dispatch(fetchCourseItemSuccess(courseUnit));\n dispatch(hideProcessingNotification());\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(hideProcessingNotification());\n handleResponseErrors(error, dispatch, updateSavingStatus);\n }\n };\n}\n\nexport function setXBlockOrderListQuery(blockId, xblockListIds, restoreCallback) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n await setXBlockOrderList(blockId, xblockListIds).then(async (result) => {\n if (result) {\n dispatch(reorderXBlockList(xblockListIds));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n const courseUnit = await getCourseUnitData(blockId);\n dispatch(fetchCourseItemSuccess(courseUnit));\n }\n });\n } catch (error) {\n restoreCallback();\n handleResponseErrors(error, dispatch, updateSavingStatus);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n","import { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\n\nimport { RequestStatus } from '../data/constants';\nimport {\n createNewCourseXBlock,\n fetchCourseUnitQuery,\n editCourseItemQuery,\n fetchCourseSectionVerticalData,\n fetchCourseVerticalChildrenData,\n deleteUnitItemQuery,\n duplicateUnitItemQuery,\n setXBlockOrderListQuery,\n editCourseUnitVisibilityAndData,\n} from './data/thunk';\nimport {\n getCourseSectionVertical,\n getCourseVerticalChildren,\n getCourseUnitData,\n getIsLoading,\n getSavingStatus,\n getErrorMessage,\n getSequenceStatus,\n getStaticFileNotices,\n getCanEdit,\n} from './data/selectors';\nimport { changeEditTitleFormOpen, updateQueryPendingStatus } from './data/slice';\nimport { PUBLISH_TYPES } from './constants';\n\nimport { useCopyToClipboard } from '../generic/clipboard';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const useCourseUnit = ({ courseId, blockId }) => {\n const dispatch = useDispatch();\n const [searchParams] = useSearchParams();\n\n const courseUnit = useSelector(getCourseUnitData);\n const savingStatus = useSelector(getSavingStatus);\n const isLoading = useSelector(getIsLoading);\n const errorMessage = useSelector(getErrorMessage);\n const sequenceStatus = useSelector(getSequenceStatus);\n const { draftPreviewLink, publishedPreviewLink } = useSelector(getCourseSectionVertical);\n const courseVerticalChildren = useSelector(getCourseVerticalChildren);\n const staticFileNotices = useSelector(getStaticFileNotices);\n const navigate = useNavigate();\n const isTitleEditFormOpen = useSelector(state => state.courseUnit.isTitleEditFormOpen);\n const canEdit = useSelector(getCanEdit);\n const { currentlyVisibleToStudents } = courseUnit;\n const { sharedClipboardData, showPasteXBlock, showPasteUnit } = useCopyToClipboard(canEdit);\n const { canPasteComponent } = courseVerticalChildren;\n\n const unitTitle = courseUnit.metadata?.displayName || '';\n const sequenceId = courseUnit.ancestorInfo?.ancestors[0].id;\n\n const headerNavigationsActions = {\n handleViewLive: () => {\n window.open(publishedPreviewLink, '_blank');\n },\n handlePreview: () => {\n window.open(draftPreviewLink, '_blank');\n },\n };\n\n const handleTitleEdit = () => {\n dispatch(changeEditTitleFormOpen(!isTitleEditFormOpen));\n };\n\n const handleConfigureSubmit = (id, isVisible, groupAccess, closeModalFn) => {\n dispatch(editCourseUnitVisibilityAndData(id, PUBLISH_TYPES.republish, isVisible, groupAccess, true, blockId));\n closeModalFn();\n };\n\n const handleTitleEditSubmit = (displayName) => {\n if (unitTitle !== displayName) {\n dispatch(editCourseItemQuery(blockId, displayName, sequenceId));\n }\n\n handleTitleEdit();\n };\n\n const handleNavigate = (id) => {\n if (sequenceId) {\n const path = `/course/${courseId}/container/${blockId}/${id}`;\n const options = { replace: true };\n if (searchParams.size) {\n navigate({\n pathname: path,\n search: `?${searchParams}`,\n }, options);\n } else {\n navigate(path, options);\n }\n }\n };\n\n const handleCreateNewCourseXBlock = (body, callback) => (\n dispatch(createNewCourseXBlock(body, callback, blockId))\n );\n\n const unitXBlockActions = {\n handleDelete: (XBlockId) => {\n dispatch(deleteUnitItemQuery(blockId, XBlockId));\n },\n handleDuplicate: (XBlockId) => {\n dispatch(duplicateUnitItemQuery(blockId, XBlockId));\n },\n };\n\n const handleXBlockDragAndDrop = (xblockListIds, restoreCallback) => {\n dispatch(setXBlockOrderListQuery(blockId, xblockListIds, restoreCallback));\n };\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n dispatch(updateQueryPendingStatus(true));\n }\n }, [savingStatus]);\n\n useEffect(() => {\n dispatch(fetchCourseUnitQuery(blockId));\n dispatch(fetchCourseSectionVerticalData(blockId, sequenceId));\n dispatch(fetchCourseVerticalChildrenData(blockId));\n\n handleNavigate(sequenceId);\n }, [courseId, blockId, sequenceId]);\n\n return {\n sequenceId,\n courseUnit,\n unitTitle,\n errorMessage,\n sequenceStatus,\n savingStatus,\n staticFileNotices,\n currentlyVisibleToStudents,\n isLoading,\n isTitleEditFormOpen,\n sharedClipboardData,\n showPasteXBlock,\n showPasteUnit,\n unitXBlockActions,\n headerNavigationsActions,\n handleTitleEdit,\n handleTitleEditSubmit,\n handleCreateNewCourseXBlock,\n handleConfigureSubmit,\n courseVerticalChildren,\n handleXBlockDragAndDrop,\n canPasteComponent,\n };\n};\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n alertFailedGeneric: {\n id: 'course-authoring.course-unit.general.alert.error.description',\n defaultMessage: 'Unable to {actionName} {type}. Please try again.',\n },\n alertUnpublishedVersion: {\n id: 'course-authoring.course-unit.general.alert.unpublished-version.description',\n defaultMessage: 'Note: The last published version of this unit is live. By publishing changes you will change the student experience.',\n },\n pasteButtonText: {\n id: 'course-authoring.course-unit.paste-component.btn.text',\n defaultMessage: 'Paste component',\n },\n});\n\nexport default messages;\n","import {\n CheckCircle as CheckCircleIcon,\n CheckCircleOutline as CheckCircleOutlineIcon,\n InfoOutline as InfoOutlineIcon,\n} from '@openedx/paragon/icons';\n\nimport { ICON_COLOR_VARIANTS, UNIT_VISIBILITY_STATES } from '../constants';\nimport messages from './messages';\n\n/**\n * Get information about the publishing status.\n * @param {Object} intl - The internationalization object.\n * @param {boolean} hasChanges - Indicates if there are unpublished changes.\n * @param {string} editedBy - The user who edited the content.\n * @param {string} editedOn - The timestamp when the content was edited.\n * @param {string} publishedBy - The user who last published the content.\n * @param {string} publishedOn - The timestamp when the content was last published.\n * @returns {string} Publish information based on the provided parameters.\n */\nexport const getPublishInfo = (intl, hasChanges, editedBy, editedOn, publishedBy, publishedOn) => {\n let publishInfoText;\n if (hasChanges && editedOn && editedBy) {\n publishInfoText = intl.formatMessage(messages.publishInfoDraftSaved, { editedOn, editedBy });\n } else if (publishedOn && publishedBy) {\n publishInfoText = intl.formatMessage(messages.publishLastPublished, { publishedOn, publishedBy });\n } else {\n publishInfoText = intl.formatMessage(messages.publishInfoPreviouslyPublished);\n }\n\n return publishInfoText;\n};\n\n/**\n * Get information about the release status.\n * @param {Object} intl - The internationalization object.\n * @param {string} releaseDate - The release date of the content.\n * @param {string} releaseDateFrom - The section name associated with the release date.\n * @returns {string|ReactElement} Release information based on the provided parameters.\n */\nexport const getReleaseInfo = (intl, releaseDate, releaseDateFrom) => {\n if (releaseDate) {\n return {\n isScheduled: true,\n releaseDate,\n releaseDateFrom,\n sectionNameMessage: intl.formatMessage(messages.releaseInfoWithSection, { sectionName: releaseDateFrom }),\n };\n }\n return {\n isScheduled: false,\n message: intl.formatMessage(messages.releaseInfoUnscheduled),\n };\n};\n\n/**\n * Get the visibility title.\n * @param {Object} intl - The internationalization object.\n * @param {boolean} releasedToStudents - Indicates if the content is released to students.\n * @param {boolean} published - Indicates if the content is published.\n * @param {boolean} hasChanges - Indicates if there are unpublished changes.\n * @returns {string} The visibility title determined by the provided parameters.\n */\nexport const getVisibilityTitle = (intl, releasedToStudents, published, hasChanges) => {\n if (releasedToStudents && published && !hasChanges) {\n return intl.formatMessage(messages.visibilityIsVisibleToTitle);\n }\n\n return intl.formatMessage(messages.visibilityWillBeVisibleToTitle);\n};\n\n/**\n * Get the icon variant based on the provided visibility state and publication status.\n * @param {string} visibilityState - The visibility state of the content.\n * @param {boolean} published - Indicates if the content is published.\n * @param {boolean} hasChanges - Indicates if there are unpublished changes.\n * @returns {Object} An object containing the icon component and color variant.\n * - iconSrc: The source component for the icon.\n * - colorVariant: The color variant for the icon.\n */\nexport const getIconVariant = (visibilityState, published, hasChanges) => {\n const iconVariants = {\n [UNIT_VISIBILITY_STATES.staffOnly]: { iconSrc: InfoOutlineIcon, colorVariant: ICON_COLOR_VARIANTS.BLACK },\n [UNIT_VISIBILITY_STATES.live]: { iconSrc: CheckCircleIcon, colorVariant: ICON_COLOR_VARIANTS.GREEN },\n publishedNoChanges: { iconSrc: CheckCircleOutlineIcon, colorVariant: ICON_COLOR_VARIANTS.BLACK },\n publishedWithChanges: { iconSrc: InfoOutlineIcon, colorVariant: ICON_COLOR_VARIANTS.BLACK },\n default: { iconSrc: InfoOutlineIcon, colorVariant: ICON_COLOR_VARIANTS.BLACK },\n };\n if (visibilityState in iconVariants) {\n return iconVariants[visibilityState];\n }\n if (published) {\n return hasChanges ? iconVariants.publishedWithChanges : iconVariants.publishedNoChanges;\n }\n return iconVariants.default;\n};\n\n/**\n * Extracts the clear course unit ID from the given course unit data.\n * @param {string} id - The course unit ID.\n * @returns {string} The clear course unit ID extracted from the provided data.\n */\nexport const extractCourseUnitId = (id) => id.match(/block@(.+)$/)[1];\n","import { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { getUnitReleaseStatus, UNIT_VISIBILITY_STATES } from '../constants';\nimport messages from './messages';\nimport { extractCourseUnitId } from './utils';\n\nconst useCourseUnitData = ({\n hasChanges, published, visibilityState, id,\n}) => {\n const intl = useIntl();\n const releaseStatus = getUnitReleaseStatus(intl);\n const locationId = extractCourseUnitId(id);\n const visibleToStaffOnly = visibilityState === UNIT_VISIBILITY_STATES.staffOnly;\n const titleMessages = {\n [UNIT_VISIBILITY_STATES.staffOnly]: messages.sidebarTitleVisibleToStaffOnly,\n [UNIT_VISIBILITY_STATES.live]: messages.sidebarTitlePublishedAndLive,\n // eslint-disable-next-line no-nested-ternary\n default: published\n ? (hasChanges ? messages.sidebarTitleDraftUnpublishedChanges\n : messages.sidebarTitlePublishedNotYetReleased)\n : messages.sidebarTitleDraftNeverPublished,\n };\n\n const releaseLabels = {\n [UNIT_VISIBILITY_STATES.staffOnly]: releaseStatus.release,\n [UNIT_VISIBILITY_STATES.live]: releaseStatus.released,\n [UNIT_VISIBILITY_STATES.ready]: releaseStatus.scheduled,\n default: releaseStatus.release,\n };\n\n const title = intl.formatMessage(titleMessages[visibilityState] || titleMessages.default);\n const releaseLabel = releaseLabels[visibilityState] || releaseLabels.default;\n\n return {\n title,\n locationId,\n releaseLabel,\n visibilityState,\n visibleToStaffOnly,\n };\n};\n\nexport default useCourseUnitData;\n","import PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\nimport { Icon, Stack } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { getCourseUnitData } from '../../data/selectors';\nimport { getIconVariant } from '../utils';\nimport messages from '../messages';\n\nconst SidebarHeader = ({ title, visibilityState, displayUnitLocation }) => {\n const intl = useIntl();\n const { hasChanges, published } = useSelector(getCourseUnitData);\n const { iconSrc, colorVariant } = getIconVariant(visibilityState, published, hasChanges);\n\n return (\n \n {!displayUnitLocation && (\n \n )}\n

    \n {displayUnitLocation ? intl.formatMessage(messages.sidebarHeaderUnitLocationTitle) : title}\n

    \n
    \n );\n};\n\nSidebarHeader.propTypes = {\n title: PropTypes.string.isRequired,\n visibilityState: PropTypes.string.isRequired,\n displayUnitLocation: PropTypes.bool,\n};\n\nSidebarHeader.defaultProps = {\n displayUnitLocation: false,\n};\n\nexport default SidebarHeader;\n","import { useSelector } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { getCourseUnitData } from '../../data/selectors';\nimport { getReleaseInfo } from '../utils';\n\nconst ReleaseInfoComponent = () => {\n const intl = useIntl();\n const {\n releaseDate,\n releaseDateFrom,\n } = useSelector(getCourseUnitData);\n const releaseInfo = getReleaseInfo(intl, releaseDate, releaseDateFrom);\n\n if (releaseInfo.isScheduled) {\n return (\n \n
    \n {releaseInfo.releaseDate} \n
    \n {releaseInfo.sectionNameMessage}\n
    \n );\n }\n\n return releaseInfo.message;\n};\n\nexport default ReleaseInfoComponent;\n","import PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\nimport { Card, Stack } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport classNames from 'classnames';\nimport { getCourseUnitData } from '../../data/selectors';\nimport { getPublishInfo } from '../utils';\nimport messages from '../messages';\nimport ReleaseInfoComponent from './ReleaseInfoComponent';\n\nconst SidebarBody = ({\n releaseLabel,\n displayUnitLocation,\n locationId,\n visibleToStaffOnly,\n}) => {\n const intl = useIntl();\n const {\n editedOn,\n editedBy,\n hasChanges,\n publishedBy,\n publishedOn,\n } = useSelector(getCourseUnitData);\n\n return (\n \n \n {displayUnitLocation ? (\n \n
    \n {intl.formatMessage(messages.unitLocationTitle)}\n
    \n

    \n {locationId}\n

    \n
    \n ) : (\n <>\n \n {getPublishInfo(intl, hasChanges, editedBy, editedOn, publishedBy, publishedOn)}\n \n \n
    \n {releaseLabel}\n
    \n \n
    \n

    \n {intl.formatMessage(messages.sidebarBodyNote)}\n

    \n \n )}\n
    \n
    \n );\n};\n\nSidebarBody.propTypes = {\n releaseLabel: PropTypes.string.isRequired,\n displayUnitLocation: PropTypes.bool,\n locationId: PropTypes.string,\n visibleToStaffOnly: PropTypes.bool,\n};\n\nSidebarBody.defaultProps = {\n displayUnitLocation: false,\n locationId: null,\n visibleToStaffOnly: false,\n};\n\nexport default SidebarBody;\n","import PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Form } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useParams } from 'react-router-dom';\n\nimport { getCourseUnitData } from '../../../data/selectors';\nimport { editCourseUnitVisibilityAndData } from '../../../data/thunk';\nimport { PUBLISH_TYPES } from '../../../constants';\nimport { getVisibilityTitle } from '../../utils';\nimport messages from '../../messages';\n\nconst UnitVisibilityInfo = ({ openVisibleModal, visibleToStaffOnly }) => {\n const intl = useIntl();\n const { blockId } = useParams();\n const dispatch = useDispatch();\n const {\n published,\n hasChanges,\n staffLockFrom,\n releasedToStudents,\n hasExplicitStaffLock,\n } = useSelector(getCourseUnitData);\n\n const handleCourseUnitVisibility = () => {\n dispatch(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.republish, true));\n };\n\n return (\n <>\n \n {getVisibilityTitle(intl, releasedToStudents, published, hasChanges)}\n \n {visibleToStaffOnly ? (\n <>\n
    \n {intl.formatMessage(messages.visibilityStaffOnlyTitle)}\n
    \n {!hasExplicitStaffLock && (\n \n {intl.formatMessage(messages.visibilityHasExplicitStaffLockText, { sectionName: staffLockFrom })}\n \n )}\n \n ) : (\n
    \n {intl.formatMessage(messages.visibilityStaffAndLearnersTitle)}\n
    \n )}\n \n {intl.formatMessage(messages.visibilityCheckboxTitle)}\n \n \n );\n};\n\nUnitVisibilityInfo.propTypes = {\n openVisibleModal: PropTypes.func.isRequired,\n visibleToStaffOnly: PropTypes.bool.isRequired,\n};\n\nexport default UnitVisibilityInfo;\n","import PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nconst Divider = ({ className, ...props }) => (\n
    \n);\n\nDivider.propTypes = {\n className: PropTypes.string,\n};\n\nDivider.defaultProps = {\n className: undefined,\n};\n\nexport default Divider;\n","import PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Button } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { Divider } from '../../../../generic/divider';\nimport { getCanEdit, getCourseUnitData } from '../../../data/selectors';\nimport { copyToClipboard } from '../../../../generic/data/thunks';\nimport messages from '../../messages';\n\nconst ActionButtons = ({ openDiscardModal, handlePublishing }) => {\n const dispatch = useDispatch();\n const intl = useIntl();\n const {\n id,\n published,\n hasChanges,\n enableCopyPasteUnits,\n } = useSelector(getCourseUnitData);\n const canEdit = useSelector(getCanEdit);\n\n return (\n <>\n {(!published || hasChanges) && (\n \n )}\n {(published && hasChanges) && (\n \n {intl.formatMessage(messages.actionButtonDiscardChangesTitle)}\n \n )}\n {enableCopyPasteUnits && canEdit && (\n <>\n \n dispatch(copyToClipboard(id))}\n variant=\"outline-primary\"\n size=\"sm\"\n >\n {intl.formatMessage(messages.actionButtonCopyUnitTitle)}\n \n \n )}\n \n );\n};\n\nActionButtons.propTypes = {\n openDiscardModal: PropTypes.func.isRequired,\n handlePublishing: PropTypes.func.isRequired,\n};\n\nexport default ActionButtons;\n","import PropTypes from 'prop-types';\nimport { Card, Stack } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport messages from '../../messages';\nimport UnitVisibilityInfo from './UnitVisibilityInfo';\nimport ActionButtons from './ActionButtons';\n\nconst SidebarFooter = ({\n locationId,\n openVisibleModal,\n handlePublishing,\n openDiscardModal,\n visibleToStaffOnly,\n displayUnitLocation,\n}) => {\n const intl = useIntl();\n\n return (\n \n \n {displayUnitLocation ? (\n \n {intl.formatMessage(messages.unitLocationDescription, { id: locationId })}\n \n ) : (\n <>\n \n \n \n )}\n \n \n );\n};\n\nSidebarFooter.propTypes = {\n locationId: PropTypes.string,\n displayUnitLocation: PropTypes.bool,\n openDiscardModal: PropTypes.func.isRequired,\n openVisibleModal: PropTypes.func.isRequired,\n handlePublishing: PropTypes.func.isRequired,\n visibleToStaffOnly: PropTypes.bool.isRequired,\n};\n\nSidebarFooter.defaultProps = {\n displayUnitLocation: false,\n locationId: null,\n};\n\nexport default SidebarFooter;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { ActionRow, AlertModal, Button } from '@openedx/paragon';\n\nconst ModalNotification = ({\n isOpen, title, message, handleCancel, handleAction, cancelButtonText, actionButtonText, variant, icon,\n}) => (\n \n \n \n \n )}\n >\n

    {message}

    \n \n);\n\nModalNotification.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n title: PropTypes.string.isRequired,\n message: PropTypes.string.isRequired,\n handleCancel: PropTypes.func.isRequired,\n handleAction: PropTypes.func.isRequired,\n cancelButtonText: PropTypes.string.isRequired,\n actionButtonText: PropTypes.string.isRequired,\n variant: PropTypes.string,\n icon: PropTypes.elementType,\n};\n\nModalNotification.defaultProps = {\n variant: 'default',\n icon: undefined,\n};\n\nexport default ModalNotification;\n","import PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useToggle } from '@openedx/paragon';\nimport { InfoOutline as InfoOutlineIcon } from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport useCourseUnitData from './hooks';\nimport { editCourseUnitVisibilityAndData } from '../data/thunk';\nimport { SidebarBody, SidebarFooter, SidebarHeader } from './components';\nimport { PUBLISH_TYPES } from '../constants';\nimport { getCourseUnitData } from '../data/selectors';\nimport messages from './messages';\nimport ModalNotification from '../../generic/modal-notification';\n\nconst PublishControls = ({ blockId }) => {\n const {\n title,\n locationId,\n releaseLabel,\n visibilityState,\n visibleToStaffOnly,\n } = useCourseUnitData(useSelector(getCourseUnitData));\n const intl = useIntl();\n\n const [isDiscardModalOpen, openDiscardModal, closeDiscardModal] = useToggle(false);\n const [isVisibleModalOpen, openVisibleModal, closeVisibleModal] = useToggle(false);\n\n const dispatch = useDispatch();\n\n const handleCourseUnitVisibility = () => {\n closeVisibleModal();\n dispatch(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.republish, null));\n };\n\n const handleCourseUnitDiscardChanges = () => {\n closeDiscardModal();\n dispatch(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.discardChanges));\n };\n\n const handleCourseUnitPublish = () => {\n dispatch(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.makePublic));\n };\n\n return (\n <>\n \n \n \n \n \n \n );\n};\n\nPublishControls.propTypes = {\n blockId: PropTypes.string,\n};\n\nPublishControls.defaultProps = {\n blockId: null,\n};\n\nexport default PublishControls;\n","import { useSelector } from 'react-redux';\nimport useCourseUnitData from './hooks';\nimport { getCourseUnitData } from '../data/selectors';\nimport { SidebarBody, SidebarFooter, SidebarHeader } from './components';\n\nconst LocationInfo = () => {\n const {\n title,\n locationId,\n releaseLabel,\n visibilityState,\n visibleToStaffOnly,\n } = useCourseUnitData(useSelector(getCourseUnitData));\n\n return (\n <>\n \n \n \n \n );\n};\n\nLocationInfo.propTypes = {};\n\nexport default LocationInfo;\n","// @ts-check\nimport React from 'react';\nimport { Stack } from '@openedx/paragon';\nimport { useParams } from 'react-router-dom';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { useContentTagsCount } from '../../generic/data/apiHooks';\nimport messages from '../messages';\nimport TagCount from '../../generic/tag-count';\n\nconst TagsSidebarHeader = () => {\n const intl = useIntl();\n const contentId = useParams().blockId;\n\n const {\n data: contentTagsCount,\n isSuccess: isContentTagsCountLoaded,\n } = useContentTagsCount(contentId || '');\n\n return (\n \n

    \n {intl.formatMessage(messages.tagsSidebarTitle)}\n

    \n { isContentTagsCountLoaded\n && }\n \n );\n};\n\nTagsSidebarHeader.propTypes = {};\n\nexport default TagsSidebarHeader;\n","// @ts-check\nimport React, { useState, useMemo } from 'react';\nimport {\n Card, Stack, Button, Collapsible, Icon,\n} from '@openedx/paragon';\nimport { ArrowDropDown, ArrowDropUp } from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useParams } from 'react-router-dom';\nimport { ContentTagsDrawerSheet } from '..';\n\nimport messages from '../messages';\nimport { useContentTaxonomyTagsData } from '../data/apiHooks';\nimport { LoadingSpinner } from '../../generic/Loading';\nimport TagsTree from '../TagsTree';\n\nconst TagsSidebarBody = () => {\n const intl = useIntl();\n const [showManageTags, setShowManageTags] = useState(false);\n const contentId = useParams().blockId;\n const onClose = () => setShowManageTags(false);\n\n const {\n data: contentTaxonomyTagsData,\n isSuccess: isContentTaxonomyTagsLoaded,\n } = useContentTaxonomyTagsData(contentId || '');\n\n const buildTagsTree = (contentTags) => {\n const resultTree = {};\n contentTags.forEach(item => {\n let currentLevel = resultTree;\n\n item.lineage.forEach((key) => {\n if (!currentLevel[key]) {\n currentLevel[key] = {\n children: {},\n canChangeObjecttag: item.canChangeObjecttag,\n canDeleteObjecttag: item.canDeleteObjecttag,\n };\n }\n\n currentLevel = currentLevel[key].children;\n });\n });\n\n return resultTree;\n };\n\n const tree = useMemo(() => {\n const result = [];\n if (isContentTaxonomyTagsLoaded && contentTaxonomyTagsData) {\n contentTaxonomyTagsData.taxonomies.forEach((taxonomy) => {\n result.push({\n ...taxonomy,\n tags: buildTagsTree(taxonomy.tags),\n });\n });\n }\n return result;\n }, [isContentTaxonomyTagsLoaded, contentTaxonomyTagsData]);\n\n return (\n <>\n \n \n { isContentTaxonomyTagsLoaded\n ? (\n \n {tree.map((taxonomy) => (\n
    \n }\n iconWhenOpen={}\n >\n \n \n
    \n ))}\n
    \n )\n : (\n
    \n \n
    \n )}\n\n \n
    \n \n \n \n );\n};\n\nTagsSidebarBody.propTypes = {};\n\nexport default TagsSidebarBody;\n","import TagsSidebarHeader from './TagsSidebarHeader';\nimport TagsSidebarBody from './TagsSidebarBody';\n\nconst TagsSidebarControls = () => (\n <>\n \n \n \n);\n\nTagsSidebarControls.propTypes = {};\n\nexport default TagsSidebarControls;\n","export const FILE_LIST_DEFAULT_VALUE = [];\n\nexport const initialNotificationAlertsState = {\n conflictingFilesAlert: true,\n errorFilesAlert: true,\n newFilesAlert: true,\n};\n","import PropTypes from 'prop-types';\n\nimport { FILE_LIST_DEFAULT_VALUE } from '../constants';\n\nconst FileList = ({ fileList }) => (\n
      \n {fileList.map((fileName) => (\n
    • {fileName}
    • \n ))}\n
    \n);\n\nFileList.propTypes = {\n fileList: PropTypes.arrayOf(PropTypes.string),\n};\n\nFileList.defaultProps = {\n fileList: FILE_LIST_DEFAULT_VALUE,\n};\n\nexport default FileList;\n","import PropTypes from 'prop-types';\n\nimport { FILE_LIST_DEFAULT_VALUE } from '../constants';\nimport FileList from './FileList';\n\nconst AlertContent = ({ fileList, text }) => (\n <>\n {text}\n \n \n);\n\nAlertContent.propTypes = {\n fileList: PropTypes.arrayOf(PropTypes.string),\n text: PropTypes.string.isRequired,\n};\n\nAlertContent.defaultProps = {\n fileList: FILE_LIST_DEFAULT_VALUE,\n};\n\nexport default AlertContent;\n","import PropTypes from 'prop-types';\nimport { Button } from '@openedx/paragon';\nimport { Link } from 'react-router-dom';\nimport { getConfig } from '@edx/frontend-platform';\n\nconst ActionButton = ({ courseId, title }) => (\n \n {title}\n \n);\n\nActionButton.propTypes = {\n courseId: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n};\n\nexport default ActionButton;\n","/**\n * Gets the status of an alert based on the length of a fileList.\n *\n * @param {Array} fileList - The list of files.\n * @param {string} alertKey - The key associated with the alert in the alertState.\n * @param {Object} alertState - The state object containing alert statuses.\n * @returns {boolean|null} - The status of the alert. Returns `true` if the fileList has length,\n * `false` if it does not, and `null` if fileList is not defined.\n */\n// eslint-disable-next-line import/prefer-default-export\nexport const getAlertStatus = (fileList, alertKey, alertState) => (\n fileList?.length ? fileList && alertState[alertKey] : null);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n hasConflictingErrorsTitle: {\n id: 'course-authoring.course-unit.paste-notification.has-conflicting-errors.title',\n defaultMessage: 'Files need to be updated manually.',\n description: 'Title for a notification indicating that files need manual updates '\n + 'due to a conflict in the clipboard.',\n },\n hasConflictingErrorsDescription: {\n id: 'course-authoring.course-unit.paste-notification.has-conflicting-errors.description',\n defaultMessage: 'The following files must be updated manually for components to work as intended:',\n description: 'Description for the notification indicating which files need manual '\n + 'updates due to a clipboard conflict.',\n },\n hasConflictingErrorsButtonText: {\n id: 'course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text',\n defaultMessage: 'Upload files',\n description: 'Button text prompting users to upload files to resolve a clipboard conflict.',\n },\n hasErrorsTitle: {\n id: 'course-authoring.course-unit.paste-notification.has-errors.title',\n defaultMessage: 'Some errors occurred',\n description: 'Title for a notification indicating that some errors occurred, likely '\n + 'related to file conflicts.',\n },\n hasErrorsDescription: {\n id: 'course-authoring.course-unit.paste-notification.has-errors.description',\n defaultMessage: 'The following required files could not be added to the course:',\n description: 'Description for the notification indicating which required files '\n + 'couldn\\'t be added to the course due to errors.',\n },\n hasNewFilesTitle: {\n id: 'course-authoring.course-unit.paste-notification.has-new-files.title',\n defaultMessage: 'New file(s) added to Files & Uploads.',\n description: 'Title for a notification indicating that new files have been added to '\n + 'the Files & Uploads section.',\n },\n hasNewFilesDescription: {\n id: 'course-authoring.course-unit.paste-notification.has-new-files.description',\n defaultMessage: 'The following required files were imported to this course:',\n description: 'Description for the notification indicating which required files '\n + 'were imported to the course.',\n },\n hasNewFilesButtonText: {\n id: 'course-authoring.course-unit.paste-notification.has-new-files.button.text',\n defaultMessage: 'View files',\n description: 'Button text prompting users to view new files imported to the course.',\n },\n});\n\nexport default messages;\n","import { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Error as ErrorIcon,\n Info as InfoIcon,\n Warning as WarningIcon,\n} from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport AlertMessage from '../../../generic/alert-message';\nimport { ActionButton, AlertContent } from './components';\nimport { getAlertStatus } from './utils';\nimport { initialNotificationAlertsState } from './constants';\nimport messages from './messages';\n\nconst PastNotificationAlert = ({ staticFileNotices, courseId }) => {\n const intl = useIntl();\n const [notificationAlerts, toggleNotificationAlerts] = useState(initialNotificationAlertsState);\n const { conflictingFiles, errorFiles, newFiles } = staticFileNotices;\n\n const hasConflictingErrors = getAlertStatus(conflictingFiles, 'conflictingFilesAlert', notificationAlerts);\n const hasErrorFiles = getAlertStatus(errorFiles, 'errorFilesAlert', notificationAlerts);\n const hasNewFiles = getAlertStatus(newFiles, 'newFilesAlert', notificationAlerts);\n\n const handleCloseNotificationAlert = (alertKey) => {\n toggleNotificationAlerts((prevAlerts) => ({\n ...prevAlerts,\n [alertKey]: false,\n }));\n };\n\n return (\n <>\n {hasConflictingErrors && (\n handleCloseNotificationAlert('conflictingFilesAlert')}\n description={(\n \n )}\n variant=\"warning\"\n icon={WarningIcon}\n dismissible\n actions={[\n ,\n ]}\n />\n )}\n {hasErrorFiles && (\n handleCloseNotificationAlert('errorFilesAlert')}\n description={(\n \n )}\n variant=\"danger\"\n icon={ErrorIcon}\n dismissible\n />\n )}\n {hasNewFiles && (\n handleCloseNotificationAlert('newFilesAlert')}\n description={(\n \n )}\n variant=\"info\"\n icon={InfoIcon}\n dismissible\n actions={[\n ,\n ]}\n />\n )}\n \n );\n};\n\nPastNotificationAlert.propTypes = {\n courseId: PropTypes.string.isRequired,\n staticFileNotices:\n PropTypes.objectOf({\n conflictingFiles: PropTypes.arrayOf(PropTypes.string),\n errorFiles: PropTypes.arrayOf(PropTypes.string),\n newFiles: PropTypes.arrayOf(PropTypes.string),\n }),\n};\n\nPastNotificationAlert.defaultProps = {\n staticFileNotices: {},\n};\n\nexport default PastNotificationAlert;\n","import { useEffect, useMemo, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\nimport { useParams } from 'react-router-dom';\nimport { Container, Layout, Stack } from '@openedx/paragon';\nimport { getConfig } from '@edx/frontend-platform';\nimport { useIntl, injectIntl } from '@edx/frontend-platform/i18n';\nimport { Warning as WarningIcon } from '@openedx/paragon/icons';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { DraggableList } from '@edx/frontend-lib-content-components';\n\nimport { getProcessingNotification } from '../generic/processing-notification/data/selectors';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport { RequestStatus } from '../data/constants';\nimport getPageHeadTitle from '../generic/utils';\nimport AlertMessage from '../generic/alert-message';\nimport { PasteComponent } from '../generic/clipboard';\nimport ProcessingNotification from '../generic/processing-notification';\nimport { SavingErrorAlert } from '../generic/saving-error-alert';\nimport ConnectionErrorAlert from '../generic/ConnectionErrorAlert';\nimport Loading from '../generic/Loading';\nimport AddComponent from './add-component/AddComponent';\nimport CourseXBlock from './course-xblock/CourseXBlock';\nimport HeaderTitle from './header-title/HeaderTitle';\nimport Breadcrumbs from './breadcrumbs/Breadcrumbs';\nimport HeaderNavigations from './header-navigations/HeaderNavigations';\nimport Sequence from './course-sequence';\nimport Sidebar from './sidebar';\nimport { useCourseUnit } from './hooks';\nimport messages from './messages';\nimport PublishControls from './sidebar/PublishControls';\nimport LocationInfo from './sidebar/LocationInfo';\nimport TagsSidebarControls from '../content-tags-drawer/tags-sidebar-controls';\nimport { PasteNotificationAlert } from './clipboard';\n\nconst CourseUnit = ({ courseId }) => {\n const { blockId } = useParams();\n const intl = useIntl();\n const {\n isLoading,\n sequenceId,\n unitTitle,\n errorMessage,\n sequenceStatus,\n savingStatus,\n isTitleEditFormOpen,\n staticFileNotices,\n currentlyVisibleToStudents,\n unitXBlockActions,\n sharedClipboardData,\n showPasteXBlock,\n showPasteUnit,\n handleTitleEditSubmit,\n headerNavigationsActions,\n handleTitleEdit,\n handleCreateNewCourseXBlock,\n handleConfigureSubmit,\n courseVerticalChildren,\n handleXBlockDragAndDrop,\n canPasteComponent,\n } = useCourseUnit({ courseId, blockId });\n\n const initialXBlocksData = useMemo(() => courseVerticalChildren.children ?? [], [courseVerticalChildren.children]);\n const [unitXBlocks, setUnitXBlocks] = useState(initialXBlocksData);\n\n useEffect(() => {\n document.title = getPageHeadTitle('', unitTitle);\n }, [unitTitle]);\n\n useEffect(() => {\n setUnitXBlocks(courseVerticalChildren.children);\n }, [courseVerticalChildren.children]);\n\n const {\n isShow: isShowProcessingNotification,\n title: processingNotificationTitle,\n } = useSelector(getProcessingNotification);\n\n if (isLoading) {\n return ;\n }\n\n if (sequenceStatus === RequestStatus.FAILED) {\n return (\n \n \n \n );\n }\n\n const finalizeXBlockOrder = () => (newXBlocks) => {\n handleXBlockDragAndDrop(newXBlocks.map(xBlock => xBlock.id), () => {\n setUnitXBlocks(initialXBlocksData);\n });\n };\n\n return (\n <>\n \n
    \n \n )}\n breadcrumbs={(\n \n )}\n headerActions={(\n \n )}\n />\n \n \n \n {currentlyVisibleToStudents && (\n \n )}\n {staticFileNotices && (\n \n )}\n \n \n \n {unitXBlocks.map(({\n name, id, blockType: type, shouldScroll, userPartitionInfo, validationMessages,\n }) => (\n \n ))}\n \n \n \n \n {showPasteXBlock && canPasteComponent && (\n \n )}\n \n \n \n \n \n \n {getConfig().ENABLE_TAGGING_TAXONOMY_PAGES === 'true'\n && (\n \n \n \n )}\n \n \n \n \n \n \n
    \n
    \n
    \n \n \n
    \n \n );\n};\n\nCourseUnit.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(CourseUnit);\n","import { createSelector } from '@reduxjs/toolkit';\n\nexport const getLoadingStatus = (state) => state.certificates.loadingStatus;\nexport const getSavingStatus = (state) => state.certificates.savingStatus;\nexport const getSavingImageStatus = (state) => state.certificates.savingImageStatus;\nexport const getErrorMessage = (state) => state.certificates.errorMessage;\nexport const getSendRequestErrors = (state) => state.certificates.sendRequestErrors.developer_message;\nexport const getCertificates = state => state.certificates.certificatesData.certificates;\nexport const getHasCertificateModes = state => state.certificates.certificatesData.hasCertificateModes;\nexport const getCourseModes = state => state.certificates.certificatesData.courseModes;\nexport const getCertificateActivationUrl = state => state.certificates.certificatesData.certificateActivationHandlerUrl;\nexport const getCertificateWebViewUrl = state => state.certificates.certificatesData.certificateWebViewUrl;\nexport const getIsCertificateActive = state => state.certificates.certificatesData.isActive;\nexport const getComponentMode = state => state.certificates.componentMode;\nexport const getCourseNumber = state => state.certificates.certificatesData.courseNumber;\nexport const getCourseNumberOverride = state => state.certificates.certificatesData.courseNumberOverride;\nexport const getCourseTitle = state => state.certificates.certificatesData.courseTitle;\n\nexport const getHasCertificates = createSelector(\n [getCertificates],\n (certificates) => certificates && certificates.length > 0,\n);\n","import { convertObjectToSnakeCase } from '../utils';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const prepareCertificatePayload = (data) => convertObjectToSnakeCase(({\n ...data,\n courseTitle: data.courseTitle,\n description: 'Description of the certificate',\n editing: data.editing || true,\n isActive: data.isActive || false,\n name: 'Name of the certificate',\n version: data.version || 1,\n signatories: data.signatories\n .map(signatory => convertObjectToSnakeCase(signatory, true))\n .map(signatorySnakeCase => ({ ...signatorySnakeCase, certificate: signatorySnakeCase.certificate || null })),\n}), true);\n","/* eslint-disable import/prefer-default-export */\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nimport { prepareCertificatePayload } from '../utils';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\n\nexport const getCertificatesApiUrl = (courseId) => `${getApiBaseUrl()}/api/contentstore/v1/certificates/${courseId}`;\nexport const getCertificateApiUrl = (courseId) => `${getApiBaseUrl()}/certificates/${courseId}`;\nexport const getUpdateCertificateApiUrl = (courseId, certificateId) => `${getCertificateApiUrl(courseId)}/${certificateId}`;\nexport const getUpdateCertificateActiveStatusApiUrl = (path) => `${getApiBaseUrl()}${path}`;\n\n/**\n * Gets certificates for a course.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getCertificates(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCertificatesApiUrl(courseId));\n\n return camelCaseObject(data);\n}\n\n/**\n * Create course certificate.\n * @param {string} courseId\n * @param {object} certificatesData\n * @returns {Promise}\n */\n\nexport async function createCertificate(courseId, certificatesData) {\n const { data } = await getAuthenticatedHttpClient()\n .post(\n getCertificateApiUrl(courseId),\n prepareCertificatePayload(certificatesData),\n );\n\n return camelCaseObject(data);\n}\n\n/**\n * Update course certificate.\n * @param {string} courseId\n * @param {object} certificateData\n * @returns {Promise}\n */\nexport async function updateCertificate(courseId, certificateData) {\n const { data } = await getAuthenticatedHttpClient()\n .post(\n getUpdateCertificateApiUrl(courseId, certificateData.id),\n prepareCertificatePayload(certificateData),\n );\n return camelCaseObject(data);\n}\n\n/**\n * Delete course certificate.\n * @param {string} courseId\n * @param {object} certificateId\n * @returns {Promise}\n */\nexport async function deleteCertificate(courseId, certificateId) {\n const { data } = await getAuthenticatedHttpClient()\n .delete(\n getUpdateCertificateApiUrl(courseId, certificateId),\n );\n return data;\n}\n\n/**\n * Activate/deactivate course certificate.\n * @param {string} courseId\n * @param {object} activationStatus\n * @returns {Promise}\n */\nexport async function updateActiveStatus(path, activationStatus) {\n const body = {\n is_active: activationStatus,\n };\n\n const { data } = await getAuthenticatedHttpClient()\n .post(\n getUpdateCertificateActiveStatusApiUrl(path),\n body,\n );\n return camelCaseObject(data);\n}\n","import { RequestStatus } from '../../data/constants';\nimport {\n hideProcessingNotification,\n showProcessingNotification,\n} from '../../generic/processing-notification/data/slice';\nimport { handleResponseErrors } from '../../generic/saving-error-alert';\nimport { NOTIFICATION_MESSAGES } from '../../constants';\nimport {\n getCertificates,\n createCertificate,\n updateCertificate,\n deleteCertificate,\n updateActiveStatus,\n} from './api';\nimport {\n fetchCertificatesSuccess,\n updateLoadingStatus,\n updateSavingStatus,\n createCertificateSuccess,\n updateCertificateSuccess,\n deleteCertificateSuccess,\n} from './slice';\nimport { ACTIVATION_MESSAGES } from './constants';\n\nexport function fetchCertificates(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const certificates = await getCertificates(courseId);\n\n dispatch(fetchCertificatesSuccess(certificates));\n dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 403) {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.DENIED }));\n } else {\n dispatch(updateLoadingStatus({ courseId, status: RequestStatus.FAILED }));\n }\n }\n };\n}\n\nexport function createCourseCertificate(courseId, certificate) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n const certificateValues = await createCertificate(courseId, certificate);\n dispatch(createCertificateSuccess(certificateValues));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n return handleResponseErrors(error, dispatch, updateSavingStatus);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function updateCourseCertificate(courseId, certificate) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n const certificatesValues = await updateCertificate(courseId, certificate);\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(updateCertificateSuccess(certificatesValues));\n return true;\n } catch (error) {\n return handleResponseErrors(error, dispatch, updateSavingStatus);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function deleteCourseCertificate(courseId, certificateId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.deleting));\n\n try {\n const certificatesValues = await deleteCertificate(courseId, certificateId);\n dispatch(deleteCertificateSuccess(certificatesValues));\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n return handleResponseErrors(error, dispatch, updateSavingStatus);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function updateCertificateActiveStatus(courseId, path, activationStatus) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n\n dispatch(showProcessingNotification(\n activationStatus ? ACTIVATION_MESSAGES.activating : ACTIVATION_MESSAGES.deactivating,\n ));\n\n try {\n await updateActiveStatus(path, activationStatus);\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(fetchCertificates(courseId));\n return true;\n } catch (error) {\n return handleResponseErrors(error, dispatch, updateSavingStatus);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.certificates.heading.title',\n defaultMessage: 'Certificates',\n },\n headingTitleTabText: {\n id: 'course-authoring.certificates.heading.title.tab.text',\n defaultMessage: 'Course certificates',\n },\n headingSubtitle: {\n id: 'course-authoring.certificates.heading.subtitle',\n defaultMessage: 'Settings',\n },\n headingActionsPreview: {\n id: 'course-authoring.certificates.heading.action.button.preview',\n defaultMessage: 'Preview certificate',\n },\n headingActionsDeactivate: {\n id: 'course-authoring.certificates.heading.action.button.deactivate',\n defaultMessage: 'Deactivate',\n },\n headingActionsActivate: {\n id: 'course-authoring.certificates.heading.action.button.activate',\n defaultMessage: 'Activate',\n },\n noCertificatesText: {\n id: 'course-authoring.certificates.nocertificate.text',\n defaultMessage: 'You haven\\'t added any certificates to this course yet.',\n },\n setupCertificateBtn: {\n id: 'course-authoring.certificates.setup.certificate.button',\n defaultMessage: 'Add your first certificate',\n },\n withoutModesText: {\n id: 'course-authoring.certificates.without.modes.text',\n defaultMessage: 'This course does not use a mode that offers certificates.',\n },\n cardCreate: {\n id: 'course-authoring.certificates.create',\n defaultMessage: 'Create',\n },\n cardCancel: {\n id: 'course-authoring.certificates.cancel',\n defaultMessage: 'Cancel',\n },\n deleteTooltip: {\n id: 'course-authoring.certificates.signatories.delete.tooltip',\n defaultMessage: 'Delete',\n },\n editTooltip: {\n id: 'course-authoring.certificates.signatories.edit.tooltip',\n defaultMessage: 'Edit',\n },\n saveTooltip: {\n id: 'course-authoring.certificates.signatories.save.tooltip',\n defaultMessage: 'Save',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport { Stack } from '@openedx/paragon';\n\nconst CertificateSection = ({\n title, actions, children, ...rest\n}) => (\n
    \n \n

    {title}

    \n {actions && actions}\n
    \n
    \n
    \n {children}\n
    \n
    \n);\n\nCertificateSection.defaultProps = {\n children: null,\n actions: null,\n};\nCertificateSection.propTypes = {\n children: PropTypes.node,\n actions: PropTypes.node,\n title: PropTypes.string.isRequired,\n};\n\nexport default CertificateSection;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n detailsSectionTitle: {\n id: 'course-authoring.certificates.details.section.title',\n defaultMessage: 'Certificate details',\n description: 'Title for the section',\n },\n detailsCourseTitle: {\n id: 'course-authoring.certificates.details.course.title',\n defaultMessage: 'Course title',\n description: 'Label for displaying the official course title in the certificate details section',\n },\n detailsCourseTitleOverride: {\n id: 'course-authoring.certificates.details.course.title.override',\n defaultMessage: 'Course title override',\n description: 'Label for the course title override input field',\n },\n detailsCourseTitleOverrideDescription: {\n id: 'course-authoring.certificates.details.course.title.override.description',\n defaultMessage: 'Specify an alternative to the official course title to display on certificates. Leave blank to use the official course title.',\n description: 'Helper text under the course title override input field',\n },\n detailsCourseNumber: {\n id: 'course-authoring.certificates.details.course.number',\n defaultMessage: 'Course number',\n description: 'Label for displaying the official course number in the certificate details section',\n },\n detailsCourseNumberOverride: {\n id: 'course-authoring.certificates.details.course.number.override',\n defaultMessage: 'Course number override',\n description: 'Label for the course number override input field',\n },\n deleteCertificateConfirmationTitle: {\n id: 'course-authoring.certificates.details.confirm-modal',\n defaultMessage: 'Delete this certificate?',\n description: 'Title for the confirmation modal when a user attempts to delete a certificate',\n },\n deleteCertificateMessage: {\n id: 'course-authoring.certificates.details.confirm-modal.message',\n defaultMessage: 'Deleting this certificate is permanent and cannot be undone.',\n description: 'Warning message within the delete confirmation modal, emphasizing the permanent nature of the action',\n },\n editCertificateConfirmationTitle: {\n id: 'course-authoring.certificates.details.confirm.edit',\n defaultMessage: 'Edit this certificate?',\n description: 'Title for the confirmation modal when a user attempts to edit an already activated (live) certificate',\n },\n editCertificateMessage: {\n id: 'course-authoring.certificates.details.confirm.edit.message',\n defaultMessage: 'This certificate has already been activated and is live. Are you sure you want to continue editing?',\n description: 'Message warning users about the implications of editing a certificate that is already live, prompting for confirmation',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Icon, Stack, IconButtonWithTooltip,\n} from '@openedx/paragon';\nimport {\n EditOutline as EditOutlineIcon, DeleteOutline as DeleteOutlineIcon,\n} from '@openedx/paragon/icons';\n\nimport CertificateSection from '../certificate-section/CertificateSection';\nimport ModalNotification from '../../generic/modal-notification';\nimport commonMessages from '../messages';\nimport messages from './messages';\nimport useCertificateDetails from './hooks/useCertificateDetails';\n\nconst CertificateDetails = ({\n certificateId,\n detailsCourseTitle,\n courseTitleOverride,\n detailsCourseNumber,\n courseNumberOverride,\n}) => {\n const intl = useIntl();\n const {\n isConfirmOpen,\n confirmOpen,\n confirmClose,\n isEditModalOpen,\n editModalOpen,\n editModalClose,\n isCertificateActive,\n handleEditAll,\n handleDeleteCard,\n } = useCertificateDetails(certificateId);\n\n return (\n \n {intl.formatMessage(commonMessages.editTooltip)}}\n alt={intl.formatMessage(commonMessages.editTooltip)}\n onClick={isCertificateActive ? editModalOpen : handleEditAll}\n />\n {intl.formatMessage(commonMessages.deleteTooltip)}}\n alt={intl.formatMessage(commonMessages.deleteTooltip)}\n onClick={confirmOpen}\n />\n \n )}\n >\n \n \n

    \n {intl.formatMessage(messages.detailsCourseTitle)}: {detailsCourseTitle}\n

    \n

    \n {intl.formatMessage(messages.detailsCourseNumber)}: {detailsCourseNumber}\n

    \n
    \n \n {courseTitleOverride && (\n

    \n {intl.formatMessage(messages.detailsCourseTitleOverride)}: {courseTitleOverride}\n

    \n )}\n {courseNumberOverride && (\n

    \n {intl.formatMessage(messages.detailsCourseNumberOverride)}: {courseNumberOverride}\n

    \n )}\n
    \n
    \n {\n editModalClose();\n handleEditAll();\n }}\n />\n {\n confirmClose();\n handleDeleteCard();\n }}\n />\n \n );\n};\n\nCertificateDetails.defaultProps = {\n courseTitleOverride: '',\n courseNumberOverride: '',\n};\n\nCertificateDetails.propTypes = {\n certificateId: PropTypes.number.isRequired,\n courseTitleOverride: PropTypes.string,\n courseNumberOverride: PropTypes.string,\n detailsCourseTitle: PropTypes.string.isRequired,\n detailsCourseNumber: PropTypes.string.isRequired,\n};\n\nexport default CertificateDetails;\n","import { useDispatch, useSelector } from 'react-redux';\nimport { useParams } from 'react-router-dom';\nimport { useToggle } from '@openedx/paragon';\n\nimport { setMode } from '../../data/slice';\nimport { deleteCourseCertificate } from '../../data/thunks';\nimport { getIsCertificateActive } from '../../data/selectors';\nimport { MODE_STATES } from '../../data/constants';\n\nconst useCertificateDetails = (certificateId) => {\n const dispatch = useDispatch();\n const { courseId } = useParams();\n const [isConfirmOpen, confirmOpen, confirmClose] = useToggle(false);\n const [isEditModalOpen, editModalOpen, editModalClose] = useToggle(false);\n const isCertificateActive = useSelector(getIsCertificateActive);\n\n const handleEditAll = () => {\n dispatch(setMode(MODE_STATES.editAll));\n };\n\n const handleDeleteCard = () => {\n if (certificateId) {\n dispatch(deleteCourseCertificate(courseId, certificateId));\n }\n };\n\n return {\n isConfirmOpen,\n confirmOpen,\n confirmClose,\n isEditModalOpen,\n editModalOpen,\n editModalClose,\n isCertificateActive,\n handleEditAll,\n handleDeleteCard,\n };\n};\n\nexport default useCertificateDetails;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n signatoryTitle: {\n id: 'course-authoring.certificates.signatories.title',\n defaultMessage: 'Signatory',\n description: 'Title for a signatory',\n },\n signatoriesRecommendation: {\n id: 'course-authoring.certificates.signatories.recommendation',\n defaultMessage: 'It is strongly recommended that you include four or fewer signatories. If you include additional signatories, preview the certificate in Print View to ensure the certificate will print correctly on one page.',\n description: 'A recommendation for the number of signatories to include on a certificate, emphasizing the importance of testing the print layout',\n },\n signatoriesSectionTitle: {\n id: 'course-authoring.certificates.signatories.section.title',\n defaultMessage: 'Certificate signatories',\n description: 'Title for the section',\n },\n addSignatoryButton: {\n id: 'course-authoring.certificates.signatories.add.signatory.button',\n defaultMessage: 'Add additional signatory',\n description: 'Button text for adding a new signatory to the certificate',\n },\n addSignatoryButtonDescription: {\n id: 'course-authoring.certificates.signatories.add.signatory.button.description',\n defaultMessage: '(Add signatories for a certificate)',\n description: 'Helper text for the button used to add signatories',\n },\n nameLabel: {\n id: 'course-authoring.certificates.signatories.name.label',\n defaultMessage: 'Name',\n description: 'Label for the input field where the signatory name is entered',\n },\n namePlaceholder: {\n id: 'course-authoring.certificates.signatories.name.placeholder',\n defaultMessage: 'Name of the signatory',\n description: 'Placeholder text for the signatory name input field',\n },\n nameDescription: {\n id: 'course-authoring.certificates.signatories.name.description',\n defaultMessage: 'The name of this signatory as it should appear on certificates.',\n description: 'Helper text under the name input field',\n },\n titleLabel: {\n id: 'course-authoring.certificates.signatories.title.label',\n defaultMessage: 'Title',\n description: 'Label for the input field where the signatory title is entered',\n },\n titlePlaceholder: {\n id: 'course-authoring.certificates.signatories.title.placeholder',\n defaultMessage: 'Title of the signatory',\n description: 'Placeholder text for the signatory title input field',\n },\n titleDescription: {\n id: 'course-authoring.certificates.signatories.title.description',\n defaultMessage: 'Titles more than 100 characters may prevent students from printing their certificate on a single page.',\n description: 'Helper text under the title input field',\n },\n organizationLabel: {\n id: 'course-authoring.certificates.signatories.organization.label',\n defaultMessage: 'Organization',\n description: 'Label for the input field where the signatory organization is entered',\n },\n organizationPlaceholder: {\n id: 'course-authoring.certificates.signatories.organization.placeholder',\n defaultMessage: 'Organization of the signatory',\n description: 'Placeholder text for the signatory organization input field',\n },\n organizationDescription: {\n id: 'course-authoring.certificates.signatories.organization.description',\n defaultMessage: 'The organization that this signatory belongs to, as it should appear on certificates.',\n description: 'Helper text under the organization input field',\n },\n imageLabel: {\n id: 'course-authoring.certificates.signatories.image.label',\n defaultMessage: 'Signature image',\n description: 'Label for the input field where the signatory image is selected',\n },\n imagePlaceholder: {\n id: 'course-authoring.certificates.signatories.image.placeholder',\n defaultMessage: 'Path to signature image',\n description: 'Placeholder text for the signatory image input field',\n },\n imageDescription: {\n id: 'course-authoring.certificates.signatories.image.description',\n defaultMessage: 'Image must be in PNG format',\n description: 'Helper text under the image input field',\n },\n uploadImageButton: {\n id: 'course-authoring.certificates.signatories.upload.image.button',\n defaultMessage: '{uploadText} signature image',\n description: 'Button text for adding or replacing a signature image',\n },\n uploadModal: {\n id: 'course-authoring.certificates.signatories.upload.modal',\n defaultMessage: 'Upload',\n description: 'Option for button text for adding a new signature image',\n },\n uploadModalReplace: {\n id: 'course-authoring.certificates.signatories.upload.modal.replace',\n defaultMessage: 'Replace',\n description: 'Option for button text for replacing an existing signature image',\n },\n deleteSignatoryConfirmation: {\n id: 'course-authoring.certificates.signatories.confirm-modal',\n defaultMessage: 'Delete \"{name}\" from the list of signatories?',\n description: 'Title for the confirmation modal when a user attempts to delete a signatory, where \"{name}\" is the name of the signatory to be deleted',\n },\n deleteSignatoryConfirmationMessage: {\n id: 'course-authoring.certificates.signatories.confirm-modal.message',\n defaultMessage: 'This action cannot be undone.',\n description: 'A warning message that emphasizes the permanence of the delete action for a signatory',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport {\n Image, Icon, Stack, IconButtonWithTooltip,\n} from '@openedx/paragon';\nimport {\n EditOutline as EditOutlineIcon,\n} from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport commonMessages from '../../messages';\nimport messages from '../messages';\n\nconst Signatory = ({\n index,\n name,\n title,\n organization,\n signatureImagePath,\n handleEdit,\n}) => {\n const intl = useIntl();\n\n return (\n
    \n \n

    {`${intl.formatMessage(messages.signatoryTitle)} ${index + 1}`}

    \n \n

    {intl.formatMessage(messages.nameLabel)} {name}

    \n

    {intl.formatMessage(messages.titleLabel)} {title}

    \n

    {intl.formatMessage(messages.organizationLabel)} {organization}

    \n
    \n
    \n\n {intl.formatMessage(commonMessages.editTooltip)}
    }\n onClick={handleEdit}\n />\n
    \n {signatureImagePath && (\n \n )}\n
    \n \n );\n};\n\nSignatory.propTypes = {\n name: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n organization: PropTypes.string.isRequired,\n signatureImagePath: PropTypes.string.isRequired,\n index: PropTypes.number.isRequired,\n handleEdit: PropTypes.func.isRequired,\n};\n\nexport default Signatory;\n","import PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport {\n Image, Icon, Stack, IconButtonWithTooltip, FormLabel, Form, Button, useToggle,\n} from '@openedx/paragon';\nimport { DeleteOutline as DeleteOutlineIcon } from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport ModalDropzone from '../../../generic/modal-dropzone/ModalDropzone';\nimport ModalNotification from '../../../generic/modal-notification';\nimport { updateSavingImageStatus } from '../../data/slice';\nimport commonMessages from '../../messages';\nimport messages from '../messages';\n\nconst SignatoryForm = ({\n index,\n name,\n title,\n isEdit,\n handleBlur,\n organization,\n handleChange,\n setFieldValue,\n showDeleteButton,\n signatureImagePath,\n handleDeleteSignatory,\n handleCancelUpdateSignatory,\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const [isOpen, open, close] = useToggle(false);\n const [isConfirmOpen, confirmOpen, confirmClose] = useToggle(false);\n\n const handleImageUpload = (newImagePath) => {\n setFieldValue(`signatories[${index}].signatureImagePath`, newImagePath);\n };\n\n const handleSavingStatusDispatch = (status) => {\n dispatch(updateSavingImageStatus(status));\n };\n\n const formData = [\n {\n labelText: intl.formatMessage(messages.nameLabel),\n value: name,\n name: `signatories[${index}].name`,\n placeholder: intl.formatMessage(messages.namePlaceholder),\n feedback: intl.formatMessage(messages.nameDescription),\n onChange: handleChange,\n onBlur: handleBlur,\n },\n {\n as: 'textarea',\n labelText: intl.formatMessage(messages.titleLabel),\n value: title,\n name: `signatories[${index}].title`,\n placeholder: intl.formatMessage(messages.titlePlaceholder),\n feedback: intl.formatMessage(messages.titleDescription),\n onChange: handleChange,\n onBlur: handleBlur,\n },\n {\n labelText: intl.formatMessage(messages.organizationLabel),\n value: organization,\n name: `signatories[${index}].organization`,\n placeholder: intl.formatMessage(messages.organizationPlaceholder),\n feedback: intl.formatMessage(messages.organizationDescription),\n onChange: handleChange,\n onBlur: handleBlur,\n },\n ];\n\n const uploadReplaceText = intl.formatMessage(\n messages.uploadImageButton,\n {\n uploadText: signatureImagePath\n ? intl.formatMessage(messages.uploadModalReplace)\n : intl.formatMessage(messages.uploadModal),\n },\n );\n\n return (\n
    \n \n

    {`${intl.formatMessage(messages.signatoryTitle)} ${index + 1}`}

    \n \n {showDeleteButton && (\n {intl.formatMessage(commonMessages.deleteTooltip)}
    }\n onClick={confirmOpen}\n />\n )}\n \n \n\n \n {formData.map(({ labelText, feedback, ...rest }) => (\n \n {labelText}\n \n \n {feedback}\n \n \n ))}\n \n {intl.formatMessage(messages.imageLabel)}\n {signatureImagePath && (\n \n )}\n \n \n \n \n {intl.formatMessage(messages.imageDescription)}\n \n \n \n \n \n \n {isEdit && (\n \n \n handleCancelUpdateSignatory()}\n >\n {intl.formatMessage(commonMessages.cardCancel)}\n \n \n )}\n\n \n {\n confirmClose();\n handleDeleteSignatory();\n }}\n />\n \n );\n};\n\nSignatoryForm.defaultProps = {\n isEdit: false,\n handleChange: null,\n handleBlur: null,\n handleDeleteSignatory: null,\n setFieldValue: null,\n handleCancelUpdateSignatory: null,\n};\n\nSignatoryForm.propTypes = {\n name: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n organization: PropTypes.string.isRequired,\n showDeleteButton: PropTypes.bool.isRequired,\n signatureImagePath: PropTypes.string.isRequired,\n index: PropTypes.number.isRequired,\n isEdit: PropTypes.bool,\n handleChange: PropTypes.func,\n handleBlur: PropTypes.func,\n setFieldValue: PropTypes.func,\n handleDeleteSignatory: PropTypes.func,\n handleCancelUpdateSignatory: PropTypes.func,\n};\n\nexport default SignatoryForm;\n","import PropTypes from 'prop-types';\nimport { Stack, Button, Form } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport CertificateSection from '../certificate-section/CertificateSection';\nimport Signatory from './signatory/Signatory';\nimport SignatoryForm from './signatory/SignatoryForm';\nimport useEditSignatory from './hooks/useEditSignatory';\nimport useCreateSignatory from './hooks/useCreateSignatory';\nimport messages from './messages';\n\nconst CertificateSignatories = ({\n isForm,\n editModes,\n signatories,\n arrayHelpers,\n initialSignatoriesValues,\n setFieldValue,\n setEditModes,\n handleBlur,\n handleChange,\n}) => {\n const intl = useIntl();\n\n const {\n toggleEditSignatory,\n handleDeleteSignatory,\n handleCancelUpdateSignatory,\n } = useEditSignatory({\n arrayHelpers, editModes, setEditModes, setFieldValue, initialSignatoriesValues,\n });\n\n const { handleAddSignatory } = useCreateSignatory({ arrayHelpers });\n\n return (\n \n
    \n

    \n {intl.formatMessage(messages.signatoriesRecommendation)}\n

    \n \n {signatories.map(({\n id, name, title, organization, signatureImagePath,\n }, idx) => (\n isForm || editModes[idx] ? (\n 1 && !editModes[idx]}\n handleDeleteSignatory={() => handleDeleteSignatory(idx)}\n {...(editModes[idx] && {\n handleCancelUpdateSignatory: () => handleCancelUpdateSignatory(idx),\n })}\n />\n ) : (\n toggleEditSignatory(idx)}\n />\n )\n ))}\n \n {isForm && (\n <>\n \n \n {intl.formatMessage(messages.addSignatoryButtonDescription)}\n \n \n )}\n
    \n \n );\n};\n\nCertificateSignatories.defaultProps = {\n handleChange: null,\n handleBlur: null,\n setFieldValue: null,\n arrayHelpers: null,\n isForm: false,\n editModes: {},\n setEditModes: null,\n initialSignatoriesValues: null,\n};\n\nCertificateSignatories.propTypes = {\n isForm: PropTypes.bool,\n editModes: PropTypes.objectOf(PropTypes.bool),\n initialSignatoriesValues: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.string.isRequired,\n organization: PropTypes.string.isRequired,\n signatureImagePath: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n })),\n handleChange: PropTypes.func,\n handleBlur: PropTypes.func,\n setFieldValue: PropTypes.func,\n setEditModes: PropTypes.func,\n arrayHelpers: PropTypes.shape({\n push: PropTypes.func,\n remove: PropTypes.func,\n }),\n signatories: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.string.isRequired,\n organization: PropTypes.string.isRequired,\n signatureImagePath: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n })).isRequired,\n};\n\nexport default CertificateSignatories;\n","const useEditSignatory = ({\n arrayHelpers, editModes, setEditModes, setFieldValue, initialSignatoriesValues,\n}) => {\n const handleDeleteSignatory = (id) => {\n arrayHelpers.remove(id);\n\n if (editModes && setEditModes) {\n const newEditModes = { ...editModes };\n delete newEditModes[id];\n setEditModes(newEditModes);\n }\n };\n\n const toggleEditSignatory = (id) => {\n setEditModes(prev => ({\n ...prev,\n [id]: !prev[id],\n }));\n };\n\n const handleCancelUpdateSignatory = (id) => {\n const signatoryInitialValues = initialSignatoriesValues[id];\n Object.keys(signatoryInitialValues).forEach(fieldKey => {\n const fieldName = `signatories[${id}].${fieldKey}`;\n setFieldValue(fieldName, signatoryInitialValues[fieldKey]);\n });\n toggleEditSignatory(id);\n };\n\n return { toggleEditSignatory, handleDeleteSignatory, handleCancelUpdateSignatory };\n};\n\nexport default useEditSignatory;\n","import { v4 as uuid } from 'uuid';\n\nconst useCreateSignatory = ({ arrayHelpers }) => {\n const handleAddSignatory = () => {\n const getNewSignatory = () => ({\n id: `local-${uuid()}`, name: '', title: '', organization: '', signatureImagePath: '',\n });\n\n arrayHelpers.push(getNewSignatory());\n };\n\n return { handleAddSignatory };\n};\n\nexport default useCreateSignatory;\n","import { v4 as uuid } from 'uuid';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const defaultCertificate = {\n courseTitle: '',\n signatories: [{\n id: `local-${uuid()}`,\n name: '',\n title: '',\n organization: '',\n signatureImagePath: '',\n }],\n};\n","import { useState } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\n\nimport { MODE_STATES } from '../../data/constants';\nimport {\n getCourseTitle, getCourseNumber, getCourseNumberOverride, getCertificates,\n} from '../../data/selectors';\nimport { updateCourseCertificate } from '../../data/thunks';\nimport { setMode } from '../../data/slice';\nimport { defaultCertificate } from '../../constants';\n\nconst useCertificatesList = (courseId) => {\n const dispatch = useDispatch();\n const certificates = useSelector(getCertificates);\n const courseTitle = useSelector(getCourseTitle);\n const courseNumber = useSelector(getCourseNumber);\n const courseNumberOverride = useSelector(getCourseNumberOverride);\n\n const [editModes, setEditModes] = useState({});\n\n const initialValues = certificates.map((certificate) => ({\n ...certificate,\n courseTitle: certificate.courseTitle || defaultCertificate.courseTitle,\n signatories: certificate.signatories || defaultCertificate.signatories,\n }));\n\n const handleSubmit = async (values) => {\n await dispatch(updateCourseCertificate(courseId, values));\n setEditModes({});\n dispatch(setMode(MODE_STATES.view));\n };\n\n return {\n editModes,\n courseTitle,\n certificates,\n courseNumber,\n initialValues,\n courseNumberOverride,\n setEditModes,\n handleSubmit,\n };\n};\n\nexport default useCertificatesList;\n","import PropTypes from 'prop-types';\nimport { Card, Stack } from '@openedx/paragon';\nimport { Formik, Form, FieldArray } from 'formik';\n\nimport CertificateDetails from '../certificate-details/CertificateDetails';\nimport CertificateSignatories from '../certificate-signatories/CertificateSignatories';\nimport useCertificatesList from './hooks/useCertificatesList';\n\nconst CertificatesList = ({ courseId }) => {\n const {\n editModes,\n courseTitle,\n certificates,\n courseNumber,\n initialValues,\n courseNumberOverride,\n setEditModes,\n handleSubmit,\n } = useCertificatesList(courseId);\n\n return (\n <>\n {certificates.map((certificate, idx) => (\n \n {({\n values, handleChange, handleBlur, setFieldValue,\n }) => (\n
    \n \n \n \n \n (\n \n )}\n />\n \n \n \n
    \n )}\n
    \n ))}\n \n );\n};\n\nCertificatesList.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default CertificatesList;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Stack, Form } from '@openedx/paragon';\n\nimport CertificateSection from '../certificate-section/CertificateSection';\nimport messages from './messages';\n\nconst CertificateDetailsForm = ({\n detailsCourseTitle,\n courseTitleOverride,\n handleChange,\n handleBlur,\n}) => {\n const intl = useIntl();\n return (\n \n \n \n

    \n {intl.formatMessage(messages.detailsCourseTitle)}: {detailsCourseTitle}\n

    \n
    \n \n \n {intl.formatMessage(messages.detailsCourseTitleOverride)}\n \n \n {intl.formatMessage(messages.detailsCourseTitleOverrideDescription)}\n \n \n \n
    \n \n );\n};\n\nCertificateDetailsForm.propTypes = {\n courseTitleOverride: PropTypes.string.isRequired,\n detailsCourseTitle: PropTypes.string.isRequired,\n handleChange: PropTypes.func.isRequired,\n handleBlur: PropTypes.func.isRequired,\n};\n\nexport default CertificateDetailsForm;\n","import { useSelector, useDispatch } from 'react-redux';\n\nimport { MODE_STATES } from '../../data/constants';\nimport { getCourseTitle } from '../../data/selectors';\nimport { setMode } from '../../data/slice';\nimport { createCourseCertificate } from '../../data/thunks';\n\nconst useCertificateCreateForm = (courseId) => {\n const dispatch = useDispatch();\n const courseTitle = useSelector(getCourseTitle);\n\n const handleCertificateSubmit = (values) => {\n const signatoriesWithoutIds = values.signatories.map(({ id, ...rest }) => rest);\n const newValues = { ...values, signatories: signatoriesWithoutIds };\n dispatch(createCourseCertificate(courseId, newValues));\n };\n\n const handleFormCancel = (resetForm) => {\n dispatch(setMode(MODE_STATES.noCertificates));\n resetForm();\n window.scrollTo({ top: 0, behavior: 'smooth' });\n };\n return {\n courseTitle, handleCertificateSubmit, handleFormCancel,\n };\n};\n\nexport default useCertificateCreateForm;\n","import PropTypes from 'prop-types';\nimport { Card, Stack, Button } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Formik, Form, FieldArray } from 'formik';\n\nimport CertificateDetailsForm from '../certificate-details/CertificateDetailsForm';\nimport CertificateSignatories from '../certificate-signatories/CertificateSignatories';\nimport { defaultCertificate } from '../constants';\nimport messages from '../messages';\nimport useCertificateCreateForm from './hooks/useCertificateCreateForm';\n\nconst CertificateCreateForm = ({ courseId }) => {\n const intl = useIntl();\n const {\n courseTitle, handleCertificateSubmit, handleFormCancel,\n } = useCertificateCreateForm(courseId);\n\n return (\n \n {({\n values, handleChange, handleBlur, resetForm, setFieldValue,\n }) => (\n
    \n \n \n \n \n (\n \n )}\n />\n \n \n \n \n handleFormCancel(resetForm)}\n >\n {intl.formatMessage(messages.cardCancel)}\n \n \n \n
    \n )}\n
    \n );\n};\n\nCertificateCreateForm.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default CertificateCreateForm;\n","import { useSelector, useDispatch } from 'react-redux';\nimport { useToggle } from '@openedx/paragon';\n\nimport { MODE_STATES } from '../../data/constants';\nimport { getCourseTitle, getCertificates } from '../../data/selectors';\nimport { setMode } from '../../data/slice';\nimport { updateCourseCertificate, deleteCourseCertificate } from '../../data/thunks';\nimport { defaultCertificate } from '../../constants';\n\nconst useCertificateEditForm = (courseId) => {\n const dispatch = useDispatch();\n const [isConfirmOpen, confirmOpen, confirmClose] = useToggle(false);\n const courseTitle = useSelector(getCourseTitle);\n const certificates = useSelector(getCertificates);\n\n const handleCertificateSubmit = (values) => {\n const signatoriesWithoutLocalIds = values.signatories.map(signatory => {\n if (signatory.id && typeof signatory.id === 'string' && signatory.id.startsWith('local-')) {\n const { id, ...rest } = signatory;\n return rest;\n }\n return signatory;\n });\n\n const newValues = {\n ...values,\n signatories: signatoriesWithoutLocalIds,\n };\n\n dispatch(updateCourseCertificate(courseId, newValues));\n };\n\n const handleCertificateUpdateCancel = (resetForm) => {\n dispatch(setMode(MODE_STATES.view));\n resetForm();\n window.scrollTo({ top: 0, behavior: 'smooth' });\n };\n\n const handleCertificateDelete = (certificateId) => {\n dispatch(deleteCourseCertificate(courseId, certificateId));\n };\n\n const initialValues = certificates.map((certificate) => ({\n ...certificate,\n courseTitle: certificate.courseTitle || defaultCertificate.courseTitle,\n signatories: certificate.signatories || defaultCertificate.signatories,\n }));\n\n return {\n confirmOpen,\n courseTitle,\n certificates,\n confirmClose,\n initialValues,\n isConfirmOpen,\n handleCertificateDelete,\n handleCertificateSubmit,\n handleCertificateUpdateCancel,\n };\n};\n\nexport default useCertificateEditForm;\n","import PropTypes from 'prop-types';\nimport { Card, Stack, Button } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Formik, Form, FieldArray } from 'formik';\n\nimport ModalNotification from '../../generic/modal-notification';\nimport CertificateDetailsForm from '../certificate-details/CertificateDetailsForm';\nimport CertificateSignatories from '../certificate-signatories/CertificateSignatories';\nimport commonMessages from '../messages';\nimport messages from '../certificate-details/messages';\nimport useCertificateEditForm from './hooks/useCertificateEditForm';\n\nconst CertificateEditForm = ({ courseId }) => {\n const intl = useIntl();\n const {\n confirmOpen,\n courseTitle,\n certificates,\n confirmClose,\n initialValues,\n isConfirmOpen,\n handleCertificateDelete,\n handleCertificateSubmit,\n handleCertificateUpdateCancel,\n } = useCertificateEditForm(courseId);\n\n return (\n <>\n {certificates.map((certificate, id) => (\n \n {({\n values, handleChange, handleBlur, resetForm, setFieldValue,\n }) => (\n <>\n
    \n \n \n \n \n (\n \n )}\n />\n \n \n \n \n handleCertificateUpdateCancel(resetForm)}\n >\n {intl.formatMessage(commonMessages.cardCancel)}\n \n confirmOpen(certificate.id)}\n >\n {intl.formatMessage(commonMessages.deleteTooltip)}\n \n \n \n
    \n confirmClose()}\n handleAction={() => {\n confirmClose();\n handleCertificateDelete(certificate.id);\n }}\n />\n \n )}\n
    \n ))}\n \n );\n};\n\nCertificateEditForm.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default CertificateEditForm;\n","// eslint-disable-next-line import/prefer-default-export\nexport const getSidebarData = ({ messages, intl }) => [\n {\n title: intl.formatMessage(messages.workingWithCertificatesTitle),\n paragraphs: [\n intl.formatMessage(messages.workingWithCertificatesFirstParagraph),\n intl.formatMessage(\n messages.workingWithCertificatesSecondParagraph,\n { strongText: {intl.formatMessage(messages.workingWithCertificatesSecondParagraph_strong)} },\n ),\n intl.formatMessage(\n messages.workingWithCertificatesThirdParagraph,\n { strongText: {intl.formatMessage(messages.workingWithCertificatesThirdParagraph_strong)} },\n ),\n ],\n },\n {\n title: intl.formatMessage(messages.issuingCertificatesTitle),\n paragraphs: [\n intl.formatMessage(\n messages.issuingCertificatesFirstParagraph,\n { strongText: {intl.formatMessage(messages.issuingCertificatesFirstParagraph_strong)} },\n ),\n intl.formatMessage(\n messages.issuingCertificatesSecondParagraph,\n { strongText: {intl.formatMessage(messages.issuingCertificatesSecondParagraph_strong)} },\n ),\n ],\n },\n];\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst SidebarBlock = ({ title, paragraphs, isLast }) => (\n \n

    \n {title}\n

    \n {paragraphs.map((text) => (\n

    \n {text}\n

    \n ))}\n {!isLast &&
    }\n
    \n);\n\nSidebarBlock.defaultProps = {\n isLast: false,\n};\n\nSidebarBlock.propTypes = {\n title: PropTypes.string.isRequired,\n paragraphs: PropTypes.arrayOf(PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.node,\n ])).isRequired,\n isLast: PropTypes.bool,\n};\n\nexport default SidebarBlock;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n workingWithCertificatesTitle: {\n id: 'course-authoring.certificates.sidebar.working-with-certificates.title',\n defaultMessage: 'Working with certificates',\n description: 'Title for the section on how to work with certificates',\n },\n workingWithCertificatesFirstParagraph: {\n id: 'course-authoring.certificates.sidebar.working-with-certificates.first-paragraph',\n defaultMessage: 'Specify a course title to use on the certificate if the course\\'s official title is too long to be displayed well.',\n description: 'Instructions for specifying a course title for the certificate',\n },\n workingWithCertificatesSecondParagraph: {\n id: 'course-authoring.certificates.sidebar.working-with-certificates.second-paragraph',\n defaultMessage: 'For verified certificates, specify between one and four signatories and upload the associated images. To edit or delete a certificate before it is activated, hover over the top right corner of the form and select {strongText} or the delete icon.',\n description: 'Details on how to specify signatories for verified certificates and edit or delete certificates',\n },\n workingWithCertificatesSecondParagraph_strong: {\n id: 'course-authoring.certificates.sidebar.working-with-certificates.second-paragraph.strong',\n defaultMessage: 'Edit',\n description: 'The strong emphasis text for the edit option',\n },\n workingWithCertificatesThirdParagraph: {\n id: 'course-authoring.certificates.sidebar.working-with-certificates.third-paragraph',\n defaultMessage: 'To view a sample certificate, choose a course mode and select {strongText}.',\n description: 'Instructions on how to view a sample certificate',\n },\n workingWithCertificatesThirdParagraph_strong: {\n id: 'course-authoring.certificates.sidebar.working-with-certificates.third-paragraph.strong',\n defaultMessage: 'Preview certificate',\n description: 'The strong emphasis text for the button to preview a sample certificate',\n },\n issuingCertificatesTitle: {\n id: 'course-authoring.certificates.sidebar.issuing-certificates.title',\n defaultMessage: 'Issuing certificates to learners',\n description: 'Title for the section on issuing certificates to learners',\n },\n issuingCertificatesFirstParagraph: {\n id: 'course-authoring.certificates.sidebar.issuing-certificates.first-paragraph',\n defaultMessage: 'To begin issuing course certificates, a course team member with either the Staff or Admin role selects {strongText}. Only course team members with these roles can edit or delete an activated certificate.',\n description: 'Instructions for issuing course certificates and the roles required to edit or delete certificates',\n },\n issuingCertificatesFirstParagraph_strong: {\n id: 'course-authoring.certificates.sidebar.issuing-certificates.first-paragraph.strong',\n defaultMessage: 'Activate',\n description: 'The strong emphasis text for the activation option',\n },\n issuingCertificatesSecondParagraph: {\n id: 'course-authoring.certificates.sidebar.issuing-certificates.second-paragraph',\n defaultMessage: '{strongText} delete certificates after a course has started; learners who have already earned certificates will no longer be able to access them.',\n description: 'A warning against deleting certificates once a course has started, noting the impact on learners',\n },\n issuingCertificatesSecondParagraph_strong: {\n id: 'course-authoring.certificates.sidebar.issuing-certificates.second-paragraph.strong',\n defaultMessage: 'Do not',\n description: 'The strong emphasis text part of the warning against deleting certificates',\n },\n learnMoreBtn: {\n id: 'course-authoring.certificates.sidebar.learnmore.button',\n defaultMessage: 'Learn more about certificates',\n description: 'Text for a button that links to additional information about setting up certificates in studio',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Button, Hyperlink } from '@openedx/paragon';\n\nimport { HelpSidebar } from '../../../generic/help-sidebar';\nimport { useHelpUrls } from '../../../help-urls/hooks';\nimport { getSidebarData } from './utils';\nimport SidebarBlock from './sidebar-block/SidebarBlock';\nimport messages from './messages';\n\nconst CertificatesSidebar = ({ courseId }) => {\n const intl = useIntl();\n const { certificates: learnMoreCertificates } = useHelpUrls(['certificates']);\n return (\n \n {getSidebarData({ messages, intl }).map(({ title, paragraphs }, id) => (\n \n ))}\n \n {intl.formatMessage(messages.learnMoreBtn)}\n \n \n );\n};\n\nCertificatesSidebar.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default CertificatesSidebar;\n","import { useState, useMemo } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useParams } from 'react-router-dom';\n\nimport {\n getCourseModes, getCertificateActivationUrl, getCertificateWebViewUrl, getIsCertificateActive,\n} from '../../../data/selectors';\nimport { updateCertificateActiveStatus } from '../../../data/thunks';\n\nconst useHeaderButtons = () => {\n const { courseId } = useParams();\n const dispatch = useDispatch();\n const courseModes = useSelector(getCourseModes);\n const certificateWebViewUrl = useSelector(getCertificateWebViewUrl);\n const certificateActivationHandlerUrl = useSelector(getCertificateActivationUrl);\n const isCertificateActive = useSelector(getIsCertificateActive);\n\n const [dropdowmItem, setDropdowmItem] = useState(courseModes[0]);\n\n const handleActivationStatus = () => {\n const status = !isCertificateActive;\n\n dispatch(updateCertificateActiveStatus(courseId, certificateActivationHandlerUrl, status));\n };\n\n const previewUrl = useMemo(() => {\n if (!certificateWebViewUrl) { return ''; }\n\n const getUrl = () => new URL(certificateWebViewUrl, window.location.origin);\n const url = getUrl();\n\n const searchParams = new URLSearchParams(url.search);\n searchParams.set('preview', dropdowmItem);\n url.search = searchParams.toString();\n\n return url.toString();\n }, [certificateWebViewUrl, dropdowmItem]);\n\n return {\n previewUrl,\n courseModes,\n dropdowmItem,\n isCertificateActive,\n setDropdowmItem,\n handleActivationStatus,\n };\n};\n\nexport default useHeaderButtons;\n","import { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Button, Dropdown, DropdownButton, Hyperlink,\n} from '@openedx/paragon';\n\nimport messages from '../../messages';\nimport useHeaderButtons from './hooks/useHeaderButtons';\n\nconst HeaderButtons = () => {\n const intl = useIntl();\n const {\n previewUrl,\n courseModes,\n dropdowmItem,\n isCertificateActive,\n setDropdowmItem,\n handleActivationStatus,\n } = useHeaderButtons();\n\n return (\n <>\n setDropdowmItem(item)}>\n {courseModes.map((mode) => {mode})}\n \n \n {intl.formatMessage(messages.headingActionsPreview)}\n \n \n {isCertificateActive\n ? intl.formatMessage(messages.headingActionsDeactivate)\n : intl.formatMessage(messages.headingActionsActivate)}\n \n \n );\n};\n\nexport default HeaderButtons;\n","import PropTypes from 'prop-types';\nimport { Container, Layout } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { SavingErrorAlert } from '../../generic/saving-error-alert';\nimport ProcessingNotification from '../../generic/processing-notification';\nimport SubHeader from '../../generic/sub-header/SubHeader';\nimport messages from '../messages';\nimport CertificatesSidebar from './certificates-sidebar/CertificatesSidebar';\nimport HeaderButtons from './header-buttons/HeaderButtons';\nimport useLayout from './hooks/useLayout';\n\nconst MainLayout = ({ courseId, showHeaderButtons, children }) => {\n const intl = useIntl();\n\n const {\n errorMessage,\n savingStatus,\n isShowProcessingNotification,\n processingNotificationTitle,\n } = useLayout();\n\n return (\n <>\n \n
    \n }\n />\n
    \n \n \n
    \n {children}\n
    \n
    \n \n \n \n \n
    \n \n
    \n \n \n
    \n \n );\n};\n\nMainLayout.defaultProps = {\n showHeaderButtons: false,\n children: null,\n};\n\nMainLayout.propTypes = {\n courseId: PropTypes.string.isRequired,\n showHeaderButtons: PropTypes.bool,\n children: PropTypes.node,\n};\n\nexport default MainLayout;\n","import { useEffect } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { RequestStatus } from '../../../data/constants';\nimport { getProcessingNotification } from '../../../generic/processing-notification/data/selectors';\nimport { getSavingStatus, getErrorMessage } from '../../data/selectors';\n\nconst useLayout = () => {\n const savingStatus = useSelector(getSavingStatus);\n const errorMessage = useSelector(getErrorMessage);\n\n const {\n isShow: isShowProcessingNotification,\n title: processingNotificationTitle,\n } = useSelector(getProcessingNotification);\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }, [savingStatus]);\n\n return {\n errorMessage,\n savingStatus,\n isShowProcessingNotification,\n processingNotificationTitle,\n };\n};\n\nexport default useLayout;\n","import { Helmet } from 'react-helmet';\nimport PropTypes from 'prop-types';\nimport Placeholder from '@edx/frontend-lib-content-components';\n\nimport { RequestStatus } from '../data/constants';\nimport Loading from '../generic/Loading';\nimport useCertificates from './hooks/useCertificates';\nimport CertificateWithoutModes from './certificate-without-modes/CertificateWithoutModes';\nimport EmptyCertificatesWithModes from './empty-certificates-with-modes/EmptyCertificatesWithModes';\nimport CertificatesList from './certificates-list/CertificatesList';\nimport CertificateCreateForm from './certificate-create-form/CertificateCreateForm';\nimport CertificateEditForm from './certificate-edit-form/CertificateEditForm';\nimport { MODE_STATES } from './data/constants';\nimport MainLayout from './layout/MainLayout';\n\nconst MODE_COMPONENTS = {\n [MODE_STATES.noModes]: CertificateWithoutModes,\n [MODE_STATES.noCertificates]: EmptyCertificatesWithModes,\n [MODE_STATES.create]: CertificateCreateForm,\n [MODE_STATES.view]: CertificatesList,\n [MODE_STATES.editAll]: CertificateEditForm,\n};\n\nconst Certificates = ({ courseId }) => {\n const {\n certificates, componentMode, isLoading, loadingStatus, pageHeadTitle, hasCertificateModes,\n } = useCertificates({ courseId });\n\n if (isLoading) {\n return ;\n }\n\n if (loadingStatus === RequestStatus.DENIED) {\n return (\n
    \n \n
    \n );\n }\n\n const ModeComponent = MODE_COMPONENTS[componentMode] || MODE_COMPONENTS[MODE_STATES.noModes];\n\n return (\n <>\n {pageHeadTitle}\n 0}>\n \n \n \n );\n};\n\nCertificates.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default Certificates;\n","import { useIntl } from '@edx/frontend-platform/i18n';\nimport { Card } from '@openedx/paragon';\n\nimport messages from '../messages';\n\nconst CertificateWithoutModes = () => {\n const intl = useIntl();\n return (\n \n \n {intl.formatMessage(messages.withoutModesText)}\n \n \n );\n};\n\nexport default CertificateWithoutModes;\n","import { useDispatch } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Button, ActionRow, Card } from '@openedx/paragon';\nimport { Add as AddIcon } from '@openedx/paragon/icons';\n\nimport { setMode } from '../data/slice';\nimport { MODE_STATES } from '../data/constants';\nimport messages from '../messages';\n\nconst EmptyCertificatesWithModes = () => {\n const intl = useIntl();\n const dispatch = useDispatch();\n\n const handleCreateMode = () => {\n dispatch(setMode(MODE_STATES.create));\n };\n\n return (\n \n \n \n {intl.formatMessage(messages.noCertificatesText)}\n \n \n {intl.formatMessage(messages.setupCertificateBtn)}\n \n \n \n \n );\n};\n\nexport default EmptyCertificatesWithModes;\n","import { useEffect, useMemo } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { RequestStatus } from '../../data/constants';\nimport getPageHeadTitle from '../../generic/utils';\nimport {\n getComponentMode, getLoadingStatus, getCertificates, getHasCertificateModes, getCourseTitle,\n} from '../data/selectors';\nimport { setMode } from '../data/slice';\nimport { fetchCertificates } from '../data/thunks';\nimport { MODE_STATES } from '../data/constants';\n\nimport messages from '../messages';\n\nconst useCertificates = ({ courseId }) => {\n const dispatch = useDispatch();\n const intl = useIntl();\n\n const componentMode = useSelector(getComponentMode);\n const certificates = useSelector(getCertificates);\n const loadingStatus = useSelector(getLoadingStatus);\n const hasCertificateModes = useSelector(getHasCertificateModes);\n const courseTitle = useSelector(getCourseTitle);\n\n const isLoading = useMemo(() => loadingStatus === RequestStatus.IN_PROGRESS, [loadingStatus]);\n\n const pageHeadTitle = getPageHeadTitle(courseTitle, intl.formatMessage(messages.headingTitleTabText));\n\n useEffect(() => {\n if (!hasCertificateModes) {\n dispatch(setMode(MODE_STATES.noModes));\n } else if (certificates.length === 0) {\n dispatch(setMode(MODE_STATES.noCertificates));\n } else {\n dispatch(setMode(MODE_STATES.view));\n }\n }, [hasCertificateModes, certificates]);\n\n useEffect(() => {\n dispatch(fetchCertificates(courseId));\n }, [courseId]);\n\n return {\n componentMode, isLoading, loadingStatus, certificates, pageHeadTitle, hasCertificateModes,\n };\n};\n\nexport default useCertificates;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n pageTitle: {\n id: 'course-authoring.export.page.title',\n defaultMessage: '{headingTitle} | {courseName} | {siteName}',\n },\n headingTitle: {\n id: 'course-authoring.export.heading.title',\n defaultMessage: 'Course export',\n },\n headingSubtitle: {\n id: 'course-authoring.export.heading.subtitle',\n defaultMessage: 'Tools',\n },\n description1: {\n id: 'course-authoring.export.description1',\n defaultMessage: 'You can export courses and edit them outside of {studioShortName}. The exported file is a .tar.gz file (that is, a .tar file compressed with GNU Zip) that contains the course structure and content. You can also re-import courses that you\\'ve exported.',\n },\n description2: {\n id: 'course-authoring.export.description2',\n defaultMessage: 'Caution: When you export a course, information such as MATLAB API keys, LTI passports, annotation secret token strings, and annotation storage URLs are included in the exported data. If you share your exported files, you may also be sharing sensitive or license-specific information.',\n },\n titleUnderButton: {\n id: 'course-authoring.export.title-under-button',\n defaultMessage: 'Export my course content',\n },\n buttonTitle: {\n id: 'course-authoring.export.button.title',\n defaultMessage: 'Export course content',\n },\n});\n\nexport default messages;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title1: {\n id: 'course-authoring.export.sidebar.title1',\n defaultMessage: 'Why export a course?',\n },\n description1: {\n id: 'course-authoring.export.sidebar.description1',\n defaultMessage: 'You may want to edit the XML in your course directly, outside of {studioShortName}. You may want to create a backup copy of your course. Or, you may want to create a copy of your course that you can later import into another course instance and customize.',\n },\n exportedContent: {\n id: 'course-authoring.export.sidebar.exportedContent',\n defaultMessage: 'What content is exported?',\n },\n exportedContentHeading: {\n id: 'course-authoring.export.sidebar.exportedContentHeading',\n defaultMessage: 'The following content is exported.',\n },\n content1: {\n id: 'course-authoring.export.sidebar.content1',\n defaultMessage: 'Course content and structure',\n },\n content2: {\n id: 'course-authoring.export.sidebar.content2',\n defaultMessage: 'Course dates',\n },\n content3: {\n id: 'course-authoring.export.sidebar.content3',\n defaultMessage: 'Grading policy',\n },\n content4: {\n id: 'course-authoring.export.sidebar.content4',\n defaultMessage: 'Any group configurations',\n },\n content5: {\n id: 'course-authoring.export.sidebar.content5',\n defaultMessage: 'Settings on the Advanced settings page, including MATLAB API keys and LTI passports',\n },\n notExportedContent: {\n id: 'course-authoring.export.sidebar.notExportedContent',\n defaultMessage: 'The following content is not exported.',\n },\n content6: {\n id: 'course-authoring.export.sidebar.content6',\n defaultMessage: 'Learner-specific content, such as learner grades and discussion forum data',\n },\n content7: {\n id: 'course-authoring.export.sidebar.content7',\n defaultMessage: 'The course team',\n },\n openDownloadFile: {\n id: 'course-authoring.export.sidebar.openDownloadFile',\n defaultMessage: 'Opening the downloaded file',\n },\n openDownloadFileDescription: {\n id: 'course-authoring.export.sidebar.openDownloadFileDescription',\n defaultMessage: 'Use an archive program to extract the data from the .tar.gz file. Extracted data includes the course.xml file, as well as subfolders that contain course content.',\n },\n learnMoreButtonTitle: {\n id: 'course-authoring.export.sidebar.learnMoreButtonTitle',\n defaultMessage: 'Learn more about exporting a course',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport {\n injectIntl,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\nimport { Hyperlink } from '@openedx/paragon';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport { useHelpUrls } from '../../help-urls/hooks';\nimport messages from './messages';\n\nconst ExportSidebar = ({ intl, courseId }) => {\n const { exportCourse: exportLearnMoreUrl } = useHelpUrls(['exportCourse']);\n return (\n \n

    {intl.formatMessage(messages.title1)}

    \n

    {intl.formatMessage(messages.description1, { studioShortName: getConfig().STUDIO_SHORT_NAME })}

    \n
    \n

    {intl.formatMessage(messages.exportedContent)}

    \n

    {intl.formatMessage(messages.exportedContentHeading)}

    \n
      \n
    • {intl.formatMessage(messages.content1)}
    • \n
    • {intl.formatMessage(messages.content2)}
    • \n
    • {intl.formatMessage(messages.content3)}
    • \n
    • {intl.formatMessage(messages.content4)}
    • \n
    • {intl.formatMessage(messages.content5)}
    • \n
    \n

    {intl.formatMessage(messages.notExportedContent)}

    \n
      \n
    • {intl.formatMessage(messages.content6)}
    • \n
    • {intl.formatMessage(messages.content7)}
    • \n
    \n
    \n

    {intl.formatMessage(messages.openDownloadFile)}

    \n

    {intl.formatMessage(messages.openDownloadFileDescription)}

    \n
    \n {intl.formatMessage(messages.learnMoreButtonTitle)}\n
    \n );\n};\n\nExportSidebar.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(ExportSidebar);\n","export const getExportTriggered = (state) => state.courseExport.exportTriggered;\nexport const getCurrentStage = (state) => state.courseExport.currentStage;\nexport const getDownloadPath = (state) => state.courseExport.downloadPath;\nexport const getSuccessDate = (state) => state.courseExport.successDate;\nexport const getError = (state) => state.courseExport.error;\nexport const getIsErrorModalOpen = (state) => state.courseExport.isErrorModalOpen;\nexport const getLoadingStatus = (state) => state.courseExport.loadingStatus;\nexport const getSavingStatus = (state) => state.courseExport.savingStatus;\n","export const LAST_EXPORT_COOKIE_NAME = 'lastexport';\nexport const EXPORT_STAGES = {\n PREPARING: 0,\n EXPORTING: 1,\n COMPRESSING: 2,\n SUCCESS: 3,\n};\nexport const SUCCESS_DATE_FORMAT = 'MM/DD/yyyy';\n","import Cookies from 'universal-cookie';\nimport moment from 'moment';\n\nimport { TIME_FORMAT } from '../constants';\nimport { LAST_EXPORT_COOKIE_NAME, SUCCESS_DATE_FORMAT } from './data/constants';\n\n/**\n * Sets an export-related cookie with the provided information.\n *\n * @param {Date} date - Date of export.\n * @param {boolean} completed - Indicates if export was completed successfully.\n * @returns {void}\n */\nexport const setExportCookie = (date, completed) => {\n const cookies = new Cookies();\n cookies.set(LAST_EXPORT_COOKIE_NAME, { date, completed }, { path: window.location.pathname });\n};\n\n/**\n * Formats a Unix timestamp as a formatted success date string.\n *\n * @param {number} unixDate - Unix timestamp to be formatted.\n * @returns {string|null} Formatted success date string, including date and time in UTC, or null if the input is falsy.\n */\nexport const getFormattedSuccessDate = (unixDate) => {\n const formattedDate = moment(unixDate).utc().format(SUCCESS_DATE_FORMAT);\n const formattedTime = moment(unixDate).utc().format(TIME_FORMAT);\n return unixDate ? ` (${formattedDate} at ${formattedTime} UTC)` : null;\n};\n","/* eslint-disable import/prefer-default-export */\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const postExportCourseApiUrl = (courseId) => new URL(`export/${courseId}`, getApiBaseUrl()).href;\nexport const getExportStatusApiUrl = (courseId) => new URL(`export_status/${courseId}`, getApiBaseUrl()).href;\n\nexport async function startCourseExporting(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .post(postExportCourseApiUrl(courseId));\n return camelCaseObject(data);\n}\n\nexport async function getExportStatus(courseId) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getExportStatusApiUrl(courseId));\n return camelCaseObject(data);\n}\n","import Cookies from 'universal-cookie';\nimport moment from 'moment';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport { RequestStatus } from '../../data/constants';\nimport { setExportCookie } from '../utils';\nimport { EXPORT_STAGES, LAST_EXPORT_COOKIE_NAME } from './constants';\n\nimport {\n startCourseExporting,\n getExportStatus,\n} from './api';\nimport {\n updateExportTriggered,\n updateCurrentStage,\n updateDownloadPath,\n updateSuccessDate,\n updateError,\n updateIsErrorModalOpen,\n reset,\n updateLoadingStatus,\n updateSavingStatus,\n} from './slice';\n\nfunction setExportDate({\n date, exportStatus, exportOutput, dispatch,\n}) {\n // If there is no cookie for the last export date, set it now.\n const cookies = new Cookies();\n const cookieData = cookies.get(LAST_EXPORT_COOKIE_NAME);\n if (!cookieData?.completed) {\n setExportCookie(date, exportStatus === EXPORT_STAGES.SUCCESS);\n }\n // If we don't have export date set yet via cookie, set success date to current date.\n if (exportOutput && !cookieData?.completed) {\n dispatch(updateSuccessDate(date));\n }\n}\n\nexport function startExportingCourse(courseId) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));\n try {\n dispatch(reset());\n dispatch(updateExportTriggered(true));\n const exportData = await startCourseExporting(courseId);\n dispatch(updateCurrentStage(exportData.exportStatus));\n setExportCookie(moment().valueOf(), exportData.exportStatus === EXPORT_STAGES.SUCCESS);\n\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport function fetchExportStatus(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n try {\n const {\n exportStatus, exportOutput, exportError,\n } = await getExportStatus(courseId);\n dispatch(updateCurrentStage(Math.abs(exportStatus)));\n\n const date = moment().valueOf();\n\n setExportDate({\n date, exportStatus, exportOutput, dispatch,\n });\n\n if (exportError) {\n const errorMessage = exportError.rawErrorMsg || exportError;\n const errorUnitUrl = exportError.editUnitUrl || null;\n dispatch(updateError({ msg: errorMessage, unitUrl: errorUnitUrl }));\n dispatch(updateIsErrorModalOpen(true));\n }\n\n if (exportOutput) {\n if (exportOutput.startsWith('/')) {\n dispatch(updateDownloadPath(`${getConfig().STUDIO_BASE_URL}${exportOutput}`));\n } else {\n dispatch(updateDownloadPath(exportOutput));\n }\n }\n\n dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n errorTitle: {\n id: 'course-authoring.export.modal.error.title',\n defaultMessage: 'There has been an error while exporting.',\n },\n errorDescriptionNotUnit: {\n id: 'course-authoring.export.modal.error.description.not.unit',\n defaultMessage: 'Your course could not be exported to XML. There is not enough information to identify the failed component. Inspect your course to identify any problematic components and try again. The raw error message is: {errorMessage}',\n },\n errorDescriptionUnit: {\n id: 'course-authoring.export.modal.error.description.unit',\n defaultMessage: 'There has been a failure to export to XML at least one component. It is recommended that you go to the edit page and repair the error before attempting another export. Please check that all components on the page are valid and do not display any error messages. The raw error message is: {errorMessage}',\n },\n errorCancelButtonUnit: {\n id: 'course-authoring.export.modal.error.button.cancel.unit',\n defaultMessage: 'Return to export',\n },\n errorCancelButtonNotUnit: {\n id: 'course-authoring.export.modal.error.button.cancel.not.unit',\n defaultMessage: 'Cancel',\n },\n errorActionButtonNotUnit: {\n id: 'course-authoring.export.modal.error.button.action.not.unit',\n defaultMessage: 'Take me to the main course page',\n },\n errorActionButtonUnit: {\n id: 'course-authoring.export.modal.error.button.action.unit',\n defaultMessage: 'Correct failed component',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { getConfig } from '@edx/frontend-platform';\nimport PropTypes from 'prop-types';\nimport { Error as ErrorIcon } from '@openedx/paragon/icons';\n\nimport ModalNotification from '../../generic/modal-notification';\nimport { getError, getIsErrorModalOpen } from '../data/selectors';\nimport { updateIsErrorModalOpen } from '../data/slice';\nimport messages from './messages';\n\nconst ExportModalError = ({\n intl,\n courseId,\n}) => {\n const dispatch = useDispatch();\n const isErrorModalOpen = useSelector(getIsErrorModalOpen);\n const { msg: errorMessage, unitUrl: unitErrorUrl } = useSelector(getError);\n\n const handleUnitRedirect = () => { window.location.assign(unitErrorUrl); };\n const handleRedirectCourseHome = () => { window.location.assign(`${getConfig().STUDIO_BASE_URL}/course/${courseId}`); };\n return (\n dispatch(updateIsErrorModalOpen(false))}\n handleAction={unitErrorUrl ? handleUnitRedirect : handleRedirectCourseHome}\n variant=\"danger\"\n icon={ErrorIcon}\n />\n );\n};\n\nExportModalError.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nExportModalError.defaultProps = {};\n\nexport default injectIntl(ExportModalError);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n exportedDataTitle: {\n id: 'course-authoring.export.footer.exportedData.title',\n defaultMessage: 'Data exported with your course:',\n },\n exportedDataItem1: {\n id: 'course-authoring.export.footer.exportedData.item.1',\n defaultMessage: 'Values from Advanced settings, including MATLAB API keys and LTI passports',\n },\n exportedDataItem2: {\n id: 'course-authoring.export.footer.exportedData.item.2',\n defaultMessage: 'Course content (all sections, sub-sections, and units)',\n },\n exportedDataItem3: {\n id: 'course-authoring.export.footer.exportedData.item.3',\n defaultMessage: 'Course structure',\n },\n exportedDataItem4: {\n id: 'course-authoring.export.footer.exportedData.item.4',\n defaultMessage: 'Individual problems',\n },\n exportedDataItem5: {\n id: 'course-authoring.export.footer.exportedData.item.5',\n defaultMessage: 'Pages',\n },\n exportedDataItem6: {\n id: 'course-authoring.export.footer.exportedData.item.6',\n defaultMessage: 'Course assets',\n },\n exportedDataItem7: {\n id: 'course-authoring.export.footer.exportedData.item.7',\n defaultMessage: 'Course settings',\n },\n notExportedDataTitle: {\n id: 'course-authoring.export.footer.notExportedData.title',\n defaultMessage: 'Data not exported with your course:',\n },\n notExportedDataItem1: {\n id: 'course-authoring.export.footer.notExportedData.item.1',\n defaultMessage: 'User data',\n },\n notExportedDataItem2: {\n id: 'course-authoring.export.footer.notExportedData.item.2',\n defaultMessage: 'Course team data',\n },\n notExportedDataItem3: {\n id: 'course-authoring.export.footer.notExportedData.item.3',\n defaultMessage: 'Forum/discussion data',\n },\n notExportedDataItem4: {\n id: 'course-authoring.export.footer.notExportedData.item.4',\n defaultMessage: 'Certificates',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport {\n injectIntl,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport { Layout } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst ExportFooter = ({ intl }) => (\n
    \n \n \n

    {intl.formatMessage(messages.exportedDataTitle)}

    \n
      \n
    • {intl.formatMessage(messages.exportedDataItem1)}
    • \n
    • {intl.formatMessage(messages.exportedDataItem2)}
    • \n
    • {intl.formatMessage(messages.exportedDataItem3)}
    • \n
    • {intl.formatMessage(messages.exportedDataItem4)}
    • \n
    • {intl.formatMessage(messages.exportedDataItem5)}
    • \n
    • {intl.formatMessage(messages.exportedDataItem6)}
    • \n
    • {intl.formatMessage(messages.exportedDataItem7)}
    • \n
    \n
    \n \n \n

    {intl.formatMessage(messages.notExportedDataTitle)}

    \n
      \n
    • {intl.formatMessage(messages.notExportedDataItem1)}
    • \n
    • {intl.formatMessage(messages.notExportedDataItem2)}
    • \n
    • {intl.formatMessage(messages.notExportedDataItem3)}
    • \n
    • {intl.formatMessage(messages.notExportedDataItem4)}
    • \n
    \n
    \n \n
    \n);\n\nExportFooter.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(ExportFooter);\n","import React from 'react';\nimport { injectIntl } from '@edx/frontend-platform/i18n';\nimport {\n Settings as SettingsIcon,\n ManageHistory as SuccessIcon,\n Warning as ErrorIcon,\n CheckCircle,\n} from '@openedx/paragon/icons';\nimport { Icon } from '@openedx/paragon';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nconst CourseStepper = ({\n steps,\n activeKey,\n percent,\n hasError,\n errorMessage,\n}) => {\n const getStepperSettings = (index) => {\n const lastStepIndex = steps.length - 1;\n const isActiveStep = index === activeKey;\n const isLastStep = index === lastStepIndex;\n const isErrorStep = isActiveStep && hasError;\n const isLastStepDone = isLastStep && isActiveStep;\n const completedStep = index < activeKey && !hasError;\n\n const getStepIcon = () => {\n if (completedStep) {\n return CheckCircle;\n }\n if (hasError && isActiveStep) {\n return ErrorIcon;\n }\n if (isLastStep && !isActiveStep) {\n return SuccessIcon;\n }\n if (isLastStepDone) {\n return CheckCircle;\n }\n\n return SettingsIcon;\n };\n\n return {\n stepIcon: getStepIcon(index),\n isPercentShow: Boolean(percent) && percent !== 100 && isActiveStep && !hasError,\n isErrorMessageShow: isErrorStep && errorMessage,\n isActiveClass: isActiveStep && !isLastStep && !hasError,\n isDoneClass: index < activeKey || isLastStepDone,\n isErrorClass: isErrorStep,\n };\n };\n\n return (\n
    \n {steps.length ? steps.map(({ title, description }, index) => {\n const {\n stepIcon,\n isPercentShow,\n isErrorMessageShow,\n isActiveClass,\n isDoneClass,\n isErrorClass,\n } = getStepperSettings(index);\n\n return (\n \n
    \n \n
    \n
    \n

    {title}

    \n {isPercentShow && (\n \n {percent}%\n

    \n )}\n

    \n {isErrorMessageShow ? errorMessage : description}\n

    \n
    \n
    \n );\n }) : null}\n
    \n );\n};\n\nCourseStepper.defaultProps = {\n percent: false,\n hasError: false,\n errorMessage: '',\n};\n\nCourseStepper.propTypes = {\n steps: PropTypes.arrayOf(PropTypes.shape({\n title: PropTypes.string.isRequired,\n description: PropTypes.string.isRequired,\n })).isRequired,\n activeKey: PropTypes.number.isRequired,\n percent: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\n errorMessage: PropTypes.string,\n hasError: PropTypes.bool,\n};\n\nexport default injectIntl(CourseStepper);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n stepperPreparingTitle: {\n id: 'course-authoring.export.stepper.title.preparing',\n defaultMessage: 'Preparing',\n },\n stepperExportingTitle: {\n id: 'course-authoring.export.stepper.title.exporting',\n defaultMessage: 'Exporting',\n },\n stepperCompressingTitle: {\n id: 'course-authoring.export.stepper.title.compressing',\n defaultMessage: 'Compressing',\n },\n stepperSuccessTitle: {\n id: 'course-authoring.export.stepper.title.success',\n defaultMessage: 'Success',\n },\n stepperPreparingDescription: {\n id: 'course-authoring.export.stepper.description.preparing',\n defaultMessage: 'Preparing to start the export',\n },\n stepperExportingDescription: {\n id: 'course-authoring.export.stepper.description.exporting',\n defaultMessage: 'Creating the export data files (You can now leave this page safely, but avoid making drastic changes to content until this export is complete)',\n },\n stepperCompressingDescription: {\n id: 'course-authoring.export.stepper.description.compressing',\n defaultMessage: 'Compressing the exported data and preparing it for download',\n },\n stepperSuccessDescription: {\n id: 'course-authoring.export.stepper.description.success',\n defaultMessage: 'Your exported course can now be downloaded',\n },\n downloadCourseButtonTitle: {\n id: 'course-authoring.export.stepper.download.button.title',\n defaultMessage: 'Download exported course',\n },\n stepperHeaderTitle: {\n id: 'course-authoring.export.stepper.header.title',\n defaultMessage: 'Course export status',\n },\n});\n\nexport default messages;\n","import React, { useEffect } from 'react';\nimport {\n FormattedDate,\n injectIntl,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Button } from '@openedx/paragon';\n\nimport CourseStepper from '../../generic/course-stepper';\nimport {\n getCurrentStage, getDownloadPath, getError, getLoadingStatus, getSuccessDate,\n} from '../data/selectors';\nimport { fetchExportStatus } from '../data/thunks';\nimport { EXPORT_STAGES } from '../data/constants';\nimport { RequestStatus } from '../../data/constants';\nimport messages from './messages';\n\nconst ExportStepper = ({ intl, courseId }) => {\n const currentStage = useSelector(getCurrentStage);\n const downloadPath = useSelector(getDownloadPath);\n const successDate = useSelector(getSuccessDate);\n const loadingStatus = useSelector(getLoadingStatus);\n const { msg: errorMessage } = useSelector(getError);\n const dispatch = useDispatch();\n const isStopFetching = currentStage === EXPORT_STAGES.SUCCESS\n || loadingStatus === RequestStatus.FAILED\n || errorMessage;\n\n useEffect(() => {\n const id = setInterval(() => {\n if (isStopFetching) {\n clearInterval(id);\n } else {\n dispatch(fetchExportStatus(courseId));\n }\n }, 3000);\n return () => clearInterval(id);\n });\n\n let successTitle = intl.formatMessage(messages.stepperSuccessTitle);\n const localizedSuccessDate = successDate ? (\n \n ) : null;\n\n if (localizedSuccessDate && currentStage === EXPORT_STAGES.SUCCESS) {\n const successWithDate = (\n <>\n {successTitle} ({localizedSuccessDate})\n \n );\n successTitle = successWithDate;\n }\n\n const steps = [\n {\n title: intl.formatMessage(messages.stepperPreparingTitle),\n description: intl.formatMessage(messages.stepperPreparingDescription),\n key: EXPORT_STAGES.PREPARING,\n }, {\n title: intl.formatMessage(messages.stepperExportingTitle),\n description: intl.formatMessage(messages.stepperExportingDescription),\n key: EXPORT_STAGES.EXPORTING,\n }, {\n title: intl.formatMessage(messages.stepperCompressingTitle),\n description: intl.formatMessage(messages.stepperCompressingDescription),\n key: EXPORT_STAGES.COMPRESSING,\n }, {\n title: successTitle,\n description: intl.formatMessage(messages.stepperSuccessDescription),\n key: EXPORT_STAGES.SUCCESS,\n },\n ];\n\n return (\n
    \n

    {intl.formatMessage(messages.stepperHeaderTitle)}

    \n \n {downloadPath && currentStage === EXPORT_STAGES.SUCCESS && }\n
    \n );\n};\n\nExportStepper.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(ExportStepper);\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Container, Layout, Button, Card,\n} from '@openedx/paragon';\nimport { ArrowCircleDown as ArrowCircleDownIcon } from '@openedx/paragon/icons';\nimport Cookies from 'universal-cookie';\nimport { getConfig } from '@edx/frontend-platform';\nimport { Helmet } from 'react-helmet';\n\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport { RequestStatus } from '../data/constants';\nimport { useModel } from '../generic/model-store';\nimport messages from './messages';\nimport ExportSidebar from './export-sidebar/ExportSidebar';\nimport {\n getCurrentStage, getError, getExportTriggered, getLoadingStatus, getSavingStatus,\n} from './data/selectors';\nimport { startExportingCourse } from './data/thunks';\nimport { EXPORT_STAGES, LAST_EXPORT_COOKIE_NAME } from './data/constants';\nimport { updateExportTriggered, updateSavingStatus, updateSuccessDate } from './data/slice';\nimport ExportModalError from './export-modal-error/ExportModalError';\nimport ExportFooter from './export-footer/ExportFooter';\nimport ExportStepper from './export-stepper/ExportStepper';\n\nconst CourseExportPage = ({ intl, courseId }) => {\n const dispatch = useDispatch();\n const exportTriggered = useSelector(getExportTriggered);\n const courseDetails = useModel('courseDetails', courseId);\n const currentStage = useSelector(getCurrentStage);\n const { msg: errorMessage } = useSelector(getError);\n const loadingStatus = useSelector(getLoadingStatus);\n const savingStatus = useSelector(getSavingStatus);\n const cookies = new Cookies();\n const isShowExportButton = !exportTriggered || errorMessage || currentStage === EXPORT_STAGES.SUCCESS;\n const anyRequestFailed = savingStatus === RequestStatus.FAILED || loadingStatus === RequestStatus.FAILED;\n const anyRequestInProgress = savingStatus === RequestStatus.PENDING || loadingStatus === RequestStatus.IN_PROGRESS;\n\n useEffect(() => {\n const cookieData = cookies.get(LAST_EXPORT_COOKIE_NAME);\n if (cookieData) {\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n dispatch(updateExportTriggered(true));\n dispatch(updateSuccessDate(cookieData.date));\n }\n }, []);\n\n return (\n <>\n \n \n {intl.formatMessage(messages.pageTitle, {\n headingTitle: intl.formatMessage(messages.headingTitle),\n courseName: courseDetails?.name,\n siteName: process.env.SITE_NAME,\n })}\n \n \n \n
    \n \n \n
    \n \n

    {intl.formatMessage(messages.description1, { studioShortName: getConfig().STUDIO_SHORT_NAME })}

    \n

    {intl.formatMessage(messages.description2)}

    \n \n \n {isShowExportButton && (\n \n dispatch(startExportingCourse(courseId))}\n iconBefore={ArrowCircleDownIcon}\n >\n {intl.formatMessage(messages.buttonTitle)}\n \n \n )}\n \n {exportTriggered && }\n \n
    \n
    \n \n \n \n \n
    \n \n
    \n
    \n null}\n />\n
    \n \n );\n};\n\nCourseExportPage.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nCourseExportPage.defaultProps = {};\n\nexport default injectIntl(CourseExportPage);\n","export const LAST_IMPORT_COOKIE_NAME = 'lastimport';\nexport const IMPORT_STAGES = {\n UPLOADING: 0,\n UNPACKING: 1,\n VERIFYING: 2,\n UPDATING: 3,\n SUCCESS: 4,\n};\n","import Cookies from 'universal-cookie';\n\nimport { LAST_IMPORT_COOKIE_NAME } from './data/constants';\n\n/**\n * Sets an import-related cookie with the provided information.\n *\n * @param {Date} date - Date of import.\n * @param {boolean} completed - Indicates if import was completed successfully.\n * @param {string} fileName - File name.\n * @returns {void}\n */\n// eslint-disable-next-line import/prefer-default-export\nexport const setImportCookie = (date, completed, fileName) => {\n const cookies = new Cookies();\n cookies.set(LAST_IMPORT_COOKIE_NAME, { date, completed, fileName }, { path: window.location.pathname });\n};\n","import { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const postImportCourseApiUrl = (courseId) => `${getApiBaseUrl()}/import/${courseId}`;\nexport const getImportStatusApiUrl = (courseId, fileName) => `${getApiBaseUrl()}/import_status/${courseId}/${fileName}`;\n\n/**\n * Start import course.\n * @param {string} courseId\n * @param {Object} fileData\n * @param {Object} requestConfig\n * @returns {Promise}\n */\nexport async function startCourseImporting(courseId, fileData, requestConfig, updateProgress) {\n const chunkSize = 20 * 1000000; // 20 MB\n const fileSize = fileData.size || 0;\n const chunkLength = Math.ceil(fileSize / chunkSize);\n let resp;\n const upload = async (blob, start, stop, index) => {\n const contentRange = `bytes ${start}-${stop}/${fileSize}`;\n const contentDisposition = `attachment; filename=\"${fileData.name}\"`;\n const headers = {\n 'Content-Range': contentRange,\n 'Content-Disposition': contentDisposition,\n };\n const formData = new FormData();\n formData.append('course-data', blob, fileData.name);\n const { data } = await getAuthenticatedHttpClient()\n .post(\n postImportCourseApiUrl(courseId),\n formData,\n { headers, ...requestConfig },\n );\n const percent = Math.trunc(((1 / chunkLength) * (index + 1)) * 100);\n updateProgress(percent);\n resp = camelCaseObject(data);\n };\n\n const chunkUpload = async (file, index) => {\n const start = index * chunkSize;\n const stop = start + chunkSize < fileSize ? start + chunkSize : fileSize;\n const blob = file.slice(start, stop, file.type);\n await upload(blob, start, stop - 1, index);\n };\n\n /* eslint-disable no-await-in-loop */\n for (let i = 0; i < chunkLength; i++) {\n await chunkUpload(fileData, i);\n }\n\n return resp;\n}\n\n/**\n * Get import status.\n * @param {string} courseId\n * @param {string} fileName\n * @returns {Promise}\n */\nexport async function getImportStatus(courseId, fileName) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getImportStatusApiUrl(courseId, fileName));\n return camelCaseObject(data);\n}\n","/* eslint-disable import/prefer-default-export */\nimport Cookies from 'universal-cookie';\nimport moment from 'moment';\n\nimport { RequestStatus } from '../../data/constants';\nimport { setImportCookie } from '../utils';\nimport { getImportStatus, startCourseImporting } from './api';\nimport {\n reset, updateCurrentStage, updateError, updateFileName, updateProgress,\n updateImportTriggered, updateLoadingStatus, updateSavingStatus, updateSuccessDate,\n} from './slice';\nimport { IMPORT_STAGES, LAST_IMPORT_COOKIE_NAME } from './constants';\n\nexport function fetchImportStatus(courseId, fileName) {\n return async (dispatch) => {\n try {\n dispatch(updateLoadingStatus(RequestStatus.IN_PROGRESS));\n const { importStatus, message } = await getImportStatus(courseId, fileName);\n dispatch(updateCurrentStage(Math.abs(importStatus)));\n const cookies = new Cookies();\n const cookieData = cookies.get(LAST_IMPORT_COOKIE_NAME);\n\n if (importStatus < 0) {\n dispatch(updateError({ hasError: true, message }));\n } else if (importStatus === IMPORT_STAGES.SUCCESS && !cookieData?.completed) {\n dispatch(updateSuccessDate(moment().valueOf()));\n }\n\n if (!cookieData?.completed) {\n setImportCookie(moment().valueOf(), importStatus === IMPORT_STAGES.SUCCESS, fileName);\n }\n dispatch(updateLoadingStatus(RequestStatus.SUCCESSFUL));\n return true;\n } catch (error) {\n dispatch(updateLoadingStatus(RequestStatus.FAILED));\n return false;\n }\n };\n}\n\nexport function handleProcessUpload(courseId, fileData, requestConfig, handleError) {\n return async (dispatch) => {\n try {\n const file = fileData.get('file');\n dispatch(reset());\n dispatch(updateSavingStatus(RequestStatus.PENDING));\n dispatch(updateFileName(file.name));\n dispatch(updateImportTriggered(true));\n const { importStatus } = await startCourseImporting(\n courseId,\n file,\n requestConfig,\n (percent) => dispatch(updateProgress(percent)),\n );\n dispatch(updateCurrentStage(importStatus));\n setImportCookie(moment().valueOf(), importStatus === IMPORT_STAGES.SUCCESS, file.name);\n dispatch(updateSavingStatus(RequestStatus.SUCCESSFUL));\n return true;\n } catch (error) {\n handleError(error);\n dispatch(updateSavingStatus(RequestStatus.FAILED));\n return false;\n }\n };\n}\n","export const getProgress = (state) => state.courseImport.progress;\nexport const getCurrentStage = (state) => state.courseImport.currentStage;\nexport const getImportTriggered = (state) => state.courseImport.importTriggered;\nexport const getFileName = (state) => state.courseImport.fileName;\nexport const getError = (state) => state.courseImport.error;\nexport const getLoadingStatus = (state) => state.courseImport.loadingStatus;\nexport const getSavingStatus = (state) => state.courseImport.savingStatus;\nexport const getSuccessDate = (state) => state.courseImport.successDate;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n stepperUploadingTitle: {\n id: 'course-authoring.import.stepper.title.uploading',\n defaultMessage: 'Uploading',\n },\n stepperUnpackingTitle: {\n id: 'course-authoring.import.stepper.title.unpacking',\n defaultMessage: 'Unpacking',\n },\n stepperVerifyingTitle: {\n id: 'course-authoring.import.stepper.title.verifying',\n defaultMessage: 'Verifying',\n },\n stepperUpdatingTitle: {\n id: 'course-authoring.import.stepper.title.updating',\n defaultMessage: 'Updating сourse',\n },\n stepperSuccessTitle: {\n id: 'course-authoring.import.stepper.title.success',\n defaultMessage: 'Success',\n },\n stepperUploadingDescription: {\n id: 'course-authoring.import.stepper.description.uploading',\n defaultMessage: 'Transferring your file to our servers',\n },\n stepperUnpackingDescription: {\n id: 'course-authoring.import.stepper.description.unpacking',\n defaultMessage: 'Expanding and preparing folder/file structure (You can now leave this page safely, but avoid making drastic changes to content until this import is complete)',\n },\n stepperVerifyingDescription: {\n id: 'course-authoring.import.stepper.description.verifying',\n defaultMessage: 'Reviewing semantics, syntax, and required data',\n },\n stepperUpdatingDescription: {\n id: 'course-authoring.import.stepper.description.updating',\n defaultMessage: 'Integrating your imported content into this course. This process might take longer with larger courses.',\n },\n stepperSuccessDescription: {\n id: 'course-authoring.import.stepper.description.success',\n defaultMessage: 'Your imported content has now been integrated into this course',\n },\n viewOutlineButton: {\n id: 'course-authoring.import.stepper.button.outline',\n defaultMessage: 'View updated outline',\n },\n defaultErrorMessage: {\n id: 'course-authoring.import.stepper.error.default',\n defaultMessage: 'Error importing course',\n },\n stepperHeaderTitle: {\n id: 'course-authoring.export.stepper.header.title',\n defaultMessage: 'Course import status',\n },\n});\n\nexport default messages;\n","import React, { useEffect } from 'react';\nimport {\n FormattedDate,\n injectIntl,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Button } from '@openedx/paragon';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport { RequestStatus } from '../../data/constants';\nimport CourseStepper from '../../generic/course-stepper';\nimport { IMPORT_STAGES } from '../data/constants';\nimport { fetchImportStatus } from '../data/thunks';\nimport {\n getCurrentStage, getError, getFileName, getLoadingStatus, getProgress, getSavingStatus, getSuccessDate,\n} from '../data/selectors';\nimport messages from './messages';\n\nconst ImportStepper = ({ intl, courseId }) => {\n const currentStage = useSelector(getCurrentStage);\n const fileName = useSelector(getFileName);\n const { hasError, message: errorMessage } = useSelector(getError);\n const progress = useSelector(getProgress);\n const dispatch = useDispatch();\n const loadingStatus = useSelector(getLoadingStatus);\n const savingStatus = useSelector(getSavingStatus);\n const successDate = useSelector(getSuccessDate);\n const isStopFetching = currentStage === IMPORT_STAGES.SUCCESS\n || loadingStatus === RequestStatus.FAILED\n || savingStatus === RequestStatus.FAILED\n || hasError;\n const formattedErrorMessage = hasError ? errorMessage || intl.formatMessage(messages.defaultErrorMessage) : '';\n\n useEffect(() => {\n const id = setInterval(() => {\n if (isStopFetching) {\n clearInterval(id);\n } else if (fileName) {\n dispatch(fetchImportStatus(courseId, fileName));\n }\n }, 3000);\n return () => clearInterval(id);\n });\n\n let successTitle = intl.formatMessage(messages.stepperSuccessTitle);\n const localizedSuccessDate = successDate ? (\n \n ) : null;\n if (localizedSuccessDate && currentStage === IMPORT_STAGES.SUCCESS) {\n const successWithDate = (\n <>\n {successTitle} ({localizedSuccessDate})\n \n );\n successTitle = successWithDate;\n }\n\n const handleRedirectCourseOutline = () => window.location.replace(`${getConfig().STUDIO_BASE_URL}/course/${courseId}`);\n\n const steps = [\n {\n title: intl.formatMessage(messages.stepperUploadingTitle),\n description: intl.formatMessage(messages.stepperUploadingDescription),\n key: IMPORT_STAGES.UPLOADING,\n }, {\n title: intl.formatMessage(messages.stepperUnpackingTitle),\n description: intl.formatMessage(messages.stepperUnpackingDescription),\n key: IMPORT_STAGES.UNPACKING,\n }, {\n title: intl.formatMessage(messages.stepperVerifyingTitle),\n description: intl.formatMessage(messages.stepperVerifyingDescription),\n key: IMPORT_STAGES.VERIFYING,\n }, {\n title: intl.formatMessage(messages.stepperUpdatingTitle),\n description: intl.formatMessage(messages.stepperUpdatingDescription),\n key: IMPORT_STAGES.UPDATING,\n }, {\n title: successTitle,\n description: intl.formatMessage(messages.stepperSuccessDescription),\n key: IMPORT_STAGES.SUCCESS,\n },\n ];\n\n return (\n
    \n

    {intl.formatMessage(messages.stepperHeaderTitle)}

    \n \n {currentStage === IMPORT_STAGES.SUCCESS && (\n \n )}\n
    \n );\n};\n\nImportStepper.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(ImportStepper);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title1: {\n id: 'course-authoring.import.sidebar.title1',\n defaultMessage: 'Why import a course?',\n },\n description1: {\n id: 'course-authoring.import.sidebar.description1',\n defaultMessage: 'You may want to run a new version of an existing course, or replace an existing course altogether. Or, you may have developed a course outside {studioShortName}.',\n },\n importedContent: {\n id: 'course-authoring.import.sidebar.importedContent',\n defaultMessage: 'What content is imported?',\n },\n importedContentHeading: {\n id: 'course-authoring.import.sidebar.importedContentHeading',\n defaultMessage: 'The following content is imported.',\n },\n content1: {\n id: 'course-authoring.import.sidebar.content1',\n defaultMessage: 'Course content and structure',\n },\n content2: {\n id: 'course-authoring.import.sidebar.content2',\n defaultMessage: 'Course dates',\n },\n content3: {\n id: 'course-authoring.import.sidebar.content3',\n defaultMessage: 'Grading policy',\n },\n content4: {\n id: 'course-authoring.import.sidebar.content4',\n defaultMessage: 'Any group configurations',\n },\n content5: {\n id: 'course-authoring.import.sidebar.content5',\n defaultMessage: 'Settings on the advanced settings page, including MATLAB API keys and LTI passports',\n },\n notImportedContent: {\n id: 'course-authoring.import.sidebar.notImportedContent',\n defaultMessage: 'The following content is not exported.',\n },\n content6: {\n id: 'course-authoring.import.sidebar.content6',\n defaultMessage: 'Learner-specific content, such as learner grades and discussion forum data',\n },\n content7: {\n id: 'course-authoring.import.sidebar.content7',\n defaultMessage: 'The course team',\n },\n warningTitle: {\n id: 'course-authoring.import.sidebar.warningTitle',\n defaultMessage: 'Warning: importing while a course is running',\n },\n warningDescription: {\n id: 'course-authoring.import.sidebar.warningDescription',\n defaultMessage: 'If you perform an import while your course is running, and you change the URL names (or url_name nodes) of any problem components, the student data associated with those problem components may be lost. This data includes students\\' problem scores.',\n },\n learnMoreButtonTitle: {\n id: 'course-authoring.import.sidebar.learnMoreButtonTitle',\n defaultMessage: 'Learn more about importing a course',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport {\n injectIntl,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\nimport { Hyperlink } from '@openedx/paragon';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport { useHelpUrls } from '../../help-urls/hooks';\nimport messages from './messages';\n\nconst ImportSidebar = ({ intl, courseId }) => {\n const { importCourse: importLearnMoreUrl } = useHelpUrls(['importCourse']);\n return (\n \n

    {intl.formatMessage(messages.title1)}

    \n

    \n {intl.formatMessage(messages.description1, { studioShortName: getConfig().STUDIO_SHORT_NAME })}\n

    \n
    \n

    {intl.formatMessage(messages.importedContent)}

    \n

    {intl.formatMessage(messages.importedContentHeading)}

    \n
      \n
    • {intl.formatMessage(messages.content1)}
    • \n
    • {intl.formatMessage(messages.content2)}
    • \n
    • {intl.formatMessage(messages.content3)}
    • \n
    • {intl.formatMessage(messages.content4)}
    • \n
    • {intl.formatMessage(messages.content5)}
    • \n
    \n

    {intl.formatMessage(messages.notImportedContent)}

    \n
      \n
    • {intl.formatMessage(messages.content6)}
    • \n
    • {intl.formatMessage(messages.content7)}
    • \n
    \n
    \n

    {intl.formatMessage(messages.warningTitle)}

    \n

    {intl.formatMessage(messages.warningDescription)}

    \n
    \n \n {intl.formatMessage(messages.learnMoreButtonTitle)}\n \n
    \n );\n};\n\nImportSidebar.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(ImportSidebar);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.import.file-section.title',\n defaultMessage: 'Select a .tar.gz file to replace your course content',\n },\n fileChosen: {\n id: 'course-authoring.import.file-section.chosen-file',\n defaultMessage: 'File chosen: {fileName}',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport {\n injectIntl,\n intlShape,\n} from '@edx/frontend-platform/i18n';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Card, Dropzone } from '@openedx/paragon';\n\nimport { IMPORT_STAGES } from '../data/constants';\nimport {\n getCurrentStage, getError, getFileName, getImportTriggered,\n} from '../data/selectors';\nimport messages from './messages';\nimport { handleProcessUpload } from '../data/thunks';\n\nconst FileSection = ({ intl, courseId }) => {\n const dispatch = useDispatch();\n const importTriggered = useSelector(getImportTriggered);\n const currentStage = useSelector(getCurrentStage);\n const fileName = useSelector(getFileName);\n const { hasError } = useSelector(getError);\n const isShowedDropzone = !importTriggered || currentStage === IMPORT_STAGES.SUCCESS || hasError;\n\n return (\n \n \n \n {isShowedDropzone\n && (\n dispatch(handleProcessUpload(\n courseId,\n fileData,\n requestConfig,\n handleError,\n ))\n }\n accept={{ 'application/gzip': ['.tar.gz'] }}\n data-testid=\"dropzone\"\n />\n )}\n \n \n );\n};\n\nFileSection.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(FileSection);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n pageTitle: {\n id: 'course-authoring.import.page.title',\n defaultMessage: '{headingTitle} | {courseName} | {siteName}',\n },\n headingTitle: {\n id: 'course-authoring.import.heading.title',\n defaultMessage: 'Course import',\n },\n headingSubtitle: {\n id: 'course-authoring.import.heading.subtitle',\n defaultMessage: 'Tools',\n },\n description1: {\n id: 'course-authoring.import.description1',\n defaultMessage: 'Be sure you want to import a course before continuing. The contents of the imported course will replace the contents of the existing course. You cannot undo a course import. Before you proceed, we recommend that you export the current course, so that you have a backup copy of it.',\n },\n description2: {\n id: 'course-authoring.import.description2',\n defaultMessage: 'The course that you import must be in a .tar.gz file (that is, a .tar file compressed with GNU Zip). This .tar.gz file must contain a course.xml file. It may also contain other files.',\n },\n description3: {\n id: 'course-authoring.import.description3',\n defaultMessage: 'The import process has five stages. During the first two stages, you must stay on this page. You can leave this page after the unpacking stage has completed. We recommend, however, that you don\\'t make important changes to your course until the import operation has completed.',\n },\n});\n\nexport default messages;\n","/* eslint-disable max-len */\nimport React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport {\n Container, Layout,\n} from '@openedx/paragon';\nimport Cookies from 'universal-cookie';\nimport { Helmet } from 'react-helmet';\n\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport { RequestStatus } from '../data/constants';\nimport { useModel } from '../generic/model-store';\nimport {\n updateFileName, updateImportTriggered, updateSavingStatus, updateSuccessDate,\n} from './data/slice';\nimport ImportStepper from './import-stepper/ImportStepper';\nimport { getImportTriggered, getLoadingStatus, getSavingStatus } from './data/selectors';\nimport { LAST_IMPORT_COOKIE_NAME } from './data/constants';\nimport ImportSidebar from './import-sidebar/ImportSidebar';\nimport FileSection from './file-section/FileSection';\nimport messages from './messages';\n\nconst CourseImportPage = ({ intl, courseId }) => {\n const dispatch = useDispatch();\n const cookies = new Cookies();\n const courseDetails = useModel('courseDetails', courseId);\n const importTriggered = useSelector(getImportTriggered);\n const savingStatus = useSelector(getSavingStatus);\n const loadingStatus = useSelector(getLoadingStatus);\n const anyRequestFailed = savingStatus === RequestStatus.FAILED || loadingStatus === RequestStatus.FAILED;\n const anyRequestInProgress = savingStatus === RequestStatus.PENDING || loadingStatus === RequestStatus.IN_PROGRESS;\n\n useEffect(() => {\n const cookieData = cookies.get(LAST_IMPORT_COOKIE_NAME);\n if (cookieData) {\n dispatch(updateSavingStatus(RequestStatus.SUCCESSFUL));\n dispatch(updateImportTriggered(true));\n dispatch(updateFileName(cookieData.fileName));\n dispatch(updateSuccessDate(cookieData.date));\n }\n }, []);\n\n return (\n <>\n \n \n {intl.formatMessage(messages.pageTitle, {\n headingTitle: intl.formatMessage(messages.headingTitle),\n courseName: courseDetails?.name,\n siteName: process.env.SITE_NAME,\n })}\n \n \n \n
    \n \n \n
    \n \n

    {intl.formatMessage(messages.description1)}

    \n

    {intl.formatMessage(messages.description2)}

    \n

    {intl.formatMessage(messages.description3)}

    \n \n {importTriggered && }\n
    \n
    \n \n \n \n \n
    \n
    \n
    \n null}\n />\n
    \n \n );\n};\n\nCourseImportPage.propTypes = {\n intl: intlShape.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nCourseImportPage.defaultProps = {};\n\nexport default injectIntl(CourseImportPage);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n pageTitle: {\n id: 'course-authoring.export.page.title',\n defaultMessage: '{headingTitle} | {courseName} | {siteName}',\n },\n headingTitle: {\n id: 'course-authoring.course-checklist.heading.title',\n defaultMessage: 'Checklists',\n description: 'Header text for the Checklist page',\n },\n headingSubtitle: {\n id: 'course-authoring.course-checklist.heading.subtitle',\n defaultMessage: 'Tools',\n },\n launchChecklistLabel: {\n id: 'launchChecklistLabel',\n defaultMessage: 'Launch checklist',\n description: 'Header text for a checklist that describes actions to have completed before a course should launch',\n },\n bestPracticesChecklistLabel: {\n id: 'bestPracticesChecklistLabel',\n defaultMessage: 'Best practices checklist',\n description: 'Header text for a checklist that describes best practices for a course',\n },\n launchChecklistLoadingLabel: {\n id: 'doneLoadingChecklistStatusLabel',\n defaultMessage: 'Launch Checklist data is loading',\n description: 'Label telling the user that the Launch Checklist is loading',\n },\n launchChecklistDoneLoadingLabel: {\n id: 'launchChecklistDoneLoadingLabel',\n defaultMessage: 'Launch Checklist data is done loading',\n description: 'Label telling the user that the Launch Checklist is done loading',\n },\n bestPracticesChecklistLoadingLabel: {\n id: 'bestPracticesChecklistLoadingLabel',\n defaultMessage: 'Best Practices Checklist data is loading',\n description: 'Label telling the user that the Best Practices Checklist is loading',\n },\n bestPracticesChecklistDoneLoadingLabel: {\n id: 'bestPracticesChecklistDoneLoadingLabel',\n defaultMessage: 'Best Practices Checklist data is done loading',\n description: 'Label telling the user that the Best Practices Checklist is done loading',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, FormattedMessage } from '@edx/frontend-platform/i18n';\n\nimport messages from './messages';\n\nconst AriaLiveRegion = ({\n isCourseLaunchChecklistLoading,\n isCourseBestPracticeChecklistLoading,\n enableQuality,\n}) => {\n const courseLaunchLoadingMessage = isCourseLaunchChecklistLoading\n ? \n : ;\n\n const courseBestPracticesLoadingMessage = isCourseBestPracticeChecklistLoading\n ? \n : ;\n\n return (\n
    \n
    \n {courseLaunchLoadingMessage}\n
    \n {enableQuality ?
    {courseBestPracticesLoadingMessage}
    : null}\n
    \n );\n};\n\nAriaLiveRegion.propTypes = {\n isCourseLaunchChecklistLoading: PropTypes.bool.isRequired,\n isCourseBestPracticeChecklistLoading: PropTypes.bool.isRequired,\n enableQuality: PropTypes.bool.isRequired,\n};\n\nexport default injectIntl(AriaLiveRegion);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n welcomeMessageShortDescription: {\n id: 'welcomeMessageShortDescription',\n defaultMessage: 'Add a welcome message',\n description: 'Label for a section that describes a welcome message for a course',\n },\n welcomeMessageLongDescription: {\n id: 'welcomeMessageLongDescription',\n defaultMessage: 'Personally welcome learners into your course and prepare learners for a positive course experience.',\n description: 'Description for a section that prompts a user to enter a welcome message for a course',\n },\n gradingPolicyShortDescription: {\n id: 'gradingPolicyShortDescription',\n defaultMessage: 'Create your course grading policy',\n description: 'Label for a section that describes a grading policy for a course',\n },\n gradingPolicyLongDescription: {\n id: 'gradingPolicyLongDescription',\n defaultMessage: 'Establish your grading policy, including assignment types and passing score. All assignments add up to 100%.',\n description: 'Description for a section that prompts a user to enter a grading policy for a course',\n },\n gradingPolicyComment: {\n id: 'gradingPolicyComment',\n defaultMessage: 'Your current grading policy adds up to {percent}%.',\n description: 'Description for a section that displays a course\\'s grading policy total',\n },\n certificateShortDescription: {\n id: 'certificateShortDescription',\n defaultMessage: 'Enable your certificate',\n description: 'Label for a section that describes a certificate for completing a course',\n },\n certificateLongDescription: {\n id: 'certificateLongDescription',\n defaultMessage: 'Make sure that all text is correct, signatures have been uploaded, and the certificate has been activated.',\n description: 'Description for a section that prompts a user to create a course completion certificate',\n },\n courseDatesShortDescription: {\n id: 'courseDatesShortDescription',\n defaultMessage: 'Set important course dates',\n description: 'Label for a section that describes a certificate for completing a course',\n },\n courseDatesLongDescription: {\n id: 'courseDatesLongDescription',\n defaultMessage: 'Establish your course schedule, including when the course starts and ends.',\n description: 'Description for a section that prompts a user to set up a course schedule',\n },\n assignmentDeadlinesShortDescription: {\n id: 'assignmentDeadlinesShortDescription',\n defaultMessage: 'Validate assignment deadlines',\n description: 'Label for a section that describes course assignment deadlines',\n },\n assignmentDeadlinesLongDescription: {\n id: 'assignmentDeadlinesLongDescription',\n defaultMessage: 'Ensure all assignment deadlines are between course start and end dates.',\n description: 'Description for a section that prompts a user to enter course assignment deadlines',\n },\n assignmentDeadlinesComment: {\n id: 'assignmentDeadlinesComment',\n defaultMessage: 'The following assignments have deadlines that do not fall between course start and end date:',\n description: 'Description for a section that displays which assignments are outside of a course\\'s start and end date',\n },\n videoDurationShortDescription: {\n id: 'videoDurationShortDescription',\n defaultMessage: 'Check video duration',\n description: 'Label for a section that describes video durations',\n },\n videoDurationLongDescription: {\n id: 'videoDurationLongDescription',\n defaultMessage: 'Learners engage best with short videos followed by opportunities to practice. Ensure that 80% or more of course videos are less than 10 minutes long.',\n description: 'Description for a section that prompts a user to follow best practices for video length',\n },\n mobileFriendlyVideoShortDescription: {\n id: 'mobileFriendlyVideoShortDescription',\n defaultMessage: 'Create mobile-friendly video',\n description: 'Label for a section that describes mobile friendly videos',\n },\n mobileFriendlyVideoLongDescription: {\n id: 'mobileFriendlyVideoLongDescription',\n defaultMessage: 'Mobile-friendly videos can be viewed across all supported devices. Ensure that at least 90% of course videos are mobile friendly by uploading course videos to the edX video pipeline.',\n description: 'Description for a section that prompts a user to follow best practices for mobile friendly videos',\n },\n diverseSequencesShortDescription: {\n id: 'diverseSequencesShortDescription',\n defaultMessage: 'Build diverse learning sequences',\n description: 'Label for a section that describes diverse sequences of educational content',\n },\n diverseSequencesLongDescription: {\n id: 'diverseSequencesLongDescription',\n defaultMessage: 'Research shows that a diverse content experience drives learner engagement. We recommend that 80% or more of your learning sequences or subsections include multiple content types (such as video, discussion, or problem).',\n description: 'Description for a section that prompts a user to follow best practices diverse sequences of educational content',\n },\n weeklyHighlightsShortDescription: {\n id: 'weeklyHighlightsShortDescription',\n defaultMessage: 'Set weekly highlights',\n description: 'Label for a section that describes weekly highlights',\n },\n weeklyHighlightsLongDescription: {\n id: 'weeklyHighlightsLongDescription',\n defaultMessage: 'Enable and specify weekly highlights to keep learners engaged and on track in your course.',\n description: 'Description for a section that prompts a user to follow best practices for course weekly highlights',\n },\n unitDepthShortDescription: {\n id: 'unitDepthShortDescription',\n defaultMessage: 'Manage unit depth',\n description: 'Label for a section that describes course unit depth',\n },\n unitDepthLongDescription: {\n id: 'unitDepthLongDescription',\n defaultMessage: 'Breaking up course content into manageable pieces promotes learner engagement. We recommend units contain no more than three components.',\n description: 'Description for a section that prompts a user to follow best practices for course unit depth',\n },\n proctoringEmailShortDescription: {\n id: 'proctoringEmailShortDescription',\n defaultMessage: 'Add a proctortrack escalation email',\n description: 'Label for a section that describes proctoring escalation email',\n },\n proctoringEmailLongDescription: {\n id: 'proctoringEmailLongDescription',\n defaultMessage: 'Courses using Proctortrack require an escalation email. Ensure learners and Support can contact your course team regarding proctoring issues (e.g. appeals, exam resets, etc).',\n description: 'Description for a section that prompts the user to add a Proctortrack escalation email for the course',\n },\n updateLinkLabel: {\n id: 'updateLinkLabel',\n defaultMessage: 'Update',\n description: 'Label for a link that takes the user to a page where they can update settings',\n },\n completionCountLabel: {\n id: 'completionCountLabel',\n defaultMessage: '{completed}/{total} completed',\n description: 'Label that describes how many tasks have been completed out of a total number of tasks',\n },\n completedItemLabel: {\n id: 'completedItemLabel',\n defaultMessage: 'completed',\n description: 'Label that describes a completed task',\n },\n uncompletedItemLabel: {\n id: 'uncompletedItemLabel',\n defaultMessage: 'uncompleted',\n description: 'Label that describes an uncompleted task',\n },\n});\n\nexport default messages;\n","export const filters = {\n ALL: 'ALL',\n SELF_PACED: 'SELF_PACED',\n INSTRUCTOR_PACED: 'INSTRUCTOR_PACED',\n};\n\nexport const checklistItems = {\n launchChecklist: [\n {\n id: 'welcomeMessage',\n pacingTypeFilter: filters.ALL,\n },\n {\n id: 'gradingPolicy',\n pacingTypeFilter: filters.ALL,\n },\n {\n id: 'certificate',\n pacingTypeFilter: filters.ALL,\n },\n {\n id: 'courseDates',\n pacingTypeFilter: filters.ALL,\n },\n {\n id: 'assignmentDeadlines',\n pacingTypeFilter: filters.INSTRUCTOR_PACED,\n },\n {\n id: 'proctoringEmail',\n pacingTypeFilter: filters.ALL,\n },\n ],\n bestPracticesChecklist: [\n {\n id: 'videoDuration',\n pacingTypeFilter: filters.ALL,\n },\n {\n id: 'mobileFriendlyVideo',\n pacingTypeFilter: filters.ALL,\n },\n {\n id: 'diverseSequences',\n pacingTypeFilter: filters.ALL,\n },\n {\n id: 'weeklyHighlights',\n pacingTypeFilter: filters.SELF_PACED,\n },\n {\n id: 'unitDepth',\n pacingTypeFilter: filters.ALL,\n },\n ],\n};\n","export const hasWelcomeMessage = updates => (\n updates.hasUpdate\n);\n\nexport const hasGradingPolicy = grades => (\n grades.hasGradingPolicy\n && parseFloat(grades.sumOfWeights.toPrecision(2), 10) === 1.0\n);\n\nexport const hasCertificate = certificates => (\n certificates.isActivated && certificates.hasCertificate\n);\n\nexport const hasDates = dates => (\n dates.hasStartDate && dates.hasEndDate\n);\n\nexport const hasAssignmentDeadlines = (assignments, dates) => {\n if (!hasDates(dates)) {\n return false;\n } if (assignments.totalNumber === 0) {\n return false;\n } if (assignments.assignmentsWithDatesBeforeStart.length > 0) {\n return false;\n } if (assignments.assignmentsWithDatesAfterEnd.length > 0) {\n return false;\n } if (assignments.assignmentsWithOraDatesBeforeStart.length > 0) {\n return false;\n } if (assignments.assignmentsWithOraDatesAfterEnd.length > 0) {\n return false;\n }\n\n return true;\n};\n\nexport const hasShortVideoDuration = (videos) => {\n if (videos.totalNumber === 0) {\n return true;\n } if (videos.totalNumber > 0 && videos.durations.median <= 600) {\n return true;\n }\n\n return false;\n};\n\nexport const hasMobileFriendlyVideos = (videos) => {\n if (videos.totalNumber === 0) {\n return true;\n } if (videos.totalNumber > 0 && (videos.numMobileEncoded / videos.totalNumber) >= 0.9) {\n return true;\n }\n\n return false;\n};\n\nexport const hasDiverseSequences = (subsections) => {\n if (subsections.totalVisible === 0) {\n return false;\n } if (subsections.totalVisible > 0) {\n return ((subsections.numWithOneBlockType / subsections.totalVisible) < 0.2);\n }\n\n return false;\n};\n\nexport const hasWeeklyHighlights = sections => (\n sections.highlightsActiveForCourse && sections.highlightsEnabled\n);\n\nexport const hasShortUnitDepth = units => (\n units.numBlocks.median <= 3\n);\n\nexport const hasProctoringEscalationEmail = proctoring => (\n proctoring.hasProctoringEscalationEmail\n);\n","import { useEffect, useState } from 'react';\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\n\nimport messages from './messages';\nimport getFilteredChecklist from './utils/getFilteredChecklist';\nimport getValidatedValue from './utils/getValidatedValue';\n\nexport const useChecklistState = ({ data, dataList }) => {\n const [checklistState, setChecklistState] = useState({\n checks: [],\n totalCompletedChecks: 0,\n values: {},\n });\n\n const updateChecklistState = () => {\n if (Object.keys(data).length > 0) {\n const { isSelfPaced } = data;\n const hasCertificatesEnabled = data.certificates && data.certificates.isEnabled;\n const hasHighlightsEnabled = data.sections && data.sections.highlightsEnabled;\n const needsProctoringEscalationEmail = (\n data.proctoring && data.proctoring.needsProctoringEscalationEmail\n );\n const checks = getFilteredChecklist(\n dataList,\n isSelfPaced,\n hasCertificatesEnabled,\n hasHighlightsEnabled,\n needsProctoringEscalationEmail,\n );\n\n const values = {};\n let totalCompletedChecks = 0;\n\n checks.forEach((check) => {\n const value = getValidatedValue(data, check.id);\n\n if (value) {\n totalCompletedChecks += 1;\n }\n\n values[check.id] = value;\n });\n\n setChecklistState({\n checks,\n totalCompletedChecks,\n values,\n });\n }\n };\n\n useEffect(() => {\n updateChecklistState();\n }, [data]);\n\n return {\n checklistState,\n setChecklistState,\n };\n};\n\nexport const getCompletionCount = (checks, totalCompletedChecks) => {\n const totalChecks = Object.values(checks).length;\n\n return (\n \n );\n};\n","import { filters } from './courseChecklistData';\n\nconst getFilteredChecklist = (\n checklist,\n isSelfPaced,\n hasCertificatesEnabled,\n hasHighlightsEnabled,\n needsProctoringEscalationEmail,\n) => {\n let filteredCheckList;\n\n if (isSelfPaced) {\n filteredCheckList = checklist.filter(data => data.pacingTypeFilter === filters.ALL\n || data.pacingTypeFilter === filters.SELF_PACED);\n } else {\n filteredCheckList = checklist.filter(data => data.pacingTypeFilter === filters.ALL\n || data.pacingTypeFilter === filters.INSTRUCTOR_PACED);\n }\n\n filteredCheckList = filteredCheckList.filter(data => data.id !== 'certificate'\n || hasCertificatesEnabled);\n\n filteredCheckList = filteredCheckList.filter(data => data.id !== 'weeklyHighlights'\n || hasHighlightsEnabled);\n\n filteredCheckList = filteredCheckList.filter(data => data.id !== 'proctoringEmail'\n || needsProctoringEscalationEmail);\n\n return filteredCheckList;\n};\n\nexport default getFilteredChecklist;\n","import * as healthValidators from './courseChecklistValidators';\n\nconst getValidatedValue = (data, id) => {\n switch (id) {\n case 'welcomeMessage':\n return healthValidators.hasWelcomeMessage(data.updates);\n case 'gradingPolicy':\n return healthValidators.hasGradingPolicy(data.grades);\n case 'certificate':\n return healthValidators.hasCertificate(data.certificates);\n case 'courseDates':\n return healthValidators.hasDates(data.dates);\n case 'assignmentDeadlines':\n return healthValidators.hasAssignmentDeadlines(data.assignments, data.dates);\n case 'videoDuration':\n return healthValidators.hasShortVideoDuration(data.videos);\n case 'mobileFriendlyVideo':\n return healthValidators.hasMobileFriendlyVideos(data.videos);\n case 'diverseSequences':\n return healthValidators.hasDiverseSequences(data.subsections);\n case 'weeklyHighlights':\n return healthValidators.hasWeeklyHighlights(data.sections);\n case 'unitDepth':\n return healthValidators.hasShortUnitDepth(data.units);\n case 'proctoringEmail':\n return healthValidators.hasProctoringEscalationEmail(data.proctoring);\n default:\n throw new Error(`Unknown validator ${id}.`);\n }\n};\n\nexport default getValidatedValue;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n Button,\n Hyperlink,\n Icon,\n} from '@openedx/paragon';\nimport { CheckCircle, RadioButtonUnchecked } from '@openedx/paragon/icons';\nimport messages from './messages';\n\nconst ChecklistItemBody = ({\n checkId,\n isCompleted,\n updateLink,\n // injected\n intl,\n}) => (\n \n
    \n {isCompleted ? (\n \n ) : (\n \n )}\n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n {updateLink && (\n \n \n \n )}\n
    \n);\n\nChecklistItemBody.defaultProps = {\n updateLink: null,\n};\n\nChecklistItemBody.propTypes = {\n checkId: PropTypes.string.isRequired,\n isCompleted: PropTypes.bool.isRequired,\n updateLink: PropTypes.string,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(ChecklistItemBody);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, FormattedMessage, FormattedNumber } from '@edx/frontend-platform/i18n';\nimport { Hyperlink, Icon } from '@openedx/paragon';\nimport { ModeComment } from '@openedx/paragon/icons';\nimport messages from './messages';\n\nconst ChecklistItemComment = ({\n checkId,\n outlineUrl,\n data,\n}) => {\n const commentWrapper = (comment) => (\n
    \n
    \n \n
    \n
    \n {comment}\n
    \n
    \n );\n\n if (checkId === 'gradingPolicy') {\n const sumOfWeights = data?.grades.sumOfWeights || 0;\n const showGradingCommentSection = Object.keys(data).length > 0 && sumOfWeights !== 1;\n\n const weightSumPercentage = (sumOfWeights * 100).toFixed(2);\n const comment = (\n \n ),\n }}\n />\n );\n return (showGradingCommentSection ? (\n commentWrapper(comment)\n ) : null);\n }\n\n if (checkId === 'assignmentDeadlines') {\n const showDeadlinesCommentSection = Object.keys(data).length > 0\n && (\n data.assignments.assignmentsWithDatesBeforeStart.length > 0\n || data?.assignments.assignmentsWithDatesAfterEnd.length > 0\n || data?.assignments.assignmentsWithOraDatesBeforeStart.length > 0\n || data?.assignments.assignmentsWithOraDatesAfterEnd.length > 0\n );\n\n const allGradedAssignmentsOutsideDateRange = [].concat(\n data?.assignments.assignmentsWithDatesBeforeStart,\n data?.assignments.assignmentsWithDatesAfterEnd,\n data?.assignments.assignmentsWithOraDatesBeforeStart,\n data?.assignments.assignmentsWithOraDatesAfterEnd,\n );\n\n // de-dupe in case one assignment has multiple violations\n const assignmentsMap = new Map();\n allGradedAssignmentsOutsideDateRange.forEach(\n (assignment) => { assignmentsMap.set(assignment.id, assignment); },\n );\n const gradedAssignmentsOutsideDateRange = [];\n assignmentsMap.forEach(\n (value) => {\n gradedAssignmentsOutsideDateRange.push(value);\n },\n );\n\n const comment = (\n <>\n \n
      \n {gradedAssignmentsOutsideDateRange.map(assignment => (\n
    • \n \n
    • \n ))}\n
    \n \n );\n return (showDeadlinesCommentSection ? (\n commentWrapper(comment)\n ) : null);\n }\n\n return null;\n};\n\nChecklistItemComment.propTypes = {\n checkId: PropTypes.string.isRequired,\n outlineUrl: PropTypes.string.isRequired,\n data: PropTypes.oneOfType([\n PropTypes.shape({\n grades: PropTypes.shape({\n sumOfWeights: PropTypes.number,\n }),\n }).isRequired,\n PropTypes.shape({\n assignments: PropTypes.shape({\n totalNumber: PropTypes.number,\n totalVisible: PropTypes.number,\n /* eslint-disable react/forbid-prop-types */\n assignmentsWithDatesBeforeStart: PropTypes.array,\n assignmentsWithDatesAfterEnd: PropTypes.array,\n assignmentsWithOraDatesBeforeStart: PropTypes.array,\n assignmentsWithOraDatesAfterEnd: PropTypes.array,\n /* eslint-enable react/forbid-prop-types */\n }),\n }).isRequired,\n ]).isRequired,\n};\n\nexport default injectIntl(ChecklistItemComment);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl } from '@edx/frontend-platform/i18n';\nimport { Container, Stack } from '@openedx/paragon';\n\nimport { LoadingSpinner } from '../../generic/Loading';\nimport { getCompletionCount, useChecklistState } from './hooks';\nimport ChecklistItemBody from './ChecklistItemBody';\nimport ChecklistItemComment from './ChecklistItemComment';\nimport { checklistItems } from './utils/courseChecklistData';\n\nconst ChecklistSection = ({\n dataHeading,\n data,\n idPrefix,\n isLoading,\n updateLinks,\n}) => {\n const dataList = checklistItems[idPrefix];\n const getCompletionCountID = () => (`${idPrefix}-completion-count`);\n const { checklistState } = useChecklistState({ data, dataList });\n const { checks, totalCompletedChecks, values } = checklistState;\n\n return (\n \n

    {dataHeading}

    \n {isLoading ? (\n
    \n \n
    \n ) : (\n <>\n
    \n {getCompletionCount(checks, totalCompletedChecks)}\n
    \n \n {checks.map(check => {\n const checkId = check.id;\n const isCompleted = values[checkId];\n const updateLink = updateLinks?.[checkId];\n const outlineUrl = updateLinks.outline;\n return (\n \n \n
    \n \n
    \n \n );\n })}\n
    \n \n )}\n
    \n );\n};\n\nChecklistSection.defaultProps = {\n updateLinks: {},\n data: {},\n};\n\nChecklistSection.propTypes = {\n dataHeading: PropTypes.string.isRequired,\n data: PropTypes.oneOfType([\n PropTypes.shape({\n assignments: PropTypes.shape({\n totalNumber: PropTypes.number,\n totalVisible: PropTypes.number,\n numWithDatesBeforeEnd: PropTypes.number,\n numWithDates: PropTypes.number,\n numWithDatesAfterStart: PropTypes.number,\n }),\n dates: PropTypes.shape({\n hasStartDate: PropTypes.bool,\n hasEndDate: PropTypes.bool,\n }),\n updates: PropTypes.shape({\n hasUpdate: PropTypes.bool,\n }),\n certificates: PropTypes.shape({\n isEnabled: PropTypes.bool,\n isActivated: PropTypes.bool,\n hasCertificate: PropTypes.bool,\n }),\n grades: PropTypes.shape({\n sumOfWeights: PropTypes.number,\n }),\n is_self_paced: PropTypes.bool,\n }).isRequired,\n PropTypes.shape({\n assignments: PropTypes.shape({\n totalNumber: PropTypes.number,\n totalVisible: PropTypes.number,\n /* eslint-disable react/forbid-prop-types */\n assignmentsWithDatesBeforeStart: PropTypes.array,\n assignmentsWithDatesAfterEnd: PropTypes.array,\n assignmentsWithOraDatesBeforeStart: PropTypes.array,\n assignmentsWithOraDatesAfterEnd: PropTypes.array,\n /* eslint-enable react/forbid-prop-types */\n }),\n dates: PropTypes.shape({\n hasStartDate: PropTypes.bool,\n hasEndDate: PropTypes.bool,\n }),\n updates: PropTypes.shape({\n hasUpdate: PropTypes.bool,\n }),\n certificates: PropTypes.shape({\n isEnabled: PropTypes.bool,\n isActivated: PropTypes.bool,\n hasCertificate: PropTypes.bool,\n }),\n grades: PropTypes.shape({\n hasGradingPolicy: PropTypes.bool,\n sumOfWeights: PropTypes.number,\n }),\n proctoring: PropTypes.shape({\n needsProctoringEscalationEmail: PropTypes.bool,\n hasProctoringEscalation_email: PropTypes.bool,\n }),\n isSelfPaced: PropTypes.bool,\n }).isRequired,\n ]),\n idPrefix: PropTypes.string.isRequired,\n isLoading: PropTypes.bool.isRequired,\n updateLinks: PropTypes.shape({\n welcomeMessage: PropTypes.string,\n gradingPolicy: PropTypes.string,\n certificate: PropTypes.string,\n courseDates: PropTypes.string,\n proctoringEmail: PropTypes.string,\n outline: PropTypes.string,\n }),\n};\n\nexport default injectIntl(ChecklistSection);\n","import ChecklistSection from './ChecklistSection';\n\nexport default ChecklistSection;\n","// @ts-check\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\n\nexport const getCourseBestPracticesApiUrl = ({\n courseId,\n excludeGraded,\n all,\n}) => `${getApiBaseUrl()}/api/courses/v1/quality/${courseId}/?exclude_graded=${excludeGraded}&all=${all}`;\n\nexport const getCourseLaunchApiUrl = ({\n courseId,\n gradedOnly,\n validateOras,\n all,\n}) => `${getApiBaseUrl()}/api/courses/v1/validation/${courseId}/?graded_only=${gradedOnly}&validate_oras=${validateOras}&all=${all}`;\n\n/**\n * Get course best practices.\n * @param {{courseId: string, excludeGraded: boolean, all: boolean}} options\n * @returns {Promise<{isSelfPaced: boolean, sections: any, subsection: any, units: any, videos: any }>}\n */\nexport async function getCourseBestPractices({\n courseId,\n excludeGraded,\n all,\n}) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseBestPracticesApiUrl({ courseId, excludeGraded, all }));\n\n return camelCaseObject(data);\n}\n\n/** @typedef {object} courseLaunchData\n * @property {boolean} isSelfPaced\n * @property {object} dates\n * @property {object} assignments\n * @property {object} grades\n * @property {number} grades.sum_of_weights\n * @property {object} certificates\n * @property {object} updates\n * @property {object} proctoring\n */\n\n/**\n * Get course launch.\n * @param {{courseId: string, gradedOnly: boolean, validateOras: boolean, all: boolean}} options\n * @returns {Promise}\n */\nexport async function getCourseLaunch({\n courseId,\n gradedOnly,\n validateOras,\n all,\n}) {\n const { data } = await getAuthenticatedHttpClient()\n .get(getCourseLaunchApiUrl({\n courseId, gradedOnly, validateOras, all,\n }));\n\n return camelCaseObject(data);\n}\n","import { RequestStatus } from '../../data/constants';\nimport {\n getCourseBestPractices,\n getCourseLaunch,\n} from './api';\nimport {\n fetchLaunchChecklistSuccess,\n updateLaunchChecklistStatus,\n fetchBestPracticeChecklistSuccess,\n updateBestPracticeChecklisttStatus,\n} from './slice';\n\nexport function fetchCourseLaunchQuery({\n courseId,\n gradedOnly = true,\n validateOras = true,\n all = true,\n}) {\n return async (dispatch) => {\n try {\n const data = await getCourseLaunch({\n courseId, gradedOnly, validateOras, all,\n });\n dispatch(fetchLaunchChecklistSuccess({ data }));\n dispatch(updateLaunchChecklistStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLaunchChecklistStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function fetchCourseBestPracticesQuery({\n courseId,\n excludeGraded = true,\n all = true,\n}) {\n return async (dispatch) => {\n try {\n const data = await getCourseBestPractices({ courseId, excludeGraded, all });\n dispatch(fetchBestPracticeChecklistSuccess({ data }));\n dispatch(updateBestPracticeChecklisttStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateBestPracticeChecklisttStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n","import { getConfig } from '@edx/frontend-platform';\n\nconst getUpdateLinks = (courseId) => ({\n welcomeMessage: `${getConfig().STUDIO_BASE_URL}/course_info/${courseId}`,\n gradingPolicy: `${getConfig().STUDIO_BASE_URL}/settings/grading/${courseId}`,\n certificate: `${getConfig().STUDIO_BASE_URL}/certificates/${courseId}`,\n courseDates: `${getConfig().STUDIO_BASE_URL}/settings/details/${courseId}#schedule`,\n proctoringEmail: 'pages-and-resources/proctoring/settings',\n outline: `${getConfig().STUDIO_BASE_URL}/course/${courseId}`,\n});\n\nexport default getUpdateLinks;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { getConfig } from '@edx/frontend-platform';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Helmet } from 'react-helmet';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Container, Stack } from '@openedx/paragon';\n\nimport { useModel } from '../generic/model-store';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport messages from './messages';\nimport AriaLiveRegion from './AriaLiveRegion';\nimport { RequestStatus } from '../data/constants';\nimport ChecklistSection from './ChecklistSection';\nimport { fetchCourseLaunchQuery, fetchCourseBestPracticesQuery } from './data/thunks';\nimport getUpdateLinks from './utils';\n\nconst CourseChecklist = ({\n courseId,\n // injected,\n intl,\n}) => {\n const dispatch = useDispatch();\n const courseDetails = useModel('courseDetails', courseId);\n const enableQuality = getConfig().ENABLE_CHECKLIST_QUALITY === 'true';\n const updateLinks = getUpdateLinks(courseId);\n\n useEffect(() => {\n dispatch(fetchCourseLaunchQuery({ courseId }));\n dispatch(fetchCourseBestPracticesQuery({ courseId }));\n }, [courseId]);\n\n const {\n loadingStatus,\n launchData,\n bestPracticeData,\n } = useSelector(state => state.courseChecklist);\n\n const { bestPracticeChecklistLoadingStatus, launchChecklistLoadingStatus } = loadingStatus;\n\n const isCourseLaunchChecklistLoading = bestPracticeChecklistLoadingStatus === RequestStatus.IN_PROGRESS;\n const isCourseBestPracticeChecklistLoading = launchChecklistLoadingStatus === RequestStatus.IN_PROGRESS;\n\n return (\n <>\n \n \n {intl.formatMessage(messages.pageTitle, {\n headingTitle: intl.formatMessage(messages.headingTitle),\n courseName: courseDetails?.name,\n siteName: process.env.SITE_NAME,\n })}\n \n \n \n \n \n \n \n {enableQuality && (\n \n )}\n \n \n \n );\n};\n\nCourseChecklist.propTypes = {\n courseId: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(CourseChecklist);\n","import CourseChecklist from './CourseChecklist';\n\nexport default CourseChecklist;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.group-configurations.heading-title',\n defaultMessage: 'Group configurations',\n description: 'Title for the heading of the group configurations section.',\n },\n headingSubtitle: {\n id: 'course-authoring.group-configurations.heading-sub-title',\n defaultMessage: 'Settings',\n description: 'Subtitle for the heading of the group configurations section.',\n },\n containsGroups: {\n id: 'course-authoring.group-configurations.container.contains-groups',\n defaultMessage: 'Contains {len, plural, one {1 group} other {{len} groups}}',\n description: 'Message indicating the number of groups contained within a container.',\n },\n notInUse: {\n id: 'course-authoring.group-configurations.container.not-in-use',\n defaultMessage: 'Not in use',\n description: 'Message indicating that the group configurations are not currently in use.',\n },\n usedInLocations: {\n id: 'course-authoring.group-configurations.container.used-in-locations',\n defaultMessage: 'Used in {len, plural, one {1 location} other {{len} locations}}',\n description: 'Message indicating the number of locations where the group configurations are used.',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\n\nconst availableGroupPropTypes = {\n active: PropTypes.bool,\n description: PropTypes.string,\n groups: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n }),\n ),\n version: PropTypes.number,\n }),\n ),\n id: PropTypes.number,\n name: PropTypes.string,\n parameters: PropTypes.shape({\n courseId: PropTypes.string,\n }),\n readOnly: PropTypes.bool,\n scheme: PropTypes.string,\n version: PropTypes.number,\n};\n\nconst MESSAGE_VALIDATION_TYPES = {\n error: 'error',\n warning: 'warning',\n};\n\nexport { MESSAGE_VALIDATION_TYPES, availableGroupPropTypes };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.group-configurations.empty-placeholder.title',\n defaultMessage: 'You have not created any content groups yet.',\n description: 'Title displayed when there are no content groups created yet.',\n },\n experimentalTitle: {\n id: 'course-authoring.group-configurations.experimental-empty-placeholder.title',\n defaultMessage: 'You have not created any group configurations yet.',\n description: 'Title displayed when there are no experimental group configurations created yet.',\n },\n button: {\n id: 'course-authoring.group-configurations.empty-placeholder.button',\n defaultMessage: 'Add your first content group',\n description: 'Label for the button to add the first content group when none exist.',\n },\n experimentalButton: {\n id: 'course-authoring.group-configurations.experimental-empty-placeholder.button',\n defaultMessage: 'Add your first group configuration',\n description: 'Label for the button to add the first experimental group configuration when none exist.',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Add as IconAdd } from '@openedx/paragon/icons';\nimport { Button } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst EmptyPlaceholder = ({ onCreateNewGroup, isExperiment }) => {\n const { formatMessage } = useIntl();\n const titleMessage = isExperiment\n ? messages.experimentalTitle\n : messages.title;\n const buttonMessage = isExperiment\n ? messages.experimentalButton\n : messages.button;\n\n return (\n \n

    {formatMessage(titleMessage)}

    \n \n {formatMessage(buttonMessage)}\n \n \n );\n};\n\nEmptyPlaceholder.defaultProps = {\n isExperiment: false,\n};\n\nEmptyPlaceholder.propTypes = {\n onCreateNewGroup: PropTypes.func.isRequired,\n isExperiment: PropTypes.bool,\n};\n\nexport default EmptyPlaceholder;\n","import { getConfig } from '@edx/frontend-platform';\n\nimport messages from './messages';\n\n/**\n * Formats the given URL to a unit page URL.\n * @param {string} url - The original part of URL.\n * @returns {string} - The formatted unit page URL.\n */\nconst formatUrlToUnitPage = (url) => new URL(url, getConfig().STUDIO_BASE_URL).href;\n\n/**\n * Retrieves a list of group count based on the number of items.\n * @param {Array} items - The array of items to count.\n * @param {function} formatMessage - The function for formatting localized messages.\n * @returns {Array} - List of group count.\n */\nconst getGroupsCountMessage = (items, formatMessage) => {\n if (!items?.length) {\n return [];\n }\n\n return [formatMessage(messages.containsGroups, { len: items.length })];\n};\n\n/**\n * Retrieves a list of usage count based on the number of items.\n * @param {Array} items - The array of items to count.\n * @param {function} formatMessage - The function for formatting localized messages.\n * @returns {Array} - List of usage count.\n */\nconst getUsageCountMessage = (items, formatMessage) => {\n if (!items?.length) {\n return [formatMessage(messages.notInUse)];\n }\n\n return [formatMessage(messages.usedInLocations, { len: items.length })];\n};\n\n/**\n * Retrieves a combined list of badge messages based on usage and group information.\n * @param {Array} usage - The array of items indicating usage.\n * @param {Object} group - The group information.\n * @param {boolean} isExperiment - Flag indicating whether it is an experiment group configurations.\n * @param {function} formatMessage - The function for formatting localized messages.\n * @returns {Array} - Combined list of badges.\n */\nconst getCombinedBadgeList = (usage, group, isExperiment, formatMessage) => [\n ...(isExperiment ? getGroupsCountMessage(group.groups, formatMessage) : []),\n ...getUsageCountMessage(usage, formatMessage),\n];\n\nexport { formatUrlToUnitPage, getCombinedBadgeList };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n titleId: {\n id: 'course-authoring.group-configurations.container.title-id',\n defaultMessage: 'ID: {id}',\n description: 'Message for the title of a container within group configurations section',\n },\n accessTo: {\n id: 'course-authoring.group-configurations.container.access-to',\n defaultMessage: 'This group controls access to:',\n description: 'Indicates that the units are contained in content group',\n },\n experimentAccessTo: {\n id: 'course-authoring.group-configurations.experiment-card.experiment-access-to',\n defaultMessage: 'This group configuration is used in:',\n description: 'Indicates that the units are contained in experiment configurations',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Button, Stack, Badge, Truncate,\n} from '@openedx/paragon';\nimport {\n ArrowDropDown as ArrowDownIcon,\n ArrowRight as ArrowRightIcon,\n} from '@openedx/paragon/icons';\n\nimport { getCombinedBadgeList } from '../utils';\nimport messages from './messages';\n\nconst TitleButton = ({\n group, isExpanded, isExperiment, onTitleClick,\n}) => {\n const { formatMessage } = useIntl();\n const { id, name, usage } = group;\n\n return (\n \n
    \n

    \n {name}\n

    \n \n {formatMessage(messages.titleId, { id })}\n \n
    \n {!isExpanded && (\n \n {getCombinedBadgeList(usage, group, isExperiment, formatMessage).map(\n (badge) => (\n \n {badge}\n \n ),\n )}\n \n )}\n \n );\n};\n\nTitleButton.defaultProps = {\n isExperiment: false,\n};\n\nTitleButton.propTypes = {\n group: PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n }),\n ),\n version: PropTypes.number.isRequired,\n active: PropTypes.bool,\n description: PropTypes.string,\n groups: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n }),\n ),\n version: PropTypes.number,\n }),\n ),\n parameters: PropTypes.shape({\n courseId: PropTypes.string,\n }),\n readOnly: PropTypes.bool,\n scheme: PropTypes.string,\n }).isRequired,\n isExpanded: PropTypes.bool.isRequired,\n isExperiment: PropTypes.bool,\n onTitleClick: PropTypes.func.isRequired,\n};\n\nexport default TitleButton;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Hyperlink, Stack, Icon } from '@openedx/paragon';\nimport {\n Warning as WarningIcon,\n Error as ErrorIcon,\n} from '@openedx/paragon/icons';\n\nimport { MESSAGE_VALIDATION_TYPES } from '../constants';\nimport { formatUrlToUnitPage } from '../utils';\nimport messages from './messages';\n\nconst UsageList = ({ className, itemList, isExperiment }) => {\n const { formatMessage } = useIntl();\n const usageDescription = isExperiment\n ? messages.experimentAccessTo\n : messages.accessTo;\n\n const renderValidationMessage = ({ text, type }) => (\n \n \n {text}\n \n );\n\n return (\n
    \n

    \n {formatMessage(usageDescription)}\n

    \n \n {itemList.map(({ url, label, validation }) => (\n <>\n \n {label}\n \n {validation && renderValidationMessage(validation)}\n \n ))}\n \n
    \n );\n};\n\nUsageList.defaultProps = {\n className: undefined,\n isExperiment: false,\n};\n\nUsageList.propTypes = {\n className: PropTypes.string,\n itemList: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n validation: PropTypes.shape({\n text: PropTypes.string,\n type: PropTypes.string,\n }),\n }).isRequired,\n ).isRequired,\n isExperiment: PropTypes.bool,\n};\n\nexport default UsageList;\n","import { useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nconst PromptIfDirty = ({ dirty }) => {\n useEffect(() => {\n // eslint-disable-next-line consistent-return\n const handleBeforeUnload = (event) => {\n if (dirty) {\n event.preventDefault();\n }\n };\n window.addEventListener('beforeunload', handleBeforeUnload);\n\n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload);\n };\n }, [dirty]);\n\n return null;\n};\nPromptIfDirty.propTypes = {\n dirty: PropTypes.bool.isRequired,\n};\nexport default PromptIfDirty;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n addNewGroup: {\n id: 'course-authoring.group-configurations.content-groups.add-new-group',\n defaultMessage: 'New content group',\n description: 'Label for adding a new content group.',\n },\n newGroupHeader: {\n id: 'course-authoring.group-configurations.content-groups.new-group.header',\n defaultMessage: 'Content group name *',\n description: 'Header text for the input field to enter the name of a new content group.',\n },\n newGroupInputPlaceholder: {\n id: 'course-authoring.group-configurations.content-groups.new-group.input.placeholder',\n defaultMessage: 'This is the name of the group',\n description: 'Placeholder text for the input field where the name of a new content group is entered.',\n },\n invalidMessage: {\n id: 'course-authoring.group-configurations.content-groups.new-group.invalid-message',\n defaultMessage: 'All groups must have a unique name.',\n description: 'Error message displayed when the name of the new content group is not unique.',\n },\n cancelButton: {\n id: 'course-authoring.group-configurations.content-groups.new-group.cancel',\n defaultMessage: 'Cancel',\n description: 'Label for the cancel button when creating a new content group.',\n },\n deleteButton: {\n id: 'course-authoring.group-configurations.content-groups.edit-group.delete',\n defaultMessage: 'Delete',\n description: 'Label for the delete button when editing a content group.',\n },\n createButton: {\n id: 'course-authoring.group-configurations.content-groups.new-group.create',\n defaultMessage: 'Create',\n description: 'Label for the create button when creating a new content group.',\n },\n saveButton: {\n id: 'course-authoring.group-configurations.content-groups.edit-group.save',\n defaultMessage: 'Save',\n description: 'Label for the save button when editing a content group.',\n },\n requiredError: {\n id: 'course-authoring.group-configurations.content-groups.new-group.required-error',\n defaultMessage: 'Group name is required',\n description: 'Error message displayed when the name of the content group is required but not provided.',\n },\n alertGroupInUsage: {\n id: 'course-authoring.group-configurations.content-groups.edit-group.alert-group-in-usage',\n defaultMessage: 'This content group is used in one or more units.',\n description: 'Alert message displayed when attempting to delete a content group that is currently in use by one or more units.',\n },\n deleteRestriction: {\n id: 'course-authoring.group-configurations.content-groups.delete-restriction',\n defaultMessage: 'Cannot delete when in use by a unit',\n description: 'Message indicating that a content group cannot be deleted because it is currently in use by a unit.',\n },\n emptyContentGroups: {\n id: 'course-authoring.group-configurations.container.empty-content-groups',\n defaultMessage: 'In the {outlineComponentLink}, use this group to control access to a component.',\n description: 'Message displayed when there are no content groups available, suggesting how to use them within the course outline.',\n },\n courseOutline: {\n id: 'course-authoring.group-configurations.container.course-outline',\n defaultMessage: 'Course outline',\n description: 'Label for the course outline link.',\n },\n actionEdit: {\n id: 'course-authoring.group-configurations.container.action.edit',\n defaultMessage: 'Edit',\n description: 'Label for the edit action in the container.',\n },\n actionDelete: {\n id: 'course-authoring.group-configurations.container.action.delete',\n defaultMessage: 'Delete',\n description: 'Label for the delete action in the container.',\n },\n subtitleModalDelete: {\n id: 'course-authoring.group-configurations.container.delete-modal.subtitle',\n defaultMessage: 'content group',\n description: 'Substr for the delete modal indicating the type of entity being deleted.',\n },\n});\n\nexport default messages;\n","import PropTypes from 'prop-types';\nimport { Formik } from 'formik';\nimport * as Yup from 'yup';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Alert,\n ActionRow,\n Button,\n Form,\n} from '@openedx/paragon';\n\nimport { WarningFilled as WarningFilledIcon } from '@openedx/paragon/icons';\n\nimport PromptIfDirty from '../../generic/prompt-if-dirty/PromptIfDirty';\nimport { isAlreadyExistsGroup } from './utils';\nimport messages from './messages';\n\nconst ContentGroupForm = ({\n isEditMode,\n groupNames,\n isUsedInLocation,\n overrideValue,\n onCreateClick,\n onCancelClick,\n onEditClick,\n}) => {\n const { formatMessage } = useIntl();\n const initialValues = { newGroupName: overrideValue };\n const validationSchema = Yup.object().shape({\n newGroupName: Yup.string()\n .required(formatMessage(messages.requiredError))\n .trim()\n .test(\n 'unique-name-restriction',\n formatMessage(messages.invalidMessage),\n (value) => overrideValue === value || !isAlreadyExistsGroup(groupNames, value),\n ),\n });\n const onSubmitForm = isEditMode ? onEditClick : onCreateClick;\n\n return (\n
    \n
    \n

    {formatMessage(messages.newGroupHeader)}

    \n
    \n \n {({\n values, errors, dirty, handleChange, handleSubmit,\n }) => {\n const isInvalid = !!errors.newGroupName;\n\n return (\n <>\n \n \n {isInvalid && (\n \n {errors.newGroupName}\n \n )}\n \n {isUsedInLocation && (\n \n

    {formatMessage(messages.alertGroupInUsage)}

    \n \n )}\n \n \n \n \n \n \n );\n }}\n \n
    \n );\n};\n\nContentGroupForm.defaultProps = {\n groupNames: [],\n overrideValue: '',\n isEditMode: false,\n isUsedInLocation: false,\n onCreateClick: null,\n onEditClick: null,\n};\n\nContentGroupForm.propTypes = {\n groupNames: PropTypes.arrayOf(PropTypes.string),\n isEditMode: PropTypes.bool,\n isUsedInLocation: PropTypes.bool,\n overrideValue: PropTypes.string,\n onCreateClick: PropTypes.func,\n onCancelClick: PropTypes.func.isRequired,\n onEditClick: PropTypes.func,\n};\n\nexport default ContentGroupForm;\n","const isAlreadyExistsGroup = (groupNames, group) => groupNames.some((name) => name === group);\n\nconst initialContentGroupObject = (groupName) => ({\n name: groupName,\n version: 1,\n usage: [],\n});\n\nexport { isAlreadyExistsGroup, initialContentGroupObject };\n","import { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useParams } from 'react-router-dom';\nimport { getConfig } from '@edx/frontend-platform';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n Hyperlink,\n Icon,\n IconButtonWithTooltip,\n useToggle,\n} from '@openedx/paragon';\nimport {\n DeleteOutline as DeleteOutlineIcon,\n EditOutline as EditOutlineIcon,\n} from '@openedx/paragon/icons';\n\nimport DeleteModal from '../../generic/delete-modal/DeleteModal';\nimport TitleButton from '../common/TitleButton';\nimport UsageList from '../common/UsageList';\nimport ContentGroupForm from './ContentGroupForm';\nimport messages from './messages';\n\nconst ContentGroupCard = ({\n group,\n groupNames,\n parentGroupId,\n readOnly,\n contentGroupActions,\n handleEditGroup,\n}) => {\n const { formatMessage } = useIntl();\n const { courseId } = useParams();\n const [isExpanded, setIsExpanded] = useState(false);\n const [isEditMode, switchOnEditMode, switchOffEditMode] = useToggle(false);\n const [isOpenDeleteModal, openDeleteModal, closeDeleteModal] = useToggle(false);\n const { id, name, usage } = group;\n const isUsedInLocation = !!usage.length;\n\n const { href: outlineUrl } = new URL(\n `/course/${courseId}`,\n getConfig().STUDIO_BASE_URL,\n );\n\n const outlineComponentLink = (\n \n {formatMessage(messages.courseOutline)}\n \n );\n\n const guideHowToAdd = (\n \n {formatMessage(messages.emptyContentGroups, { outlineComponentLink })}\n \n );\n\n const handleExpandContent = () => {\n setIsExpanded((prevState) => !prevState);\n };\n\n const handleDeleteGroup = () => {\n contentGroupActions.handleDelete(parentGroupId, id);\n closeDeleteModal();\n };\n\n return (\n <>\n {isEditMode ? (\n handleEditGroup(id, values, switchOffEditMode)}\n />\n ) : (\n
    \n
    \n \n {!readOnly && (\n \n \n \n \n )}\n
    \n {isExpanded && (\n \n {usage?.length ? (\n \n ) : (\n guideHowToAdd\n )}\n
    \n )}\n \n )}\n \n \n );\n};\n\nContentGroupCard.defaultProps = {\n group: {\n id: undefined,\n name: '',\n usage: [],\n version: undefined,\n },\n readOnly: false,\n groupNames: [],\n parentGroupId: null,\n handleEditGroup: null,\n contentGroupActions: {},\n};\n\nContentGroupCard.propTypes = {\n group: PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n }),\n ),\n version: PropTypes.number.isRequired,\n active: PropTypes.bool,\n description: PropTypes.string,\n groups: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n }),\n ),\n version: PropTypes.number,\n }),\n ),\n parameters: PropTypes.shape({\n courseId: PropTypes.string,\n }),\n readOnly: PropTypes.bool,\n scheme: PropTypes.string,\n }),\n groupNames: PropTypes.arrayOf(PropTypes.string),\n parentGroupId: PropTypes.number,\n readOnly: PropTypes.bool,\n handleEditGroup: PropTypes.func,\n contentGroupActions: PropTypes.shape({\n handleCreate: PropTypes.func,\n handleDelete: PropTypes.func,\n handleEdit: PropTypes.func,\n }),\n};\n\nexport default ContentGroupCard;\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Button, useToggle } from '@openedx/paragon';\nimport { Add as AddIcon } from '@openedx/paragon/icons';\n\nimport { availableGroupPropTypes } from '../constants';\nimport EmptyPlaceholder from '../empty-placeholder';\nimport ContentGroupCard from './ContentGroupCard';\nimport ContentGroupForm from './ContentGroupForm';\nimport { initialContentGroupObject } from './utils';\nimport messages from './messages';\n\nconst ContentGroupsSection = ({\n availableGroup,\n contentGroupActions,\n}) => {\n const { formatMessage } = useIntl();\n const [isNewGroupVisible, openNewGroup, hideNewGroup] = useToggle(false);\n const { id: parentGroupId, groups, name } = availableGroup;\n const groupNames = groups?.map((group) => group.name);\n\n const handleCreateNewGroup = (values) => {\n const updatedContentGroups = {\n ...availableGroup,\n groups: [\n ...availableGroup.groups,\n initialContentGroupObject(values.newGroupName),\n ],\n };\n contentGroupActions.handleCreate(updatedContentGroups, hideNewGroup);\n };\n\n const handleEditContentGroup = (id, { newGroupName }, callbackToClose) => {\n const updatedContentGroups = {\n ...availableGroup,\n groups: availableGroup.groups.map((group) => (group.id === id ? { ...group, name: newGroupName } : group)),\n };\n contentGroupActions.handleEdit(updatedContentGroups, callbackToClose);\n };\n\n return (\n
    \n

    \n {name}\n

    \n {groups?.length ? (\n <>\n {groups.map((group) => (\n \n ))}\n {!isNewGroupVisible && (\n \n {formatMessage(messages.addNewGroup)}\n \n )}\n \n ) : (\n !isNewGroupVisible && (\n \n )\n )}\n {isNewGroupVisible && (\n \n )}\n
    \n );\n};\n\nContentGroupsSection.propTypes = {\n availableGroup: PropTypes.shape(availableGroupPropTypes).isRequired,\n contentGroupActions: PropTypes.shape({\n handleCreate: PropTypes.func,\n handleDelete: PropTypes.func,\n handleEdit: PropTypes.func,\n }).isRequired,\n};\n\nexport default ContentGroupsSection;\n","export const ALPHABET_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nexport const initialExperimentConfiguration = {\n name: '',\n description: '',\n groups: [\n {\n name: 'Group A', version: 1, usage: [], idx: 0,\n },\n {\n name: 'Group B', version: 1, usage: [], idx: 1,\n },\n ],\n scheme: 'random',\n parameters: {},\n usage: [],\n active: true,\n version: 1,\n};\n","import { isArray } from 'lodash';\n\nimport { ALPHABET_LETTERS } from './constants';\n\n/**\n * Generates the next unique group name based on existing group names.\n * @param {Array} groups - An array of group objects.\n * @param {string} groupFieldName - Optional. The name of the field containing the group name. Default is 'name'.\n * @returns {Object} An object containing the next unique group name, along with additional information.\n */\nconst getNextGroupName = (groups, groupFieldName = 'name') => {\n const existingGroupNames = groups.map((group) => group.name);\n const lettersCount = ALPHABET_LETTERS.length;\n\n // Calculate the maximum index of existing groups\n const maxIdx = groups.reduce((max, group) => Math.max(max, group.idx), -1);\n\n // Calculate the next index for the new group\n const nextIndex = maxIdx + 1;\n\n let groupName = '';\n let counter = 0;\n\n do {\n let tempIndex = nextIndex + counter;\n groupName = '';\n while (tempIndex >= 0) {\n groupName = ALPHABET_LETTERS[tempIndex % lettersCount] + groupName;\n tempIndex = Math.floor(tempIndex / lettersCount) - 1;\n }\n counter++;\n } while (existingGroupNames.includes(`Group ${groupName}`));\n\n return {\n [groupFieldName]: `Group ${groupName}`, version: 1, usage: [], idx: nextIndex,\n };\n};\n\n/**\n * Calculates the percentage of groups values of total groups.\n * @param {number} totalGroups - Total number of groups.\n * @returns {string} The percentage of groups, each group has the same value.\n */\nconst getGroupPercentage = (totalGroups) => (totalGroups === 0 ? '0%' : `${Math.floor(100 / totalGroups)}%`);\n\n/**\n * Checks if all group names in the array are unique.\n * @param {Array} groups - An array of group objects.\n * @returns {boolean} True if all group names are unique, otherwise false.\n */\nconst allGroupNamesAreUnique = (groups) => {\n const names = groups.map((group) => group.name);\n return new Set(names).size === names.length;\n};\n\n/**\n * Formats form group errors into an object. Because we need to handle both type errors.\n * @param {Array|string} errors - The form group errors.\n * @returns {Object} An object containing arrayErrors and stringError properties.\n */\nconst getFormGroupErrors = (errors) => {\n const arrayErrors = isArray(errors) ? errors : [];\n const stringError = isArray(errors) ? '' : errors || '';\n\n return { arrayErrors, stringError };\n};\n\nexport {\n allGroupNamesAreUnique,\n getNextGroupName,\n getGroupPercentage,\n getFormGroupErrors,\n};\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n title: {\n id: 'course-authoring.group-configurations.experiment-configuration.title',\n defaultMessage: 'Experiment group configurations',\n description: 'Title for the page displaying experiment group configurations.',\n },\n addNewGroup: {\n id: 'course-authoring.group-configurations.experiment-group.add-new-group',\n defaultMessage: 'New group configuration',\n description: 'Label for adding a new experiment group configuration.',\n },\n experimentConfigurationName: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.name',\n defaultMessage: 'Group configuration name',\n description: 'Label for the input field to enter the name of an experiment group configuration.',\n },\n experimentConfigurationId: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.id',\n defaultMessage: 'Group configuration ID {id}',\n description: 'Label displaying the ID of an experiment group configuration.',\n },\n experimentConfigurationNameFeedback: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.name.feedback',\n defaultMessage: 'Name or short description of the configuration.',\n description: 'Feedback message for the name/description input field of an experiment group configuration.',\n },\n experimentConfigurationNamePlaceholder: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.name.placeholder',\n defaultMessage: 'This is the name of the group configuration',\n description: 'Placeholder text for the name input field of an experiment group configuration.',\n },\n experimentConfigurationNameRequired: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.name.required',\n defaultMessage: 'Group configuration name is required.',\n description: 'Error message displayed when the name of the experiment group configuration is required but not provided.',\n },\n experimentConfigurationDescription: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.description',\n defaultMessage: 'Description',\n description: 'Label for the description input field of an experiment group configuration.',\n },\n experimentConfigurationDescriptionFeedback: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.description.feedback',\n defaultMessage: 'Optional long description.',\n description: 'Feedback message for the description input field of an experiment group configuration.',\n },\n experimentConfigurationDescriptionPlaceholder: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.description.placeholder',\n defaultMessage: 'This is the description of the group configuration',\n description: 'Placeholder text for the description input field of an experiment group configuration.',\n },\n experimentConfigurationGroups: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.groups',\n defaultMessage: 'Groups',\n description: 'Label for the section displaying groups within an experiment group configuration.',\n },\n experimentConfigurationGroupsFeedback: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.groups.feedback',\n defaultMessage: 'Name of the groups that students will be assigned to, for example, Control, Video, Problems. You must have two or more groups.',\n description: 'Feedback message for the groups section of an experiment group configuration.',\n },\n experimentConfigurationGroupsNameRequired: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.groups.name.required',\n defaultMessage: 'All groups must have a name.',\n description: 'Error message displayed when the name of a group within an experiment group configuration is required but not provided.',\n },\n experimentConfigurationGroupsNameUnique: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.groups.name.unique',\n defaultMessage: 'All groups must have a unique name.',\n description: 'Error message displayed when the names of groups within an experiment group configuration are not unique.',\n },\n experimentConfigurationGroupsRequired: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.groups.required',\n defaultMessage: 'There must be at least one group.',\n description: 'Error message displayed when at least one group is required within an experiment group configuration.',\n },\n experimentConfigurationGroupsTooltip: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.groups.tooltip',\n defaultMessage: 'Delete',\n description: 'Tooltip message for the delete action within the groups section of an experiment group configuration.',\n },\n experimentConfigurationGroupsAdd: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.groups.add',\n defaultMessage: 'Add another group',\n description: 'Label for the button to add another group within the groups section of an experiment group configuration.',\n },\n experimentConfigurationDeleteRestriction: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.delete.restriction',\n defaultMessage: 'Cannot delete when in use by an experiment',\n description: 'Error message indicating that an experiment group configuration cannot be deleted because it is currently in use by an experiment.',\n },\n experimentConfigurationCancel: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.cancel',\n defaultMessage: 'Cancel',\n description: 'Label for the cancel button within an experiment group configuration.',\n },\n experimentConfigurationSave: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.save',\n defaultMessage: 'Save',\n description: 'Label for the save button within an experiment group configuration.',\n },\n experimentConfigurationCreate: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.create',\n defaultMessage: 'Create',\n description: 'Label for the create button within an experiment group configuration.',\n },\n experimentConfigurationAlert: {\n id: 'course-authoring.group-configurations.experiment-configuration.container.alert',\n defaultMessage: 'This configuration is currently used in content experiments. If you make changes to the groups, you may need to edit those experiments.',\n description: 'Alert message indicating that an experiment group configuration is currently used in content experiments and that changes may require editing those experiments.',\n },\n emptyExperimentGroup: {\n id: 'course-authoring.group-configurations.experiment-card.empty-experiment-group',\n defaultMessage: 'This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.',\n description: 'Message displayed when an experiment group configuration is not in use and suggests adding a content experiment.',\n },\n courseOutline: {\n id: 'course-authoring.group-configurations.experiment-card.course-outline',\n defaultMessage: 'Course outline',\n description: 'Label for the course outline section within an experiment card.',\n },\n actionEdit: {\n id: 'course-authoring.group-configurations.experiment-card.action.edit',\n defaultMessage: 'Edit',\n description: 'Label for the edit action within an experiment card.',\n },\n actionDelete: {\n id: 'course-authoring.group-configurations.experiment-card.action.delete',\n defaultMessage: 'Delete',\n description: 'Label for the delete action within an experiment card.',\n },\n subtitleModalDelete: {\n id: 'course-authoring.group-configurations.experiment-card.delete-modal.subtitle',\n defaultMessage: 'group configurations',\n description: 'Subtitle for the delete modal indicating the type of entity being deleted.',\n },\n deleteRestriction: {\n id: 'course-authoring.group-configurations.experiment-card.delete-restriction',\n defaultMessage: 'Cannot delete when in use by a unit',\n description: 'Error message indicating that an experiment card cannot be deleted because it is currently in use by a unit.',\n },\n});\n\nexport default messages;\n","/* eslint-disable react/no-array-index-key */\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Close as CloseIcon, Add as AddIcon } from '@openedx/paragon/icons';\nimport {\n Form, Icon, IconButtonWithTooltip, Stack, Button,\n} from '@openedx/paragon';\n\nimport {\n getNextGroupName,\n getGroupPercentage,\n getFormGroupErrors,\n} from './utils';\nimport messages from './messages';\n\nconst ExperimentFormGroups = ({\n groups,\n errors,\n onChange,\n onDeleteGroup,\n onCreateGroup,\n}) => {\n const { formatMessage } = useIntl();\n const percentage = getGroupPercentage(groups.length);\n const { arrayErrors, stringError } = getFormGroupErrors(errors);\n\n return (\n \n \n {formatMessage(messages.experimentConfigurationGroups)}*\n \n \n {formatMessage(messages.experimentConfigurationGroupsFeedback)}\n \n {stringError && (\n \n {stringError}\n \n )}\n \n {groups.map((group, idx) => {\n const fieldError = arrayErrors?.[idx]?.name;\n const isInvalid = !!fieldError;\n\n return (\n \n \n \n
    \n {percentage}\n
    \n onDeleteGroup(idx)}\n />\n
    \n {isInvalid && (\n \n {fieldError}\n \n )}\n
    \n );\n })}\n \n onCreateGroup(getNextGroupName(groups))}\n iconBefore={AddIcon}\n block\n >\n {formatMessage(messages.experimentConfigurationGroupsAdd)}\n \n \n );\n};\n\nExperimentFormGroups.defaultProps = {\n errors: [],\n};\n\nExperimentFormGroups.propTypes = {\n groups: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string,\n version: PropTypes.number,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n validation: PropTypes.shape({\n type: PropTypes.string,\n text: PropTypes.string,\n }),\n }),\n ),\n }),\n ).isRequired,\n onChange: PropTypes.func.isRequired,\n onDeleteGroup: PropTypes.func.isRequired,\n onCreateGroup: PropTypes.func.isRequired,\n errors: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.shape({ name: PropTypes.string })),\n PropTypes.string,\n ]),\n};\n\nexport default ExperimentFormGroups;\n","import * as Yup from 'yup';\n\nimport messages from './messages';\nimport { allGroupNamesAreUnique } from './utils';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const experimentFormValidationSchema = (formatMessage) => Yup.object().shape({\n id: Yup.number(),\n name: Yup.string()\n .trim()\n .required(formatMessage(messages.experimentConfigurationNameRequired)),\n description: Yup.string(),\n groups: Yup.array()\n .of(\n Yup.object().shape({\n id: Yup.number(),\n name: Yup.string()\n .trim()\n .required(\n formatMessage(messages.experimentConfigurationGroupsNameRequired),\n ),\n version: Yup.number(),\n usage: Yup.array().nullable(true),\n }),\n )\n .required()\n .min(1, formatMessage(messages.experimentConfigurationGroupsRequired))\n .test(\n 'unique-group-name-restriction',\n formatMessage(messages.experimentConfigurationGroupsNameUnique),\n (values) => allGroupNamesAreUnique(values),\n ),\n scheme: Yup.string(),\n version: Yup.number(),\n parameters: Yup.object(),\n usage: Yup.array()\n .of(\n Yup.object().shape({\n label: Yup.string(),\n url: Yup.string(),\n }),\n )\n .nullable(true),\n active: Yup.bool(),\n});\n","import PropTypes from 'prop-types';\nimport { FieldArray, Formik } from 'formik';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Alert,\n ActionRow,\n Button,\n Form,\n} from '@openedx/paragon';\nimport { WarningFilled as WarningFilledIcon } from '@openedx/paragon/icons';\n\nimport PromptIfDirty from '../../generic/prompt-if-dirty/PromptIfDirty';\nimport ExperimentFormGroups from './ExperimentFormGroups';\nimport messages from './messages';\nimport { experimentFormValidationSchema } from './validation';\n\nconst ExperimentForm = ({\n isEditMode,\n initialValues,\n isUsedInLocation,\n onCreateClick,\n onCancelClick,\n onEditClick,\n}) => {\n const { formatMessage } = useIntl();\n const onSubmitForm = isEditMode ? onEditClick : onCreateClick;\n\n return (\n \n
    \n

    {formatMessage(messages.experimentConfigurationName)}*

    \n {isEditMode && (\n \n {formatMessage(messages.experimentConfigurationId, {\n id: initialValues.id,\n })}\n \n )}\n
    \n \n {({\n values, errors, dirty, handleChange, handleSubmit,\n }) => (\n <>\n \n \n \n {formatMessage(messages.experimentConfigurationNameFeedback)}\n \n {errors.name && (\n \n {errors.name}\n \n )}\n \n\n \n \n {formatMessage(messages.experimentConfigurationDescription)}\n \n \n \n {formatMessage(\n messages.experimentConfigurationDescriptionFeedback,\n )}\n \n \n\n (\n arrayHelpers.remove(idx)}\n onCreateGroup={(newGroup) => arrayHelpers.push(newGroup)}\n />\n )}\n />\n\n {isUsedInLocation && (\n \n

    {formatMessage(messages.experimentConfigurationAlert)}

    \n \n )}\n \n \n \n \n \n \n )}\n \n \n );\n};\n\nExperimentForm.defaultProps = {\n isEditMode: false,\n isUsedInLocation: false,\n onCreateClick: null,\n onEditClick: null,\n};\n\nExperimentForm.propTypes = {\n isEditMode: PropTypes.bool,\n initialValues: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n description: PropTypes.string,\n groups: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n groupName: PropTypes.string,\n }),\n ),\n }).isRequired,\n isUsedInLocation: PropTypes.bool,\n onCreateClick: PropTypes.func,\n onCancelClick: PropTypes.func.isRequired,\n onEditClick: PropTypes.func,\n};\n\nexport default ExperimentForm;\n","import PropTypes from 'prop-types';\nimport { Stack, Truncate } from '@openedx/paragon';\n\nimport { getGroupPercentage } from './utils';\n\nconst ExperimentCardGroup = ({ groups }) => {\n const percentage = getGroupPercentage(groups.length);\n\n return (\n \n {groups.map((item) => (\n \n {item.name}\n {percentage}\n \n ))}\n \n );\n};\n\nExperimentCardGroup.propTypes = {\n groups: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n }),\n ),\n version: PropTypes.number,\n }),\n ).isRequired,\n};\n\nexport default ExperimentCardGroup;\n","import { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useParams } from 'react-router-dom';\nimport { getConfig } from '@edx/frontend-platform';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow,\n Hyperlink,\n Icon,\n IconButtonWithTooltip,\n useToggle,\n} from '@openedx/paragon';\nimport {\n DeleteOutline as DeleteOutlineIcon,\n EditOutline as EditOutlineIcon,\n} from '@openedx/paragon/icons';\n\nimport DeleteModal from '../../generic/delete-modal/DeleteModal';\nimport TitleButton from '../common/TitleButton';\nimport UsageList from '../common/UsageList';\nimport ExperimentCardGroup from './ExperimentCardGroup';\nimport ExperimentForm from './ExperimentForm';\nimport messages from './messages';\nimport { initialExperimentConfiguration } from './constants';\n\nconst ExperimentCard = ({\n configuration,\n experimentConfigurationActions,\n isExpandedByDefault,\n onCreate,\n}) => {\n const { formatMessage } = useIntl();\n const { courseId } = useParams();\n const [isExpanded, setIsExpanded] = useState(false);\n const [isEditMode, switchOnEditMode, switchOffEditMode] = useToggle(false);\n const [isOpenDeleteModal, openDeleteModal, closeDeleteModal] = useToggle(false);\n\n useEffect(() => {\n setIsExpanded(isExpandedByDefault);\n }, [isExpandedByDefault]);\n\n const {\n id, groups: groupsControl, description, usage,\n } = configuration;\n const isUsedInLocation = !!usage?.length;\n\n const { href: outlineUrl } = new URL(\n `/course/${courseId}`,\n getConfig().STUDIO_BASE_URL,\n );\n\n const outlineComponentLink = (\n \n {formatMessage(messages.courseOutline)}\n \n );\n\n const guideHowToAdd = (\n \n {formatMessage(messages.emptyExperimentGroup, { outlineComponentLink })}\n \n );\n\n // We need to store actual idx as an additional field for getNextGroupName utility.\n const configurationGroupsWithIndexField = {\n ...configuration,\n groups: configuration.groups.map((group, idx) => ({ ...group, idx })),\n };\n\n const formValues = isEditMode\n ? configurationGroupsWithIndexField\n : initialExperimentConfiguration;\n\n const handleDeleteConfiguration = () => {\n experimentConfigurationActions.handleDelete(id);\n closeDeleteModal();\n };\n\n const handleEditConfiguration = (values) => {\n experimentConfigurationActions.handleEdit(values, switchOffEditMode);\n };\n\n return (\n <>\n {isEditMode ? (\n \n ) : (\n \n
    \n setIsExpanded((prevState) => !prevState)}\n isExperiment\n />\n \n \n \n \n
    \n {isExpanded && (\n \n {description}\n \n {usage?.length ? (\n \n ) : (\n guideHowToAdd\n )}\n \n )}\n \n )}\n \n \n );\n};\n\nExperimentCard.defaultProps = {\n configuration: {\n id: undefined,\n name: '',\n usage: [],\n version: undefined,\n },\n isExpandedByDefault: false,\n onCreate: null,\n experimentConfigurationActions: {},\n};\n\nExperimentCard.propTypes = {\n configuration: PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n validation: PropTypes.shape({\n type: PropTypes.string,\n text: PropTypes.string,\n }),\n }),\n ),\n version: PropTypes.number.isRequired,\n active: PropTypes.bool,\n description: PropTypes.string,\n groups: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n }),\n ),\n version: PropTypes.number,\n }),\n ),\n parameters: PropTypes.shape({\n courseId: PropTypes.string,\n }),\n scheme: PropTypes.string,\n }),\n isExpandedByDefault: PropTypes.bool,\n onCreate: PropTypes.func,\n experimentConfigurationActions: PropTypes.shape({\n handleCreate: PropTypes.func,\n handleEdit: PropTypes.func,\n handleDelete: PropTypes.func,\n }),\n};\n\nexport default ExperimentCard;\n","import PropTypes from 'prop-types';\nimport { Button, useToggle } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Add as AddIcon } from '@openedx/paragon/icons';\n\nimport { useScrollToHashElement } from '../../hooks';\nimport EmptyPlaceholder from '../empty-placeholder';\nimport ExperimentForm from './ExperimentForm';\nimport ExperimentCard from './ExperimentCard';\nimport { initialExperimentConfiguration } from './constants';\nimport messages from './messages';\n\nconst ExperimentConfigurationsSection = ({\n availableGroups,\n experimentConfigurationActions,\n}) => {\n const { formatMessage } = useIntl();\n const [\n isNewConfigurationVisible,\n openNewConfiguration,\n hideNewConfiguration,\n ] = useToggle(false);\n\n const handleCreateConfiguration = (configuration) => {\n experimentConfigurationActions.handleCreate(configuration, hideNewConfiguration);\n };\n\n const { elementWithHash } = useScrollToHashElement({ isLoading: true });\n\n return (\n
    \n

    \n {formatMessage(messages.title)}\n

    \n {availableGroups.length ? (\n <>\n {availableGroups.map((configuration) => (\n \n ))}\n {!isNewConfigurationVisible && (\n \n {formatMessage(messages.addNewGroup)}\n \n )}\n \n ) : (\n !isNewConfigurationVisible && (\n \n )\n )}\n {isNewConfigurationVisible && (\n \n )}\n
    \n );\n};\n\nExperimentConfigurationsSection.defaultProps = {\n availableGroups: [],\n};\n\nExperimentConfigurationsSection.propTypes = {\n availableGroups: PropTypes.arrayOf(\n PropTypes.shape({\n active: PropTypes.bool,\n description: PropTypes.string,\n groups: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n usage: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n url: PropTypes.string,\n }),\n ),\n version: PropTypes.number,\n }).isRequired,\n ),\n id: PropTypes.number,\n name: PropTypes.string,\n parameters: PropTypes.shape({\n courseId: PropTypes.string,\n }),\n readOnly: PropTypes.bool,\n scheme: PropTypes.string,\n version: PropTypes.number,\n }).isRequired,\n ),\n experimentConfigurationActions: PropTypes.shape({\n handleCreate: PropTypes.func,\n handleDelete: PropTypes.func,\n }).isRequired,\n};\n\nexport default ExperimentConfigurationsSection;\n","import PropTypes from 'prop-types';\n\nimport { availableGroupPropTypes } from '../constants';\nimport ContentGroupCard from '../content-groups-section/ContentGroupCard';\n\nconst EnrollmentTrackGroupsSection = ({ availableGroup: { groups, name } }) => (\n
    \n

    {name}

    \n {groups.map((group) => (\n \n ))}\n
    \n);\n\nEnrollmentTrackGroupsSection.propTypes = {\n availableGroup: PropTypes.shape(availableGroupPropTypes).isRequired,\n};\n\nexport default EnrollmentTrackGroupsSection;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n aboutTitle: {\n id: 'course-authoring.group-configurations.sidebar.about.title',\n defaultMessage: 'Content groups',\n description: 'Title for the content groups section in the sidebar.',\n },\n aboutDescription_1: {\n id: 'course-authoring.group-configurations.sidebar.about.description-1',\n defaultMessage: 'If you have cohorts enabled in your course, you can use content groups to create cohort-specific courseware. In other words, you can customize the content that particular cohorts see in your course.',\n description: 'First description for the content groups section in the sidebar.',\n },\n aboutDescription_2: {\n id: 'course-authoring.group-configurations.sidebar.about.description-2',\n defaultMessage: 'Each content group that you create can be associated with one or more cohorts. In addition to making course content available to all learners, you can restrict access to some content to learners in specific content groups. Only learners in the cohorts that are associated with the specified content groups see the additional content.',\n description: 'Second description for the content groups section in the sidebar.',\n },\n aboutDescription_3: {\n id: 'course-authoring.group-configurations.sidebar.about.description-3',\n defaultMessage: 'Click {strongText} to add a new content group. To edit the name of a content group, hover over its box and click {strongText2}. You can delete a content group only if it is not in use by a unit. To delete a content group, hover over its box and click the delete icon.',\n description: 'Third description for the content groups section in the sidebar. Mentions how to add, edit, and delete content groups.',\n },\n aboutDescription_3_strong: {\n id: 'course-authoring.group-configurations.sidebar.about.description-3.strong',\n defaultMessage: 'New content group',\n description: 'Strong text (button label) used in the third description for adding a new content group.',\n },\n about_2_title: {\n id: 'course-authoring.group-configurations.sidebar.about-2.title',\n defaultMessage: 'Experiment group configurations',\n description: 'Title for the experiment group configurations section in the sidebar.',\n },\n about_2_description_1: {\n id: 'course-authoring.group-configurations.sidebar.about-2.description-1',\n defaultMessage: 'Use experiment group configurations if you are conducting content experiments, also known as A/B testing, in your course. Experiment group configurations define how many groups of learners are in a content experiment. When you create a content experiment for a course, you select the group configuration to use.',\n description: 'First description for the experiment group configurations section in the sidebar.',\n },\n about_2_description_2: {\n id: 'course-authoring.group-configurations.sidebar.about-2.description-2',\n defaultMessage: 'Click {strongText} to add a new configuration. To edit a configuration, hover over its box and click {strongText2}. You can delete a group configuration only if it is not in use in an experiment. To delete a configuration, hover over its box and click the delete icon.',\n description: 'Second description for the experiment group configurations section in the sidebar. Mentions how to add, edit, and delete group configurations.',\n },\n about_2_description_2_strong: {\n id: 'course-authoring.group-configurations.sidebar.about-2.description-2.strong',\n defaultMessage: 'New group configuration',\n description: 'Strong text (button label) used in the second description for adding a new group configuration.',\n },\n about_3_title: {\n id: 'course-authoring.group-configurations.sidebar.about-3.title',\n defaultMessage: 'Enrollment track groups',\n description: 'Title for the enrollment track groups section in the sidebar.',\n },\n about_3_description_1: {\n id: 'course-authoring.group-configurations.sidebar.about-3.description-1',\n defaultMessage: 'Enrollment track groups allow you to offer different course content to learners in each enrollment track. Learners enrolled in each enrollment track in your course are automatically included in the corresponding enrollment track group.',\n description: 'First description for the enrollment track groups section in the sidebar.',\n },\n about_3_description_2: {\n id: 'course-authoring.group-configurations.sidebar.about-3.description-2',\n defaultMessage: 'On unit pages in the course outline, you can restrict access to components to learners based on their enrollment track.',\n description: 'Second description for the enrollment track groups section in the sidebar.',\n },\n about_3_description_3: {\n id: 'course-authoring.group-configurations.sidebar.about-3.description-3',\n defaultMessage: 'You cannot edit enrollment track groups, but you can expand each group to view details of the course content that is designated for learners in the group.',\n description: 'Third description for the enrollment track groups section in the sidebar. Mentions the limitations and options for managing enrollment track groups.',\n },\n aboutDescription_strong_edit: {\n id: 'course-authoring.group-configurations.sidebar.about.description.strong-edit',\n defaultMessage: 'edit',\n description: 'Strong text used to indicate the edit action.',\n },\n learnMoreBtn: {\n id: 'course-authoring.group-configurations.sidebar.learnmore.button',\n defaultMessage: 'Learn more',\n description: 'Label for the \"Learn more\" button in the sidebar.',\n },\n});\n\nexport default messages;\n","import { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Hyperlink } from '@openedx/paragon';\n\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport { useHelpUrls } from '../../help-urls/hooks';\nimport { getSidebarData } from './utils';\nimport messages from './messages';\n\nconst GroupConfigurationSidebar = ({\n courseId, shouldShowExperimentGroups, shouldShowContentGroup, shouldShowEnrollmentTrackGroup,\n}) => {\n const intl = useIntl();\n const urls = useHelpUrls(['groupConfigurations', 'enrollmentTracks', 'contentGroups']);\n const sidebarData = getSidebarData({\n messages, intl, shouldShowExperimentGroups, shouldShowContentGroup, shouldShowEnrollmentTrackGroup,\n });\n\n return (\n \n {sidebarData\n .map(({ title, paragraphs, urlKey }, idx) => (\n \n

    \n {title}\n

    \n {paragraphs.map((text) => (\n

    \n {text}\n

    \n ))}\n \n {intl.formatMessage(messages.learnMoreBtn)}\n \n {idx !== sidebarData.length - 1 &&
    }\n
    \n ))}\n \n );\n};\n\nGroupConfigurationSidebar.propTypes = {\n courseId: PropTypes.string.isRequired,\n shouldShowContentGroup: PropTypes.bool.isRequired,\n shouldShowExperimentGroups: PropTypes.bool.isRequired,\n shouldShowEnrollmentTrackGroup: PropTypes.bool.isRequired,\n};\n\nexport default GroupConfigurationSidebar;\n","/**\n * Compiles the sidebar data for the course authoring sidebar.\n *\n * @param {Object} messages - The localized messages.\n * @param {Object} intl - The intl object for formatting messages.\n * @param {boolean} shouldShowExperimentGroups - Flag to include experiment group configuration data.\n * @param {boolean} shouldShowContentGroup - Flag to include content group data.\n * @param {boolean} shouldShowEnrollmentTrackGroup - Flag to include enrollment track group data.\n * @returns {Object[]} The array of sidebar data groups.\n */\nconst getSidebarData = ({\n messages, intl, shouldShowExperimentGroups, shouldShowContentGroup, shouldShowEnrollmentTrackGroup,\n}) => {\n const groups = [];\n\n if (shouldShowEnrollmentTrackGroup) {\n groups.push({\n urlKey: 'enrollmentTracks',\n title: intl.formatMessage(messages.about_3_title),\n paragraphs: [\n intl.formatMessage(messages.about_3_description_1),\n intl.formatMessage(messages.about_3_description_2),\n intl.formatMessage(messages.about_3_description_3),\n ],\n });\n }\n if (shouldShowContentGroup) {\n groups.push({\n urlKey: 'contentGroups',\n title: intl.formatMessage(messages.aboutTitle),\n paragraphs: [\n intl.formatMessage(messages.aboutDescription_1),\n intl.formatMessage(messages.aboutDescription_2),\n intl.formatMessage(messages.aboutDescription_3, {\n strongText: {intl.formatMessage(messages.aboutDescription_3_strong)},\n strongText2: {intl.formatMessage(messages.aboutDescription_strong_edit)},\n }),\n ],\n });\n }\n if (shouldShowExperimentGroups) {\n groups.push({\n urlKey: 'groupConfigurations',\n title: intl.formatMessage(messages.about_2_title),\n paragraphs: [\n intl.formatMessage(messages.about_2_description_1),\n intl.formatMessage(messages.about_2_description_2, {\n strongText: {intl.formatMessage(messages.about_2_description_2_strong)},\n strongText2: {intl.formatMessage(messages.aboutDescription_strong_edit)},\n }),\n ],\n });\n }\n return groups;\n};\n// eslint-disable-next-line import/prefer-default-export\nexport { getSidebarData };\n","export const getGroupConfigurationsData = (state) => state.groupConfigurations.groupConfigurations;\nexport const getLoadingStatus = (state) => state.groupConfigurations.loadingStatus;\nexport const getSavingStatus = (state) => state.groupConfigurations.savingStatus;\nexport const getErrorMessage = (state) => state.groupConfigurations.errorMessage;\n","import { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nconst API_PATH_PATTERN = 'group_configurations';\nconst getStudioBaseUrl = () => getConfig().STUDIO_BASE_URL;\n\nexport const getContentStoreApiUrl = (courseId) => `${getStudioBaseUrl()}/api/contentstore/v1/${API_PATH_PATTERN}/${courseId}`;\nexport const getLegacyApiUrl = (courseId, parentGroupId, groupId) => {\n const parentUrlPath = `${getStudioBaseUrl()}/${API_PATH_PATTERN}/${courseId}`;\n const parentGroupPath = `${parentGroupId ? `/${parentGroupId}` : ''}`;\n const groupPath = `${groupId ? `/${groupId}` : ''}`;\n return `${parentUrlPath}${parentGroupPath}${groupPath}`;\n};\n\n/**\n * Get content groups and experimental group configurations for course.\n * @param {string} courseId\n * @returns {Promise}\n */\nexport async function getGroupConfigurations(courseId) {\n const { data } = await getAuthenticatedHttpClient().get(\n getContentStoreApiUrl(courseId),\n );\n\n return camelCaseObject(data);\n}\n\n/**\n * Create new content group for course.\n * @param {string} courseId\n * @param {object} group\n * @returns {Promise}\n */\nexport async function createContentGroup(courseId, group) {\n const { data } = await getAuthenticatedHttpClient().post(\n getLegacyApiUrl(courseId, group.id),\n group,\n );\n\n return camelCaseObject(data);\n}\n\n/**\n * Edit exists content group in course.\n * @param {string} courseId\n * @param {object} group\n * @returns {Promise}\n */\nexport async function editContentGroup(courseId, group) {\n const { data } = await getAuthenticatedHttpClient().post(\n getLegacyApiUrl(courseId, group.id),\n group,\n );\n\n return camelCaseObject(data);\n}\n\n/**\n * Delete exists content group from the course.\n * @param {string} courseId\n * @param {number} parentGroupId\n * @param {number} groupId\n * @returns {Promise}\n */\nexport async function deleteContentGroup(courseId, parentGroupId, groupId) {\n const { data } = await getAuthenticatedHttpClient().delete(\n getLegacyApiUrl(courseId, parentGroupId, groupId),\n );\n\n return camelCaseObject(data);\n}\n\n/**\n * Create a new experiment configuration for the course.\n * @param {string} courseId\n * @param {object} configuration\n * @returns {Promise}\n */\nexport async function createExperimentConfiguration(courseId, configuration) {\n const { data } = await getAuthenticatedHttpClient().post(\n getLegacyApiUrl(courseId),\n configuration,\n );\n\n return camelCaseObject(data);\n}\n\n/**\n * Edit the experiment configuration for the course.\n * @param {string} courseId\n * @param {object} configuration\n * @returns {Promise}\n */\nexport async function editExperimentConfiguration(courseId, configuration) {\n const { data } = await getAuthenticatedHttpClient().post(\n getLegacyApiUrl(courseId, configuration.id),\n configuration,\n );\n\n return camelCaseObject(data);\n}\n\n/**\n * Delete existing experimental configuration from the course.\n * @param {string} courseId\n * @param {number} configurationId\n * @returns {Promise}\n */\nexport async function deleteExperimentConfiguration(courseId, configurationId) {\n const { data } = await getAuthenticatedHttpClient().delete(\n getLegacyApiUrl(courseId, configurationId),\n );\n\n return camelCaseObject(data);\n}\n","import { RequestStatus } from '../../data/constants';\nimport { NOTIFICATION_MESSAGES } from '../../constants';\nimport {\n hideProcessingNotification,\n showProcessingNotification,\n} from '../../generic/processing-notification/data/slice';\nimport { handleResponseErrors } from '../../generic/saving-error-alert';\nimport {\n getGroupConfigurations,\n createContentGroup,\n editContentGroup,\n deleteContentGroup,\n createExperimentConfiguration,\n editExperimentConfiguration,\n deleteExperimentConfiguration,\n} from './api';\nimport {\n fetchGroupConfigurations,\n updateLoadingStatus,\n updateSavingStatuses,\n updateGroupConfigurationsSuccess,\n deleteGroupConfigurationsSuccess,\n updateExperimentConfigurationSuccess,\n deleteExperimentConfigurationSuccess,\n} from './slice';\n\nexport function fetchGroupConfigurationsQuery(courseId) {\n return async (dispatch) => {\n dispatch(updateLoadingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n const groupConfigurations = await getGroupConfigurations(courseId);\n dispatch(fetchGroupConfigurations({ groupConfigurations }));\n dispatch(updateLoadingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatus({ status: RequestStatus.FAILED }));\n }\n };\n}\n\nexport function createContentGroupQuery(courseId, group) {\n return async (dispatch) => {\n dispatch(updateSavingStatuses({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n const data = await createContentGroup(courseId, group);\n dispatch(updateGroupConfigurationsSuccess({ data }));\n dispatch(updateSavingStatuses({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n return handleResponseErrors(error, dispatch, updateSavingStatuses);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function editContentGroupQuery(courseId, group) {\n return async (dispatch) => {\n dispatch(updateSavingStatuses({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n const data = await editContentGroup(courseId, group);\n dispatch(updateGroupConfigurationsSuccess({ data }));\n dispatch(updateSavingStatuses({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n return handleResponseErrors(error, dispatch, updateSavingStatuses);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function deleteContentGroupQuery(courseId, parentGroupId, groupId) {\n return async (dispatch) => {\n dispatch(updateSavingStatuses({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.deleting));\n\n try {\n await deleteContentGroup(courseId, parentGroupId, groupId);\n dispatch(deleteGroupConfigurationsSuccess({ parentGroupId, groupId }));\n dispatch(updateSavingStatuses({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n handleResponseErrors(error, dispatch, updateSavingStatuses);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function createExperimentConfigurationQuery(courseId, newConfiguration) {\n return async (dispatch) => {\n dispatch(updateSavingStatuses({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n const configuration = await createExperimentConfiguration(\n courseId,\n newConfiguration,\n );\n dispatch(updateExperimentConfigurationSuccess({ configuration }));\n dispatch(updateSavingStatuses({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n return handleResponseErrors(error, dispatch, updateSavingStatuses);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function editExperimentConfigurationQuery(\n courseId,\n editedConfiguration,\n) {\n return async (dispatch) => {\n dispatch(updateSavingStatuses({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.saving));\n\n try {\n const configuration = await editExperimentConfiguration(\n courseId,\n editedConfiguration,\n );\n dispatch(updateExperimentConfigurationSuccess({ configuration }));\n dispatch(updateSavingStatuses({ status: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n return handleResponseErrors(error, dispatch, updateSavingStatuses);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n\nexport function deleteExperimentConfigurationQuery(courseId, configurationId) {\n return async (dispatch) => {\n dispatch(updateSavingStatuses({ status: RequestStatus.PENDING }));\n dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.deleting));\n\n try {\n await deleteExperimentConfiguration(courseId, configurationId);\n dispatch(deleteExperimentConfigurationSuccess({ configurationId }));\n dispatch(updateSavingStatuses({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n handleResponseErrors(error, dispatch, updateSavingStatuses);\n } finally {\n dispatch(hideProcessingNotification());\n }\n };\n}\n","import { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { RequestStatus } from '../data/constants';\nimport { getProcessingNotification } from '../generic/processing-notification/data/selectors';\nimport {\n getGroupConfigurationsData,\n getLoadingStatus,\n getSavingStatus,\n getErrorMessage,\n} from './data/selectors';\nimport { updateSavingStatuses } from './data/slice';\nimport {\n createContentGroupQuery,\n createExperimentConfigurationQuery,\n deleteContentGroupQuery,\n deleteExperimentConfigurationQuery,\n editContentGroupQuery,\n editExperimentConfigurationQuery,\n fetchGroupConfigurationsQuery,\n} from './data/thunk';\n\nconst useGroupConfigurations = (courseId) => {\n const dispatch = useDispatch();\n const groupConfigurations = useSelector(getGroupConfigurationsData);\n const loadingStatus = useSelector(getLoadingStatus);\n const savingStatus = useSelector(getSavingStatus);\n const errorMessage = useSelector(getErrorMessage);\n const {\n isShow: isShowProcessingNotification,\n title: processingNotificationTitle,\n } = useSelector(getProcessingNotification);\n\n const handleInternetConnectionFailed = () => {\n dispatch(updateSavingStatuses({ status: RequestStatus.FAILED }));\n };\n\n const contentGroupActions = {\n handleCreate: (group, callbackToClose) => {\n dispatch(createContentGroupQuery(courseId, group)).then((result) => {\n if (result) {\n callbackToClose();\n }\n });\n },\n handleEdit: (group, callbackToClose) => {\n dispatch(editContentGroupQuery(courseId, group)).then((result) => {\n if (result) {\n callbackToClose();\n }\n });\n },\n handleDelete: (parentGroupId, groupId) => {\n dispatch(deleteContentGroupQuery(courseId, parentGroupId, groupId));\n },\n };\n\n const experimentConfigurationActions = {\n handleCreate: (configuration, callbackToClose) => {\n dispatch(\n createExperimentConfigurationQuery(courseId, configuration),\n ).then((result) => {\n if (result) {\n callbackToClose();\n }\n });\n },\n handleEdit: (configuration, callbackToClose) => {\n dispatch(editExperimentConfigurationQuery(courseId, configuration)).then(\n (result) => {\n if (result) {\n callbackToClose();\n }\n },\n );\n },\n handleDelete: (configurationId) => {\n dispatch(deleteExperimentConfigurationQuery(courseId, configurationId));\n },\n };\n\n useEffect(() => {\n dispatch(fetchGroupConfigurationsQuery(courseId));\n }, [courseId]);\n\n return {\n isLoading: loadingStatus === RequestStatus.IN_PROGRESS,\n savingStatus,\n contentGroupActions,\n experimentConfigurationActions,\n errorMessage,\n groupConfigurations,\n isShowProcessingNotification,\n processingNotificationTitle,\n handleInternetConnectionFailed,\n };\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { useGroupConfigurations };\n","import PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Container, Layout, Stack, Row,\n} from '@openedx/paragon';\n\nimport { LoadingSpinner } from '../generic/Loading';\nimport { useModel } from '../generic/model-store';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport getPageHeadTitle from '../generic/utils';\nimport ProcessingNotification from '../generic/processing-notification';\nimport { SavingErrorAlert } from '../generic/saving-error-alert';\nimport messages from './messages';\nimport ContentGroupsSection from './content-groups-section';\nimport ExperimentConfigurationsSection from './experiment-configurations-section';\nimport EnrollmentTrackGroupsSection from './enrollment-track-groups-section';\nimport GroupConfigurationSidebar from './group-configuration-sidebar';\nimport { useGroupConfigurations } from './hooks';\n\nconst GroupConfigurations = ({ courseId }) => {\n const { formatMessage } = useIntl();\n const courseDetails = useModel('courseDetails', courseId);\n const {\n isLoading,\n savingStatus,\n errorMessage,\n contentGroupActions,\n experimentConfigurationActions,\n processingNotificationTitle,\n isShowProcessingNotification,\n groupConfigurations: {\n allGroupConfigurations,\n shouldShowEnrollmentTrack,\n shouldShowExperimentGroups,\n experimentGroupConfigurations,\n },\n } = useGroupConfigurations(courseId);\n\n document.title = getPageHeadTitle(\n courseDetails?.name,\n formatMessage(messages.headingTitle),\n );\n\n if (isLoading) {\n return (\n \n \n \n );\n }\n\n const enrollmentTrackGroup = shouldShowEnrollmentTrack\n ? allGroupConfigurations[0]\n : null;\n const contentGroup = allGroupConfigurations?.[shouldShowEnrollmentTrack ? 1 : 0];\n\n return (\n <>\n \n
    \n \n \n \n \n {!!enrollmentTrackGroup && (\n \n )}\n {!!contentGroup && (\n \n )}\n {shouldShowExperimentGroups && (\n \n )}\n \n \n \n \n \n \n \n
    \n \n \n
    \n \n );\n};\n\nGroupConfigurations.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default GroupConfigurations;\n","import React from 'react';\nimport {\n Navigate, Routes, Route, useParams,\n} from 'react-router-dom';\nimport { getConfig } from '@edx/frontend-platform';\nimport { PageWrap } from '@edx/frontend-platform/react';\nimport { Textbooks } from 'CourseAuthoring/textbooks';\nimport CourseAuthoringPage from './CourseAuthoringPage';\nimport { PagesAndResources } from './pages-and-resources';\nimport EditorContainer from './editors/EditorContainer';\nimport VideoSelectorContainer from './selectors/VideoSelectorContainer';\nimport CustomPages from './custom-pages';\nimport { FilesPage, VideosPage } from './files-and-videos';\nimport { AdvancedSettings } from './advanced-settings';\nimport { CourseOutline } from './course-outline';\nimport ScheduleAndDetails from './schedule-and-details';\nimport { GradingSettings } from './grading-settings';\nimport CourseTeam from './course-team/CourseTeam';\nimport { CourseUpdates } from './course-updates';\nimport { CourseUnit } from './course-unit';\nimport { Certificates } from './certificates';\nimport CourseExportPage from './export-page/CourseExportPage';\nimport CourseImportPage from './import-page/CourseImportPage';\nimport { DECODED_ROUTES } from './constants';\nimport CourseChecklist from './course-checklist';\nimport GroupConfigurations from './group-configurations';\n\n/**\n * As of this writing, these routes are mounted at a path prefixed with the following:\n *\n * /course/:courseId\n *\n * Meaning that their absolute paths look like:\n *\n * /course/:courseId/course-pages\n * /course/:courseId/proctored-exam-settings\n * /course/:courseId/editor/:blockType/:blockId\n *\n * This component and CourseAuthoringPage should maybe be combined once we no longer need to have\n * CourseAuthoringPage split out for use in LegacyProctoringRoute. Once that route is removed, we\n * can move the Header/Footer rendering to this component and likely pull the course detail loading\n * in as well, and it'd feel a bit better-factored and the roles would feel more clear.\n */\nconst CourseAuthoringRoutes = () => {\n const { courseId } = useParams();\n\n return (\n \n \n }\n />\n }\n />\n }\n />\n : null}\n />\n }\n />\n }\n />\n }\n />\n {DECODED_ROUTES.COURSE_UNIT.map((path) => (\n }\n />\n ))}\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n \n \n );\n};\n\nexport default CourseAuthoringRoutes;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n 'course-authoring.page.title': {\n id: 'course-authoring.page.title',\n defaultMessage: 'Course Authoring | {siteName}',\n description: 'Title tag',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport messages from './messages';\n\nconst Head = ({ intl }) => (\n \n \n {intl.formatMessage(messages['course-authoring.page.title'], { siteName: getConfig().SITE_NAME })}\n \n \n \n);\n\nHead.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(Head);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n aboutTitle: {\n id: 'course-authoring.studio-home.sidebar.about.title',\n defaultMessage: 'New to {studioName}?',\n },\n aboutDescription: {\n id: 'course-authoring.studio-home.sidebar.about.description',\n defaultMessage: 'Click \"Looking for help with Studio\" at the bottom of the page to access our continually updated documentation and other {studioShortName} resources.',\n },\n studioHomeLinkToGettingStarted: {\n id: 'course-authoring.studio-home.sidebar.about.getting-started',\n defaultMessage: 'Getting started with {studioName}',\n },\n sidebarHeader2: {\n id: 'course-authoring.studio-home.sidebar.about.header-2',\n defaultMessage: 'Can I create courses in {studioName}?',\n },\n sidebarDescription2: {\n id: 'course-authoring.studio-home.sidebar.about.description-2',\n defaultMessage: 'In order to create courses in {studioName}, you must {mailTo}',\n },\n sidebarDescription2MailTo: {\n id: 'course-authoring.studio-home.sidebar.about.description-2.mail-to',\n defaultMessage: 'contact {platformName} staff to help you create a course.',\n },\n sidebarHeader3: {\n id: 'course-authoring.studio-home.sidebar.about.header-3',\n defaultMessage: 'Can I create courses in {studioName}?',\n },\n sidebarDescription3: {\n id: 'course-authoring.studio-home.sidebar.about.description-3',\n defaultMessage: 'In order to create courses in {studioName}, you must have course creator privileges to create your own course.',\n },\n sidebarHeader4: {\n id: 'course-authoring.studio-home.sidebar.about.header-4',\n defaultMessage: 'Can I create courses in {studioName}?',\n },\n sidebarDescription4: {\n id: 'course-authoring.studio-home.sidebar.about.description-4',\n defaultMessage: 'Your request to author courses in {studioName} has been denied. Please {mailTo}.',\n },\n sidebarDescription4MailTo: {\n id: 'course-authoring.studio-home.sidebar.about.description-4.mail-to',\n defaultMessage: 'contact {platformName} staff with further questions',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { MailtoLink } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { COURSE_CREATOR_STATES } from '../../constants';\nimport { useHelpUrls } from '../../help-urls/hooks';\nimport { HelpSidebar, HelpSidebarLink } from '../../generic/help-sidebar';\nimport { getStudioHomeData } from '../data/selectors';\nimport messages from './messages';\n\nconst HomeSidebar = () => {\n const intl = useIntl();\n const {\n studioName,\n platformName,\n studioShortName,\n studioRequestEmail,\n techSupportEmail,\n courseCreatorStatus,\n } = useSelector(getStudioHomeData);\n const { home: aboutHomeLink } = useHelpUrls(['home']);\n\n // eslint-disable-next-line max-len\n const isShowMailToGetInstruction = courseCreatorStatus === COURSE_CREATOR_STATES.disallowedForThisSite\n && !!studioRequestEmail;\n const isShowUnrequestedInstruction = courseCreatorStatus === COURSE_CREATOR_STATES.unrequested;\n const isShowDeniedInstruction = courseCreatorStatus === COURSE_CREATOR_STATES.denied;\n\n return (\n \n

    \n {intl.formatMessage(messages.aboutTitle, { studioName })}\n

    \n

    \n {intl.formatMessage(messages.aboutDescription, { studioShortName })}\n

    \n \n {isShowMailToGetInstruction && (\n <>\n
    \n

    \n {intl.formatMessage(messages.sidebarHeader2, { studioName })}\n

    \n

    \n {intl.formatMessage(messages.sidebarDescription2, {\n studioName,\n mailTo: (\n {\n intl.formatMessage(messages.sidebarDescription2MailTo, { platformName })\n }\n \n ),\n })}\n

    \n \n )}\n {isShowUnrequestedInstruction && (\n <>\n
    \n

    \n {intl.formatMessage(messages.sidebarHeader3, { studioName })}\n

    \n

    \n {intl.formatMessage(messages.sidebarDescription3, { studioName })}\n

    \n \n )}\n {isShowDeniedInstruction && (\n <>\n
    \n

    \n {intl.formatMessage(messages.sidebarHeader4, { studioName })}\n

    \n

    \n {intl.formatMessage(messages.sidebarDescription4, {\n studioName,\n mailTo: (\n {\n intl.formatMessage(messages.sidebarDescription4MailTo, { platformName })\n }\n \n ),\n })}\n

    \n \n )}\n
    \n );\n};\n\nexport default HomeSidebar;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n coursesTabTitle: {\n id: 'course-authoring.studio-home.courses.tab.title',\n defaultMessage: 'Courses',\n },\n courseTabErrorMessage: {\n id: 'course-authoring.studio-home.courses.tab.error.message',\n defaultMessage: 'Failed to fetch courses. Please try again later.',\n },\n coursesPaginationInfo: {\n id: 'course-authoring.studio-home.courses.pagination.info',\n defaultMessage: 'Showing {length} of {total}',\n },\n librariesTabErrorMessage: {\n id: 'course-authoring.studio-home.libraries.tab.error.message',\n defaultMessage: 'Failed to fetch libraries. Please try again later.',\n },\n librariesTabTitle: {\n id: 'course-authoring.studio-home.libraries.tab.title',\n defaultMessage: 'Libraries',\n },\n archivedTabTitle: {\n id: 'course-authoring.studio-home.archived.tab.title',\n defaultMessage: 'Archived courses',\n },\n archiveTabErrorMessage: {\n id: 'course-authoring.studio-home.archived.tab.error.message',\n defaultMessage: 'Failed to fetch archived courses. Please try again later.',\n },\n coursesTabCourseNotFoundAlertTitle: {\n id: 'course-authoring.studio-home.courses.tab.course.not.found.alert.title',\n defaultMessage: 'We could not find any result',\n },\n coursesTabCourseNotFoundAlertMessage: {\n id: 'course-authoring.studio-home.courses.tab.course.not.found.alert.message',\n defaultMessage: 'There are no courses with the current filters.',\n },\n coursesTabCourseNotFoundAlertCleanFiltersButton: {\n id: 'course-authoring.studio-home.courses.tab.course.not.found.alert.clean.filters.button',\n defaultMessage: 'Clear filters',\n },\n taxonomiesTabTitle: {\n id: 'course-authoring.studio-home.taxonomies.tab.title',\n defaultMessage: 'Taxonomies',\n description: 'Title of Taxonomies tab on the home page',\n },\n});\n\nexport default messages;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.studio-home.heading.title',\n defaultMessage: '{studioShortName} home',\n },\n addNewCourseBtnText: {\n id: 'course-authoring.studio-home.add-new-course.btn.text',\n defaultMessage: 'New course',\n },\n addNewLibraryBtnText: {\n id: 'course-authoring.studio-home.add-new-library.btn.text',\n defaultMessage: 'New library',\n },\n homePageLoadFailedMessage: {\n id: 'course-authoring.studio-home.page-load.failed.message',\n defaultMessage: 'Failed to load Studio home. Please try again later.',\n },\n emailStaffBtnText: {\n id: 'course-authoring.studio-home.email-staff.btn.text',\n defaultMessage: 'Email staff to create course',\n },\n defaultSection_1_Title: {\n id: 'course-authoring.studio-home.default-section-1.title',\n defaultMessage: 'Are you staff on an existing {studioShortName} course?',\n },\n defaultSection_1_Description: {\n id: 'course-authoring.studio-home.default-section-1.description',\n defaultMessage: 'The course creator must give you access to the course. Contact the course creator or administrator for the course you are helping to author.',\n },\n defaultSection_2_Title: {\n id: 'course-authoring.studio-home.default-section-2.title',\n defaultMessage: 'Create your first course',\n },\n defaultSection_2_Description: {\n id: 'course-authoring.studio-home.default-section-2.description',\n defaultMessage: 'Your new course is just a click away!',\n },\n btnAddNewCourseText: {\n id: 'course-authoring.studio-home.btn.add-new-course.text',\n defaultMessage: 'Create your first course',\n },\n btnReRunText: {\n id: 'course-authoring.studio-home.btn.re-run.text',\n defaultMessage: 'Re-run course',\n },\n viewLiveBtnText: {\n id: 'course-authoring.studio-home.btn.view-live.text',\n defaultMessage: 'View live',\n },\n organizationTitle: {\n id: 'course-authoring.studio-home.organization.title',\n defaultMessage: 'Organization and library settings',\n },\n organizationLabel: {\n id: 'course-authoring.studio-home.organization.label',\n defaultMessage: 'Show all courses in organization:',\n },\n organizationSubmitBtnText: {\n id: 'course-authoring.studio-home.organization.btn.submit.text',\n defaultMessage: 'Submit',\n },\n organizationInputPlaceholder: {\n id: 'course-authoring.studio-home.organization.input.placeholder',\n defaultMessage: 'For example, MITx',\n },\n organizationInputNoOptions: {\n id: 'course-authoring.studio-home.organization.input.no-options',\n defaultMessage: 'No options',\n },\n});\n\nexport default messages;\n","/**\n * Removes leading and trailing slashes from a string.\n * @param {string} str - The string to trim.\n * @returns {string} The trimmed string.\n */\n// eslint-disable-next-line import/prefer-default-export\nexport const trimSlashes = (str) => str.replace(/^\\/|\\/$/g, '');\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport {\n Card,\n Hyperlink,\n Dropdown,\n IconButton,\n ActionRow,\n} from '@openedx/paragon';\nimport { MoreHoriz } from '@openedx/paragon/icons';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport { COURSE_CREATOR_STATES } from '../../constants';\nimport { getStudioHomeData } from '../data/selectors';\nimport messages from '../messages';\nimport { trimSlashes } from './utils';\n\nconst CardItem = ({\n intl,\n displayName,\n lmsLink,\n rerunLink,\n org,\n number,\n run,\n isLibraries,\n courseKey,\n isPaginated,\n url,\n}) => {\n const {\n allowCourseReruns,\n courseCreatorStatus,\n rerunCreatorStatus,\n } = useSelector(getStudioHomeData);\n const courseUrl = () => new URL(url, getConfig().STUDIO_BASE_URL);\n const subtitle = isLibraries ? `${org} / ${number}` : `${org} / ${number} / ${run}`;\n const readOnlyItem = !(lmsLink || rerunLink || url);\n const showActions = !(readOnlyItem || isLibraries);\n const isShowRerunLink = allowCourseReruns\n && rerunCreatorStatus\n && courseCreatorStatus === COURSE_CREATOR_STATES.granted;\n const hasDisplayName = displayName.trim().length ? displayName : courseKey;\n\n return (\n \n \n {hasDisplayName}\n \n ) : (\n {displayName}\n )}\n subtitle={subtitle}\n actions={showActions && (\n isPaginated ? (\n \n \n \n {isShowRerunLink && (\n \n {messages.btnReRunText.defaultMessage}\n \n )}\n \n {intl.formatMessage(messages.viewLiveBtnText)}\n \n \n \n ) : (\n \n {isShowRerunLink && (\n \n {intl.formatMessage(messages.btnReRunText)}\n \n )}\n \n {intl.formatMessage(messages.viewLiveBtnText)}\n \n \n )\n )}\n />\n \n );\n};\n\nCardItem.defaultProps = {\n isLibraries: false,\n isPaginated: false,\n courseKey: '',\n rerunLink: '',\n lmsLink: '',\n run: '',\n};\n\nCardItem.propTypes = {\n intl: intlShape.isRequired,\n displayName: PropTypes.string.isRequired,\n lmsLink: PropTypes.string,\n rerunLink: PropTypes.string,\n org: PropTypes.string.isRequired,\n run: PropTypes.string,\n number: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n isLibraries: PropTypes.bool,\n courseKey: PropTypes.string,\n isPaginated: PropTypes.bool,\n};\n\nexport default injectIntl(CardItem);\n","/**\n * Alphabetical sorting for arrays of courses and libraries.\n *\n * @param {array} arr - Array of courses or libraries.\n * @returns {array} - An array of alphabetically sorted courses or libraries.\n */\nconst sortAlphabeticallyArray = (arr) => [...arr]\n .sort((firstArrayData, secondArrayData) => firstArrayData\n .displayName.localeCompare(secondArrayData.displayName));\n\n// eslint-disable-next-line import/prefer-default-export\nexport { sortAlphabeticallyArray };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Icon, Row } from '@openedx/paragon';\nimport { Error } from '@openedx/paragon/icons';\n\nimport { LoadingSpinner } from '../../../generic/Loading';\nimport CardItem from '../../card-item';\nimport { sortAlphabeticallyArray } from '../utils';\nimport AlertMessage from '../../../generic/alert-message';\nimport messages from '../messages';\n\nconst LibrariesTab = ({\n libraries,\n isLoading,\n isFailed,\n // injected\n intl,\n}) => {\n if (isLoading) {\n return (\n \n \n \n );\n }\n return (\n isFailed ? (\n \n \n {intl.formatMessage(messages.librariesTabErrorMessage)}\n \n )}\n />\n ) : (\n
    \n {sortAlphabeticallyArray(libraries).map(({\n displayName, org, number, url,\n }) => (\n \n ))}\n
    \n )\n );\n};\nLibrariesTab.propTypes = {\n libraries: PropTypes.arrayOf(\n PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n libraryKey: PropTypes.string.isRequired,\n number: PropTypes.string.isRequired,\n org: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n }),\n ).isRequired,\n isLoading: PropTypes.bool.isRequired,\n isFailed: PropTypes.bool.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(LibrariesTab);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Icon, Row } from '@openedx/paragon';\nimport { Error } from '@openedx/paragon/icons';\n\nimport { LoadingSpinner } from '../../../generic/Loading';\nimport CardItem from '../../card-item';\nimport { sortAlphabeticallyArray } from '../utils';\nimport AlertMessage from '../../../generic/alert-message';\nimport messages from '../messages';\n\nconst ArchivedTab = ({\n archivedCoursesData,\n isLoading,\n isFailed,\n // injected\n intl,\n}) => {\n if (isLoading) {\n return (\n \n \n \n );\n }\n return (\n isFailed ? (\n \n \n {intl.formatMessage(messages.archiveTabErrorMessage)}\n \n )}\n />\n ) : (\n
    \n {sortAlphabeticallyArray(archivedCoursesData).map(({\n courseKey, displayName, lmsLink, org, rerunLink, number, run, url,\n }) => (\n \n ))}\n
    \n )\n );\n};\n\nArchivedTab.propTypes = {\n archivedCoursesData: PropTypes.arrayOf(\n PropTypes.shape({\n courseKey: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n lmsLink: PropTypes.string.isRequired,\n number: PropTypes.string.isRequired,\n org: PropTypes.string.isRequired,\n rerunLink: PropTypes.string.isRequired,\n run: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n }),\n ).isRequired,\n isLoading: PropTypes.bool.isRequired,\n isFailed: PropTypes.bool.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(ArchivedTab);\n","import { camelCaseObject, snakeCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nexport const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getStudioHomeApiUrl = () => new URL('api/contentstore/v1/home', getApiBaseUrl()).href;\nexport const getRequestCourseCreatorUrl = () => new URL('request_course_creator', getApiBaseUrl()).href;\nexport const getCourseNotificationUrl = (url) => new URL(url, getApiBaseUrl()).href;\n\n/**\n * Get's studio home data.\n * @param {string} search\n * @returns {Promise}\n */\nexport async function getStudioHomeData() {\n const { data } = await getAuthenticatedHttpClient().get(getStudioHomeApiUrl());\n return camelCaseObject(data);\n}\n\nexport async function getStudioHomeCourses(search) {\n const { data } = await getAuthenticatedHttpClient().get(`${getApiBaseUrl()}/api/contentstore/v1/home/courses${search}`);\n return camelCaseObject(data);\n}\n/**\n * Get's studio home courses.\n * @param {string} search - Query string parameters for filtering the courses.\n * @param {object} customParams - Additional custom parameters for the API request.\n * @returns {Promise} - A Promise that resolves to the response data containing the studio home courses.\n * Note: We are changing /api/contentstore/v1 to /api/contentstore/v2 due to upcoming breaking changes.\n * Features such as pagination, filtering, and ordering are better handled in the new version.\n * Please refer to this PR for further details: https://github.com/openedx/edx-platform/pull/34173\n */\nexport async function getStudioHomeCoursesV2(search, customParams) {\n const customParamsFormat = snakeCaseObject(customParams);\n const { data } = await getAuthenticatedHttpClient().get(`${getApiBaseUrl()}/api/contentstore/v2/home/courses${search}`, { params: customParamsFormat });\n return camelCaseObject(data);\n}\n\nexport async function getStudioHomeLibraries() {\n const { data } = await getAuthenticatedHttpClient().get(`${getApiBaseUrl()}/api/contentstore/v1/home/libraries`);\n return camelCaseObject(data);\n}\n\n/**\n * Handle course notification requests.\n * @param {string} url\n * @returns {Promise}\n*/\nexport async function handleCourseNotification(url) {\n const { data } = await getAuthenticatedHttpClient().delete(getCourseNotificationUrl(url));\n return camelCaseObject(data);\n}\n\n/**\n * Send user request to course creation access for studio home data.\n * @returns {Promise}\n */\nexport async function sendRequestForCourseCreator() {\n const { data } = await getAuthenticatedHttpClient().post(getRequestCourseCreatorUrl());\n return camelCaseObject(data);\n}\n","import { RequestStatus } from '../../data/constants';\nimport {\n getStudioHomeData,\n sendRequestForCourseCreator,\n handleCourseNotification,\n getStudioHomeCourses,\n getStudioHomeLibraries,\n getStudioHomeCoursesV2,\n} from './api';\nimport {\n fetchStudioHomeDataSuccess,\n fetchCourseDataSuccess,\n updateLoadingStatuses,\n updateSavingStatuses,\n fetchLibraryDataSuccess,\n fetchCourseDataSuccessV2,\n} from './slice';\n\nfunction fetchStudioHomeData(search, hasHomeData, requestParams = {}, isPaginationEnabled = false) {\n return async (dispatch) => {\n dispatch(updateLoadingStatuses({ studioHomeLoadingStatus: RequestStatus.IN_PROGRESS }));\n dispatch(updateLoadingStatuses({ courseLoadingStatus: RequestStatus.IN_PROGRESS }));\n\n if (!hasHomeData) {\n try {\n const studioHomeData = await getStudioHomeData();\n dispatch(fetchStudioHomeDataSuccess(studioHomeData));\n dispatch(updateLoadingStatuses({ studioHomeLoadingStatus: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatuses({ studioHomeLoadingStatus: RequestStatus.FAILED }));\n return;\n }\n }\n try {\n if (isPaginationEnabled) {\n const coursesData = await getStudioHomeCoursesV2(search || '', requestParams);\n dispatch(fetchCourseDataSuccessV2(coursesData));\n } else {\n const coursesData = await getStudioHomeCourses(search || '');\n dispatch(fetchCourseDataSuccess(coursesData));\n }\n\n dispatch(updateLoadingStatuses({ courseLoadingStatus: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatuses({ courseLoadingStatus: RequestStatus.FAILED }));\n }\n };\n}\n\nfunction fetchLibraryData() {\n return async (dispatch) => {\n dispatch(updateLoadingStatuses({ libraryLoadingStatus: RequestStatus.IN_PROGRESS }));\n\n try {\n const libraryData = await getStudioHomeLibraries();\n dispatch(fetchLibraryDataSuccess(libraryData));\n dispatch(updateLoadingStatuses({ libraryLoadingStatus: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateLoadingStatuses({ libraryLoadingStatus: RequestStatus.FAILED }));\n }\n };\n}\n\nfunction handleDeleteNotificationQuery(url) {\n return async (dispatch) => {\n dispatch(updateSavingStatuses({ deleteNotificationSavingStatus: RequestStatus.PENDING }));\n\n try {\n await handleCourseNotification(url);\n dispatch(updateSavingStatuses({ deleteNotificationSavingStatus: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n dispatch(updateSavingStatuses({ deleteNotificationSavingStatus: RequestStatus.FAILED }));\n }\n };\n}\n\nfunction requestCourseCreatorQuery() {\n return async (dispatch) => {\n dispatch(updateSavingStatuses({ courseCreatorSavingStatus: RequestStatus.PENDING }));\n\n try {\n await sendRequestForCourseCreator();\n dispatch(updateSavingStatuses({ courseCreatorSavingStatus: RequestStatus.SUCCESSFUL }));\n return true;\n } catch (error) {\n dispatch(updateSavingStatuses({ courseCreatorSavingStatus: RequestStatus.FAILED }));\n return false;\n }\n };\n}\n\nexport {\n fetchStudioHomeData,\n fetchLibraryData,\n requestCourseCreatorQuery,\n handleDeleteNotificationQuery,\n};\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n deniedCollapsibleTitle: {\n id: 'course-authoring.studio-home.collapsible.denied.title',\n defaultMessage: 'Your course creator request status',\n },\n deniedCollapsibleDescription: {\n id: 'course-authoring.studio-home.collapsible.denied.description',\n defaultMessage: '{studioName} is a hosted solution for our xConsortium partners and selected guests. Courses for which you are a team member appear above for you to edit, while course creator privileges are granted by {platformName}. Our team has completed evaluating your request.',\n },\n deniedCollapsibleActionTitle: {\n id: 'course-authoring.studio-home.collapsible.denied.action.title',\n defaultMessage: 'Your course creator request status:',\n },\n deniedCollapsibleState: {\n id: 'course-authoring.studio-home.collapsible.denied.state',\n defaultMessage: 'Denied',\n },\n deniedCollapsibleActionText: {\n id: 'course-authoring.studio-home.collapsible.denied.action.text',\n defaultMessage: 'Your request did not meet the criteria/guidelines specified by {platformName} Staff.',\n },\n pendingCollapsibleTitle: {\n id: 'course-authoring.studio-home.collapsible.pending.title',\n defaultMessage: 'Your course creator request status',\n },\n pendingCollapsibleDescription: {\n id: 'course-authoring.studio-home.collapsible.pending.description',\n defaultMessage: '{studioName} is a hosted solution for our xConsortium partners and selected guests. Courses for which you are a team member appear above for you to edit, while course creator privileges are granted by {platformName}. Our team is currently evaluating your request.',\n },\n pendingCollapsibleActionTitle: {\n id: 'course-authoring.studio-home.collapsible.pending.action.title',\n defaultMessage: 'Your course creator request status:',\n },\n pendingCollapsibleState: {\n id: 'course-authoring.studio-home.collapsible.pending.state',\n defaultMessage: 'Pending',\n },\n pendingCollapsibleActionText: {\n id: 'course-authoring.studio-home.collapsible.pending.action.text',\n defaultMessage: 'Your request is currently being reviewed by {platformName} staff and should be updated shortly.',\n },\n unrequestedCollapsibleTitle: {\n id: 'course-authoring.studio-home.collapsible.unrequested.title',\n defaultMessage: 'Becoming a course creator in {studioShortName}',\n },\n unrequestedCollapsibleDescription: {\n id: 'course-authoring.studio-home.collapsible.unrequested.description',\n defaultMessage: '{studioName} is a hosted solution for our xConsortium partners and selected guests. Courses for which you are a team member appear above for you to edit, while course creator privileges are granted by {platformName}. Our team will evaluate your request and provide you feedback within 24 hours during the work week.',\n },\n unrequestedCollapsibleDefaultButton: {\n id: 'course-authoring.studio-home.collapsible.unrequested.button.default',\n defaultMessage: 'Request the ability to create courses',\n },\n unrequestedCollapsiblePendingButton: {\n id: 'course-authoring.studio-home.collapsible.unrequested.button.pending',\n defaultMessage: 'Submitting your request',\n },\n unrequestedCollapsibleFailedButton: {\n id: 'course-authoring.studio-home.collapsible.unrequested.button.failed',\n defaultMessage: 'Sorry, there was error with your request',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n Collapsible,\n Bubble,\n Icon,\n StatefulButton,\n} from '@openedx/paragon';\nimport {\n Add as AddIcon,\n Minus as MinusIcon,\n} from '@openedx/paragon/icons/es5';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { RequestStatus } from '../../data/constants';\nimport { COURSE_CREATOR_STATES, STATEFUL_BUTTON_STATES } from '../../constants';\nimport { getStudioHomeData, getSavingStatuses } from '../data/selectors';\nimport { requestCourseCreatorQuery } from '../data/thunks';\nimport messages from './messages';\n\nconst CollapsibleStateWithAction = ({ state, className }) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const {\n platformName,\n studioName,\n studioShortName,\n } = useSelector(getStudioHomeData);\n const { courseCreatorSavingStatus } = useSelector(getSavingStatuses);\n\n const requestButtonStates = {\n labels: {\n default: intl.formatMessage(messages.unrequestedCollapsibleDefaultButton),\n pending: intl.formatMessage(messages.unrequestedCollapsiblePendingButton),\n error: intl.formatMessage(messages.unrequestedCollapsibleFailedButton),\n },\n disabledStates: [STATEFUL_BUTTON_STATES.pending, STATEFUL_BUTTON_STATES.error],\n };\n\n const statusButtonMap = {\n [RequestStatus.PENDING]: STATEFUL_BUTTON_STATES.pending,\n [RequestStatus.FAILED]: STATEFUL_BUTTON_STATES.error,\n };\n\n const requestButtonCurrentState = statusButtonMap[courseCreatorSavingStatus] || STATEFUL_BUTTON_STATES.default;\n\n function getTextForStatus() {\n const matchTextAction = {\n [COURSE_CREATOR_STATES.denied]: {\n title: intl.formatMessage(messages.deniedCollapsibleTitle),\n description: intl.formatMessage(messages.deniedCollapsibleDescription, {\n studioName,\n platformName,\n }),\n stateName: intl.formatMessage(messages.deniedCollapsibleState),\n actionTitle: intl.formatMessage(messages.deniedCollapsibleActionTitle),\n actionText: intl.formatMessage(messages.deniedCollapsibleActionText, {\n platformName,\n }),\n },\n [COURSE_CREATOR_STATES.unrequested]: {\n title: intl.formatMessage(messages.unrequestedCollapsibleTitle, {\n studioShortName,\n }),\n description: intl.formatMessage(\n messages.unrequestedCollapsibleDescription,\n { studioName, platformName },\n ),\n },\n [COURSE_CREATOR_STATES.pending]: {\n title: intl.formatMessage(messages.pendingCollapsibleTitle),\n description: intl.formatMessage(\n messages.pendingCollapsibleDescription,\n { studioName, platformName },\n ),\n stateName: intl.formatMessage(messages.pendingCollapsibleState),\n actionTitle: intl.formatMessage(messages.pendingCollapsibleActionTitle),\n actionText: intl.formatMessage(messages.pendingCollapsibleActionText, {\n platformName,\n }),\n },\n };\n\n return matchTextAction[state];\n }\n\n const {\n title,\n stateName,\n actionText,\n description,\n actionTitle,\n } = getTextForStatus();\n\n return (\n \n \n {title}\n \n \n \n \n \n \n \n \n \n \n \n\n \n

    {description}

    \n
    {actionTitle}
    \n {[COURSE_CREATOR_STATES.denied, COURSE_CREATOR_STATES.pending].includes(state) ? (\n \n \n {stateName}\n \n {actionText}\n \n ) : (\n dispatch(requestCourseCreatorQuery())}\n state={requestButtonCurrentState}\n {...requestButtonStates}\n />\n )}\n
    \n \n );\n};\n\nCollapsibleStateWithAction.defaultProps = {\n className: undefined,\n};\n\nCollapsibleStateWithAction.propTypes = {\n state: PropTypes.oneOf(Object.values(COURSE_CREATOR_STATES)).isRequired,\n className: PropTypes.string,\n};\n\nexport default CollapsibleStateWithAction;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { Button, Card } from '@openedx/paragon';\nimport { Add as AddIcon } from '@openedx/paragon/icons/es5';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\n\nimport { getStudioHomeData } from '../../../data/selectors';\nimport messages from '../../../messages';\n\nconst ContactAdministrator = ({\n intl, hasAbilityToCreateCourse, showNewCourseContainer, onClickNewCourse,\n}) => {\n const { studioShortName } = useSelector(getStudioHomeData);\n\n return (\n \n \n {intl.formatMessage(messages.defaultSection_1_Description)}\n \n {hasAbilityToCreateCourse && (\n <>\n \n \n {intl.formatMessage(messages.btnAddNewCourseText)}\n \n )}\n >\n {intl.formatMessage(messages.defaultSection_2_Description)}\n \n \n )}\n \n );\n};\n\nContactAdministrator.defaultProps = {\n hasAbilityToCreateCourse: false,\n};\n\nContactAdministrator.propTypes = {\n intl: intlShape.isRequired,\n hasAbilityToCreateCourse: PropTypes.bool,\n showNewCourseContainer: PropTypes.bool.isRequired,\n onClickNewCourse: PropTypes.func.isRequired,\n};\n\nexport default injectIntl(ContactAdministrator);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n coursesTypesFilterMenuAllCurses: {\n id: 'course-authoring.studio-home.courses.tab.types-filter-menu.all-courses',\n defaultMessage: 'All courses',\n },\n coursesTypesFilterMenuActiveCurses: {\n id: 'course-authoring.studio-home.courses.tab.types-filter-menu.active-courses',\n defaultMessage: 'Active',\n },\n coursesTypesFilterMenuArchivedCurses: {\n id: 'course-authoring.studio-home.courses.tab.types-filter-menu.archived-courses',\n defaultMessage: 'Archived',\n },\n});\n\nexport default messages;\n","import { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\nimport { Icon, Dropdown } from '@openedx/paragon';\nimport { Check } from '@openedx/paragon/icons';\nimport { getStudioHomeCoursesParams } from '../../../../data/selectors';\n\nconst CoursesFilterMenu = ({\n id: idProp,\n menuItems,\n onItemMenuSelected,\n defaultItemSelectedText,\n}) => {\n const [itemMenuSelected, setItemMenuSelected] = useState(defaultItemSelectedText);\n const { cleanFilters } = useSelector(getStudioHomeCoursesParams);\n const handleCourseTypeSelected = (name, value) => {\n setItemMenuSelected(name);\n onItemMenuSelected(value);\n };\n\n const courseTypeSelectedIcon = (itemValue) => (itemValue === itemMenuSelected ? (\n \n ) : null);\n\n useEffect(() => {\n if (cleanFilters) {\n setItemMenuSelected(defaultItemSelectedText);\n }\n }, [cleanFilters]);\n\n return (\n \n \n {itemMenuSelected}\n \n \n {menuItems.map(({ id, name, value }) => (\n handleCourseTypeSelected(name, value)}\n data-testid={`item-menu-${id}`}\n >\n {name} {courseTypeSelectedIcon(name)}\n \n ))}\n \n \n );\n};\n\nCoursesFilterMenu.defaultProps = {\n defaultItemSelectedText: '',\n menuItems: [],\n};\n\nCoursesFilterMenu.propTypes = {\n onItemMenuSelected: PropTypes.func.isRequired,\n defaultItemSelectedText: PropTypes.string,\n id: PropTypes.string.isRequired,\n menuItems: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n }),\n ),\n};\n\nexport default CoursesFilterMenu;\n","import { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport messages from './messages';\n\nimport CoursesFilterMenu from '../courses-filter-menu';\n\nconst CoursesTypesFilterMenu = ({ onItemMenuSelected }) => {\n const intl = useIntl();\n\n const courseTypes = useMemo(\n () => [\n {\n id: 'all-courses',\n name: intl.formatMessage(messages.coursesTypesFilterMenuAllCurses),\n value: 'allCourses',\n },\n {\n id: 'active-courses',\n name: intl.formatMessage(messages.coursesTypesFilterMenuActiveCurses),\n value: 'activeCourses',\n },\n {\n id: 'archived-courses',\n name: intl.formatMessage(messages.coursesTypesFilterMenuArchivedCurses),\n value: 'archivedCourses',\n },\n ],\n [intl],\n );\n\n const handleCourseTypeSelected = (courseType) => {\n onItemMenuSelected(courseType);\n };\n\n return (\n \n );\n};\n\nCoursesTypesFilterMenu.propTypes = {\n onItemMenuSelected: PropTypes.func.isRequired,\n};\n\nexport default CoursesTypesFilterMenu;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n coursesOrderFilterMenuAscendantCurses: {\n id: 'course-authoring.studio-home.courses.tab.order-filter-menu.ascendant-courses',\n defaultMessage: 'Name A-Z',\n },\n coursesOrderFilterMenuDescendantCurses: {\n id: 'course-authoring.studio-home.courses.tab.order-filter-menu.descendant-courses',\n defaultMessage: 'Name Z-A',\n },\n coursesOrderFilterMenuNewestCurses: {\n id: 'course-authoring.studio-home.courses.tab.order-filter-menu.newest-courses',\n defaultMessage: 'Newest',\n },\n coursesOrderFilterMenuOldestCurses: {\n id: 'course-authoring.studio-home.courses.tab.order-filter-menu.oldest-courses',\n defaultMessage: 'Oldest',\n },\n});\n\nexport default messages;\n","import { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport messages from './messages';\n\nimport CoursesFilterMenu from '../courses-filter-menu';\n\nconst CoursesOrderFilterMenu = ({ onItemMenuSelected }) => {\n const intl = useIntl();\n\n const courseOrders = useMemo(\n () => [\n {\n id: 'az-courses',\n name: intl.formatMessage(messages.coursesOrderFilterMenuAscendantCurses),\n value: 'azCourses',\n },\n {\n id: 'za-courses',\n name: intl.formatMessage(messages.coursesOrderFilterMenuDescendantCurses),\n value: 'zaCourses',\n },\n {\n id: 'newest-courses',\n name: intl.formatMessage(messages.coursesOrderFilterMenuNewestCurses),\n value: 'newestCourses',\n },\n {\n id: 'oldest-courses',\n name: intl.formatMessage(messages.coursesOrderFilterMenuOldestCurses),\n value: 'oldestCourses',\n },\n ],\n [intl],\n );\n\n const handleCourseTypeSelected = (courseOrder) => {\n onItemMenuSelected(courseOrder);\n };\n\n return (\n \n );\n};\n\nCoursesOrderFilterMenu.propTypes = {\n onItemMenuSelected: PropTypes.func.isRequired,\n};\n\nexport default CoursesOrderFilterMenu;\n","import { useState, useCallback } from 'react';\nimport { useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { SearchField } from '@openedx/paragon';\nimport { debounce } from 'lodash';\n\nimport { getStudioHomeCoursesParams } from '../../../data/selectors';\nimport { updateStudioHomeCoursesCustomParams } from '../../../data/slice';\nimport { fetchStudioHomeData } from '../../../data/thunks';\nimport { LoadingSpinner } from '../../../../generic/Loading';\nimport CoursesTypesFilterMenu from './courses-types-filter-menu';\nimport CoursesOrderFilterMenu from './courses-order-filter-menu';\nimport './index.scss';\n\n/* regex to check if a string has only whitespace\n example \" \"\n*/\nconst regexOnlyWhiteSpaces = /^\\s+$/;\n\nconst CoursesFilters = ({\n dispatch,\n locationValue,\n onSubmitSearchField,\n isLoading,\n}) => {\n const studioHomeCoursesParams = useSelector(getStudioHomeCoursesParams);\n const {\n order,\n search,\n activeOnly,\n archivedOnly,\n cleanFilters,\n } = studioHomeCoursesParams;\n const [inputSearchValue, setInputSearchValue] = useState('');\n\n const getFilterTypeData = (baseFilters) => ({\n archivedCourses: { ...baseFilters, archivedOnly: true, activeOnly: undefined },\n activeCourses: { ...baseFilters, activeOnly: true, archivedOnly: undefined },\n allCourses: { ...baseFilters, archivedOnly: undefined, activeOnly: undefined },\n azCourses: { ...baseFilters, order: 'display_name' },\n zaCourses: { ...baseFilters, order: '-display_name' },\n newestCourses: { ...baseFilters, order: '-created' },\n oldestCourses: { ...baseFilters, order: 'created' },\n });\n\n const handleMenuFilterItemSelected = (filterType) => {\n const baseFilters = {\n currentPage: 1,\n search,\n order,\n isFiltered: true,\n archivedOnly,\n activeOnly,\n cleanFilters: false,\n };\n\n const filterParams = getFilterTypeData(baseFilters);\n const filterParamsFormat = filterParams[filterType] || baseFilters;\n const {\n coursesOrderLabel,\n coursesTypesLabel,\n isFiltered,\n orderTypeLabel,\n cleanFilters: cleanFilterParams,\n currentPage,\n ...customParams\n } = filterParamsFormat;\n dispatch(updateStudioHomeCoursesCustomParams(filterParamsFormat));\n dispatch(fetchStudioHomeData(locationValue, false, { page: 1, ...customParams }, true));\n };\n\n const handleSearchCourses = (searchValueDebounced) => {\n const valueFormatted = searchValueDebounced.trim();\n const filterParams = {\n search: valueFormatted.length > 0 ? valueFormatted : undefined,\n activeOnly,\n archivedOnly,\n order,\n };\n const hasOnlySpaces = regexOnlyWhiteSpaces.test(searchValueDebounced);\n\n if (valueFormatted !== search && !hasOnlySpaces && !cleanFilters) {\n dispatch(updateStudioHomeCoursesCustomParams({\n currentPage: 1,\n isFiltered: true,\n cleanFilters: false,\n ...filterParams,\n }));\n\n dispatch(fetchStudioHomeData(locationValue, false, { page: 1, ...filterParams }, true));\n }\n\n setInputSearchValue(searchValueDebounced);\n };\n\n const handleSearchCoursesDebounced = useCallback(\n debounce((value) => handleSearchCourses(value), 400),\n [],\n );\n\n return (\n
    \n
    \n \n {isLoading && (\n \n \n \n )}\n
    \n\n \n \n
    \n );\n};\n\nCoursesFilters.defaultProps = {\n locationValue: '',\n onSubmitSearchField: () => {},\n isLoading: false,\n};\n\nCoursesFilters.propTypes = {\n dispatch: PropTypes.func.isRequired,\n locationValue: PropTypes.string,\n onSubmitSearchField: PropTypes.func,\n isLoading: PropTypes.bool,\n};\n\nexport default CoursesFilters;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n itemInProgressFooterText: {\n id: 'course-authoring.studio-home.processing.course-item.footer.in-progress',\n defaultMessage: 'The new course will be added to your course list in 5-10 minutes. Return to this page or {refresh} to update the course list. The new course will need some manual configuration.',\n },\n itemInProgressFooterHyperlink: {\n id: 'course-authoring.studio-home.processing.course-item.footer.in-progress.hyperlink',\n defaultMessage: 'refresh it',\n },\n itemInProgressActionText: {\n id: 'course-authoring.studio-home.processing.course-item.action.in-progress',\n defaultMessage: 'Configuring as re-run',\n },\n itemIsFailedActionText: {\n id: 'course-authoring.studio-home.processing.course-item.action.failed',\n defaultMessage: 'Configuration error',\n },\n itemFailedFooterText: {\n id: 'course-authoring.studio-home.processing.course-item.footer.failed',\n defaultMessage: 'A system error occurred while your course was being processed. Please go to the original course to try the re-run again, or contact your PM for assistance.',\n },\n itemFailedFooterButton: {\n id: 'course-authoring.studio-home.processing.course-item.footer.failed.button',\n defaultMessage: 'Dismiss',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport {\n ActionRow,\n Card,\n Hyperlink,\n Button,\n Icon,\n} from '@openedx/paragon';\nimport {\n Close as CloseIcon,\n Warning as WarningIcon,\n RotateRight as RotateRightIcon,\n} from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { handleDeleteNotificationQuery } from '../../data/thunks';\nimport messages from './messages';\n\nconst CourseItem = ({ course }) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const {\n displayName, org, number, run, isInProgress, isFailed, dismissLink,\n } = course;\n const subtitle = `${org} / ${number} / ${run}`;\n\n return (\n
    \n {isInProgress && (\n \n {displayName}

    }\n subtitle={subtitle}\n actions={(\n \n \n \n {intl.formatMessage(messages.itemInProgressActionText)}\n \n )}\n />\n \n \n {intl.formatMessage(messages.itemInProgressFooterText, {\n refresh: (\n \n {intl.formatMessage(messages.itemInProgressFooterHyperlink)}\n \n ),\n })}\n \n
    \n )}\n\n {isFailed && (\n \n {displayName}

    }\n subtitle={subtitle}\n actions={(\n \n \n {intl.formatMessage(messages.itemIsFailedActionText)}\n \n )}\n />\n \n \n {intl.formatMessage(messages.itemFailedFooterText)}\n dispatch(handleDeleteNotificationQuery(dismissLink))}\n iconBefore={CloseIcon}\n variant=\"tertiary\"\n size=\"sm\"\n >\n {intl.formatMessage(messages.itemFailedFooterButton)}\n \n \n
    \n )}\n
    \n );\n};\n\nCourseItem.propTypes = {\n course: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n courseKey: PropTypes.string.isRequired,\n org: PropTypes.string.isRequired,\n number: PropTypes.string.isRequired,\n run: PropTypes.string.isRequired,\n isFailed: PropTypes.bool.isRequired,\n isInProgress: PropTypes.bool.isRequired,\n dismissLink: PropTypes.string.isRequired,\n }).isRequired,\n};\n\nexport default CourseItem;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n processingTitle: {\n id: 'course-authoring.studio-home.processing.title',\n defaultMessage: 'Courses being processed',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { Stack } from '@openedx/paragon';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { getStudioHomeData } from '../data/selectors';\nimport CourseItem from './course-item';\nimport messages from './messages';\n\nconst ProcessingCourses = () => {\n const intl = useIntl();\n const { inProcessCourseActions } = useSelector(getStudioHomeData);\n\n return (\n <>\n
    \n {intl.formatMessage(messages.processingTitle)}\n
    \n
    \n \n {inProcessCourseActions.map((course) => (\n \n ))}\n \n \n );\n};\n\nexport default ProcessingCourses;\n","import React from 'react';\nimport { useLocation } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { useSelector } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Icon,\n Row,\n Pagination,\n Alert,\n Button,\n} from '@openedx/paragon';\nimport { Error } from '@openedx/paragon/icons';\n\nimport { COURSE_CREATOR_STATES } from '../../../constants';\nimport { getStudioHomeData, getStudioHomeCoursesParams } from '../../data/selectors';\nimport { updateStudioHomeCoursesCustomParams } from '../../data/slice';\nimport { fetchStudioHomeData } from '../../data/thunks';\nimport CardItem from '../../card-item';\nimport CollapsibleStateWithAction from '../../collapsible-state-with-action';\nimport ContactAdministrator from './contact-administrator';\nimport CoursesFilters from './courses-filters';\nimport ProcessingCourses from '../../processing-courses';\nimport { LoadingSpinner } from '../../../generic/Loading';\nimport AlertMessage from '../../../generic/alert-message';\nimport messages from '../messages';\nimport './index.scss';\n\nconst CoursesTab = ({\n coursesDataItems,\n showNewCourseContainer,\n onClickNewCourse,\n isShowProcessing,\n isLoading,\n isFailed,\n dispatch,\n numPages,\n coursesCount,\n isEnabledPagination,\n}) => {\n const intl = useIntl();\n const location = useLocation();\n const {\n courseCreatorStatus,\n optimizationEnabled,\n } = useSelector(getStudioHomeData);\n const studioHomeCoursesParams = useSelector(getStudioHomeCoursesParams);\n const { currentPage, isFiltered } = studioHomeCoursesParams;\n const hasAbilityToCreateCourse = courseCreatorStatus === COURSE_CREATOR_STATES.granted;\n const showCollapsible = [\n COURSE_CREATOR_STATES.denied,\n COURSE_CREATOR_STATES.pending,\n COURSE_CREATOR_STATES.unrequested,\n ].includes(courseCreatorStatus);\n const locationValue = location.search ?? '';\n\n const handlePageSelected = (page) => {\n const {\n search,\n order,\n archivedOnly,\n activeOnly,\n } = studioHomeCoursesParams;\n\n const customParams = {\n search,\n order,\n archivedOnly,\n activeOnly,\n };\n\n dispatch(fetchStudioHomeData(locationValue, false, { page, ...customParams }, true));\n dispatch(updateStudioHomeCoursesCustomParams({ currentPage: page, isFiltered: true }));\n };\n\n const handleCleanFilters = () => {\n const customParams = {\n currentPage: 1,\n search: undefined,\n order: 'display_name',\n isFiltered: true,\n cleanFilters: true,\n archivedOnly: undefined,\n activeOnly: undefined,\n };\n\n dispatch(fetchStudioHomeData(locationValue, false, { page: 1, order: 'display_name' }, true));\n dispatch(updateStudioHomeCoursesCustomParams(customParams));\n };\n\n const isNotFilteringCourses = !isFiltered && !isLoading;\n const hasCourses = coursesDataItems?.length > 0;\n\n if (isLoading && !isFiltered) {\n return (\n \n \n \n );\n }\n\n return (\n isFailed && !isFiltered ? (\n \n \n {intl.formatMessage(messages.courseTabErrorMessage)}\n \n )}\n />\n ) : (\n
    \n {isShowProcessing && !isEnabledPagination && }\n {isEnabledPagination && (\n
    \n \n

    \n {intl.formatMessage(messages.coursesPaginationInfo, {\n length: coursesDataItems.length,\n total: coursesCount,\n })}\n

    \n
    \n )}\n {hasCourses ? (\n <>\n {coursesDataItems.map(\n ({\n courseKey,\n displayName,\n lmsLink,\n org,\n rerunLink,\n number,\n run,\n url,\n cmsLink,\n }) => (\n \n ),\n )}\n\n {numPages > 1 && isEnabledPagination && (\n \n )}\n \n ) : (!optimizationEnabled && isNotFilteringCourses && (\n \n )\n )}\n\n {isFiltered && !hasCourses && !isLoading && (\n \n \n {intl.formatMessage(messages.coursesTabCourseNotFoundAlertTitle)}\n \n

    \n {intl.formatMessage(messages.coursesTabCourseNotFoundAlertMessage)}\n

    \n \n
    \n )}\n {showCollapsible && (\n \n )}\n
    \n )\n );\n};\n\nCoursesTab.defaultProps = {\n numPages: 0,\n coursesCount: 0,\n isEnabledPagination: false,\n};\n\nCoursesTab.propTypes = {\n coursesDataItems: PropTypes.arrayOf(\n PropTypes.shape({\n courseKey: PropTypes.string.isRequired,\n displayName: PropTypes.string.isRequired,\n lmsLink: PropTypes.string.isRequired,\n number: PropTypes.string.isRequired,\n org: PropTypes.string.isRequired,\n rerunLink: PropTypes.string.isRequired,\n run: PropTypes.string.isRequired,\n url: PropTypes.string.isRequired,\n }),\n ).isRequired,\n showNewCourseContainer: PropTypes.bool.isRequired,\n onClickNewCourse: PropTypes.func.isRequired,\n isShowProcessing: PropTypes.bool.isRequired,\n isLoading: PropTypes.bool.isRequired,\n isFailed: PropTypes.bool.isRequired,\n dispatch: PropTypes.func.isRequired,\n numPages: PropTypes.number,\n coursesCount: PropTypes.number,\n isEnabledPagination: PropTypes.bool,\n};\n\nexport default CoursesTab;\n","import React, { useMemo, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { Tab, Tabs } from '@openedx/paragon';\nimport { getConfig } from '@edx/frontend-platform';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { useNavigate } from 'react-router-dom';\n\nimport { getLoadingStatuses, getStudioHomeData } from '../data/selectors';\nimport messages from './messages';\nimport LibrariesTab from './libraries-tab';\nimport ArchivedTab from './archived-tab';\nimport CoursesTab from './courses-tab';\nimport { RequestStatus } from '../../data/constants';\nimport { fetchLibraryData } from '../data/thunks';\n\nconst TabsSection = ({\n intl,\n showNewCourseContainer,\n onClickNewCourse,\n isShowProcessing,\n dispatch,\n isPaginationCoursesEnabled,\n}) => {\n const navigate = useNavigate();\n const TABS_LIST = {\n courses: 'courses',\n libraries: 'libraries',\n archived: 'archived',\n taxonomies: 'taxonomies',\n };\n const [tabKey, setTabKey] = useState(TABS_LIST.courses);\n const {\n libraryAuthoringMfeUrl,\n redirectToLibraryAuthoringMfe,\n courses, librariesEnabled, libraries, archivedCourses,\n numPages, coursesCount,\n } = useSelector(getStudioHomeData);\n const {\n courseLoadingStatus,\n libraryLoadingStatus,\n } = useSelector(getLoadingStatuses);\n const isLoadingCourses = courseLoadingStatus === RequestStatus.IN_PROGRESS;\n const isFailedCoursesPage = courseLoadingStatus === RequestStatus.FAILED;\n const isLoadingLibraries = libraryLoadingStatus === RequestStatus.IN_PROGRESS;\n const isFailedLibrariesPage = libraryLoadingStatus === RequestStatus.FAILED;\n\n // Controlling the visibility of tabs when using conditional rendering is necessary for\n // the correct operation of iterating over child elements inside the Paragon Tabs component.\n const visibleTabs = useMemo(() => {\n const tabs = [];\n tabs.push(\n \n \n ,\n );\n\n if (archivedCourses?.length) {\n tabs.push(\n \n \n ,\n );\n }\n\n if (librariesEnabled) {\n tabs.push(\n \n {!redirectToLibraryAuthoringMfe && (\n \n )}\n ,\n );\n }\n\n if (getConfig().ENABLE_TAGGING_TAXONOMY_PAGES === 'true') {\n tabs.push(\n ,\n );\n }\n\n return tabs;\n }, [archivedCourses, librariesEnabled, showNewCourseContainer, isLoadingCourses, isLoadingLibraries]);\n\n const handleSelectTab = (tab) => {\n if (tab === TABS_LIST.libraries && redirectToLibraryAuthoringMfe) {\n window.location.assign(libraryAuthoringMfeUrl);\n } else if (tab === TABS_LIST.libraries && !redirectToLibraryAuthoringMfe) {\n dispatch(fetchLibraryData());\n } else if (tab === TABS_LIST.taxonomies) {\n navigate('/taxonomies');\n }\n setTabKey(tab);\n };\n\n return (\n \n {visibleTabs}\n \n );\n};\n\nTabsSection.defaultProps = {\n isPaginationCoursesEnabled: false,\n};\n\nTabsSection.propTypes = {\n intl: intlShape.isRequired,\n showNewCourseContainer: PropTypes.bool.isRequired,\n onClickNewCourse: PropTypes.func.isRequired,\n isShowProcessing: PropTypes.bool.isRequired,\n dispatch: PropTypes.func.isRequired,\n isPaginationCoursesEnabled: PropTypes.bool,\n};\n\nexport default injectIntl(TabsSection);\n","import React, { useState, useEffect } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { isEmpty } from 'lodash';\nimport { Button, Form, FormLabel } from '@openedx/paragon';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { TypeaheadDropdown } from '@edx/frontend-lib-content-components';\n\nimport { getOrganizations } from '../../generic/data/selectors';\nimport { fetchOrganizationsQuery } from '../../generic/data/thunks';\nimport messages from '../messages';\n\nconst OrganizationSection = ({ intl }) => {\n const dispatch = useDispatch();\n const location = useLocation();\n const navigate = useNavigate();\n const fieldName = 'org';\n const searchParams = new URLSearchParams(location.search);\n const orgURLValue = searchParams.get(fieldName) || '';\n const [inputValue, setInputValue] = useState('');\n const organizations = useSelector(getOrganizations);\n\n useEffect(() => {\n if (isEmpty(organizations)) {\n dispatch(fetchOrganizationsQuery());\n }\n }, []);\n\n // We have to set value only after the list of organizations to be received to display the initial state correctly.\n useEffect(() => {\n if (organizations.length) {\n setInputValue(orgURLValue);\n }\n }, [orgURLValue, organizations]);\n\n const handleSubmit = () => {\n navigate({\n pathname: '/home',\n search: `?${fieldName}=${inputValue}`,\n });\n };\n\n return (\n
    \n

    \n {intl.formatMessage(messages.organizationTitle)}\n

    \n \n \n {intl.formatMessage(messages.organizationLabel)}\n \n setInputValue(e.target.value)}\n handleChange={(value) => setInputValue(value)}\n noOptionsMessage={intl.formatMessage(messages.organizationInputNoOptions)}\n helpMessage=\"\"\n errorMessage=\"\"\n floatingLabel=\"\"\n />\n \n \n
    \n );\n};\n\nOrganizationSection.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(OrganizationSection);\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headingTitle: {\n id: 'course-authoring.studio-home.verify-email.heading',\n defaultMessage: 'Thanks for signing up, {username}!',\n },\n bannerTitle: {\n id: 'course-authoring.studio-home.verify-email.banner.title',\n defaultMessage: 'We need to verify your email address',\n },\n bannerDescription: {\n id: 'course-authoring.studio-home.verify-email.banner.description',\n defaultMessage: 'Almost there! In order to complete your sign up we need you to verify your email address ({email}). An activation message and next steps should be waiting for you there.',\n },\n sidebarTitle: {\n id: 'course-authoring.studio-home.verify-email.sidebar.title',\n defaultMessage: 'Need help?',\n },\n sidebarDescription: {\n id: 'course-authoring.studio-home.verify-email.sidebar.description',\n defaultMessage: 'Please check your Junk or Spam folders in case our email isn\\'t in your INBOX. Still can\\'t find the verification email? Request help via the link below.',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { Layout, Card } from '@openedx/paragon';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport messages from './messages';\n\nconst VerifyEmailLayout = () => {\n const intl = useIntl();\n const { email, username } = getAuthenticatedUser();\n\n return (\n \n \n
    \n

    {intl.formatMessage(messages.headingTitle, { username })}

    \n \n \n {intl.formatMessage(messages.bannerDescription, { email })}\n \n \n
    \n
    \n \n \n

    \n {intl.formatMessage(messages.sidebarTitle)}\n

    \n

    \n {intl.formatMessage(messages.sidebarDescription)}\n

    \n
    \n
    \n \n );\n};\n\nexport default VerifyEmailLayout;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n courseDisplayNameLabel: {\n id: 'course-authoring.create-or-rerun-course.display-name.label',\n defaultMessage: 'Course name',\n },\n courseDisplayNamePlaceholder: {\n id: 'course-authoring.create-or-rerun-course.display-name.placeholder',\n defaultMessage: 'e.g. Introduction to Computer Science',\n },\n courseDisplayNameCreateHelpText: {\n id: 'course-authoring.create-or-rerun-course.create.display-name.help-text',\n defaultMessage: 'The public display name for your course. This cannot be changed, but you can set a different display name in advanced settings later.',\n },\n courseDisplayNameRerunHelpText: {\n id: 'course-authoring.create-or-rerun-course.rerun.display-name.help-text',\n defaultMessage: 'The public display name for the new course. (This name is often the same as the original course name.)',\n },\n courseOrgLabel: {\n id: 'course-authoring.create-or-rerun-course.org.label',\n defaultMessage: 'Organization',\n },\n courseOrgPlaceholder: {\n id: 'course-authoring.create-or-rerun-course.org.placeholder',\n defaultMessage: 'e.g. UniversityX or OrganizationX',\n },\n courseOrgNoOptions: {\n id: 'course-authoring.create-or-rerun-course.org.no-options',\n defaultMessage: 'No options',\n },\n courseOrgCreateHelpText: {\n id: 'course-authoring.create-or-rerun-course.create.org.help-text',\n defaultMessage: 'The name of the organization sponsoring the course. {strong} This cannot be changed, but you can set a different display name in advanced settings later.',\n },\n courseOrgRerunHelpText: {\n id: 'course-authoring.create-or-rerun-course.rerun.org.help-text',\n defaultMessage: 'The name of the organization sponsoring the new course. (This name is often the same as the original organization name.) {strong}',\n },\n courseNoteNoSpaceAllowedStrong: {\n id: 'course-authoring.create-or-rerun-course.no-space-allowed.strong',\n defaultMessage: 'Note: No spaces or special characters are allowed.',\n },\n courseNoteOrgNameIsPartStrong: {\n id: 'course-authoring.create-or-rerun-course.org.help-text.strong',\n defaultMessage: 'Note: The organization name is part of the course URL.',\n },\n courseNumberLabel: {\n id: 'course-authoring.create-or-rerun-course.number.label',\n defaultMessage: 'Course number',\n },\n courseNumberPlaceholder: {\n id: 'course-authoring.create-or-rerun-course.number.placeholder',\n defaultMessage: 'e.g. CS101',\n },\n courseNumberCreateHelpText: {\n id: 'course-authoring.create-or-rerun-course.create.number.help-text',\n defaultMessage: 'The unique number that identifies your course within your organization. {strong}',\n },\n courseNumberRerunHelpText: {\n id: 'course-authoring.create-or-rerun-course.rerun.number.help-text',\n defaultMessage: 'The unique number that identifies the new course within the organization. (This number will be the same as the original course number and cannot be changed.)',\n },\n courseNotePartCourseURLRequireStrong: {\n id: 'course-authoring.create-or-rerun-course.number.help-text.strong',\n defaultMessage: 'Note: This is part of your course URL, so no spaces or special characters are allowed and it cannot be changed.',\n },\n courseRunLabel: {\n id: 'course-authoring.create-or-rerun-course.run.label',\n defaultMessage: 'Course run',\n },\n courseRunPlaceholder: {\n id: 'course-authoring.create-or-rerun-course.run.placeholder',\n defaultMessage: 'e.g. 2014_T1',\n },\n courseRunCreateHelpText: {\n id: 'course-authoring.create-or-rerun-course.create.run.help-text',\n defaultMessage: 'The term in which your course will run. {strong}',\n },\n courseRunRerunHelpText: {\n id: 'course-authoring.create-or-rerun-course.create.rerun.help-text',\n defaultMessage: 'The term in which the new course will run. (This value is often different than the original course run value.){strong}',\n },\n defaultPlaceholder: {\n id: 'course-authoring.create-or-rerun-course.default-placeholder',\n defaultMessage: 'Label',\n },\n createButton: {\n id: 'course-authoring.create-or-rerun-course.create.button.create',\n defaultMessage: 'Create',\n },\n rerunCreateButton: {\n id: 'course-authoring.create-or-rerun-course.rerun.button.create',\n defaultMessage: 'Create re-run',\n },\n creatingButton: {\n id: 'course-authoring.create-or-rerun-course.button.creating',\n defaultMessage: 'Creating',\n },\n rerunningCreateButton: {\n id: 'course-authoring.create-or-rerun-course.rerun.button.rerunning',\n defaultMessage: 'Processing re-run request',\n },\n cancelButton: {\n id: 'course-authoring.create-or-rerun-course.button.cancel',\n defaultMessage: 'Cancel',\n },\n requiredFieldError: {\n id: 'course-authoring.create-or-rerun-course.required.error',\n defaultMessage: 'Required field.',\n },\n disallowedCharsError: {\n id: 'course-authoring.create-or-rerun-course.disallowed-chars.error',\n defaultMessage: 'Please do not use any spaces or special characters in this field.',\n },\n noSpaceError: {\n id: 'course-authoring.create-or-rerun-course.no-space.error',\n defaultMessage: 'Please do not use any spaces in this field.',\n },\n alertErrorExistsAriaLabelledBy: {\n id: 'course-authoring.create-or-rerun-course.error.already-exists.labelledBy',\n defaultMessage: 'alert-already-exists-title',\n },\n alertErrorExistsAriaDescribedBy: {\n id: 'course-authoring.create-or-rerun-course.error.already-exists.aria.describedBy',\n defaultMessage: 'alert-confirmation-description',\n },\n});\n\nexport default messages;\n","import React, { useRef, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useParams } from 'react-router-dom';\nimport classNames from 'classnames';\nimport { useSelector } from 'react-redux';\nimport {\n Form,\n Button,\n Dropdown,\n ActionRow,\n StatefulButton,\n TransitionReplace,\n} from '@openedx/paragon';\nimport { Info as InfoIcon } from '@openedx/paragon/icons';\nimport { TypeaheadDropdown } from '@edx/frontend-lib-content-components';\n\nimport AlertMessage from '../alert-message';\nimport { STATEFUL_BUTTON_STATES } from '../../constants';\nimport { RequestStatus } from '../../data/constants';\nimport { getSavingStatus } from '../data/selectors';\nimport { getStudioHomeData } from '../../studio-home/data/selectors';\nimport { updatePostErrors } from '../data/slice';\nimport { updateCreateOrRerunCourseQuery } from '../data/thunks';\nimport { useCreateOrRerunCourse } from './hooks';\nimport messages from './messages';\n\nconst CreateOrRerunCourseForm = ({\n title,\n isCreateNewCourse,\n initialValues,\n onClickCancel,\n}) => {\n const { courseId } = useParams();\n const savingStatus = useSelector(getSavingStatus);\n const { allowToCreateNewOrg } = useSelector(getStudioHomeData);\n const runFieldReference = useRef(null);\n const displayNameFieldReference = useRef(null);\n\n const {\n intl,\n errors,\n values,\n postErrors,\n isFormFilled,\n isFormInvalid,\n organizations,\n showErrorBanner,\n dispatch,\n handleBlur,\n handleChange,\n hasErrorField,\n setFieldValue,\n } = useCreateOrRerunCourse(initialValues);\n\n const newCourseFields = [\n {\n label: intl.formatMessage(messages.courseDisplayNameLabel),\n helpText: intl.formatMessage(\n isCreateNewCourse\n ? messages.courseDisplayNameCreateHelpText\n : messages.courseDisplayNameRerunHelpText,\n ),\n name: 'displayName',\n value: values.displayName,\n placeholder: intl.formatMessage(messages.courseDisplayNamePlaceholder),\n disabled: false,\n ref: displayNameFieldReference,\n },\n {\n label: intl.formatMessage(messages.courseOrgLabel),\n helpText: isCreateNewCourse\n ? intl.formatMessage(messages.courseOrgCreateHelpText, {\n strong: {intl.formatMessage(messages.courseNoteOrgNameIsPartStrong)},\n })\n : intl.formatMessage(messages.courseOrgRerunHelpText, {\n strong: (\n <>\n
    \n \n {intl.formatMessage(messages.courseNoteNoSpaceAllowedStrong)}\n \n \n ),\n }),\n name: 'org',\n value: values.org,\n options: organizations,\n placeholder: intl.formatMessage(messages.courseOrgPlaceholder),\n disabled: false,\n },\n {\n label: intl.formatMessage(messages.courseNumberLabel),\n helpText: isCreateNewCourse\n ? intl.formatMessage(messages.courseNumberCreateHelpText, {\n strong: (\n \n {intl.formatMessage(messages.courseNotePartCourseURLRequireStrong)}\n \n ),\n })\n : intl.formatMessage(messages.courseNumberRerunHelpText),\n name: 'number',\n value: values.number,\n placeholder: intl.formatMessage(messages.courseNumberPlaceholder),\n disabled: !isCreateNewCourse,\n },\n {\n label: intl.formatMessage(messages.courseRunLabel),\n helpText: isCreateNewCourse\n ? intl.formatMessage(messages.courseRunCreateHelpText, {\n strong: (\n \n {intl.formatMessage(messages.courseNotePartCourseURLRequireStrong)}\n \n ),\n })\n : intl.formatMessage(messages.courseRunRerunHelpText, {\n strong: (\n <>\n
    \n \n {intl.formatMessage(messages.courseNoteNoSpaceAllowedStrong)}\n \n \n ),\n }),\n name: 'run',\n value: values.run,\n placeholder: intl.formatMessage(messages.courseRunPlaceholder),\n disabled: false,\n ref: runFieldReference,\n },\n ];\n\n const createButtonState = {\n labels: {\n default: intl.formatMessage(isCreateNewCourse ? messages.createButton : messages.rerunCreateButton),\n pending: intl.formatMessage(isCreateNewCourse ? messages.creatingButton : messages.rerunningCreateButton),\n },\n disabledStates: [STATEFUL_BUTTON_STATES.pending],\n };\n\n const handleOnClickCreate = () => {\n const courseData = isCreateNewCourse ? values : { ...values, sourceCourseKey: courseId };\n dispatch(updateCreateOrRerunCourseQuery(courseData));\n };\n\n const handleOnClickCancel = () => {\n dispatch(updatePostErrors({}));\n onClickCancel();\n };\n\n const handleCustomBlurForDropdown = (e) => {\n // it needs to correct handleOnChange Form.Autosuggest\n const { value, name } = e.target;\n setFieldValue(name, value);\n handleBlur(e);\n };\n\n const renderOrgField = (field) => (allowToCreateNewOrg ? (\n setFieldValue(field.name, value)}\n noOptionsMessage={intl.formatMessage(messages.courseOrgNoOptions)}\n helpMessage=\"\"\n errorMessage=\"\"\n floatingLabel=\"\"\n />\n ) : (\n \n \n {field.value || intl.formatMessage(messages.courseOrgNoOptions)}\n \n \n {field.options?.map((value) => (\n setFieldValue(field.name, value)}\n >\n {value}\n \n ))}\n \n \n ));\n\n useEffect(() => {\n // it needs to display the initial focus for the field depending on the current page\n if (!isCreateNewCourse) {\n runFieldReference?.current?.focus();\n } else {\n displayNameFieldReference?.current?.focus();\n }\n }, []);\n\n return (\n
    \n \n {showErrorBanner ? (\n \n ) : null}\n \n

    {title}

    \n
    \n {newCourseFields.map((field) => (\n \n {field.label}\n {field.name !== 'org' ? (\n \n ) : renderOrgField(field)}\n {field.helpText}\n {hasErrorField(field.name) && (\n \n {errors[field.name]}\n \n )}\n \n ))}\n \n \n {intl.formatMessage(messages.cancelButton)}\n \n \n \n \n
    \n );\n};\n\nCreateOrRerunCourseForm.defaultProps = {\n title: '',\n isCreateNewCourse: false,\n};\n\nCreateOrRerunCourseForm.propTypes = {\n title: PropTypes.string,\n initialValues: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n org: PropTypes.string.isRequired,\n number: PropTypes.string.isRequired,\n run: PropTypes.string.isRequired,\n }).isRequired,\n isCreateNewCourse: PropTypes.bool,\n onClickCancel: PropTypes.func.isRequired,\n};\n\nexport default CreateOrRerunCourseForm;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { getConfig } from '@edx/frontend-platform';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useFormik } from 'formik';\nimport * as Yup from 'yup';\n\nimport { RequestStatus } from '../../data/constants';\nimport { getStudioHomeData } from '../../studio-home/data/selectors';\nimport {\n getRedirectUrlObj,\n getOrganizations,\n getPostErrors,\n getSavingStatus,\n} from '../data/selectors';\nimport { updateSavingStatus, updatePostErrors } from '../data/slice';\nimport { fetchOrganizationsQuery } from '../data/thunks';\nimport messages from './messages';\n\nconst useCreateOrRerunCourse = (initialValues) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const redirectUrlObj = useSelector(getRedirectUrlObj);\n const createOrRerunCourseSavingStatus = useSelector(getSavingStatus);\n const allOrganizations = useSelector(getOrganizations);\n const postErrors = useSelector(getPostErrors);\n const {\n allowToCreateNewOrg,\n allowedOrganizations,\n } = useSelector(getStudioHomeData);\n const [isFormFilled, setFormFilled] = useState(false);\n const [showErrorBanner, setShowErrorBanner] = useState(false);\n const organizations = allowToCreateNewOrg ? allOrganizations : allowedOrganizations;\n const specialCharsRule = /^[a-zA-Z0-9_\\-.'*~\\s]+$/;\n const noSpaceRule = /^\\S*$/;\n const validationSchema = Yup.object().shape({\n displayName: Yup.string().required(\n intl.formatMessage(messages.requiredFieldError),\n ),\n org: Yup.string()\n .required(intl.formatMessage(messages.requiredFieldError))\n .matches(\n specialCharsRule,\n intl.formatMessage(messages.disallowedCharsError),\n )\n .matches(noSpaceRule, intl.formatMessage(messages.noSpaceError)),\n number: Yup.string()\n .required(intl.formatMessage(messages.requiredFieldError))\n .matches(\n specialCharsRule,\n intl.formatMessage(messages.disallowedCharsError),\n )\n .matches(noSpaceRule, intl.formatMessage(messages.noSpaceError)),\n run: Yup.string()\n .required(intl.formatMessage(messages.requiredFieldError))\n .matches(\n specialCharsRule,\n intl.formatMessage(messages.disallowedCharsError),\n )\n .matches(noSpaceRule, intl.formatMessage(messages.noSpaceError)),\n });\n\n const {\n values, errors, touched, handleChange, handleBlur, setFieldValue,\n } = useFormik({\n initialValues,\n enableReinitialize: true,\n validateOnBlur: false,\n validationSchema,\n });\n\n useEffect(() => {\n if (allowToCreateNewOrg) {\n dispatch(fetchOrganizationsQuery());\n }\n }, []);\n\n useEffect(() => {\n setFormFilled(Object.values(values).every((i) => i));\n dispatch(updatePostErrors({}));\n }, [values]);\n\n useEffect(() => {\n setShowErrorBanner(!!postErrors.errMsg);\n }, [postErrors]);\n\n useEffect(() => {\n if (createOrRerunCourseSavingStatus === RequestStatus.SUCCESSFUL) {\n dispatch(updateSavingStatus({ status: '' }));\n const { url, destinationCourseKey } = redirectUrlObj;\n // New courses' url to the outline page is provided in the url. However, for course\n // re-runs the url is /course/. The actual destination for the rer-run's outline\n // is in the destionationCourseKey attribute from the api.\n if (url) {\n if (destinationCourseKey) {\n window.location.assign(`${getConfig().STUDIO_BASE_URL}${url}${destinationCourseKey}`);\n } else {\n window.location.assign(`${getConfig().STUDIO_BASE_URL}${url}`);\n }\n }\n } else if (createOrRerunCourseSavingStatus === RequestStatus.FAILED) {\n dispatch(updateSavingStatus({ status: '' }));\n }\n }, [createOrRerunCourseSavingStatus]);\n\n const hasErrorField = (fieldName) => !!errors[fieldName] && !!touched[fieldName];\n const isFormInvalid = Object.keys(errors).length;\n\n return {\n intl,\n errors,\n values,\n postErrors,\n isFormFilled,\n isFormInvalid,\n organizations,\n showErrorBanner,\n dispatch,\n handleBlur,\n handleChange,\n hasErrorField,\n setFieldValue,\n setShowErrorBanner,\n };\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { useCreateOrRerunCourse };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n createNewCourse: {\n id: 'course-authoring.studio-home.new-course.title',\n defaultMessage: 'Create a new course',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { CreateOrRerunCourseForm } from '../../generic/create-or-rerun-course';\nimport messages from './messages';\n\nconst CreateNewCourseForm = ({ handleOnClickCancel }) => {\n const intl = useIntl();\n const initialNewCourseData = {\n displayName: '',\n org: '',\n number: '',\n run: '',\n };\n\n return (\n
    \n \n
    \n );\n};\n\nCreateNewCourseForm.propTypes = {\n handleOnClickCancel: PropTypes.func.isRequired,\n};\n\nexport default CreateNewCourseForm;\n","import React from 'react';\nimport {\n Button,\n Container,\n Icon,\n Layout,\n MailtoLink,\n Row,\n} from '@openedx/paragon';\nimport { Add as AddIcon, Error } from '@openedx/paragon/icons';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { StudioFooter } from '@edx/frontend-component-footer';\nimport { getConfig } from '@edx/frontend-platform';\n\nimport Loading from '../generic/Loading';\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport Header from '../header';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport HomeSidebar from './home-sidebar';\nimport TabsSection from './tabs-section';\nimport OrganizationSection from './organization-section';\nimport VerifyEmailLayout from './verify-email-layout';\nimport CreateNewCourseForm from './create-new-course-form';\nimport messages from './messages';\nimport { useStudioHome } from './hooks';\nimport AlertMessage from '../generic/alert-message';\n\nconst StudioHome = ({ intl }) => {\n const isPaginationCoursesEnabled = getConfig().ENABLE_HOME_PAGE_COURSE_API_V2;\n const {\n isLoadingPage,\n isFailedLoadingPage,\n studioHomeData,\n isShowProcessing,\n anyQueryIsFailed,\n isShowEmailStaff,\n anyQueryIsPending,\n showNewCourseContainer,\n isShowOrganizationDropdown,\n hasAbilityToCreateNewCourse,\n isFiltered,\n setShowNewCourseContainer,\n dispatch,\n } = useStudioHome(isPaginationCoursesEnabled);\n\n const {\n userIsActive,\n studioShortName,\n studioRequestEmail,\n libraryAuthoringMfeUrl,\n redirectToLibraryAuthoringMfe,\n } = studioHomeData;\n\n function getHeaderButtons() {\n const headerButtons = [];\n\n if (isFailedLoadingPage || !userIsActive) {\n return headerButtons;\n }\n\n if (isShowEmailStaff) {\n headerButtons.push(\n {intl.formatMessage(messages.emailStaffBtnText)},\n );\n }\n\n if (hasAbilityToCreateNewCourse) {\n headerButtons.push(\n setShowNewCourseContainer(true)}\n >\n {intl.formatMessage(messages.addNewCourseBtnText)}\n ,\n );\n }\n\n let libraryHref = `${getConfig().STUDIO_BASE_URL}/home_library`;\n if (redirectToLibraryAuthoringMfe) {\n libraryHref = `${libraryAuthoringMfeUrl}/create`;\n }\n\n headerButtons.push(\n \n {intl.formatMessage(messages.addNewLibraryBtnText)}\n ,\n );\n\n return headerButtons;\n }\n\n const headerButtons = userIsActive ? getHeaderButtons() : [];\n if (isLoadingPage && !isFiltered) {\n return ();\n }\n\n const getMainBody = () => {\n if (isFailedLoadingPage) {\n return (\n \n \n {intl.formatMessage(messages.homePageLoadFailedMessage)}\n \n )}\n />\n );\n }\n if (!userIsActive) {\n return ;\n }\n return (\n \n \n
    \n {showNewCourseContainer && (\n setShowNewCourseContainer(false)} />\n )}\n {isShowOrganizationDropdown && }\n setShowNewCourseContainer(true)}\n isShowProcessing={isShowProcessing && !isFiltered}\n dispatch={dispatch}\n isPaginationCoursesEnabled={isPaginationCoursesEnabled}\n />\n
    \n
    \n \n \n \n \n );\n };\n\n return (\n <>\n
    \n \n
    \n
    \n
    \n \n
    \n
    \n {getMainBody()}\n
    \n
    \n
    \n \n
    \n \n \n );\n};\n\nStudioHome.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(StudioHome);\n","import { useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { RequestStatus } from '../data/constants';\nimport { COURSE_CREATOR_STATES } from '../constants';\nimport { getCourseData, getSavingStatus } from '../generic/data/selectors';\nimport { fetchStudioHomeData } from './data/thunks';\nimport {\n getLoadingStatuses,\n getSavingStatuses,\n getStudioHomeData,\n getStudioHomeCoursesParams,\n} from './data/selectors';\nimport { updateSavingStatuses } from './data/slice';\n\nconst useStudioHome = (isPaginated = false) => {\n const location = useLocation();\n const dispatch = useDispatch();\n const studioHomeData = useSelector(getStudioHomeData);\n const studioHomeCoursesParams = useSelector(getStudioHomeCoursesParams);\n const { isFiltered } = studioHomeCoursesParams;\n const newCourseData = useSelector(getCourseData);\n const { studioHomeLoadingStatus } = useSelector(getLoadingStatuses);\n const savingCreateRerunStatus = useSelector(getSavingStatus);\n const {\n courseCreatorSavingStatus,\n deleteNotificationSavingStatus,\n } = useSelector(getSavingStatuses);\n const [showNewCourseContainer, setShowNewCourseContainer] = useState(false);\n const isLoadingPage = studioHomeLoadingStatus === RequestStatus.IN_PROGRESS;\n const isFailedLoadingPage = studioHomeLoadingStatus === RequestStatus.FAILED;\n\n useEffect(() => {\n if (!isPaginated) {\n dispatch(fetchStudioHomeData(location.search ?? ''));\n setShowNewCourseContainer(false);\n }\n }, [location.search]);\n\n useEffect(() => {\n if (isPaginated) {\n const firstPage = 1;\n dispatch(fetchStudioHomeData(location.search ?? '', false, { page: firstPage }, true));\n }\n }, []);\n\n useEffect(() => {\n if (courseCreatorSavingStatus === RequestStatus.SUCCESSFUL) {\n dispatch(updateSavingStatuses({ courseCreatorSavingStatus: '' }));\n dispatch(fetchStudioHomeData());\n }\n }, [courseCreatorSavingStatus]);\n\n useEffect(() => {\n if (deleteNotificationSavingStatus === RequestStatus.SUCCESSFUL) {\n dispatch(updateSavingStatuses({ courseCreatorSavingStatus: '' }));\n dispatch(fetchStudioHomeData());\n } else if (deleteNotificationSavingStatus === RequestStatus.FAILED) {\n dispatch(updateSavingStatuses({ deleteNotificationSavingStatus: '' }));\n }\n }, [deleteNotificationSavingStatus]);\n\n const {\n allowCourseReruns,\n rerunCreatorStatus,\n optimizationEnabled,\n studioRequestEmail,\n inProcessCourseActions,\n courseCreatorStatus,\n } = studioHomeData;\n\n const isShowOrganizationDropdown = optimizationEnabled && courseCreatorStatus === COURSE_CREATOR_STATES.granted;\n const isShowEmailStaff = courseCreatorStatus === COURSE_CREATOR_STATES.disallowedForThisSite && !!studioRequestEmail;\n const isShowProcessing = allowCourseReruns && rerunCreatorStatus && inProcessCourseActions?.length > 0;\n const hasAbilityToCreateNewCourse = courseCreatorStatus === COURSE_CREATOR_STATES.granted;\n const anyQueryIsPending = [deleteNotificationSavingStatus, courseCreatorSavingStatus, savingCreateRerunStatus]\n .includes(RequestStatus.PENDING);\n const anyQueryIsFailed = [deleteNotificationSavingStatus, courseCreatorSavingStatus, savingCreateRerunStatus]\n .includes(RequestStatus.FAILED);\n\n return {\n isLoadingPage,\n isFailedLoadingPage,\n newCourseData,\n studioHomeData,\n isShowProcessing,\n anyQueryIsFailed,\n isShowEmailStaff,\n anyQueryIsPending,\n showNewCourseContainer,\n courseCreatorSavingStatus,\n isShowOrganizationDropdown,\n hasAbilityToCreateNewCourse,\n isFiltered,\n dispatch,\n setShowNewCourseContainer,\n };\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { useStudioHome };\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n rerunCourseDescription: {\n id: 'course-authoring.course-rerun.form.description',\n defaultMessage: 'Provide identifying information for this re-run of the course. The original course is not affected in any way by a re-run. {strong}',\n },\n rerunCourseDescriptionStrong: {\n id: 'course-authoring.course-rerun.form.description.strong',\n defaultMessage: 'Note: Together, the organization, course number, and course run must uniquely identify this new course instance.',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { CreateOrRerunCourseForm } from '../../generic/create-or-rerun-course';\nimport messages from './messages';\n\nconst CourseRerunForm = ({ initialFormValues, onClickCancel }) => {\n const intl = useIntl();\n return (\n
    \n
    {intl.formatMessage(messages.rerunCourseDescription, {\n strong: (\n {intl.formatMessage(messages.rerunCourseDescriptionStrong)}\n ),\n })}\n
    \n \n
    \n );\n};\n\nCourseRerunForm.propTypes = {\n initialFormValues: PropTypes.shape({\n displayName: PropTypes.string.isRequired,\n org: PropTypes.string.isRequired,\n number: PropTypes.string.isRequired,\n run: PropTypes.string,\n }).isRequired,\n onClickCancel: PropTypes.func.isRequired,\n};\n\nexport default CourseRerunForm;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n sectionTitle1: {\n id: 'course-authoring.course-rerun.sidebar.section-1.title',\n defaultMessage: 'When will my course re-run start?',\n },\n sectionDescription1: {\n id: 'course-authoring.course-rerun.sidebar.section-1.description',\n defaultMessage: 'The new course is set to start on',\n },\n sectionTitle2: {\n id: 'course-authoring.course-rerun.sidebar.section-2.title',\n defaultMessage: 'What transfers from the original course?',\n },\n sectionDescription2: {\n id: 'course-authoring.course-rerun.sidebar.section-2.description',\n defaultMessage: 'The new course has the same course outline and content as the original course. All problems, videos, announcements, and other files are duplicated to the new course.',\n },\n sectionTitle3: {\n id: 'course-authoring.course-rerun.sidebar.section-3.title',\n defaultMessage: 'What does not transfer from the original course?',\n },\n sectionDescription3: {\n id: 'course-authoring.course-rerun.sidebar.section-3.description',\n defaultMessage: 'You are the only member of the new course\\'s staff. No students are enrolled in the course, and there is no student data. There is no content in the discussion topics or wiki.',\n },\n sectionLink4: {\n id: 'course-authoring.course-rerun.sidebar.section-4.link',\n defaultMessage: 'Learn more about course re-runs',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { Hyperlink } from '@openedx/paragon';\nimport { FormattedDate, useIntl } from '@edx/frontend-platform/i18n';\n\nimport { useHelpUrls } from '../../help-urls/hooks';\nimport { HelpSidebar } from '../../generic/help-sidebar';\nimport messages from './messages';\n\nconst CourseRerunSideBar = () => {\n const intl = useIntl();\n const { default: learnMoreUrl } = useHelpUrls(['default']);\n const defaultCourseDate = new Date(Date.UTC(2030, 0, 1, 0, 0));\n const localizedCourseDate = (\n \n );\n\n const sidebarMessages = [\n {\n title: intl.formatMessage(messages.sectionTitle1),\n description: `${intl.formatMessage(messages.sectionDescription1)}`,\n date: localizedCourseDate,\n },\n {\n title: intl.formatMessage(messages.sectionTitle2),\n description: intl.formatMessage(messages.sectionDescription2),\n },\n {\n title: intl.formatMessage(messages.sectionTitle3),\n description: intl.formatMessage(messages.sectionDescription3),\n },\n {\n link: {\n text: intl.formatMessage(messages.sectionLink4),\n href: learnMoreUrl,\n },\n },\n ];\n\n return (\n \n {sidebarMessages.map(({\n title,\n description,\n link,\n date,\n }, index) => {\n const isLastSection = index === sidebarMessages.length - 1;\n\n return (\n
    \n

    {title}

    \n

    {description} {date}

    \n {!!link && (\n \n {link.text}\n \n )}\n {!isLastSection &&
    }\n
    \n );\n })}\n \n );\n};\n\nexport default CourseRerunSideBar;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n rerunTitle: {\n id: 'course-authoring.course-rerun.title',\n defaultMessage: 'Create a re-run of',\n },\n cancelButton: {\n id: 'course-authoring.course-rerun.actions.button.cancel',\n defaultMessage: 'Cancel',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport {\n Container,\n Layout,\n Stack,\n ActionRow,\n Button,\n} from '@openedx/paragon';\nimport { StudioFooter } from '@edx/frontend-component-footer';\nimport { useNavigate, useParams } from 'react-router-dom';\n\nimport Header from '../header';\nimport Loading from '../generic/Loading';\nimport { getLoadingStatuses } from '../generic/data/selectors';\nimport InternetConnectionAlert from '../generic/internet-connection-alert';\nimport { RequestStatus } from '../data/constants';\nimport CourseRerunForm from './course-rerun-form';\nimport CourseRerunSideBar from './course-rerun-sidebar';\nimport messages from './messages';\nimport { useCourseRerun } from './hooks';\n\nconst CourseRerun = () => {\n const { courseId } = useParams();\n const navigate = useNavigate();\n const {\n intl,\n displayName,\n savingStatus,\n initialFormValues,\n originalCourseData,\n } = useCourseRerun(courseId);\n const { organizationLoadingStatus } = useSelector(getLoadingStatuses);\n\n if (organizationLoadingStatus === RequestStatus.IN_PROGRESS) {\n return ;\n }\n\n const handleRerunCourseCancel = () => {\n navigate('/home');\n };\n\n return (\n <>\n
    \n \n
    \n
    \n
    \n
    \n \n

    \n {intl.formatMessage(messages.rerunTitle)} {displayName}\n

    \n {originalCourseData}\n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n \n
    \n \n \n );\n};\n\nexport default CourseRerun;\n","import { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useNavigate } from 'react-router-dom';\n\nimport { RequestStatus } from '../data/constants';\nimport { updateSavingStatus } from '../generic/data/slice';\nimport {\n getSavingStatus,\n getRedirectUrlObj,\n getCourseRerunData,\n getCourseData,\n} from '../generic/data/selectors';\nimport { fetchCourseRerunQuery, fetchOrganizationsQuery } from '../generic/data/thunks';\nimport { fetchStudioHomeData } from '../studio-home/data/thunks';\n\nconst useCourseRerun = (courseId) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const savingStatus = useSelector(getSavingStatus);\n const courseData = useSelector(getCourseData);\n const courseRerunData = useSelector(getCourseRerunData);\n const redirectUrlObj = useSelector(getRedirectUrlObj);\n\n const {\n displayName = '',\n org = '',\n run = '',\n number = '',\n } = courseRerunData;\n const originalCourseData = `${org} ${number} ${run}`;\n const initialFormValues = {\n displayName,\n org,\n number,\n run: '',\n };\n\n useEffect(() => {\n dispatch(fetchStudioHomeData());\n dispatch(fetchCourseRerunQuery(courseId));\n dispatch(fetchOrganizationsQuery());\n }, []);\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n dispatch(updateSavingStatus({ status: '' }));\n const { url } = redirectUrlObj;\n if (url) {\n navigate('/home');\n }\n }\n }, [savingStatus]);\n\n return {\n intl,\n courseData,\n displayName,\n savingStatus,\n initialFormValues,\n originalCourseData,\n dispatch,\n };\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { useCourseRerun };\n","// @ts-check\nimport { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n importWizardButtonCancel: {\n id: 'course-authoring.import-tags.wizard.button.cancel',\n defaultMessage: 'Cancel',\n },\n importWizardButtonNext: {\n id: 'course-authoring.import-tags.wizard.button.next',\n defaultMessage: 'Next',\n },\n importWizardButtonPrevious: {\n id: 'course-authoring.import-tags.wizard.button.previous',\n defaultMessage: 'Previous',\n },\n importWizardButtonImport: {\n id: 'course-authoring.import-tags.wizard.button.import',\n defaultMessage: 'Import',\n },\n importWizardButtonContinue: {\n id: 'course-authoring.import-tags.wizard.button.continue',\n defaultMessage: 'Continue',\n },\n importWizardButtonConfirm: {\n id: 'course-authoring.import-tags.wizard.button.confirm',\n defaultMessage: 'Yes, import file',\n },\n importWizardStepExportTitle: {\n id: 'course-authoring.import-tags.wizard.step-export.title',\n defaultMessage: 'Update \"{name}\"',\n },\n importWizardStepExportBody: {\n id: 'course-authoring.import-tags.wizard.step-export.body',\n defaultMessage: 'To update this taxonomy you need to import a new CSV or JSON file. The current taxonomy will '\n + 'be completely replaced by the contents of the imported file (e.g. if a tag in the current taxonomy is not '\n + 'present in the imported file, it will be removed - both from the taxonomy and from any tagged course '\n + 'content).'\n + '{br}You may wish to export the taxonomy in its current state before importing the new file.',\n },\n importWizardStepExportCSVButton: {\n id: 'course-authoring.import-tags.wizard.step-export.button-csv',\n defaultMessage: 'CSV file',\n },\n importWizardStepExportJSONButton: {\n id: 'course-authoring.import-tags.wizard.step-export.button-json',\n defaultMessage: 'JSON file',\n },\n importWizardStepUploadTitle: {\n id: 'course-authoring.import-tags.wizard.step-upload.title',\n defaultMessage: 'Upload file',\n },\n importWizardStepUploadClearFile: {\n id: 'course-authoring.import-tags.wizard.step-upload.clear-file',\n defaultMessage: 'Clear file',\n },\n importWizardStepUploadBody: {\n id: 'course-authoring.import-tags.wizard.step-upload.body',\n defaultMessage: 'You may use any spreadsheet tool (for CSV files), or any text editor (for JSON files) to create '\n + 'the file that you wish to import.'\n + '{br}Once the file is ready to be imported, drag and drop it into the box below, or click to upload.',\n },\n importWizardStepPlanTitle: {\n id: 'course-authoring.import-tags.wizard.step-plan.title',\n defaultMessage: 'Differences between files',\n },\n importWizardStepPlanBody: {\n id: 'course-authoring.import-tags.wizard.step-plan.body',\n defaultMessage: 'Importing this file will make {changeCount} updates to the existing taxonomy. '\n + 'The content of the imported file will replace any existing values that do not match the new values.'\n + '{br}Importing this file will cause the following updates:',\n },\n importWizardStepPlanNoChanges: {\n id: 'course-authoring.import-tags.wizard.step-plan.no-changes',\n defaultMessage: 'No changes',\n },\n importWizardStepConfirmTitle: {\n id: 'course-authoring.import-tags.wizard.step-confirm.title',\n defaultMessage: 'Import and replace tags',\n },\n importWizardStepConfirmBody: {\n id: 'course-authoring.import-tags.wizard.step-confirm.body',\n defaultMessage: 'Warning! You are about to make {changeCount} changes to the existing taxonomy. Any tags applied '\n + 'to course content will be updated or removed. This cannot be undone.'\n + '{br}Are you sure you want to continue importing this file?',\n },\n promptTaxonomyName: {\n id: 'course-authoring.import-tags.prompt.taxonomy-name',\n defaultMessage: 'Enter a name for the new taxonomy',\n },\n promptTaxonomyNameRequired: {\n id: 'course-authoring.import-tags.prompt.taxonomy-name.required',\n defaultMessage: 'You must enter a name for the new taxonomy',\n },\n promptTaxonomyExportId: {\n id: 'course-authoring.import-tags.prompt.taxonomy-export-id',\n defaultMessage: \"Enter a Export ID for the new taxonomy. Should only contain alphanumeric characters or '_' '-' '.'\",\n },\n promptTaxonomyExportIdRequired: {\n id: 'course-authoring.import-tags.prompt.taxonomy-export-id.required',\n defaultMessage: 'You must enter an Export ID for the new taxonomy.',\n },\n promptTaxonomyExportIdInvalid: {\n id: 'course-authoring.import-tags.prompt.taxonomy-export-id.invalid',\n defaultMessage: \"Invalid Export ID. Should only contain alphanumeric characters or '_' '-' '.'\",\n },\n promptTaxonomyDescription: {\n id: 'course-authoring.import-tags.prompt.taxonomy-description',\n defaultMessage: 'Enter a description for the new taxonomy',\n },\n importTaxonomySuccess: {\n id: 'course-authoring.import-tags.success',\n defaultMessage: 'Taxonomy imported successfully',\n },\n importTaxonomyError: {\n id: 'course-authoring.import-tags.error',\n defaultMessage: 'Import failed - see details in the browser console',\n },\n importTaxonomyToast: {\n id: 'course-authoring.import-tags.toast.success',\n defaultMessage: '\"{name}\" updated',\n },\n importTaxonomyErrorAlert: {\n id: 'course-authoring.import-tags.error-alert.title',\n defaultMessage: 'Import error',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport React, {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n StatefulButton,\n} from '@openedx/paragon';\nimport PropTypes from 'prop-types';\n\n/**\n * A button that shows a loading spinner when clicked.\n * @param {object} props\n * @param {string} props.label\n * @param {function=} props.onClick\n * @param {boolean=} props.disabled\n * @returns {JSX.Element}\n */\nconst LoadingButton = ({\n label,\n onClick,\n disabled,\n}) => {\n const [state, setState] = useState('');\n // This is used to prevent setting the isLoading state after the component has been unmounted.\n const componentMounted = useRef(true);\n\n useEffect(() => () => {\n componentMounted.current = false;\n }, []);\n\n const loadingOnClick = useCallback(async (e) => {\n if (!onClick) {\n return;\n }\n\n setState('pending');\n try {\n await onClick(e);\n } catch (err) {\n // Do nothing\n } finally {\n if (componentMounted.current) {\n setState('');\n }\n }\n }, [componentMounted, onClick]);\n\n return (\n \n );\n};\n\nLoadingButton.propTypes = {\n label: PropTypes.string.isRequired,\n onClick: PropTypes.func,\n disabled: PropTypes.bool,\n};\n\nLoadingButton.defaultProps = {\n onClick: undefined,\n disabled: undefined,\n};\n\nexport default LoadingButton;\n","// @ts-check\n/* eslint-disable import/prefer-default-export */\nimport React from 'react';\n\n/**\n * @typedef AlertProps\n * @type {Object}\n * @property {React.ReactNode} title - title of the alert.\n * @property {React.ReactNode} description - description of the alert.\n */\nexport const TaxonomyContext = React.createContext({\n toastMessage: /** @type{null|string} */ (null),\n setToastMessage: /** @type{null|React.Dispatch>} */ (null),\n alertProps: /** @type{null|AlertProps} */ (null),\n setAlertProps: /** @type{null|React.Dispatch>} */ (null),\n});\n","// @ts-check\nimport React, { useState, useContext, useMemo } from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n useToggle,\n Button,\n Container,\n Dropzone,\n Icon,\n IconButton,\n ModalDialog,\n Stack,\n Stepper,\n} from '@openedx/paragon';\nimport {\n DeleteOutline,\n Download,\n Error as ErrorIcon,\n InsertDriveFile,\n Warning,\n} from '@openedx/paragon/icons';\nimport PropTypes from 'prop-types';\n\nimport LoadingButton from '../../generic/loading-button';\nimport { LoadingSpinner } from '../../generic/Loading';\nimport { getFileSizeToClosestByte } from '../../utils';\nimport { TaxonomyContext } from '../common/context';\nimport { getTaxonomyExportFile } from '../data/api';\nimport { useImportTags, useImportPlan } from '../data/apiHooks';\nimport messages from './messages';\n\nconst linebreak = <>

    ;\n\nconst TaxonomyProp = PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n});\n\nconst ExportStep = ({ taxonomy }) => {\n const intl = useIntl();\n\n return (\n \n \n

    {intl.formatMessage(messages.importWizardStepExportBody, { br: linebreak })}

    \n \n getTaxonomyExportFile(taxonomy.id, 'csv')}\n data-testid=\"export-csv-button\"\n >\n {intl.formatMessage(messages.importWizardStepExportCSVButton)}\n \n getTaxonomyExportFile(taxonomy.id, 'json')}\n data-testid=\"export-json-button\"\n >\n {intl.formatMessage(messages.importWizardStepExportJSONButton)}\n \n \n
    \n
    \n );\n};\n\nExportStep.propTypes = {\n taxonomy: TaxonomyProp.isRequired,\n};\n\nconst UploadStep = ({\n file,\n setFile,\n importPlanError,\n}) => {\n const intl = useIntl();\n\n /** @type {(args: {fileData: FormData}) => void} */\n const handleFileLoad = ({ fileData }) => {\n setFile(fileData.get('file'));\n };\n\n const clearFile = (e) => {\n e.stopPropagation();\n setFile(null);\n };\n\n return (\n \n \n

    {intl.formatMessage(messages.importWizardStepUploadBody, { br: linebreak })}

    \n
    \n {!file ? (\n \n ) : (\n \n \n \n
    {file.name}
    \n
    {getFileSizeToClosestByte(file.size)}
    \n
    \n \n \n )}\n
    \n\n {importPlanError && {importPlanError}}\n
    \n
    \n );\n};\n\nUploadStep.propTypes = {\n file: PropTypes.shape({\n name: PropTypes.string.isRequired,\n size: PropTypes.number.isRequired,\n }),\n setFile: PropTypes.func.isRequired,\n importPlanError: PropTypes.string,\n};\n\nUploadStep.defaultProps = {\n file: null,\n importPlanError: null,\n};\n\nconst PlanStep = ({ importPlan }) => {\n const intl = useIntl();\n\n return (\n \n \n {intl.formatMessage(messages.importWizardStepPlanBody, { br: linebreak, changeCount: importPlan?.length })}\n
      \n {importPlan?.length ? (\n importPlan.map((line) =>
    • {line}
    • )\n ) : (\n
    • {intl.formatMessage(messages.importWizardStepPlanNoChanges)}
    • \n )}\n
    \n
    \n
    \n );\n};\n\nPlanStep.propTypes = {\n importPlan: PropTypes.arrayOf(PropTypes.string),\n};\n\nPlanStep.defaultProps = {\n importPlan: null,\n};\n\nconst ConfirmStep = ({ importPlan }) => {\n const intl = useIntl();\n\n return (\n \n \n {intl.formatMessage(\n messages.importWizardStepConfirmBody,\n { br: linebreak, changeCount: importPlan?.length },\n )}\n \n \n );\n};\n\nConfirmStep.propTypes = {\n importPlan: PropTypes.arrayOf(PropTypes.string),\n};\n\nConfirmStep.defaultProps = {\n importPlan: null,\n};\n\nconst DefaultModalHeader = ({ children }) => (\n \n {children}\n \n);\n\nDefaultModalHeader.propTypes = {\n children: PropTypes.string.isRequired,\n};\n\nconst ImportTagsWizard = ({\n taxonomy,\n isOpen,\n onClose,\n}) => {\n const intl = useIntl();\n const { setToastMessage, setAlertProps } = useContext(TaxonomyContext);\n\n const steps = ['export', 'upload', 'plan', 'confirm'];\n const [currentStep, setCurrentStep] = useState(steps[0]);\n\n const [file, setFile] = useState(/** @type {null|File} */ (null));\n\n const [isDialogDisabled, disableDialog, enableDialog] = useToggle(false);\n\n const importPlanResult = useImportPlan(taxonomy.id, file);\n\n const importPlan = useMemo(() => {\n if (!importPlanResult.data) {\n return null;\n }\n let planArrayTemp = importPlanResult.data.split('\\n');\n planArrayTemp = planArrayTemp.slice(2); // Removes the first two lines\n planArrayTemp = planArrayTemp.slice(0, -1); // Removes the last line\n const planArray = planArrayTemp\n .filter((line) => !(line.includes('No changes'))) // Removes the \"No changes\" lines\n .map((line) => line.split(':')[1].trim()); // Get only the action message\n return /** @type {string[]} */(planArray);\n }, [importPlanResult.data]);\n\n const importTagsMutation = useImportTags();\n\n const generatePlan = React.useCallback(() => {\n setCurrentStep('plan');\n }, []);\n\n const confirmImportTags = async () => {\n disableDialog();\n try {\n if (file) {\n await importTagsMutation.mutateAsync({\n taxonomyId: taxonomy.id,\n file,\n });\n }\n if (setToastMessage) {\n setToastMessage(intl.formatMessage(messages.importTaxonomyToast, { name: taxonomy.name }));\n }\n } catch (/** @type {any} */ error) {\n const alertProps = {\n variant: 'danger',\n icon: ErrorIcon,\n title: intl.formatMessage(messages.importTaxonomyErrorAlert),\n description: error.message,\n };\n\n if (setAlertProps) {\n setAlertProps(alertProps);\n }\n } finally {\n enableDialog();\n onClose();\n }\n };\n\n const stepHeaders = {\n export: (\n \n {intl.formatMessage(messages.importWizardStepExportTitle, { name: taxonomy.name })}\n \n ),\n upload: (\n \n {intl.formatMessage(messages.importWizardStepUploadTitle)}\n \n ),\n plan: (\n \n {intl.formatMessage(messages.importWizardStepPlanTitle)}\n \n ),\n confirm: (\n \n \n \n \n {intl.formatMessage(messages.importWizardStepConfirmTitle, { changeCount: importPlan?.length })}\n \n \n \n ),\n };\n\n return (\n e.stopPropagation() /* This prevents calling onClick handler from the parent */}\n >\n \n {(isDialogDisabled) && (\n // This div is used to prevent the user from interacting with the dialog while the import is happening\n
    \n )}\n\n {stepHeaders[currentStep]}\n\n
    \n\n \n \n \n \n \n \n \n\n
    \n\n \n\n \n \n \n \n\n \n \n \n \n {\n importPlanResult.isLoading ? \n : (\n \n )\n }\n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n
    \n \n \n );\n};\n\nImportTagsWizard.propTypes = {\n taxonomy: TaxonomyProp.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n};\n\nexport default ImportTagsWizard;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headerTitle: {\n id: 'course-authoring.taxonomy-list.header.title',\n defaultMessage: 'Taxonomies',\n },\n downloadTemplateButtonLabel: {\n id: 'course-authoring.taxonomy-list.button.download-template.label',\n defaultMessage: 'Download template',\n },\n downloadTemplateButtonCSVLabel: {\n id: 'course-authoring.taxonomy-list.button.download-template.csv.label',\n defaultMessage: 'CSV template',\n },\n downloadTemplateButtonJSONLabel: {\n id: 'course-authoring.taxonomy-list.button.download-template.json.label',\n defaultMessage: 'JSON template',\n },\n downloadTemplateButtonHint: {\n id: 'course-authoring.taxonomy-list.butotn.download-template.hint',\n defaultMessage: 'Download example taxonomy',\n },\n importButtonLabel: {\n id: 'course-authoring.taxonomy-list.button.import.label',\n defaultMessage: 'Import',\n },\n orgInputSelectDefaultValue: {\n id: 'course-authoring.taxonomy-list.select.org.default',\n defaultMessage: 'All taxonomies',\n },\n orgAllValue: {\n id: 'course-authoring.taxonomy-list.select.org.all',\n defaultMessage: 'All',\n },\n orgUnassignedValue: {\n id: 'course-authoring.taxonomy-list.select.org.unassigned',\n defaultMessage: 'Unassigned',\n },\n usageLoadingMessage: {\n id: 'course-authoring.taxonomy-list.spinner.loading',\n defaultMessage: 'Loading',\n },\n taxonomyDeleteToast: {\n id: 'course-authoring.taxonomy-list.toast.delete',\n defaultMessage: '\"{name}\" deleted',\n },\n taxonomyDismissLabel: {\n id: 'course-authoring.taxonomy-list.alert.dismiss',\n defaultMessage: 'Dismiss',\n },\n importInProgressAlertDescription: {\n id: 'course-authoring.import-tags.prompt.in-progress',\n defaultMessage: 'Please keep this window open. We\\'ll let you know when it\\'s done.',\n description: 'Alert message when the taxonomy import is in progress.',\n },\n});\n\nexport default messages;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n exportModalTitle: {\n id: 'course-authoring.taxonomy-list.modal.export.title',\n defaultMessage: 'Select format to export',\n },\n exportModalBodyDescription: {\n id: 'course-authoring.taxonomy-list.modal.export.body',\n defaultMessage: 'Select the file format in which you would like the taxonomy to be exported:',\n },\n exportModalSubmitButtonLabel: {\n id: 'course-authoring.taxonomy-list.modal.export.submit.label',\n defaultMessage: 'Export',\n },\n taxonomyCSVFormat: {\n id: 'course-authoring.taxonomy-list.csv-format',\n defaultMessage: 'CSV file',\n },\n taxonomyJSONFormat: {\n id: 'course-authoring.taxonomy-list.json-format',\n defaultMessage: 'JSON file',\n },\n taxonomyModalsCancelLabel: {\n id: 'course-authoring.taxonomy-list.modal.cancel',\n defaultMessage: 'Cancel',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport React, { useState } from 'react';\nimport {\n ActionRow,\n Button,\n Container,\n Form,\n ModalDialog,\n} from '@openedx/paragon';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport messages from './messages';\nimport { getTaxonomyExportFile } from '../data/api';\n\nconst ExportModal = ({\n taxonomyId,\n isOpen,\n onClose,\n}) => {\n const intl = useIntl();\n const [outputFormat, setOutputFormat] = useState(/** @type {'csv'|'json'} */('csv'));\n\n const onClickExport = React.useCallback(() => {\n onClose();\n getTaxonomyExportFile(taxonomyId, outputFormat);\n }, [onClose, taxonomyId, outputFormat]);\n\n return (\n e.stopPropagation() /* This prevents calling onClick handler from the parent */}>\n \n \n \n {intl.formatMessage(messages.exportModalTitle)}\n \n \n \n \n \n {intl.formatMessage(messages.exportModalBodyDescription)}\n \n setOutputFormat(e.target.value)}\n >\n \n {intl.formatMessage(messages.taxonomyCSVFormat)}\n \n \n {intl.formatMessage(messages.taxonomyJSONFormat)}\n \n \n \n \n \n \n \n {intl.formatMessage(messages.taxonomyModalsCancelLabel)}\n \n \n {intl.formatMessage(messages.exportModalSubmitButtonLabel)}\n \n \n \n \n \n );\n};\n\nExportModal.propTypes = {\n taxonomyId: PropTypes.number.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n};\n\nexport default ExportModal;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n deleteDialogTitle: {\n id: 'course-authoring.taxonomy-list.dialog.delete.title',\n defaultMessage: 'Delete \"{taxonomyName}\"',\n },\n deleteDialogBody: {\n id: 'course-authoring.taxonomy-list.dialog.delete.body',\n defaultMessage: 'Warning! You are about to delete a taxonomy containing {tagsCount} tags. Assigned organizations will no longer be able to access the taxonomy, and any tags applied to course content will be removed.',\n },\n deleteDialogConfirmLabel: {\n id: 'course-authoring.taxonomy-list.dialog.delete.confirm.label',\n defaultMessage: 'Type {deleteLabel} to confirm',\n },\n deleteDialogConfirmDeleteLabel: {\n id: 'course-authoring.taxonomy-list.dialog.delete.confirmDelete.label',\n defaultMessage: 'DELETE',\n },\n deleteDialogCancelLabel: {\n id: 'course-authoring.taxonomy-list.dialog.delete.cancel.label',\n defaultMessage: 'Cancel',\n },\n deleteDialogDeleteLabel: {\n id: 'course-authoring.taxonomy-list.dialog.delete.delete.label',\n defaultMessage: 'Delete',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport React, { useCallback, useState } from 'react';\nimport {\n ActionRow,\n Button,\n Container,\n Form,\n ModalDialog,\n Icon,\n} from '@openedx/paragon';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Warning } from '@openedx/paragon/icons';\nimport messages from './messages';\n\nconst DeleteDialog = ({\n taxonomyName,\n tagsCount,\n isOpen,\n onClose,\n onDelete,\n}) => {\n const intl = useIntl();\n const [deleteButtonDisabled, setDeleteButtonDisabled] = useState(true);\n const deleteLabel = intl.formatMessage(messages.deleteDialogConfirmDeleteLabel);\n\n const handleInputChange = useCallback((event) => {\n if (event.target.value === deleteLabel) {\n setDeleteButtonDisabled(false);\n } else {\n setDeleteButtonDisabled(true);\n }\n }, []);\n\n const onClickDelete = React.useCallback(() => {\n onClose();\n onDelete();\n }, [onClose, onDelete]);\n\n return (\n e.stopPropagation() /* This prevents calling onClick handler from the parent */}>\n \n \n \n \n {intl.formatMessage(messages.deleteDialogTitle, { taxonomyName })}\n \n \n \n
    \n {intl.formatMessage(messages.deleteDialogBody, { tagsCount })}\n
    \n \n \n {intl.formatMessage(messages.deleteDialogConfirmLabel, {\n deleteLabel: {deleteLabel},\n })}\n \n \n \n
    \n \n \n \n {intl.formatMessage(messages.deleteDialogCancelLabel)}\n \n \n {intl.formatMessage(messages.deleteDialogDeleteLabel)}\n \n \n \n \n
    \n );\n};\n\nDeleteDialog.propTypes = {\n taxonomyName: PropTypes.string.isRequired,\n tagsCount: PropTypes.number.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n};\n\nexport default DeleteDialog;\n","// @ts-check\nimport { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n headerTitle: {\n id: 'course-authoring.taxonomy-manage-orgs.header.title',\n defaultMessage: 'Assign to organizations',\n },\n bodyText: {\n id: 'course-authoring.taxonomy-manage-orgs.body.text',\n defaultMessage: 'Manage which organizations can access the taxonomy by assigning them in the menu below. You can '\n + 'also choose to assign the taxonomy to all organizations.',\n },\n assignOrgs: {\n id: 'course-authoring.taxonomy-manage-orgs.assign-orgs',\n defaultMessage: 'Assign organizations',\n },\n currentAssignments: {\n id: 'course-authoring.taxonomy-manage-orgs.current-assignments',\n defaultMessage: 'Currently assigned:',\n },\n addOrganizations: {\n id: 'course-authoring.taxonomy-manage-orgs.add-orgs',\n defaultMessage: 'Add another organization:',\n },\n searchOrganizations: {\n id: 'course-authoring.taxonomy-manage-orgs.search-orgs',\n defaultMessage: 'Search for an organization',\n },\n noOrganizationAssigned: {\n id: 'course-authoring.taxonomy-manage-orgs.no-orgs',\n defaultMessage: 'No organizations assigned',\n },\n assignAll: {\n id: 'course-authoring.taxonomy-manage-orgs.assign-all',\n defaultMessage: 'Assign to all organizations',\n },\n cancelButton: {\n id: 'course-authoring.taxonomy-manage-orgs.button.cancel',\n defaultMessage: 'Cancel',\n },\n saveButton: {\n id: 'course-authoring.taxonomy-manage-orgs.button.save',\n defaultMessage: 'Save',\n },\n confirmUnassignTitle: {\n id: 'course-authoring.taxonomy-manage-orgs.confirm-dialog.title',\n defaultMessage: 'Unassign taxonomy',\n },\n confirmUnassignText: {\n id: 'course-authoring.taxonomy-manage-orgs.confirm-dialog.text',\n defaultMessage: 'Content authors from unassigned organizations will not be able to tag course content with '\n + '{taxonomyName}. Are you sure you want to continue?',\n },\n continueButton: {\n id: 'course-authoring.taxonomy-manage-orgs.confirm-dialog.button.continue',\n defaultMessage: 'Continue',\n },\n assignOrgsSuccess: {\n id: 'course-authoring.taxonomy-manage-orgs.toast.assign-orgs-success',\n defaultMessage: 'Assigned organizations updated',\n },\n removeOrg: {\n id: 'course-authoring.taxonomy-manage-orgs.remove-org',\n defaultMessage: 'Remove {org}',\n description: 'button to remove a specific organization from a taxonomy',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport React, { useContext, useEffect, useState } from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n useToggle,\n ActionRow,\n AlertModal,\n Button,\n Chip,\n Container,\n Form,\n ModalDialog,\n Stack,\n} from '@openedx/paragon';\nimport {\n Close,\n Warning,\n} from '@openedx/paragon/icons';\nimport PropTypes from 'prop-types';\n\nimport { useOrganizationListData } from '../../generic/data/apiHooks';\nimport { TaxonomyContext } from '../common/context';\nimport { useTaxonomyDetails } from '../data/apiHooks';\nimport { useManageOrgs } from './data/api';\nimport messages from './messages';\nimport './ManageOrgsModal.scss';\n\nconst ConfirmModal = ({\n isOpen,\n onClose,\n confirm,\n taxonomyName,\n}) => {\n const intl = useIntl();\n return (\n \n \n \n \n )}\n >\n

    \n {intl.formatMessage(messages.confirmUnassignText, { taxonomyName })}\n

    \n \n );\n};\n\nConfirmModal.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n confirm: PropTypes.func.isRequired,\n taxonomyName: PropTypes.string.isRequired,\n};\n\nconst ManageOrgsModal = ({\n taxonomyId,\n isOpen,\n onClose,\n}) => {\n const intl = useIntl();\n const { setToastMessage } = useContext(TaxonomyContext);\n\n const [selectedOrgs, setSelectedOrgs] = useState(/** @type {null|string[]} */(null));\n const [allOrgs, setAllOrgs] = useState(/** @type {null|boolean} */(null));\n\n const [isConfirmModalOpen, openConfirmModal, closeConfirmModal] = useToggle(false);\n\n const [isDialogDisabled, disableDialog, enableDialog] = useToggle(false);\n\n const {\n data: organizationListData,\n } = useOrganizationListData();\n\n const { data: taxonomy } = useTaxonomyDetails(taxonomyId);\n\n const manageOrgMutation = useManageOrgs();\n\n const saveOrgs = async () => {\n disableDialog();\n closeConfirmModal();\n if (selectedOrgs !== null && allOrgs !== null) {\n try {\n await manageOrgMutation.mutateAsync({\n taxonomyId,\n orgs: allOrgs ? undefined : selectedOrgs,\n allOrgs,\n });\n if (setToastMessage) {\n setToastMessage(intl.formatMessage(messages.assignOrgsSuccess));\n }\n } catch (error) {\n // ToDo: display the error to the user\n } finally {\n enableDialog();\n onClose();\n }\n }\n };\n\n const confirmSave = async () => {\n if (!selectedOrgs?.length && !allOrgs) {\n openConfirmModal();\n } else {\n await saveOrgs();\n }\n };\n\n useEffect(() => {\n if (taxonomy) {\n if (selectedOrgs === null) {\n setSelectedOrgs([...taxonomy.orgs]);\n }\n if (allOrgs === null) {\n setAllOrgs(taxonomy.allOrgs);\n }\n }\n }, [taxonomy]);\n\n useEffect(() => {\n if (selectedOrgs) {\n // This is a hack to force the Form.Autosuggest to clear its value after a selection is made.\n const inputRef = /** @type {null|HTMLInputElement} */ (document.querySelector('.manage-orgs .pgn__form-group input'));\n if (inputRef) {\n // @ts-ignore value can be null\n inputRef.value = null;\n const event = new Event('change', { bubbles: true });\n inputRef.dispatchEvent(event);\n }\n }\n }, [selectedOrgs]);\n\n if (!selectedOrgs || !taxonomy) {\n return null;\n }\n\n return (\n e.stopPropagation() /* This prevents calling onClick handler from the parent */}>\n \n {isDialogDisabled && (\n // This div is used to prevent the user from interacting with the dialog while it is disabled\n
    \n )}\n\n \n \n {intl.formatMessage(messages.headerTitle)}\n \n \n\n
    \n\n \n \n \n
    {intl.formatMessage(messages.bodyText)}
    \n \n
    {intl.formatMessage(messages.currentAssignments)}
    \n
    \n
    \n {selectedOrgs.length ? selectedOrgs.map((org) => (\n setSelectedOrgs(selOrgs => (selOrgs || []).filter((o) => o !== org))}\n disabled={!!allOrgs}\n >\n {org}\n \n )) : {intl.formatMessage(messages.noOrganizationAssigned)} }\n
    \n
    \n
    \n \n \n {intl.formatMessage(messages.addOrganizations)}\n \n {\n if (selectionValue) {\n setSelectedOrgs([...selectedOrgs, selectionValue]);\n }\n }}\n disabled={allOrgs}\n >\n {organizationListData ? organizationListData.filter(o => !selectedOrgs?.includes(o)).map((org) => (\n {org}\n )) : [] }\n \n \n setAllOrgs(e.target.checked)}>\n {intl.formatMessage(messages.assignAll)}\n \n
    \n\n
    \n\n \n \n \n {intl.formatMessage(messages.cancelButton)}\n \n \n \n \n \n \n \n );\n};\n\nManageOrgsModal.propTypes = {\n taxonomyId: PropTypes.number.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n};\n\nexport default ManageOrgsModal;\n","// @ts-check\nimport { camelCaseObject, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\nimport { useQueryClient, useMutation } from '@tanstack/react-query';\n\nconst getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\n\n/**\n * @param {number} taxonomyId\n * @returns {string}\n */\nexport const getManageOrgsApiUrl = (taxonomyId) => new URL(\n `api/content_tagging/v1/taxonomies/${taxonomyId}/orgs/`,\n getApiBaseUrl(),\n).href;\n\n/**\n * Build the mutation to assign organizations to a taxonomy.\n */\nexport const useManageOrgs = () => {\n const queryClient = useQueryClient();\n return useMutation({\n /**\n * @type {import(\"@tanstack/react-query\").MutateFunction<\n * any,\n * any,\n * {\n * taxonomyId: number,\n * orgs?: string[],\n * allOrgs: boolean,\n * }\n * >}\n */\n mutationFn: async ({ taxonomyId, orgs, allOrgs }) => {\n const { data } = await getAuthenticatedHttpClient().put(\n getManageOrgsApiUrl(taxonomyId),\n {\n all_orgs: allOrgs,\n orgs: allOrgs ? undefined : orgs,\n },\n );\n\n return camelCaseObject(data);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: ['taxonomyList'],\n });\n queryClient.invalidateQueries({\n queryKey: ['taxonomyDetail', variables.taxonomyId],\n });\n },\n });\n};\n","// @ts-check\nimport { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n actionsButtonLabel: {\n id: 'course-authoring.taxonomy-menu.action.button.label',\n defaultMessage: 'Actions',\n },\n actionsButtonAlt: {\n id: 'course-authoring.taxonomy-menu.action.button.alt',\n defaultMessage: '{name} actions',\n },\n importMenu: {\n id: 'course-authoring.taxonomy-menu.import.label',\n defaultMessage: 'Re-import',\n },\n manageOrgsMenu: {\n id: 'course-authoring.taxonomy-menu.assign-orgs.label',\n defaultMessage: 'Manage Organizations',\n },\n exportMenu: {\n id: 'course-authoring.taxonomy-menu.export.label',\n defaultMessage: 'Export',\n },\n deleteMenu: {\n id: 'course-authoring.taxonomy-menu.delete.label',\n defaultMessage: 'Delete',\n },\n taxonomyDeleteToast: {\n id: 'course-authoring.taxonomy-list.toast.delete',\n defaultMessage: '\"{name}\" deleted',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport React, { useCallback, useContext } from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n useToggle,\n Button,\n Dropdown,\n Icon,\n IconButton,\n} from '@openedx/paragon';\nimport { MoreVert } from '@openedx/paragon/icons';\nimport { pickBy } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { useNavigate } from 'react-router-dom';\n\nimport ExportModal from '../export-modal';\nimport { useDeleteTaxonomy } from '../data/apiHooks';\nimport { TaxonomyContext } from '../common/context';\nimport DeleteDialog from '../delete-dialog';\nimport { ImportTagsWizard } from '../import-tags';\nimport { ManageOrgsModal } from '../manage-orgs';\nimport messages from './messages';\n\n/** @typedef {import('../data/types.mjs').TaxonomyData} TaxonomyData */\n// Note: to make mocking easier for tests, the types below only specify the subset of TaxonomyData that we actually use.\n\n/**\n * A menu that provides actions for editing a specific taxonomy.\n * @type {React.FC<{\n * taxonomy: Pick,\n * iconMenu?: boolean\n * }>}\n */\nconst TaxonomyMenu = ({\n taxonomy, iconMenu,\n}) => {\n const intl = useIntl();\n const navigate = useNavigate();\n\n const deleteTaxonomy = useDeleteTaxonomy();\n const { setToastMessage } = useContext(TaxonomyContext);\n\n const onDeleteTaxonomy = useCallback(() => {\n deleteTaxonomy({ pk: taxonomy.id }, {\n onSuccess: () => {\n if (setToastMessage) {\n setToastMessage(intl.formatMessage(messages.taxonomyDeleteToast, { name: taxonomy.name }));\n }\n navigate('/taxonomies');\n },\n onError: () => {\n // TODO: display the error to the user\n },\n });\n }, [setToastMessage, taxonomy]);\n\n const [isDeleteDialogOpen, deleteDialogOpen, deleteDialogClose] = useToggle(false);\n const [isExportModalOpen, exportModalOpen, exportModalClose] = useToggle(false);\n const [isImportModalOpen, importModalOpen, importModalClose] = useToggle(false);\n const [isManageOrgsModalOpen, manageOrgsModalOpen, manageOrgsModalClose] = useToggle(false);\n\n /**\n * @typedef {Object} MenuItem\n * @property {string} title - The title of the menu item\n * @property {() => void} action - The action to perform when the menu item is clicked\n * @property {boolean} [show] - Whether or not to show the menu item\n *\n * @constant\n * @type {Record}\n */\n let menuItems = {\n import: {\n title: intl.formatMessage(messages.importMenu),\n action: importModalOpen,\n show: taxonomy.canChangeTaxonomy && !taxonomy.systemDefined,\n },\n export: {\n title: intl.formatMessage(messages.exportMenu),\n action: exportModalOpen,\n show: true, // if we can view the taxonomy, we can export it\n },\n delete: {\n title: intl.formatMessage(messages.deleteMenu),\n action: deleteDialogOpen,\n show: taxonomy.canDeleteTaxonomy && !taxonomy.systemDefined,\n },\n manageOrgs: {\n title: intl.formatMessage(messages.manageOrgsMenu),\n action: manageOrgsModalOpen,\n show: taxonomy.canChangeTaxonomy,\n },\n };\n\n // Remove hidden menu items\n menuItems = pickBy(menuItems, (value) => value.show);\n\n const renderModals = () => (\n <>\n {isDeleteDialogOpen && (\n \n )}\n {isExportModalOpen && (\n \n )}\n {isImportModalOpen && (\n \n )}\n {isManageOrgsModalOpen && (\n \n )}\n \n );\n\n const toggleProps = iconMenu ? {\n as: IconButton,\n src: MoreVert,\n iconAs: Icon,\n } : {\n as: Button,\n };\n\n return (\n ev.preventDefault()}>\n \n {intl.formatMessage(messages.actionsButtonLabel)}\n \n \n {Object.keys(menuItems).map((key) => (\n cannot appear as a descendant of warning\n onClick={\n (e) => {\n e.preventDefault();\n menuItems[key].action();\n }\n }\n >\n {menuItems[key].title}\n \n ))}\n \n {renderModals()}\n \n );\n};\n\nTaxonomyMenu.propTypes = {\n taxonomy: PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n tagsCount: PropTypes.number.isRequired,\n systemDefined: PropTypes.bool.isRequired,\n canChangeTaxonomy: PropTypes.bool.isRequired,\n canDeleteTaxonomy: PropTypes.bool.isRequired,\n }).isRequired,\n iconMenu: PropTypes.bool,\n};\n\nTaxonomyMenu.defaultProps = {\n iconMenu: false,\n};\n\nexport default TaxonomyMenu;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n assignedToOrgsLabel: {\n id: 'course-authoring.taxonomy-list.orgs-count.label',\n defaultMessage: 'Assigned to {orgsCount} orgs',\n },\n});\n\nexport default messages;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n systemTaxonomyPopoverTitle: {\n id: 'course-authoring.taxonomy-list.popover.system-defined.title',\n defaultMessage: 'System taxonomy',\n },\n systemTaxonomyPopoverBody: {\n id: 'course-authoring.taxonomy-list.popover.system-defined.body',\n defaultMessage: 'This is a system-level taxonomy and is enabled by default.',\n },\n systemDefinedBadge: {\n id: 'course-authoring.taxonomy-list.badge.system-defined.label',\n defaultMessage: 'System-level',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Badge,\n OverlayTrigger,\n Popover,\n} from '@openedx/paragon';\nimport messages from './messages';\n\nconst SystemDefinedBadge = ({ taxonomyId }) => {\n const intl = useIntl();\n const getToolTip = () => (\n \n \n {intl.formatMessage(messages.systemTaxonomyPopoverTitle)}\n \n \n {intl.formatMessage(messages.systemTaxonomyPopoverBody)}\n \n \n );\n\n return (\n \n \n {intl.formatMessage(messages.systemDefinedBadge)}\n \n \n );\n};\n\nSystemDefinedBadge.propTypes = {\n taxonomyId: PropTypes.number.isRequired,\n};\n\nexport default SystemDefinedBadge;\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n Card,\n OverlayTrigger,\n Popover,\n} from '@openedx/paragon';\nimport PropTypes from 'prop-types';\nimport { NavLink } from 'react-router-dom';\nimport classNames from 'classnames';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { TaxonomyMenu } from '../taxonomy-menu';\nimport messages from './messages';\nimport SystemDefinedBadge from '../system-defined-badge';\n\nconst orgsCountEnabled = (orgsCount) => orgsCount !== undefined && orgsCount !== 0;\n\nconst HeaderSubtitle = ({\n id, showSystemBadge, orgsCount,\n}) => {\n const intl = useIntl();\n\n // Show system defined badge\n if (showSystemBadge) {\n return ;\n }\n\n // Or show orgs count\n if (orgsCountEnabled(orgsCount)) {\n return (\n
    \n {intl.formatMessage(messages.assignedToOrgsLabel, { orgsCount })}\n
    \n );\n }\n\n // Or none\n return null;\n};\n\nHeaderSubtitle.defaultProps = {\n orgsCount: undefined,\n};\n\nHeaderSubtitle.propTypes = {\n id: PropTypes.number.isRequired,\n showSystemBadge: PropTypes.bool.isRequired,\n orgsCount: PropTypes.number,\n};\n\nconst HeaderTitle = ({ taxonomyId, title }) => {\n const containerRef = useRef(null);\n const textRef = useRef(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useEffect(() => {\n const containerWidth = containerRef.current.clientWidth;\n const textWidth = textRef.current.offsetWidth;\n setIsTruncated(textWidth > containerWidth);\n }, [title]);\n\n const getToolTip = () => (\n \n \n {title}\n \n \n );\n\n return (\n \n
    \n {title}\n
    \n \n );\n};\n\nHeaderTitle.propTypes = {\n taxonomyId: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n};\n\nconst TaxonomyCard = ({ className, original }) => {\n const {\n id, name, description, systemDefined, orgsCount,\n } = original;\n\n const intl = useIntl();\n\n const getHeaderActions = () => (\n \n );\n\n return (\n \n }\n subtitle={(\n \n )}\n actions={getHeaderActions()}\n />\n \n \n {description}\n \n \n \n );\n};\n\nTaxonomyCard.defaultProps = {\n className: '',\n};\n\nTaxonomyCard.propTypes = {\n className: PropTypes.string,\n original: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n description: PropTypes.string,\n systemDefined: PropTypes.bool,\n orgsCount: PropTypes.number,\n tagsCount: PropTypes.number,\n canChangeTaxonomy: PropTypes.bool,\n canDeleteTaxonomy: PropTypes.bool,\n }).isRequired,\n};\n\nexport default TaxonomyCard;\n","// @ts-check\nimport React, { useCallback, useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Button,\n CardView,\n Container,\n DataTable,\n Dropdown,\n OverlayTrigger,\n Spinner,\n Tooltip,\n SelectMenu,\n MenuItem,\n} from '@openedx/paragon';\nimport {\n Add,\n Check,\n} from '@openedx/paragon/icons';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport { Helmet } from 'react-helmet';\n\nimport { useOrganizationListData } from '../generic/data/apiHooks';\nimport SubHeader from '../generic/sub-header/SubHeader';\nimport getPageHeadTitle from '../generic/utils';\nimport { ALL_TAXONOMIES, apiUrls, UNASSIGNED } from './data/api';\nimport { useImportNewTaxonomy, useTaxonomyList } from './data/apiHooks';\nimport { importTaxonomy } from './import-tags';\nimport messages from './messages';\nimport TaxonomyCard from './taxonomy-card';\nimport { TaxonomyContext } from './common/context';\n\nconst TaxonomyListHeaderButtons = ({ canAddTaxonomy }) => {\n const intl = useIntl();\n const importMutation = useImportNewTaxonomy();\n const { setToastMessage } = useContext(TaxonomyContext);\n\n const showImportInProgressAlert = useCallback(() => {\n /* istanbul ignore next */\n if (setToastMessage) {\n setToastMessage(intl.formatMessage(messages.importInProgressAlertDescription));\n }\n }, [setToastMessage]);\n\n const closeImportInProgressAlert = useCallback(() => {\n /* istanbul ignore next */\n if (setToastMessage) {\n setToastMessage(null);\n }\n }, [setToastMessage]);\n\n return (\n <>\n \n {intl.formatMessage(messages.downloadTemplateButtonHint)}\n \n )}\n >\n \n \n {intl.formatMessage(messages.downloadTemplateButtonLabel)}\n \n \n \n {intl.formatMessage(messages.downloadTemplateButtonCSVLabel)}\n \n \n {intl.formatMessage(messages.downloadTemplateButtonJSONLabel)}\n \n \n \n \n importTaxonomy(\n intl,\n importMutation,\n showImportInProgressAlert,\n closeImportInProgressAlert,\n )}\n data-testid=\"taxonomy-import-button\"\n disabled={!canAddTaxonomy}\n >\n {intl.formatMessage(messages.importButtonLabel)}\n \n \n );\n};\n\nconst OrganizationFilterSelector = ({\n isOrganizationListLoaded,\n organizationListData,\n selectedOrgFilter,\n setSelectedOrgFilter,\n}) => {\n const intl = useIntl();\n const isOrgSelected = (value) => (value === selectedOrgFilter ? : null);\n const selectOptions = [\n isOrgSelected(ALL_TAXONOMIES)}\n onClick={() => setSelectedOrgFilter(ALL_TAXONOMIES)}\n >\n { isOrgSelected(ALL_TAXONOMIES)\n ? intl.formatMessage(messages.orgInputSelectDefaultValue)\n : intl.formatMessage(messages.orgAllValue)}\n ,\n isOrgSelected(UNASSIGNED)}\n onClick={() => setSelectedOrgFilter(UNASSIGNED)}\n >\n { intl.formatMessage(messages.orgUnassignedValue) }\n ,\n ];\n\n if (isOrganizationListLoaded && organizationListData) {\n organizationListData.forEach(org => (\n selectOptions.push(\n isOrgSelected(org)}\n onClick={() => setSelectedOrgFilter(org)}\n >\n {org}\n ,\n )\n ));\n }\n\n return (\n \n { isOrganizationListLoaded\n ? selectOptions\n : (\n \n )}\n \n );\n};\n\nconst TaxonomyListPage = () => {\n const intl = useIntl();\n const [selectedOrgFilter, setSelectedOrgFilter] = useState(ALL_TAXONOMIES);\n\n const {\n data: organizationListData,\n isSuccess: isOrganizationListLoaded,\n } = useOrganizationListData();\n\n const {\n data: taxonomyListData,\n isSuccess: isLoaded,\n } = useTaxonomyList(selectedOrgFilter);\n const canAddTaxonomy = taxonomyListData?.canAddTaxonomy ?? false;\n\n const getOrgSelect = () => (\n // Initialize organization select component\n \n );\n\n return (\n <>\n \n {getPageHeadTitle('', intl.formatMessage(messages.headerTitle))}\n \n
    \n \n }\n hideBorder\n />\n \n
    \n
    \n \n {isLoaded && taxonomyListData && (\n \n TaxonomyCard(row)}\n />\n \n )}\n {!isLoaded && (\n \n \n \n )}\n \n
    \n \n );\n};\n\nTaxonomyListHeaderButtons.propTypes = {\n canAddTaxonomy: PropTypes.bool.isRequired,\n};\n\nOrganizationFilterSelector.propTypes = {\n isOrganizationListLoaded: PropTypes.bool.isRequired,\n organizationListData: PropTypes.arrayOf(PropTypes.string),\n selectedOrgFilter: PropTypes.string.isRequired,\n setSelectedOrgFilter: PropTypes.func.isRequired,\n};\n\nOrganizationFilterSelector.defaultProps = {\n organizationListData: null,\n};\n\nTaxonomyListPage.propTypes = {};\n\nexport default TaxonomyListPage;\n","// @ts-check\nimport messages from './messages';\n\n/*\n * This function get a file from the user. It does this by creating a\n * file input element, and then clicking it. This allows us to get a file\n * from the user without using a form. The file input element is created\n * and appended to the DOM, then clicked. When the user selects a file,\n * the change event is fired, and the file is resolved.\n * The file input element is then removed from the DOM.\n*/\n/* istanbul ignore next */\nconst selectFile = async () => new Promise((resolve) => {\n const fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.accept = '.json,.csv';\n fileInput.style.display = 'none';\n fileInput.addEventListener('change', (/** @type { Event & { target: HTMLInputElement} } */ event) => {\n const file = event.target.files?.[0];\n if (!file) {\n resolve(null);\n }\n resolve(file);\n document.body.removeChild(fileInput);\n }, false);\n\n fileInput.addEventListener('cancel', () => {\n resolve(null);\n document.body.removeChild(fileInput);\n }, false);\n\n document.body.appendChild(fileInput);\n\n // Calling click() directly was not working as expected, so we use setTimeout\n // to ensure the file input is added to the DOM before clicking it.\n setTimeout(() => fileInput.click(), 0);\n});\n\n/* istanbul ignore next */\n/**\n * @param {*} intl The react-intl object returned by the useIntl() hook\n * @param {ReturnType} importMutation The import mutation\n * returned by the useImportNewTaxonomy() hook.\n * @param {() => void} showImportInProgressAlert Function to show `In progress` alert.\n * @param {() => void} closeImportInProgressAlert Function to close `In progress` alert.\n */\nexport const importTaxonomy = async ( // eslint-disable-line import/prefer-default-export\n intl,\n importMutation,\n showImportInProgressAlert,\n closeImportInProgressAlert,\n) => {\n /*\n * This function is a temporary \"Barebones\" implementation of the import\n * functionality with `prompt` and `alert`. It is intended to be replaced\n * with a component that shows a `ModalDialog` in the future.\n * See: https://github.com/openedx/modular-learning/issues/116\n */\n /* eslint-disable no-alert */\n /* eslint-disable no-console */\n\n const getTaxonomyName = () => {\n let taxonomyName = null;\n while (!taxonomyName) {\n taxonomyName = prompt(intl.formatMessage(messages.promptTaxonomyName));\n\n if (taxonomyName == null) {\n break;\n }\n\n if (!taxonomyName) {\n alert(intl.formatMessage(messages.promptTaxonomyNameRequired));\n }\n }\n return taxonomyName;\n };\n\n const getTaxonomyDescription = () => prompt(intl.formatMessage(messages.promptTaxonomyDescription));\n\n const file = await selectFile();\n\n if (!file) {\n return;\n }\n\n const name = getTaxonomyName();\n if (name == null) {\n return;\n }\n\n const description = getTaxonomyDescription();\n if (description == null) {\n return;\n }\n\n showImportInProgressAlert();\n\n importMutation.mutateAsync({\n name,\n description,\n file,\n }).then(() => {\n closeImportInProgressAlert();\n alert(intl.formatMessage(messages.importTaxonomySuccess));\n }).catch((error) => {\n closeImportInProgressAlert();\n alert(intl.formatMessage(messages.importTaxonomyError));\n console.error(error.response);\n });\n};\n","// @ts-check\nimport React, { useMemo, useState } from 'react';\nimport { StudioFooter } from '@edx/frontend-component-footer';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Outlet, ScrollRestoration } from 'react-router-dom';\nimport { Toast } from '@openedx/paragon';\n\nimport AlertMessage from '../generic/alert-message';\nimport Header from '../header';\nimport { TaxonomyContext } from './common/context';\nimport messages from './messages';\n\nconst TaxonomyLayout = () => {\n const intl = useIntl();\n // Use `setToastMessage` to show the toast.\n const [toastMessage, setToastMessage] = useState(/** @type{null|string} */ (null));\n // Use `setToastMessage` to show the alert.\n const [alertProps, setAlertProps] = useState(/** @type {null|import('./common/context').AlertProps} */ (null));\n\n const context = useMemo(() => ({\n toastMessage, setToastMessage, alertProps, setAlertProps,\n }), []);\n\n return (\n \n
    \n
    \n { alertProps && (\n setAlertProps(null)}\n {...alertProps}\n />\n )}\n \n \n {toastMessage && (\n setToastMessage(null)}\n data-testid=\"taxonomy-toast\"\n >\n {toastMessage}\n \n )}\n
    \n \n
    \n );\n};\n\nexport default TaxonomyLayout;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n noResultsFoundMessage: {\n id: 'course-authoring.tag-list.no-results-found.message',\n defaultMessage: 'No results found',\n },\n tagListColumnValueHeader: {\n id: 'course-authoring.tag-list.column.value.header',\n defaultMessage: 'Tag name',\n },\n tagListError: {\n id: 'course-authoring.tag-list.error',\n defaultMessage: 'Error: unable to load child tags',\n },\n});\n\nexport default messages;\n","// @ts-check\nimport React, { useState } from 'react';\nimport { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n';\nimport { DataTable } from '@openedx/paragon';\nimport { isEqual } from 'lodash';\nimport Proptypes from 'prop-types';\n\nimport { LoadingSpinner } from '../../generic/Loading';\nimport messages from './messages';\nimport { useTagListData, useSubTags } from './data/apiHooks';\n\nconst SubTagsExpanded = ({ taxonomyId, parentTagValue }) => {\n const subTagsData = useSubTags(taxonomyId, parentTagValue);\n\n if (subTagsData.isLoading) {\n return ;\n }\n if (subTagsData.isError) {\n return ;\n }\n\n return (\n
      \n {subTagsData.data.results.map(tagData => (\n
    • \n {tagData.value} {tagData.descendantCount > 0 ? `(${tagData.descendantCount})` : null}\n
    • \n ))}\n
    \n );\n};\n\nSubTagsExpanded.propTypes = {\n taxonomyId: Proptypes.number.isRequired,\n parentTagValue: Proptypes.string.isRequired,\n};\n\n/**\n * An \"Expand\" toggle to show/hide subtags, but one which is hidden if the given tag row has no subtags.\n */\nconst OptionalExpandLink = ({ row }) => (\n row.original.childCount > 0 ?
    : null\n);\nOptionalExpandLink.propTypes = DataTable.ExpandRow.propTypes;\n\n/**\n * Custom DataTable cell to join tag value with child count\n */\nconst TagValue = ({ row }) => (\n <>\n {row.original.value}\n {` (${row.original.descendantCount})`}\n \n);\nTagValue.propTypes = {\n row: Proptypes.shape({\n original: Proptypes.shape({\n value: Proptypes.string.isRequired,\n childCount: Proptypes.number.isRequired,\n descendantCount: Proptypes.number.isRequired,\n }).isRequired,\n }).isRequired,\n};\n\nconst TagListTable = ({ taxonomyId }) => {\n const intl = useIntl();\n const [options, setOptions] = useState({\n pageIndex: 0,\n pageSize: 100,\n });\n const { isLoading, data: tagList } = useTagListData(taxonomyId, options);\n\n const fetchData = (args) => {\n if (!isEqual(args, options)) {\n setOptions({ ...args });\n }\n };\n\n return (\n
    \n (\n \n )}\n columns={[\n {\n Header: intl.formatMessage(messages.tagListColumnValueHeader),\n Cell: TagValue,\n },\n {\n id: 'expander',\n Header: DataTable.ExpandAll,\n Cell: OptionalExpandLink,\n },\n ]}\n >\n \n \n {tagList?.numPages !== undefined && tagList?.numPages > 1\n && }\n \n
    \n );\n};\n\nTagListTable.propTypes = {\n taxonomyId: Proptypes.number.isRequired,\n};\n\nexport default TagListTable;\n","// @ts-check\n\n// TODO: this file needs to be merged into src/taxonomy/data/apiHooks.js\n\nimport { useQuery } from '@tanstack/react-query';\nimport { camelCaseObject } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\nimport { apiUrls } from '../../data/api';\nimport { taxonomyQueryKeys } from '../../data/apiHooks';\n\n/**\n * @param {number} taxonomyId\n * @param {import('./types.mjs').QueryOptions} options\n * @returns {import('@tanstack/react-query').UseQueryResult}\n */\nexport const useTagListData = (taxonomyId, options) => {\n const { pageIndex, pageSize } = options;\n return useQuery({\n queryKey: taxonomyQueryKeys.taxonomyTagListPage(taxonomyId, pageIndex, pageSize),\n queryFn: async () => {\n const { data } = await getAuthenticatedHttpClient().get(apiUrls.tagList(taxonomyId, pageIndex, pageSize));\n return camelCaseObject(data);\n },\n });\n};\n\n/**\n * Temporary hook to load *all* the subtags of a given tag in a taxonomy.\n * Doesn't handle pagination or anything. This is meant to be replaced by\n * something more sophisticated later, as we improve the \"taxonomy details\" page.\n * @param {number} taxonomyId\n * @param {string} parentTagValue\n * @returns {import('@tanstack/react-query').UseQueryResult}\n */\nexport const useSubTags = (taxonomyId, parentTagValue) => useQuery({\n queryKey: taxonomyQueryKeys.taxonomyTagSubtagsList(taxonomyId, parentTagValue),\n queryFn: async () => {\n const response = await getAuthenticatedHttpClient().get(apiUrls.allSubtagsOf(taxonomyId, parentTagValue));\n return camelCaseObject(response.data);\n },\n});\n","// ts-check\nimport { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n taxonomyDetailsHeader: {\n id: 'course-authoring.taxonomy-detail.side-card.header',\n defaultMessage: 'Taxonomy details',\n },\n taxonomyDetailsName: {\n id: 'course-authoring.taxonomy-detail.side-card.name',\n defaultMessage: 'Title',\n },\n taxonomyDetailsDescription: {\n id: 'course-authoring.taxonomy-detail.side-card.description',\n defaultMessage: 'Description',\n },\n taxonomyDetailsExportID: {\n id: 'course-authoring.taxonomy-detail.side-card.exportID',\n defaultMessage: 'Export ID',\n },\n});\n\nexport default messages;\n","import { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Card,\n} from '@openedx/paragon';\nimport PropTypes from 'prop-types';\n\nimport messages from './messages';\n\nconst TaxonomyDetailSideCard = ({ taxonomy }) => {\n const intl = useIntl();\n return (\n \n \n \n {taxonomy.name}\n \n \n \n {taxonomy.description}\n \n \n {taxonomy.exportId}\n \n \n );\n};\n\nTaxonomyDetailSideCard.propTypes = {\n taxonomy: PropTypes.shape({\n name: PropTypes.string.isRequired,\n exportId: PropTypes.string.isRequired,\n description: PropTypes.string.isRequired,\n }).isRequired,\n};\n\nexport default TaxonomyDetailSideCard;\n","// @ts-check\nimport React from 'react';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Breadcrumb,\n Container,\n Layout,\n} from '@openedx/paragon';\nimport { Helmet } from 'react-helmet';\nimport { Link, useParams } from 'react-router-dom';\n\nimport ConnectionErrorAlert from '../../generic/ConnectionErrorAlert';\nimport Loading from '../../generic/Loading';\nimport getPageHeadTitle from '../../generic/utils';\nimport SubHeader from '../../generic/sub-header/SubHeader';\nimport taxonomyMessages from '../messages';\nimport { TagListTable } from '../tag-list';\nimport { TaxonomyMenu } from '../taxonomy-menu';\nimport TaxonomyDetailSideCard from './TaxonomyDetailSideCard';\nimport { useTaxonomyDetails } from '../data/apiHooks';\nimport SystemDefinedBadge from '../system-defined-badge';\n\nconst TaxonomyDetailPage = () => {\n const intl = useIntl();\n const { taxonomyId: taxonomyIdString } = useParams();\n const taxonomyId = Number(taxonomyIdString);\n\n const {\n data: taxonomy,\n isError,\n isFetched,\n } = useTaxonomyDetails(taxonomyId);\n\n if (!isFetched) {\n return (\n \n );\n }\n\n if (isError || !taxonomy) {\n return (\n \n );\n }\n\n const getHeaderActions = () => (\n \n );\n\n const getSystemDefinedBadge = () => {\n if (taxonomy.systemDefined) {\n return ;\n }\n return null;\n };\n\n return (\n <>\n \n {getPageHeadTitle(intl.formatMessage(taxonomyMessages.headerTitle), taxonomy.name)}\n \n
    \n \n \n \n \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n
    \n \n );\n};\n\nexport default TaxonomyDetailPage;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n pageTitle: {\n id: 'course-authoring.import.page.title',\n defaultMessage: 'Studio Accessibility Policy| {siteName}',\n },\n});\n\nexport default messages;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n a11yBodyPolicyLink: {\n id: 'a11yBodyPolicyLink',\n defaultMessage: 'Website Accessibility Policy',\n description: 'Title for link to full accessibility policy.',\n },\n a11yBodyPageHeader: {\n id: 'a11yBodyPageHeader',\n defaultMessage: 'Individualized Accessibility Process for Course Creators',\n description: 'Heading for studio\\'s accessibility policy page.',\n },\n a11yBodyIntroGraph: {\n id: 'a11yBodyIntroGraph',\n defaultMessage: `At edX, we seek to understand and respect the unique needs and perspectives of the edX global community.\n We value every course team and are committed to expanding access to all, including course team creators and authors with\n disabilities. To that end, we have adopted a {communityAccessibilityLink} and this process to allow course team creators\n and authors to request assistance if they are unable to develop and post content on our platform via Studio because of their\n disabilities.`,\n description: 'Introductory paragraph outlining why we care about accessibility, and what we\\'re doing about it.',\n },\n a11yBodyStepsHeader: {\n id: 'a11yBodyStepsHeader',\n defaultMessage: 'Course team creators and authors needing such assistance should take the following steps:',\n description: 'Heading for list of steps authors can take for accessibility requests.',\n },\n a11yBodyEdxResponse: {\n id: 'a11yBodyEdxResponse',\n defaultMessage: `'We will communicate with you about your preferences and needs in determining the appropriate solution, although\n the ultimate decision will be ours, provided that the solution is effective and timely. The factors we will consider in choosing\n an accessibility solution are: effectiveness; timeliness (relative to your deadlines); ease of implementation; and ease of use for\n you. We will notify you of the decision and explain the basis for our decision within 10 business days of discussing with you.`,\n description: 'Paragraph outlining how we will select an accessibility solution.',\n },\n a11yBodyEdxFollowUp: {\n id: 'a11yBodyEdxFollowUp',\n defaultMessage: `Thereafter, we will communicate with you on a weekly basis regarding our evaluation, decision, and progress in\n implementing the accessibility solution. We will notify you when implementation of your accessibility solution is complete and\n will follow-up with you as may be necessary to see if the solution was effective.`,\n description: 'Paragraph outlining how we will follow-up with you during and after implementing an accessibility solution.',\n },\n a11yBodyOngoingSupport: {\n id: 'a11yBodyOngoingSupport',\n defaultMessage: 'EdX will provide ongoing technical support as needed and will address any additional issues that arise after the initial course creation.',\n description: 'A statement of ongoing support.',\n },\n a11yBodyA11yFeedback: {\n id: 'a11yBodyA11yFeedback',\n defaultMessage: 'Please direct any questions or suggestions on how to improve the accessibility of Studio to {emailElement} or use the form below. We welcome your feedback.',\n description: 'Contact information heading for those with accessibility issues or suggestions.',\n },\n a11yBodyEmailHeading: {\n id: 'a11yBodyEmailHeading',\n defaultMessage: 'Send an email to {emailElement} with the following information:',\n description: 'Heading for list of information required when you email us.',\n },\n a11yBodyNameEmail: {\n id: 'a11yBodyNameEmail',\n defaultMessage: 'your name and email address;',\n description: 'Your contact information.',\n },\n a11yBodyInstitution: {\n id: 'a11yBodyInstitution',\n defaultMessage: 'the edX member institution that you are affiliated with;',\n description: 'edX affiliate information.',\n },\n a11yBodyBarrier: {\n id: 'a11yBodyBarrier',\n defaultMessage: 'a brief description of the challenge or barrier to access that you are experiencing; and',\n description: 'Accessibility problem information.',\n },\n a11yBodyTimeConstraints: {\n id: 'a11yBodyTimeConstraints',\n defaultMessage: 'how soon you need access and for how long (e.g., a planned course start date or in connection with a course-related deadline such as a final essay).',\n description: 'Time contstraint information.',\n },\n a11yBodyReceipt: {\n id: 'a11yBodyReceipt',\n defaultMessage: 'The edX Support Team will respond to confirm receipt and forward your request to the edX Partner Manager for your institution and the edX Website Accessibility Specialist.',\n description: 'Paragraph outlining what steps edX will take immediately.',\n },\n a11yBodyExtraInfo: {\n id: 'a11yBodyExtraInfo',\n defaultMessage: `With guidance from the Website Accessibility Specialist, edX will contact you to discuss your request and gather\n additional information from you about your preferences and needs, to determine if there's a workable solution that edX is able to support.`,\n description: 'Paragraph outlining how and when edX will reach out to you.',\n },\n a11yBodyFixesListHeader: {\n id: 'a11yBodyFixesListHeader',\n defaultMessage: 'EdX will assist you promptly and thoroughly so that you are able to create content on the CMS within your time constraints. Such efforts may include, but are not limited to:',\n description: 'Heading for list of ways we might be able to assist.',\n },\n a11yBodyThirdParty: {\n id: 'a11yBodyThirdParty',\n defaultMessage: 'Purchasing a third-party tool or software for use on an individual basis to assist your use of Studio;',\n description: 'Buy third-party software.',\n },\n a11yBodyContractor: {\n id: 'a11yBodyContractor',\n defaultMessage: 'Engaging a trained independent contractor to provide real-time visual, verbal and physical assistance; or',\n description: 'Hire a contractor.',\n },\n a11yBodyCodeFix: {\n id: 'a11yBodyCodeFix',\n defaultMessage: 'Developing new code to implement a technical fix.',\n description: 'Make a technical fix.',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, FormattedMessage } from '@edx/frontend-platform/i18n';\nimport { Hyperlink, MailtoLink, Stack } from '@openedx/paragon';\n\nimport messages from './messages';\n\nconst AccessibilityBody = ({\n communityAccessibilityLink,\n email,\n}) => (\n
    \n
    \n

    \n \n

    \n
    \n \n
    \n \n Website Accessibility Policy\n \n ),\n }}\n />\n
    \n
    \n \n
    \n
      \n
    1. \n \n {email}\n \n ),\n }}\n />\n
        \n
      • \n \n
      • \n
      • \n \n
      • \n
      • \n \n
      • \n
      • \n \n
      • \n
      \n
    2. \n
    3. \n \n
    4. \n
    5. \n \n
    6. \n
    \n
    \n \n {email}\n \n ),\n }}\n />\n
    \n
    \n
    \n);\n\nAccessibilityBody.propTypes = {\n communityAccessibilityLink: PropTypes.string.isRequired,\n email: PropTypes.string.isRequired,\n};\n\nexport default injectIntl(AccessibilityBody);\n","import AccessibilityBody from './AccessibilityBody';\n\nexport default AccessibilityBody;\n","import { ensureConfig, getConfig } from '@edx/frontend-platform';\nimport { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';\n\nensureConfig([\n 'STUDIO_BASE_URL',\n], 'Course Apps API service');\n\nexport const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;\nexport const getZendeskrUrl = () => `${getApiBaseUrl()}/zendesk_proxy/v0`;\n\n/**\n * Posts the form data to zendesk endpoint\n * @param {string} courseId\n * @returns {Promise<[{}]>}\n */\nexport async function postAccessibilityForm({ name, email, message }) {\n const data = {\n name,\n tags: ['studio_a11y'],\n email: {\n from: email,\n subject: 'Studio Accessibility Request',\n message,\n },\n };\n\n await getAuthenticatedHttpClient().post(getZendeskrUrl(), data);\n}\n","import { RequestStatus } from '../../data/constants';\nimport { postAccessibilityForm } from './api';\nimport { updateSavingStatus } from './slice';\n\nfunction submitAccessibilityForm({ email, name, message }) {\n return async (dispatch) => {\n dispatch(updateSavingStatus({ status: RequestStatus.IN_PROGRESS }));\n\n try {\n await postAccessibilityForm({ email, name, message });\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n } catch (error) {\n if (error.response && error.response.status === 429) {\n dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));\n } else {\n dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));\n }\n }\n };\n}\n\nexport default submitAccessibilityForm;\n","import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n accessibilityPolicyFormEmailLabel: {\n id: 'accessibilityPolicyFormEmailLabel',\n defaultMessage: 'Email Address',\n description: 'Label for the email form field',\n },\n accessibilityPolicyFormErrorHighVolume: {\n id: 'accessibilityPolicyFormErrorHighVolume',\n defaultMessage: 'We are currently experiencing high volume. Try again later today or send an email message to {emailLink}.',\n description: 'Error message when site is experiencing high volume that will include an email link',\n },\n accessibilityPolicyFormErrorMissingFields: {\n id: 'accessibilityPolicyFormErrorMissingFields',\n defaultMessage: 'Make sure to fill in all fields.',\n description: 'Error message to instruct user to fill in all fields',\n },\n accessibilityPolicyFormHeader: {\n id: 'accessibilityPolicyFormHeader',\n defaultMessage: 'Studio Accessibility Feedback',\n description: 'The heading for the form',\n },\n accessibilityPolicyFormMessageLabel: {\n id: 'accessibilityPolicyFormMessageLabel',\n defaultMessage: 'Message',\n description: 'Label for the message form field',\n },\n accessibilityPolicyFormNameLabel: {\n id: 'accessibilityPolicyFormNameLabel',\n defaultMessage: 'Name',\n description: 'Label for the name form field',\n },\n accessibilityPolicyFormSubmitAria: {\n id: 'accessibilityPolicyFormSubmitAria',\n defaultMessage: 'Submit Accessibility Feedback Form',\n description: 'Detailed aria-label for the submit button',\n },\n accessibilityPolicyFormSubmitLabel: {\n id: 'accessibilityPolicyFormSubmitLabel',\n defaultMessage: 'Submit',\n description: 'General label for the submit button',\n },\n accessibilityPolicyFormSubmittingFeedbackLabel: {\n id: 'accessibilityPolicyFormSubmittingFeedbackLabel',\n defaultMessage: 'Submitting',\n description: 'Loading message while form feedback is being submitted',\n },\n accessibilityPolicyFormSuccess: {\n id: 'accessibilityPolicyFormSuccess',\n defaultMessage: 'Thank you for contacting edX!',\n description: 'Simple thank you message when form submission is successful',\n },\n accessibilityPolicyFormSuccessDetails: {\n id: 'accessibilityPolicyFormSuccessDetails',\n defaultMessage: 'Thank you for your feedback regarding the accessibility of Studio. We typically respond within one business day ({day_start} to {day_end}, {time_start} to {time_end}).',\n description: 'Detailed thank you message when form submission is successful',\n },\n accessibilityPolicyFormValidEmail: {\n id: 'accessibilityPolicyFormValidEmail',\n defaultMessage: 'Enter a valid email address.',\n description: 'Error message for when an invalid email is entered into the form',\n },\n accessibilityPolicyFormValidMessage: {\n id: 'accessibilityPolicyFormValidMessage',\n defaultMessage: 'Enter a message.',\n description: 'Error message an invalid message is entered into the form',\n },\n accessibilityPolicyFormValidName: {\n id: 'accessibilityPolicyFormValidName',\n defaultMessage: 'Enter a name.',\n description: 'Error message an invalid name is entered into the form',\n },\n});\n\nexport default messages;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n injectIntl, FormattedMessage, intlShape, FormattedDate, FormattedTime,\n} from '@edx/frontend-platform/i18n';\nimport {\n ActionRow, Alert, Form, Stack, StatefulButton,\n} from '@openedx/paragon';\n\nimport { RequestStatus } from '../../data/constants';\nimport { STATEFUL_BUTTON_STATES } from '../../constants';\nimport submitAccessibilityForm from '../data/thunks';\nimport useAccessibility from './hooks';\nimport messages from './messages';\n\nconst AccessibilityForm = ({\n accessibilityEmail,\n // injected\n intl,\n}) => {\n const {\n errors,\n values,\n isFormFilled,\n dispatch,\n handleBlur,\n handleChange,\n hasErrorField,\n savingStatus,\n } = useAccessibility({ name: '', email: '', message: '' }, intl);\n\n const formFields = [\n {\n label: intl.formatMessage(messages.accessibilityPolicyFormEmailLabel),\n name: 'email',\n value: values.email,\n },\n {\n label: intl.formatMessage(messages.accessibilityPolicyFormNameLabel),\n name: 'name',\n value: values.name,\n },\n {\n label: intl.formatMessage(messages.accessibilityPolicyFormMessageLabel),\n name: 'message',\n value: values.message,\n },\n ];\n\n const createButtonState = {\n labels: {\n default: intl.formatMessage(messages.accessibilityPolicyFormSubmitLabel),\n pending: intl.formatMessage(messages.accessibilityPolicyFormSubmittingFeedbackLabel),\n },\n disabledStates: [STATEFUL_BUTTON_STATES.pending],\n };\n\n const handleSubmit = () => {\n dispatch(submitAccessibilityForm(values));\n };\n\n const start = new Date('Mon Jan 29 2018 13:00:00 GMT (UTC)');\n const end = new Date('Fri Feb 2 2018 21:00:00 GMT (UTC)');\n\n return (\n <>\n

    \n \n

    \n {savingStatus === RequestStatus.SUCCESSFUL && (\n \n \n
    \n \n
    \n
    \n ),\n time_start: (),\n day_end: (),\n time_end: (),\n }}\n />\n
    \n
    \n
    \n )}\n {savingStatus === RequestStatus.FAILED && (\n \n
    \n \n )}\n
    \n {formFields.map((field) => (\n \n \n {hasErrorField(field.name) && (\n \n {errors[field.name]}\n \n )}\n \n ))}\n
    \n \n \n \n \n );\n};\n\nAccessibilityForm.propTypes = {\n accessibilityEmail: PropTypes.string.isRequired,\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(AccessibilityForm);\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useFormik } from 'formik';\nimport * as Yup from 'yup';\n\nimport { RequestStatus } from '../../data/constants';\nimport messages from './messages';\n\nconst useAccessibility = (initialValues, intl) => {\n const dispatch = useDispatch();\n const savingStatus = useSelector(state => state.accessibilityPage.savingStatus);\n const [isFormFilled, setFormFilled] = useState(false);\n const validationSchema = Yup.object().shape({\n name: Yup.string().required(\n intl.formatMessage(messages.accessibilityPolicyFormValidName),\n ),\n email: Yup.string()\n .email(intl.formatMessage(messages.accessibilityPolicyFormValidEmail))\n .required(intl.formatMessage(messages.accessibilityPolicyFormValidEmail)),\n message: Yup.string().required(\n intl.formatMessage(messages.accessibilityPolicyFormValidMessage),\n ),\n });\n\n const {\n values, errors, touched, handleChange, handleBlur, handleReset,\n } = useFormik({\n initialValues,\n enableReinitialize: true,\n validateOnBlur: false,\n validationSchema,\n });\n\n useEffect(() => {\n setFormFilled(Object.values(values).every((i) => i));\n }, [values]);\n\n useEffect(() => {\n if (savingStatus === RequestStatus.SUCCESSFUL) {\n handleReset();\n }\n }, [savingStatus]);\n\n const hasErrorField = (fieldName) => !!errors[fieldName] && !!touched[fieldName];\n\n return {\n errors,\n values,\n isFormFilled,\n dispatch,\n handleBlur,\n handleChange,\n hasErrorField,\n savingStatus,\n };\n};\n\nexport default useAccessibility;\n","import AccessibilityForm from './AccessibilityForm';\n\nexport default AccessibilityForm;\n","import React from 'react';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { Helmet } from 'react-helmet';\nimport { Container } from '@openedx/paragon';\nimport { StudioFooter } from '@edx/frontend-component-footer';\n\nimport Header from '../header';\nimport messages from './messages';\nimport AccessibilityBody from './AccessibilityBody';\nimport AccessibilityForm from './AccessibilityForm';\n\nconst AccessibilityPage = ({\n // injected\n intl,\n}) => {\n const communityAccessibilityLink = 'https://www.edx.org/accessibility';\n const email = 'accessibility@edx.org';\n return (\n <>\n \n \n {intl.formatMessage(messages.pageTitle, {\n siteName: process.env.SITE_NAME,\n })}\n \n \n
    \n \n \n \n \n \n \n );\n};\n\nAccessibilityPage.propTypes = {\n // injected\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(AccessibilityPage);\n","import AccessibilityPage from './AccessibilityPage';\n\nexport default AccessibilityPage;\n","// extracted by mini-css-extract-plugin\nexport default {\"xs\":\"0\",\"sm\":\"576px\",\"md\":\"768px\",\"lg\":\"992px\",\"xl\":\"1200px\",\"xxl\":\"1400px\"};","import 'core-js/stable';\nimport 'regenerator-runtime/runtime';\n\nimport {\n APP_INIT_ERROR, APP_READY, subscribe, initialize, mergeConfig, getConfig, getPath,\n} from '@edx/frontend-platform';\nimport { AppProvider, ErrorPage } from '@edx/frontend-platform/react';\nimport React, { useEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport {\n Route, createRoutesFromElements, createBrowserRouter, RouterProvider,\n} from 'react-router-dom';\nimport {\n QueryClient,\n QueryClientProvider,\n} from '@tanstack/react-query';\n\nimport { initializeHotjar } from '@edx/frontend-enterprise-hotjar';\nimport { logError } from '@edx/frontend-platform/logging';\nimport messages from './i18n';\n\nimport initializeStore from './store';\nimport CourseAuthoringRoutes from './CourseAuthoringRoutes';\nimport Head from './head/Head';\nimport { StudioHome } from './studio-home';\nimport CourseRerun from './course-rerun';\nimport { TaxonomyLayout, TaxonomyDetailPage, TaxonomyListPage } from './taxonomy';\nimport { ContentTagsDrawer } from './content-tags-drawer';\nimport AccessibilityPage from './accessibility-page';\n\nimport 'react-datepicker/dist/react-datepicker.css';\nimport './index.scss';\n\nconst queryClient = new QueryClient();\n\nconst App = () => {\n useEffect(() => {\n if (process.env.HOTJAR_APP_ID) {\n try {\n initializeHotjar({\n hotjarId: process.env.HOTJAR_APP_ID,\n hotjarVersion: process.env.HOTJAR_VERSION,\n hotjarDebug: !!process.env.HOTJAR_DEBUG,\n });\n } catch (error) {\n logError(error);\n }\n }\n }, []);\n\n const router = createBrowserRouter(\n createRoutesFromElements(\n \n } />\n } />\n } />\n {getConfig().ENABLE_ACCESSIBILITY_PAGE === 'true' && (\n } />\n )}\n {getConfig().ENABLE_TAGGING_TAXONOMY_PAGES === 'true' && (\n <>\n }>\n } />\n \n }>\n } />\n \n }\n />\n \n )}\n ,\n ),\n {\n basename: getPath(getConfig().PUBLIC_PATH),\n },\n );\n\n return (\n \n \n \n \n \n \n );\n};\n\nsubscribe(APP_READY, () => {\n ReactDOM.render(\n (),\n document.getElementById('root'),\n );\n});\n\nsubscribe(APP_INIT_ERROR, (error) => {\n ReactDOM.render(, document.getElementById('root'));\n});\n\ninitialize({\n handlers: {\n config: () => {\n mergeConfig({\n SUPPORT_URL: process.env.SUPPORT_URL || null,\n SUPPORT_EMAIL: process.env.SUPPORT_EMAIL || null,\n LEARNING_BASE_URL: process.env.LEARNING_BASE_URL,\n EXAMS_BASE_URL: process.env.EXAMS_BASE_URL || null,\n CALCULATOR_HELP_URL: process.env.CALCULATOR_HELP_URL || null,\n ENABLE_PROGRESS_GRAPH_SETTINGS: process.env.ENABLE_PROGRESS_GRAPH_SETTINGS || 'false',\n ENABLE_TEAM_TYPE_SETTING: process.env.ENABLE_TEAM_TYPE_SETTING === 'true',\n ENABLE_OPEN_MANAGED_TEAM_TYPE: process.env.ENABLE_OPEN_MANAGED_TEAM_TYPE === 'true',\n BBB_LEARN_MORE_URL: process.env.BBB_LEARN_MORE_URL || '',\n STUDIO_BASE_URL: process.env.STUDIO_BASE_URL || null,\n STUDIO_SHORT_NAME: process.env.STUDIO_SHORT_NAME || null,\n TERMS_OF_SERVICE_URL: process.env.TERMS_OF_SERVICE_URL || null,\n PRIVACY_POLICY_URL: process.env.PRIVACY_POLICY_URL || null,\n ENABLE_ACCESSIBILITY_PAGE: process.env.ENABLE_ACCESSIBILITY_PAGE || 'false',\n NOTIFICATION_FEEDBACK_URL: process.env.NOTIFICATION_FEEDBACK_URL || null,\n ENABLE_UNIT_PAGE: process.env.ENABLE_UNIT_PAGE || 'false',\n ENABLE_ASSETS_PAGE: process.env.ENABLE_ASSETS_PAGE || 'false',\n ENABLE_VIDEO_UPLOAD_PAGE_LINK_IN_CONTENT_DROPDOWN: process.env.ENABLE_VIDEO_UPLOAD_PAGE_LINK_IN_CONTENT_DROPDOWN || 'false',\n ENABLE_TAGGING_TAXONOMY_PAGES: process.env.ENABLE_TAGGING_TAXONOMY_PAGES || 'false',\n ENABLE_HOME_PAGE_COURSE_API_V2: process.env.ENABLE_HOME_PAGE_COURSE_API_V2 === 'true',\n ENABLE_CHECKLIST_QUALITY: process.env.ENABLE_CHECKLIST_QUALITY || 'true',\n ENABLE_GRADING_METHOD_IN_PROBLEMS: process.env.ENABLE_GRADING_METHOD_IN_PROBLEMS === 'true',\n }, 'CourseAuthoringConfig');\n },\n },\n messages,\n requireAuthenticatedUser: true,\n});\n","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\n\nexport const PagesAndResourcesContext = React.createContext({});\n\nconst PagesAndResourcesProvider = ({ courseId, children }) => {\n const contextValue = useMemo(() => ({\n courseId,\n path: `/course/${courseId}/pages-and-resources`,\n }), []);\n return (\n \n {children}\n \n );\n};\n\nPagesAndResourcesProvider.propTypes = {\n courseId: PropTypes.string.isRequired,\n children: PropTypes.node.isRequired,\n};\n\nexport default PagesAndResourcesProvider;\n","import classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nconst AppConfigFormDivider = ({ thick, marginAdj }) => (\n \n);\n\nAppConfigFormDivider.propTypes = {\n thick: PropTypes.bool,\n marginAdj: PropTypes.shape({\n default: PropTypes.number,\n sm: PropTypes.number,\n }),\n};\n\nAppConfigFormDivider.defaultProps = {\n thick: false,\n marginAdj: {\n default: 4,\n sm: 5,\n },\n};\n\nexport default AppConfigFormDivider;\n","var map = {\n\t\"./af\": 19183,\n\t\"./af.js\": 19183,\n\t\"./ar\": 31035,\n\t\"./ar-dz\": 47214,\n\t\"./ar-dz.js\": 47214,\n\t\"./ar-kw\": 40830,\n\t\"./ar-kw.js\": 40830,\n\t\"./ar-ly\": 91280,\n\t\"./ar-ly.js\": 91280,\n\t\"./ar-ma\": 77258,\n\t\"./ar-ma.js\": 77258,\n\t\"./ar-sa\": 64096,\n\t\"./ar-sa.js\": 64096,\n\t\"./ar-tn\": 97826,\n\t\"./ar-tn.js\": 97826,\n\t\"./ar.js\": 31035,\n\t\"./az\": 20051,\n\t\"./az.js\": 20051,\n\t\"./be\": 46194,\n\t\"./be.js\": 46194,\n\t\"./bg\": 64323,\n\t\"./bg.js\": 64323,\n\t\"./bm\": 57837,\n\t\"./bm.js\": 57837,\n\t\"./bn\": 75780,\n\t\"./bn-bd\": 25959,\n\t\"./bn-bd.js\": 25959,\n\t\"./bn.js\": 75780,\n\t\"./bo\": 81451,\n\t\"./bo.js\": 81451,\n\t\"./br\": 76480,\n\t\"./br.js\": 76480,\n\t\"./bs\": 91607,\n\t\"./bs.js\": 91607,\n\t\"./ca\": 23232,\n\t\"./ca.js\": 23232,\n\t\"./cs\": 91034,\n\t\"./cs.js\": 91034,\n\t\"./cv\": 54213,\n\t\"./cv.js\": 54213,\n\t\"./cy\": 95800,\n\t\"./cy.js\": 95800,\n\t\"./da\": 40739,\n\t\"./da.js\": 40739,\n\t\"./de\": 66951,\n\t\"./de-at\": 82181,\n\t\"./de-at.js\": 82181,\n\t\"./de-ch\": 61339,\n\t\"./de-ch.js\": 61339,\n\t\"./de.js\": 66951,\n\t\"./dv\": 16938,\n\t\"./dv.js\": 16938,\n\t\"./el\": 59573,\n\t\"./el.js\": 59573,\n\t\"./en-au\": 62458,\n\t\"./en-au.js\": 62458,\n\t\"./en-ca\": 51816,\n\t\"./en-ca.js\": 51816,\n\t\"./en-gb\": 8069,\n\t\"./en-gb.js\": 8069,\n\t\"./en-ie\": 15586,\n\t\"./en-ie.js\": 15586,\n\t\"./en-il\": 60009,\n\t\"./en-il.js\": 60009,\n\t\"./en-in\": 51207,\n\t\"./en-in.js\": 51207,\n\t\"./en-nz\": 83724,\n\t\"./en-nz.js\": 83724,\n\t\"./en-sg\": 24334,\n\t\"./en-sg.js\": 24334,\n\t\"./eo\": 1292,\n\t\"./eo.js\": 1292,\n\t\"./es\": 66328,\n\t\"./es-do\": 61452,\n\t\"./es-do.js\": 61452,\n\t\"./es-mx\": 94444,\n\t\"./es-mx.js\": 94444,\n\t\"./es-us\": 81285,\n\t\"./es-us.js\": 81285,\n\t\"./es.js\": 66328,\n\t\"./et\": 7181,\n\t\"./et.js\": 7181,\n\t\"./eu\": 62830,\n\t\"./eu.js\": 62830,\n\t\"./fa\": 19565,\n\t\"./fa.js\": 19565,\n\t\"./fi\": 85541,\n\t\"./fi.js\": 85541,\n\t\"./fil\": 65661,\n\t\"./fil.js\": 65661,\n\t\"./fo\": 26087,\n\t\"./fo.js\": 26087,\n\t\"./fr\": 25396,\n\t\"./fr-ca\": 96581,\n\t\"./fr-ca.js\": 96581,\n\t\"./fr-ch\": 81294,\n\t\"./fr-ch.js\": 81294,\n\t\"./fr.js\": 25396,\n\t\"./fy\": 12533,\n\t\"./fy.js\": 12533,\n\t\"./ga\": 55796,\n\t\"./ga.js\": 55796,\n\t\"./gd\": 50847,\n\t\"./gd.js\": 50847,\n\t\"./gl\": 60439,\n\t\"./gl.js\": 60439,\n\t\"./gom-deva\": 46514,\n\t\"./gom-deva.js\": 46514,\n\t\"./gom-latn\": 66525,\n\t\"./gom-latn.js\": 66525,\n\t\"./gu\": 34232,\n\t\"./gu.js\": 34232,\n\t\"./he\": 50915,\n\t\"./he.js\": 50915,\n\t\"./hi\": 22095,\n\t\"./hi.js\": 22095,\n\t\"./hr\": 10762,\n\t\"./hr.js\": 10762,\n\t\"./hu\": 88275,\n\t\"./hu.js\": 88275,\n\t\"./hy-am\": 73094,\n\t\"./hy-am.js\": 73094,\n\t\"./id\": 27769,\n\t\"./id.js\": 27769,\n\t\"./is\": 99676,\n\t\"./is.js\": 99676,\n\t\"./it\": 74313,\n\t\"./it-ch\": 25141,\n\t\"./it-ch.js\": 25141,\n\t\"./it.js\": 74313,\n\t\"./ja\": 11985,\n\t\"./ja.js\": 11985,\n\t\"./jv\": 53908,\n\t\"./jv.js\": 53908,\n\t\"./ka\": 32808,\n\t\"./ka.js\": 32808,\n\t\"./kk\": 33930,\n\t\"./kk.js\": 33930,\n\t\"./km\": 71532,\n\t\"./km.js\": 71532,\n\t\"./kn\": 69461,\n\t\"./kn.js\": 69461,\n\t\"./ko\": 60502,\n\t\"./ko.js\": 60502,\n\t\"./ku\": 18660,\n\t\"./ku.js\": 18660,\n\t\"./ky\": 83088,\n\t\"./ky.js\": 83088,\n\t\"./lb\": 65742,\n\t\"./lb.js\": 65742,\n\t\"./lo\": 25417,\n\t\"./lo.js\": 25417,\n\t\"./lt\": 64968,\n\t\"./lt.js\": 64968,\n\t\"./lv\": 41202,\n\t\"./lv.js\": 41202,\n\t\"./me\": 34438,\n\t\"./me.js\": 34438,\n\t\"./mi\": 18498,\n\t\"./mi.js\": 18498,\n\t\"./mk\": 6744,\n\t\"./mk.js\": 6744,\n\t\"./ml\": 63949,\n\t\"./ml.js\": 63949,\n\t\"./mn\": 4459,\n\t\"./mn.js\": 4459,\n\t\"./mr\": 46679,\n\t\"./mr.js\": 46679,\n\t\"./ms\": 56960,\n\t\"./ms-my\": 47483,\n\t\"./ms-my.js\": 47483,\n\t\"./ms.js\": 56960,\n\t\"./mt\": 99989,\n\t\"./mt.js\": 99989,\n\t\"./my\": 64978,\n\t\"./my.js\": 64978,\n\t\"./nb\": 88460,\n\t\"./nb.js\": 88460,\n\t\"./ne\": 23993,\n\t\"./ne.js\": 23993,\n\t\"./nl\": 95378,\n\t\"./nl-be\": 62678,\n\t\"./nl-be.js\": 62678,\n\t\"./nl.js\": 95378,\n\t\"./nn\": 67560,\n\t\"./nn.js\": 67560,\n\t\"./oc-lnc\": 87060,\n\t\"./oc-lnc.js\": 87060,\n\t\"./pa-in\": 62187,\n\t\"./pa-in.js\": 62187,\n\t\"./pl\": 93532,\n\t\"./pl.js\": 93532,\n\t\"./pt\": 49396,\n\t\"./pt-br\": 92485,\n\t\"./pt-br.js\": 92485,\n\t\"./pt.js\": 49396,\n\t\"./ro\": 33179,\n\t\"./ro.js\": 33179,\n\t\"./ru\": 93797,\n\t\"./ru.js\": 93797,\n\t\"./sd\": 40675,\n\t\"./sd.js\": 40675,\n\t\"./se\": 59036,\n\t\"./se.js\": 59036,\n\t\"./si\": 59160,\n\t\"./si.js\": 59160,\n\t\"./sk\": 31266,\n\t\"./sk.js\": 31266,\n\t\"./sl\": 74699,\n\t\"./sl.js\": 74699,\n\t\"./sq\": 69728,\n\t\"./sq.js\": 69728,\n\t\"./sr\": 87129,\n\t\"./sr-cyrl\": 55000,\n\t\"./sr-cyrl.js\": 55000,\n\t\"./sr.js\": 87129,\n\t\"./ss\": 74346,\n\t\"./ss.js\": 74346,\n\t\"./sv\": 9877,\n\t\"./sv.js\": 9877,\n\t\"./sw\": 918,\n\t\"./sw.js\": 918,\n\t\"./ta\": 24787,\n\t\"./ta.js\": 24787,\n\t\"./te\": 6199,\n\t\"./te.js\": 6199,\n\t\"./tet\": 91851,\n\t\"./tet.js\": 91851,\n\t\"./tg\": 33881,\n\t\"./tg.js\": 33881,\n\t\"./th\": 87828,\n\t\"./th.js\": 87828,\n\t\"./tk\": 99677,\n\t\"./tk.js\": 99677,\n\t\"./tl-ph\": 29253,\n\t\"./tl-ph.js\": 29253,\n\t\"./tlh\": 95586,\n\t\"./tlh.js\": 95586,\n\t\"./tr\": 17254,\n\t\"./tr.js\": 17254,\n\t\"./tzl\": 61192,\n\t\"./tzl.js\": 61192,\n\t\"./tzm\": 69631,\n\t\"./tzm-latn\": 72841,\n\t\"./tzm-latn.js\": 72841,\n\t\"./tzm.js\": 69631,\n\t\"./ug-cn\": 71720,\n\t\"./ug-cn.js\": 71720,\n\t\"./uk\": 28048,\n\t\"./uk.js\": 28048,\n\t\"./ur\": 86751,\n\t\"./ur.js\": 86751,\n\t\"./uz\": 96343,\n\t\"./uz-latn\": 60513,\n\t\"./uz-latn.js\": 60513,\n\t\"./uz.js\": 96343,\n\t\"./vi\": 44821,\n\t\"./vi.js\": 44821,\n\t\"./x-pseudo\": 23973,\n\t\"./x-pseudo.js\": 23973,\n\t\"./yo\": 15000,\n\t\"./yo.js\": 15000,\n\t\"./zh-cn\": 43762,\n\t\"./zh-cn.js\": 43762,\n\t\"./zh-hk\": 9246,\n\t\"./zh-hk.js\": 9246,\n\t\"./zh-mo\": 41107,\n\t\"./zh-mo.js\": 41107,\n\t\"./zh-tw\": 79014,\n\t\"./zh-tw.js\": 79014\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 35358;"],"names":["map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","keys","Object","module","exports","slice","createSlice","name","initialState","appIds","activeAppId","selectedAppId","status","RequestStatus","IN_PROGRESS","saveStatus","SUCCESSFUL","reducers","loadApps","state","_ref","payload","assign","selectApp","_ref2","appId","updateStatus","_ref3","updateSaveStatus","_ref4","actions","reducer","DATE_FORMAT","TIME_FORMAT","DATE_TIME_FORMAT","COMMA_SEPARATED_DATE_FORMAT","DEFAULT_EMPTY_WYSIWYG_VALUE","STATEFUL_BUTTON_STATES","default","pending","error","USER_ROLES","admin","staff","NOTIFICATION_MESSAGES","adding","saving","duplicating","deleting","copying","pasting","discardChanges","publishing","hidingFromStudents","makingVisibleToStudents","empty","DEFAULT_TIME_STAMP","COURSE_CREATOR_STATES","unrequested","granted","denied","disallowedForThisSite","DECODED_ROUTES","COURSE_UNIT","UPLOAD_FILE_MAX_SIZE","COURSE_BLOCK_NAMES","chapter","sequential","vertical","component","STUDIO_CLIPBOARD_CHANNEL","CLIPBOARD_STATUS","loading","ready","expired","STRUCTURAL_XBLOCK_TYPES","FAILED","DENIED","PENDING","CLEAR","PARTIAL","PARTIAL_FAILURE","NOT_FOUND","TeamSizes","DEFAULT","MIN","MAX","GroupTypes","OPEN","PUBLIC_MANAGED","PRIVATE_MANAGED","OPEN_MANAGED","DivisionSchemes","NONE","COHORT","VisibilityTypes","GATED","LIVE","STAFF_ONLY","HIDE_AFTER_DUE","UNSCHEDULED","NEEDS_ATTENTION","add","modelType","model","undefined","update","_objectSpread","remove","addModel","addModels","models","forEach","addModelsMap","modelsMap","values","updateModel","updateModels","_ref5","updateModelsMap","_ref6","removeModel","_ref7","removeModels","_ref8","useModel","type","useSelector","shallowEqual","useModels","defineMessages","connectionError","defaultMessage","description","supportText","getLoadingStatus","pagesAndResources","loadingStatus","getSavingStatus","savingStatus","getCourseAppsApiStatus","courseAppsApiStatus","getCourseAppSettingValue","setting","courseAppSettings","value","getResetStatus","resetStatus","courseAppIds","fetchCourseAppsSuccess","updateLoadingStatus","updateSavingStatus","updateResetStatus","updateCourseAppsApiStatus","fetchCourseAppsSettingsSuccess","updateCourseAppsSettingsSuccess","ensureConfig","getApiBaseUrl","getConfig","STUDIO_BASE_URL","getCourseAppsApiUrl","getCourseAdvancedSettingsApiUrl","COURSE_APPS_ORDER","fetchCourseApps","courseId","async","dispatch","courseApps","data","getAuthenticatedHttpClient","get","camelCaseObject","getCourseApps","sort","firstEl","secondEl","indexOf","courseApp","response","updateAppStatus","patch","enabled","updateCourseApp","fetchCourseAppSettings","settings","settingValues","filter_fields","snakeCase","join","getCourseAdvancedSettings","updateCourseAppSetting","updateCourseAdvancedSettings","configurationChangeConsequence","configureApp","configure","ok","cancel","confirm","confirmConfigurationChange","confirmEnableDiscussionsLabel","cancelEnableDiscussionsLabel","confirmEnableDiscussions","cancelEnableDiscussions","backButton","saveButton","savingButton","savedButton","divisionByGroup","divideByCohortsLabel","divideByCohortsHelp","divideCourseTopicsByCohortsLabel","divideCourseTopicsByCohortsHelp","divideGeneralTopic","divideQuestionsForTAsTopic","cohortsEnabled","instructorDashboard","visibilityInContext","gradedUnitPagesLabel","gradedUnitPagesHelp","groupInContextSubsectionLabel","groupInContextSubsectionHelp","anonymousPosting","allowAnonymousPostsLabel","allowAnonymousPostsHelp","allowAnonymousPostsPeersLabel","allowAnonymousPostsPeersHelp","reportedContentEmailNotifications","reportedContentEmailNotificationsLabel","reportedContentEmailNotificationsHelp","discussionTopics","discussionTopicsLabel","discussionTopicsHelp","discussionTopicRequired","discussionTopicNameAlreadyExist","addTopicButton","deleteButton","cancelButton","discussionTopicDeletionHelp","discussionTopicDeletionLabel","renameGeneralTopic","generalTopicHelp","configureAdditionalTopic","addTopicHelpText","restrictedStartDateHelp","restrictedEndDateHelp","restrictedStartTimeHelp","restrictedEndTimeHelp","restrictedDatesStatus","restrictedStartDateRequired","restrictedEndDateRequired","restrictedStartDateInPast","restrictedEndDateInPast","restrictedStartTimeInPast","restrictedEndTimeInPast","restrictedStartTimeInValidFormat","restrictedEndTimeInValidFormat","restrictedStartDateInValidFormat","restrictedEndDateInValidFormat","discussionRestrictionLabel","discussionRestrictionHelp","discussionRestrictionDatesHelp","addRestrictedDatesButton","configureRestrictedDates","activeRestrictedDatesDeletionLabel","activeRestrictedDatesDeletionHelp","completeRestrictedDatesDeletionHelp","restrictedDatesDeletionLabel","restrictedDatesDeletionHelp","discussionRestrictionOffLabelHelpText","discussionRestrictionOnLabelHelpText","discussionRestrictionScheduledLabelHelpText","enableRestrictedDatesConfirmationLabel","enableRestrictedDatesConfirmationHelp","deleteAltText","expandAltText","collapseAltText","startDateLabel","startTimeLabel","endDateLabel","endTimeLabel","filterItemFromObject","array","key","filter","item","checkFieldErrors","touched","errors","fieldPath","propertyName","path","Boolean","getIn","checkStatus","startDate","endDate","today","moment","isBefore","constants","COMPLETE","isAfter","UPCOMING","ACTIVE","validTimeFormats","mergeDateTime","date","time","getTime","dateTime","split","hasValidDateFormat","isValid","hasValidTimeFormat","startOfDayTime","startOf","format","endOfDayTime","endOf","normalizeTime","normalizeDate","decodeDateTime","nDate","nTime","sortRestrictedDatesByStatus","order","_","obj","startTime","formatRestrictedDates","formattedDate","endTime","hasSameDay","isSameDay","isSame","hasSameMonth","isSameMonth","hasSameYear","isSameYear","isTimeAvailable","mStartDate","mEndDate","mStartDateTime","mEndDateTime","badgeVariant","deleteRestrictedDatesHelperText","messages","discussionRestriction","DISABLED","ENABLED","SCHEDULED","discussionRestrictionOptions","message","label","FEATURE_TYPES","subtract","useIsMobile","useMediaQuery","query","useIsDesktop","convertObjectToSnakeCase","unpacked","arguments","length","reduce","snakeCaseObj","snakeCaseKey","deepConvertingKeysToCamelCase","Array","isArray","camelCaseObj","camelCaseKey","replace","match","p1","toUpperCase","deepConvertingKeysToSnakeCase","entries","toLowerCase","transformKeysToCamelCase","letter","parseArrayOrObjectValues","result","Number","isNaN","JSON","parse","createCorrectInternalRoute","checkPath","basePath","getPath","PUBLIC_PATH","endsWith","startsWith","getPagePath","isMfePageEnabled","urlParameter","useAppSetting","settingName","useDispatch","useContext","PagesAndResourcesContext","settingValue","useEffect","includes","getLabelById","options","foundOption","find","option","setupYupExtensions","Yup","property","this","test","list","index","propertyValue","entry","push","createError","discussionTopic","parent","topic","some","startDateTime","endDateTime","isInvalidStartDateTime","isSameOrAfter","originalValue","convertToDateFromString","dateStr","stringValue","String","substring","toDate","convertToStringFromDate","isValidDate","formattedValue","getFileSizeToClosestByte","fileSize","divides","size","parseFloat","toFixed","CollapsableEditor","title","open","defaultOpen","onToggle","onClose","onDelete","children","expandAlt","deleteAlt","collapseAlt","props","_objectWithoutProperties","_excluded","_jsxs","Collapsible","Advanced","className","Trigger","style","justifyContent","_jsx","Visible","whenClosed","IconButton","alt","src","ExpandMore","iconAs","Icon","variant","whenOpen","onClick","event","stopPropagation","Delete","ExpandLess","Body","propTypes","PropTypes","isRequired","defaultProps","React","ConnectionErrorAlert","intl","Alert","FormattedMessage","supportLink","Link","href","SUPPORT_URL","formatMessage","intlShape","injectIntl","FormSwitchGroup","helpText","onChange","onBlur","checked","disabled","helpTextId","Form","Group","controlId","Label","SwitchControl","Text","FormikErrorFeedback","useFormikContext","fieldTouched","fieldError","TransitionReplace","Control","Feedback","hasIcon","FormikControl","help","controlClasses","params","handleChange","handleBlur","setFieldError","onFocus","target","isInvalid","_Fragment","LoadingSpinner","Spinner","animation","role","screenReaderText","Loading","PermissionDeniedAlert","messagesOfArLanguage","messagesOfUkLanguage","messagesOfTrTrLanguage","messagesOfThLanguage","messagesOfTeLanguage","messagesOfSwLanguage","messagesOfRuLanguage","messagesOfPtPtLanguage","messagesOfPtBrLanguage","messagesOfItItLanguage","messagesOfIdLanguage","messagesOfHiLanguage","messagesOfHeLanguage","messagesOfFrCaLanguage","messagesOfFaLanguage","messagesOfEsEsLanguage","messagesOfEs419Language","messagesOfElLanguage","messagesOfDeDeLanguage","messagesOfDaLanguage","messagesOfDeLanguage","messagesFromFrontendLibContentComponents","messagesFromFrontendPlatform","messagesFromParagon","messagesFromFrontendComponentFooter","canChangeProvider","updateCanChangeProviders","canChangeProviders","LOADING","LOADED","SAVING","SAVED","featureIds","hasValidationError","discussionTopicIds","divideDiscussionIds","enableInContext","enableGradedUnits","unitLevelVisibility","postingRestrictions","updateValidationStatus","hasError","updateDiscussionTopicIds","updatedDiscussionTopicIds","updateDividedDiscussionsIds","customPagesIds","addingStatus","deletingStatus","setPageIds","updateAddingStatus","updateDeletingStatus","deleteCustomPageSuccess","customPageId","addCustomPageSuccess","updateCustomPagesApiStatus","proctoringErrors","sendRequestErrors","getDataSendErrors","fetchProctoringExamErrorsSuccess","gradingSettings","courseSettings","fetchGradingSettingsSuccess","sendGradingSettingsSuccess","fetchCourseSettingsSuccess","loadingStatuses","studioHomeLoadingStatus","courseNotificationLoadingStatus","courseLoadingStatus","libraryLoadingStatus","savingStatuses","courseCreatorSavingStatus","deleteNotificationSavingStatus","studioHomeData","studioHomeCoursesRequestParams","currentPage","search","archivedOnly","activeOnly","isFiltered","cleanFilters","updateLoadingStatuses","updateSavingStatuses","fetchStudioHomeDataSuccess","fetchCourseDataSuccess","courses","archivedCourses","inProcessCourseActions","fetchCourseDataSuccessV2","results","numPages","count","coursesCount","fetchLibraryDataSuccess","libraries","updateStudioHomeCoursesCustomParams","loadingDetailsStatus","loadingSettingsStatus","courseDetails","updateLoadingDetailsStatus","updateLoadingSettingsStatus","updateCourseDetailsSuccess","fetchCourseDetailsSuccess","assetIds","duplicateFiles","updatingStatus","usageStatus","delete","lock","download","usageMetrics","setAssetIds","isEmpty","setSortedAssetIds","updateEditStatus","editType","deleteAssetSuccess","assetId","addAssetSuccess","updateDuplicateFiles","files","updateErrors","currentErrorState","clearErrors","_ref9","loadingCourseTeamStatus","users","showTransferOwnershipHint","allowActions","errorMessage","fetchCourseTeamSuccess","updateLoadingCourseTeamStatus","deleteCourseTeamUser","user","email","setErrorMessage","courseUpdates","courseHandouts","createCourseUpdateQuery","editCourseUpdateQuery","deleteCourseUpdateQuery","editCourseHandoutsQuery","fetchCourseUpdatesQuery","fetchCourseHandoutsQuery","fetchCourseUpdatesSuccess","createCourseUpdate","editCourseUpdate","courseUpdate","deleteCourseUpdate","sortBy","reverse","fetchCourseHandoutsSuccess","editCourseHandouts","isShow","showProcessingNotification","hideProcessingNotification","loadingHelpUrlsStatus","pages","updatePages","updateLoadingHelpUrlsStatus","exportTriggered","currentStage","msg","unitUrl","downloadPath","successDate","isErrorModalOpen","updateExportTriggered","updateCurrentStage","updateDownloadPath","updateSuccessDate","updateError","updateIsErrorModalOpen","reset","organizationLoadingStatus","courseRerunLoadingStatus","organizations","createOrRerunCourse","courseData","courseRerunData","redirectUrlObj","postErrors","clipboardData","fetchOrganizations","updateCourseData","updateCourseRerunData","updateRedirectUrlObj","updatePostErrors","updateClipboardData","progress","importTriggered","fileName","updateProgress","updateImportTriggered","updateFileName","videoIds","pageSettings","transcriptStatus","thumbnail","transcript","setVideoIds","setPageSettings","deleteVideoSuccess","videoId","addVideoById","updateTranscriptCredentialsSuccess","provider","transcriptCredentials","updateTranscriptPreferenceSuccess","activeTranscriptPreferences","_ref10","failAddVideo","_ref11","addVideoSuccess","updateVideoUploadProgress","ITEM_BADGE_STATUS","CHECKLIST_FILTERS","LAUNCH_CHECKLIST","pacingTypeFilter","BEST_PRACTICES_CHECKLIST","VIDEO_SHARING_OPTIONS","perVideo","allOn","allOff","API_ERROR_TYPES","outlineIndexLoadingStatus","reIndexLoadingStatus","fetchSectionLoadingStatus","courseLaunchQueryStatus","outlineIndexApi","reindexApi","sectionLoadingApi","courseLaunchApi","outlineIndexData","statusBarData","courseReleaseDate","highlightsEnabledForMessaging","isSelfPaced","checklist","totalCourseLaunchChecks","completedCourseLaunchChecks","totalCourseBestPracticesChecks","completedCourseBestPracticesChecks","videoSharingEnabled","videoSharingOptions","sectionsList","isCustomRelativeDatesActive","currentSection","currentSubsection","currentItem","deletable","draggable","childAddable","duplicable","enableProctoredExams","pasteFileNotices","fetchOutlineIndexSuccess","courseStructure","childInfo","updateOutlineIndexLoadingStatus","updateReindexLoadingStatus","updateFetchSectionLoadingStatus","updateCourseLaunchQueryStatus","dismissError","updateStatusBar","updateCourseActions","fetchStatusBarChecklistSuccess","fetchStatusBarSelPacedSuccess","updateSectionList","_ref12","section","setCurrentItem","_ref13","reorderSectionList","_ref14","a","b","setCurrentSection","_ref15","setCurrentSubsection","_ref16","addSection","_ref17","addSubsection","_ref18","parentLocator","deleteSection","_ref19","_ref20","itemId","deleteSubsection","_ref21","sectionId","_ref22","deleteUnit","_ref23","subsection","subsectionId","_ref24","duplicateSection","_ref25","currentValue","duplicatedItem","setPasteFileNotices","_ref26","removePasteFileNotices","_ref27","reorderSubsectionList","reorderUnitList","isQueryPending","isTitleEditFormOpen","canEdit","fetchUnitLoadingStatus","courseSectionVerticalLoadingStatus","courseVerticalChildrenLoadingStatus","unit","courseSectionVertical","courseVerticalChildren","isPublished","staticFileNotices","fetchCourseItemSuccess","updateLoadingCourseUnitStatus","updateQueryPendingStatus","changeEditTitleFormOpen","fetchSequenceRequest","sequenceId","sequenceStatus","sequenceMightBeUnit","fetchSequenceSuccess","fetchSequenceFailure","fetchCourseSectionVerticalDataSuccess","updateLoadingCourseSectionVerticalDataStatus","updateLoadingCourseXblockStatus","createUnitXblockLoadingStatus","addNewUnitStatus","updateCourseVerticalChildren","updateCourseVerticalChildrenLoadingStatus","deleteXBlock","duplicateXBlock","newCourseVerticalChildren","blockId","newId","shouldScroll","fetchStaticFileNoticesSuccess","reorderXBlockList","indexMap","Map","launchChecklistStatus","bestPracticeChecklistStatus","launchData","bestPracticeData","fetchLaunchChecklistSuccess","updateLaunchChecklistStatus","fetchBestPracticeChecklistSuccess","updateBestPracticeChecklisttStatus","textbooks","currentTextbookId","fetchTextbooks","createTextbookSuccess","editTextbookSuccess","textbook","deleteTextbookSuccess","MODE_STATES","certificatesData","componentMode","savingImageStatus","updateSavingImageStatus","fetchCertificatesSuccess","createCertificateSuccess","action","certificates","updateCertificateSuccess","findIndex","c","setMode","deleteCertificateSuccess","groupConfigurations","fetchGroupConfigurations","updateGroupConfigurationsSuccess","groupIndex","allGroupConfigurations","group","deleteGroupConfigurationsSuccess","parentGroupId","groupId","parentGroupIndex","groups","updateExperimentConfigurationSuccess","configuration","experimentConfigurationState","experimentGroupConfigurations","configurationIdx","conf","deleteExperimentConfigurationSuccess","configurationId","filteredGroups","initializeStore","preloadedState","configureStore","courseDetail","courseDetailReducer","customPages","customPagesReducer","discussions","discussionsReducer","assets","filesReducer","pagesAndResourcesReducer","scheduleAndDetails","scheduleAndDetailsReducer","advancedSettings","advancedSettingsReducer","gradingSettingsReducer","studioHome","studioHomeReducer","modelsReducer","live","liveReducer","courseTeam","courseTeamReducer","CourseUpdatesReducer","processingNotification","processingNotificationReducer","helpUrls","helpUrlsReducer","courseExport","courseExportReducer","generic","genericReducer","courseImport","courseImportReducer","videos","videosReducer","courseOutline","courseOutlineReducer","courseUnit","courseUnitReducer","courseChecklist","courseChecklistReducer","accessibilityPage","accessibilityPageReducer","certificatesReducer","groupConfigurationsReducer","textbooksReducer","AlertMessage","Heading","warningTitle","warningDescription","warningTitleAriaLabelledBy","warningDescriptionAriaDescribedBy","SavingErrorAlert","useIntl","showAlert","setShowAlert","useState","isOnline","setIsOnline","window","navigator","onLine","isQueryFailed","handleOnlineStatus","events","addEventListener","removeEventListener","show","icon","WarningIcon","handleResponseErrors","savingStatusFunction","customAttributes","httpErrorResponseData","parsedData","err","getProcessingNotification","SubHeader","subtitle","breadcrumbs","contentTitle","instruction","headerActions","titleActions","hideBorder","withSubHeaderContent","ActionRow","ProcessingNotification","Badge","classNames","IconSettings","capitalize","EmptyPlaceholder","onCreateNewTextbook","Button","iconBefore","IconAdd","DeleteModal","category","isOpen","close","onDeleteSubmit","modalTitle","modalDescription","AlertModal","footerNode","preventDefault","getTextbooksData","getErrorMessage","getCurrentTextbookId","PromptIfDirty","dirty","handleBeforeUnload","uploadImageDropzoneText","uploadImageDropzoneAlt","uploadImageValidationText","cancelModal","uploadModal","uploadImageDropzoneInvalidSizeMore","onCancel","fileTypes","onSavingStatus","onSelectFile","useParams","selectedFile","setSelectedFile","previewUrl","setPreviewUrl","uploadProgress","setUploadProgress","disabledUploadBtn","setDisabledUploadBtn","VALID_IMAGE_TYPES","accept","useMemo","acc","mimeType","handleSelectFile","fileData","file","reader","FileReader","onloadend","readAsDataURL","imageValidator","fileType","pop","extensionsList","typesList","types","extensions","handleCancel","handleUpload","onUploadProgress","progressEvent","percentCompleted","Math","round","loaded","total","config","post","URL","getUploadAssetsUrl","uploadAssets","url","asset","ModalDropzone","imageHelpText","previewComponent","imageDropzoneText","invalidFileSizeMore","maxSize","useModalDropzone","invalidSizeMore","inputComponent","Image","fluid","isActive","FileUploadIcon","ModalDialog","hasCloseButton","isFullscreenOnMobile","Header","Title","Card","Dropzone","onProcessUpload","errorMessages","validator","Footer","CloseButton","shape","tab_title","required","max","chapters","of","min","TextbookForm","closeTextbookForm","initialFormValues","onSubmit","courseTitle","currentTextbookIndex","setCurrentTextbookIndex","isUploadModalOpen","openUploadModal","closeUploadModal","useToggle","onCloseUploadModal","Formik","initialValues","validationSchema","textbookFormValidationSchema","validateOnBlur","validateOnMount","handleSubmit","setFieldValue","placeholder","FieldArray","render","arrayHelpers","IconButtonWithTooltip","tooltipContent","UploadIcon","onUploadButtonClick","DeleteIcon","AddIcon","courseName","PdfIcon","getTextbookFormInitialValues","TextbookCard","handleSavingStatusDispatch","onEditSubmit","textbookIndex","AppContext","isTextbookFormOpen","openTextbookForm","isDeleteModalOpen","openDeleteModal","closeDeleteModal","tabTitle","ViewIcon","onPreviewTextbookClick","LMS_BASE_URL","EditIcon","styling","textbookTitle","handleDeleteButtonSubmit","otherLinkURLParams","grading","proctoredExamSettings","sidebarTitleOther","sidebarLinkToScheduleAndDetails","sidebarLinkToGrading","sidebarLinkToCourseTeam","sidebarLinkToGroupConfigurations","sidebarLinkToProctoredExamSettings","sidebarLinkToAdvancedSettings","HelpSidebarLink","as","pathToPage","TagElement","Hyperlink","destination","showLaunchIcon","HelpSidebar","showOtherSettings","proctoredExamSettingsUrl","pathname","useLocation","showOtherLink","generateLegacyURL","scheduleAndDetailsDestination","gradingDestination","courseTeamDestination","advancedSettingsDestination","groupConfigurationsDestination","fetchHelpUrls","urls","getHelpUrls","getPages","useHelpUrls","tokenNames","helpTokens","names","urlsDictionary","TextbookSidebar","textbookUrl","API_PATH_PATTERN","getStudioBaseUrl","getEditTextbooksApiUrl","textbookId","fetchTextbooksQuery","getTextbooksApiUrl","getTextbooks","createTextbookQuery","getUpdateTextbooksApiUrl","createTextbook","editTextbookQuery","put","omit","editTextbook","deleteTextbookQuery","deleteTextbook","Textbooks","isLoading","handleTextbookFormSubmit","handleTextbookEditFormSubmit","handleTextbookDeleteSubmit","formValues","useTextbooks","processingNotificationTitle","Row","Helmet","Container","Breadcrumb","ariaLabel","links","Layout","lg","span","md","sm","xs","xl","Element","_defineMessages","blockTypeFilter","blockTagsFilter","childTagsExpand","childTagsCollapse","clearFilters","numResults","searchAllCourses","searchThisCourse","inputPlaceholder","searchTagsByKeywordPlaceholder","submitSearchTagsByKeyword","showMore","showMoreResults","loadingMoreResults","emptySearchTitle","emptySearchSubtitle","noResultsTitle","noResultsSubtitle","openInNewWindow","searchError","TAG_SEP","highlightPreTag","highlightPostTag","getContentSearchConfig","indexName","index_name","apiKey","api_key","forceArray","formatSearchHit","hit","_formatted","newHit","formatted","displayName","display_name","content","SearchContext","SearchContextProvider","extraFilter","closeSearchModal","searchKeywords","setSearchKeywords","blockTypesFilter","setBlockTypesFilter","tagsFilter","setTagsFilter","canClearFilters","connectionDetails","isError","hasConnectionError","useQuery","queryKey","queryFn","cacheTime","staleTime","refetchInterval","refetchOnWindowFocus","refetchOnMount","client","MeiliSearch","host","useInfiniteQuery","pageParam","offset","queries","extraFilterFormatted","blockTypesFilterFormatted","bt","tagsFilterFormatted","filters","tagPath","parts","formatTagsFilter","indexUid","q","attributesToHighlight","attributesToCrop","cropLength","limit","facets","multiSearch","hits","totalHits","estimatedTotalHits","blockTypes","facetDistribution","block_type","nextOffset","fetchSearchResults","getNextPageParam","lastPage","keepPreviousData","allHits","page","isFetching","isFetchingNextPage","fetchNextPage","hasNextPage","useContentSearchResults","Provider","useSearchContext","ctx","ClearFiltersButton","InfoMessage","image","Stack","hasFiltersApplied","hasQuery","NoResultImage","EmptySearchImage","sidebarTitleDraftNeverPublished","sidebarTitleVisibleToStaffOnly","sidebarTitlePublishedAndLive","sidebarTitleDraftUnpublishedChanges","sidebarTitlePublishedNotYetReleased","sidebarHeaderUnitLocationTitle","sidebarBodyNote","publishInfoPreviouslyPublished","publishInfoDraftSaved","publishLastPublished","releaseInfoUnscheduled","releaseInfoWithSection","visibilityIsVisibleToTitle","visibilityWillBeVisibleToTitle","unitLocationTitle","unitLocationDescription","visibilityCheckboxTitle","visibilityStaffOnlyTitle","visibilityStaffAndLearnersTitle","visibilityHasExplicitStaffLockText","actionButtonPublishTitle","actionButtonDiscardChangesTitle","actionButtonCopyUnitTitle","releaseStatusTitle","releasedStatusTitle","scheduledStatusTitle","modalDiscardUnitChangesTitle","modalDiscardUnitChangesActionButtonText","modalDiscardUnitChangesCancelButtonText","modalDiscardUnitChangesDescription","modalMakeVisibilityTitle","modalMakeVisibilityActionButtonText","modalMakeVisibilityCancelButtonText","modalMakeVisibilityDescription","buttonText","modalBtnText","modalContainerTitle","modalContainerCancelBtnText","modalComponentSupportLabelFullySupported","modalComponentSupportLabelProvisionallySupported","modalComponentSupportLabelNotSupported","modalComponentSupportTooltipFullySupported","modalComponentSupportTooltipNotSupported","modalComponentSupportTooltipProvisionallySupported","COMPONENT_TYPES","advanced","discussion","library","html","openassessment","problem","video","dragAndDrop","TYPE_ICONS_MAP","VideoCameraIcon","other","BookOpenIcon","FormatListBulletedIcon","LockIcon","COMPONENT_TYPE_ICON_MAP","ScienceIcon","QuestionAnswerOutlineIcon","LibraryIcon","TextFieldsIcon","EditNoteIcon","HelpOutlineIcon","BackHandIcon","UNIT_VISIBILITY_STATES","ICON_COLOR_VARIANTS","PUBLISH_TYPES","republish","makePublic","getStudioHomeData","getLoadingStatuses","getSavingStatuses","getStudioHomeCoursesParams","text","part","idx","endIdx","highLightPart","otherPart","STRUCTURAL_TYPE_ICONS","Folder","navigate","useNavigate","libraryAuthoringMfeUrl","redirectToLibraryAuthoringMfe","usageKey","noRedirectUrl","getContextUrl","newWindow","contextKey","urlSuffix","blockType","getUnitUrlSuffix","libComponentUsageKey","encodedUsageKey","encodeURIComponent","getUnitComponentUrlSuffix","getCourseComponentUrlSuffix","getUrlSuffix","getLibraryHitUrl","navigateToContext","redirectUrl","location","direction","gap","onKeyDown","tabIndex","Article","Highlight","htmlContent","capaContent","bc","OpenInNew","newWindowUrl","SearchResults","labels","SearchResult","StatefulButton","SearchField","onClear","Input","autoFocus","ClearButton","SubmitButton","appliedFilters","setTarget","ref","iconAfter","ArrowDropDown","ModalPopup","positionRef","textAlign","textTransform","FilterByBlockType","sortedBlockTypeKeys","localeCompare","sortedBlockTypes","handleCheckboxChange","currentFilters","x","SearchFilterWidget","BlockTypeLabel","CheckboxSet","defaultValue","Menu","boxShadow","MenuItem","Checkbox","pill","TagMenuItem","tagCount","isChecked","onClickCheckbox","hasChildren","isExpanded","onToggleChildren","randomNumber","floor","random","checkboxId","htmlFor","ArrowDropUp","tagName","TagOptions","parentTagPath","tagSearchKeywords","expandedTags","toggleTagChildren","searchContext","args","mainQuery","facetName","depth","parentFilter","parentParts","maybeHasChildren","nextLevelFacet","preloadChildTagsData","searchForFacetValues","facetQuery","tags","facetHits","childFacetHits","t","tagsWithChildren","Set","has","mayBeMissingResults","fetchAvailableTagOptions","tagKeywordSearchData","trim","matches","attributesToSearchOn","attributesToRetrieve","tagSearchKeywordsLower","toLocaleLowerCase","tagPathList","from","fetchTagsThatMatchKeyword","matchingTag","useTagFilterOptions","tf","tp","Warning","FilterByTags","setTagSearchKeywords","setExpandedTags","tagWithLineage","currentList","submitButton","Stats","hasCourseId","_searchThisCourseEnabled","setSearchThisCourse","switchToThisCourse","switchToAllCourses","zIndex","SearchKeywordsField","SelectMenu","defaultSelected","Check","EmptyStates","isOverflowVisible","SearchUI","getContentMenuItems","studioBaseUrl","items","ENABLE_VIDEO_UPLOAD_PAGE_LINK_IN_CONTENT_DROPDOWN","getSettingMenuItems","getToolsMenuItems","ENABLE_TAGGING_TAXONOMY_PAGES","courseOrg","courseNumber","isHiddenMainMenu","isShowSearchModalOpen","openSearchModal","meiliSearchEnabled","MEILISEARCH_ENABLED","mainMenuDropdowns","buttonTitle","outlineLink","StudioHeader","org","number","searchButtonAction","SearchModal","fetchCourseDetail","username","course_id","normalizeCourseDetail","getCourseDetail","getAuthenticatedUser","administrator","Date","start","NotFoundAlert","AppHeader","CourseAuthoringPage","courseDetailStatus","inProgress","isEditor","StudioFooter","heading","viewLiveButton","errorShowingConfiguration","contentPermissions","applyButton","applyingButton","appliedButton","noProviderSwitchAfterCourseStarted","providerSelection","Incomplete","DiscussionsContext","DiscussionsProvider","contextValue","normalizeRestrictedDates","normalizeData","uuid","normalizePiiSharing","piiSharing","pii_sharing_allowed","piiShareUsername","piiShareEmail","normalizeAppConfig","provider_type","enableDivideByCohorts","always_divide_inline_discussions","division_scheme","enableDivideCourseTopicsByCohorts","divided_course_wide_discussions","allowAnonymousPosts","allow_anonymous","allowAnonymousPostsPeers","allow_anonymous_to_peers","reported_content_email_notifications","divisionScheme","alwaysDivideInlineDiscussions","restrictedDates","discussion_blackouts","allowDivisionByUnit","divideByCohorts","divideCourseTopicsByCohorts","available_division_schemes","groupAtSubsection","group_at_subsection","normalizePluginConfig","plugin_configuration","consumerKey","lti_1p1_client_key","consumerSecret","lti_1p1_client_secret","launchUrl","lti_1p1_launch_url","normalizeLtiConfig","lti_configuration","normalizeDiscussionTopic","extractDiscussionTopicIds","normalizeFeatures","apps","feature","app","supported","normalizeSettings","enable_in_context","enable_graded_units","unit_level_visibility","posting_restrictions","appConfig","piiConfig","discussion_topics","denormalizeRestrictedDate","restrictedPeriod","getDiscussionsSettingsUrl","updateDiscussionSettingsState","discussionSettings","fetchProviders","features","updateProviderState","getDiscussionsProvidersUrl","available","externalLinks","learnMore","external_links","learn_more","general","accessibility","contactEmail","contact_email","hasFullSupport","has_full_support","adminOnlyConfig","admin_only_config","active","normalizeProviders","getDiscussionsProviders","fetchDiscussionSettings","providerId","provider_id","getDiscussionsSettings","saveProviderConfig","drafts","successPath","pluginConfiguration","topics","currentTopic","newTopics","ltiConfiguration","pii_share_username","pii_share_email","version","apiData","context_key","denormalizeData","postDiscussionsSettings","supportedFeatures","noApps","nextButton","appFullSupport","appBasicSupport","hideDiscussionTab","hideDiscussionTabTitle","hideDiscussionTabMessage","hideDiscussionOkButton","hideDiscussionCancelButton","SupportedFeature","FeaturesList","AppCard","selected","isClickable","onKeyPress","appMessages","CheckboxControl","readOnly","appName","Section","Responsive","maxWidth","breakpoints","extraSmall","FeaturesTable","basic","partial","full","common","featureSupportType","createRow","appCheckmarkCells","replaceAll","Remove","DataTable","itemCount","columns","accessor","Table","AppListNextButton","discussionsPath","handleStartConfig","useCallback","AppList","discussionTabToggle","setDiscussionTabToggle","isGlobalStaff","ltiProvider","isOnSmallScreen","useWindowSize","width","medium","minWidth","showOneEdxProvider","handleSelectApp","updateSettings","enabledDiscussion","handleClose","handleOk","toggleVal","Switch","floatLabelLeft","labelClassName","CardGrid","columnSizes","filteredApps","small","isBlocking","IntlAppList","NextButton","SaveFormConnectionErrorAlert","AnonymousPostingFields","AppConfigFormDivider","ConfirmationPopup","bodyText","onConfirm","confirmLabel","cancelLabel","confirmVariant","confirmButtonClass","cancelButtonClass","sectionClasses","FieldFeedback","feedbackClasses","transitionClasses","errorCondition","feedbackCondition","feedbackMessage","RestrictDatesInput","fieldName","fieldClasses","formGroupClasses","fieldNameCommonBase","dataTestId","inFocus","setInFocus","isInvalidInput","handleFocusOut","handleSetFocus","floatingLabel","CollapseCardHeading","expandHeadingText","collapseHeadingText","badgeStatus","height","padding","lineHeight","DiscussionRestrictionItem","restrictedDate","restrictedDateError","showDeletePopup","setShowDeletePopup","collapseIsOpen","setCollapseOpen","setFieldTouched","handleToggle","handleOnClose","field","getHeading","handleShowDeletePopup","handleCancelDeletePopup","zone","RestrictionSchedules","validateForm","updatedRestrictedDates","newRestrictedDateItem","STATUS","onAddNewItem","Add","DiscussionRestriction","selectedRestrictionOption","setSelectedRestrictionOption","handleClick","handleConfirmation","discussionRestrictionButtons","restriction","selectedRestrictionMessage","ButtonGroup","toggle","TopicItem","isGeneralTopic","deleteTopicPopup","deleteDiscussionTopic","controlClassName","OpenedXConfigFormContext","createContext","OpenedXConfigFormProvider","isFormInvalid","discussionTopicErrors","validDiscussionTopics","validTopics","setValidDiscussionTopics","DiscussionTopics","handleOnFocus","currentValidTopics","allDiscussionTopics","allValidTopics","_createElement","topicIndex","topicId","handleTopicDelete","addNewTopic","DivisionByGroupFields","learningCourseURL","handleDivideCourseTopicsByCohortsToggle","handleCheckBoxToggle","ReportedContentEmailNotifications","thick","InContextDiscussionFields","showPopup","setShowPopup","OpenedXConfigForm","formRef","legacy","appConfigObj","discussionTopicsModel","legacyAppConfig","additionalFields","enabledGradedUnits","checkFormat","when","is","compare","uniqueObjectProperty","validateOnChange","restrictedDatesErrors","documentationPage","formInstructions","consumerKeyRequired","consumerSecretRequired","launchUrlRequired","staffOnlyConfigInfo","staffOnlyConfigGuide","contact","linkTextHeading","linkText","AppExternalLinks","providerName","customClasses","linkTypes","rel","link","MailtoLink","to","LtiConfigForm","ltiAppConfig","useFormik","isInvalidConsumerKey","isInvalidConsumerSecret","isInvalidLaunchUrl","showLTIConfig","supportEmails","Yellowdig","InScribe","Piazza","supportEmail","AppConfigFormContext","AppConfigFormProvider","AppConfigFormSaveButton","labelText","canSubmit","submitButtonState","handleSave","current","dispatchEvent","Event","cancelable","bubbles","complete","AppConfigForm","pagesAndResourcesPath","routeAppId","setLoading","confirmationDialogVisible","setConfirmationDialogVisible","form","alert","fontSize","IntlAppConfigForm","SaveButton","SELECTION_STEP","SETTINGS_STEP","DiscussionsSettings","startStep","currentStep","setCurrentStep","handleBack","FullscreenModal","Stepper","activeKey","modalBodyClassName","beforeBodyNode","eventKey","Step","PageSettingButton","legacyLink","allowedOperations","ArrowForward","enable","Settings","CoursePageShape","PageCard","settingButton","isDesktop","SettingButton","PageGrid","PluginSlot","PluginLoadFailedError","ErrorAlert","SettingsComponent","LazyLoadedComponent","catch","console","trace","getPageHeadTitle","courseOrSectionName","pageName","PagesAndResources","document","LEARNING_BASE_URL","contentPermissionsPages","separateAppId","splice","PagesAndResourcesProvider","Routes","Route","element","PageWrap","Suspense","fallback","EditorContainer","EditorPage","studioEndpointUrl","lmsEndpointUrl","VideoSelectorContainer","VideoSelectorPage","getTabHandlerUrl","errorAlertMessage","note","addPageHeaderLabel","viewLiveLabel","pageExplanationHeader","pageExplanationBody","customPagesExplanationHeader","customPagesExplanationBody","studentViewExplanationHeader","studentViewExplanationBody","studentViewExampleButton","studentViewModalTitle","studentViewModalBody","newPageTitle","editTooltipContent","deleteTooltipContent","visibilityTooltipContent","addPageBodyLabel","addingPageBodyLabel","deleteConfirmationTitle","deleteConfirmationMessage","deletePageLabel","deletingPageBodyLabel","cancelButtonLabel","CustomPagesContext","CustomPagesProvider","CustomPageCard","deletePageStatus","setCurrentPage","isDeleteConfirmationOpen","openDeleteConfirmation","closeDeleteConfirmation","customPagesPath","deletePageStateProps","icons","SpinnerSimple","disabledStates","Spacer","tooltipPlacement","EditOutline","handleEditOpen","courseStaffOnly","VisibilityOff","Visibility","toggleVisibility","metadata","pageData","htmlString","updateCustomPage","updateCustomPageVisibility","course_staff_only","DeleteOutline","handleDelete","closeConfirmation","deleteCustomPage","deleteSingleCustomPage","EditModal","pageId","position","top","left","right","bottom","returnFunction","CustomPages","orderedPages","setOrderedPages","getCustomPages","fetchCustomPages","addPageStatus","handleAddPage","courseBlockId","parent_locator","addCustomPage","locator","addSingleCustomPage","addPageStateProps","Placeholder","hideHeading","actionName","DraggableList","itemList","setState","updateOrder","handleReorder","newPageOrder","tabs","currentTab","tab_locator","updateCustomPageOrder","updatePageOrder","SortableItem","componentStyle","background","borderRadius","marginBottom","previewLmsStaticPages","handleEditClose","updateSingleCustomPage","getAssetsUrl","getAssets","nextPage","images","documents","audio","updateFileValues","updatedFiles","wrapperType","FILES_AND_UPLOAD_TYPE_FILTERS","contentType","dateAdded","locked","usageLocations","utcDateString","utcDateTime","toString","lockStatus","activeStatus","addAssetFile","isOverwrite","formData","FormData","append","addAsset","parsedAssets","thumbnailAltMessage","copyStudioUrlTitle","copyWebUrlTitle","dateAddedTitle","fileSizeTitle","studioUrlTitle","webUrlTitle","lockFileTitle","activeCheckboxLabel","inactiveCheckboxLabel","lockedCheckboxLabel","publicCheckboxLabel","codeCheckboxLabel","imageCheckboxLabel","documentCheckboxLabel","audioCheckboxLabel","otherCheckboxLabel","overwriteConfirmMessage","overwriteModalTitle","confirmOverwriteButtonLabel","cancelOverwriteButtonLabel","FilesPageContext","FilesPageProvider","rowStatusMessage","apiStatusToastMessage","apiStatusAddingAction","apiStatusDeletingAction","apiStatusDownloadingAction","fileSizeError","noResultsFoundMessage","addFilesButtonLabel","actionsButtonLabel","transcriptionErrorMessage","usageTitle","usageLoadingMessage","usageNotInUseMessage","copyVideoIdTitle","downloadTitle","lockMenuTitle","lockFileTooltipContent","unlockMenuTitle","infoTitle","downloadEncodingsTitle","deleteTitle","deleteConfirmationUsageMessage","deleteFileButtonLabel","sortButtonLabel","sortModalTitleLabel","sortByNameAscending","sortByNewest","sortBySizeDescending","sortByNameDescending","sortByOldest","sortBySizeAscending","applySortButton","failedLabel","FileMenu","externalUrl","handleLock","onDownload","openAssetInfo","portableUrl","Dropdown","Toggle","MoreHoriz","Item","clipboard","writeText","Divider","ThumbnailPreview","imageSize","thumbnailPreview","GalleryCard","original","handleBulkDownload","handleLockFile","handleOpenDeleteConfirmation","handleOpenFileInfo","lockFile","downloadLink","FileThumbnail","wordBreak","Truncate","lines","Chip","transcripts","ClosedCaption","sortByHeader","filterByHeader","clearAllButtonLabel","getCheckedFilters","allFilters","SortAndFilterModal","isSortOpen","closeSort","handleSort","setAllFilters","gotoPage","DataTableContext","filterOptions","allOptions","column","filterChoices","getFilterOptions","setSortBy","filterBy","set","clear","useCheckboxSetValues","updatedFilters","SelectableBox","log","isInline","handleClearAll","processFilters","filterableColumns","displayNameFilter","filterValue","matchingFilters","choice","TableActions","selectedFlatRows","fileInputControl","encodingsDownloadUrl","setInitialState","openSort","Tune","click","arrayOf","string","bool","func","getCurrentViewRange","filterRowCount","initialRowCount","fileCount","rowCount","FilterStatus","clearFiltersText","buttonClassName","setFilter","RowStatusComponent","getFilters","filterColumn","getFilterDisplayName","displayNames","searchValue","Close","iconAfterAlt","onIconAfterClick","removeFilter","editedFilter","currentFilter","updatedFilterValue","RowStatus","filteredRows","initialRows","pageOptions","pageCount","pageIndex","TableFooter","Pagination","paginationLabel","onPageSelect","pageNum","AccessColumn","row","OverlayTrigger","placement","overlay","Tooltip","Locked","LockOpen","ActiveColumn","pageLoadStatus","isNil","MoreInfoColumn","onEscapeKey","ASPECT_RATIO","TRANSCRIPT_FAILURE_STATUSES","VIDEO_SUCCESS_STATUSES","VIDEO_FAILURE_STATUSES","StatusColumn","isUploaded","isFailed","failedText","ThumbnailColumn","TranscriptColumn","transcriptionStatus","numOfTranscripts","transcriptMessage","Info","isNewFile","edxVideoId","clientVideoId","created","courseVideoImageUrl","getFormattedDuration","seconds","minutes","num","padStart","getSortedTranscripts","languages","transcriptDisplayNames","sortedTranscripts","sortedTranscriptCodes","getSupportedFormats","supportedFileFormats","supportedFormats","val","resampleFile","addVideoThumbnail","onload","imageAspectRatio","abs","hasValidDimensions","naturalWidth","naturalHeight","resampledFile","filename","canvas","createElement","getContext","heightRatio","cropLeft","cropTop","drawImage","canvasUrl","arr","bstr","atob","n","u8arr","Uint8Array","charCodeAt","File","createResampledFile","toDataURL","resampleImage","getLanguageOptions","checkCredentials","cielo24","cieloHasCredentials","threePlayHasCredentials","apiSecretKey","cielo24Fidelity","cielo24Turnaround","preferredLanguages","threePlayTurnaround","videoSourceLanguage","useFileInput","onAddFile","setSelectedRows","setAddOpen","addFile","FileInput","fileInput","hook","allowMultiple","multiple","UsageMetricsMessage","usageMessage","usagePathStatus","listStyle","displayLocation","ErrorOutline","InfoModal","sidebar","activeTab","setActiveTab","showTranscriptionError","minHeight","errorDescription","UsageMetricsMessages","ApiStatusToast","actionType","selectedRowCount","setClose","Toast","DeleteConfirmationModal","handleBulkDelete","selectedRows","firstSelectedRow","activeContentRows","isDeletingCourseContent","deletedCourseContent","fileNumber","FileTable","handleAddFile","handleDeleteFile","handleDownloadFile","handleUsagePaths","handleErrorReset","handleFileOrder","tableColumns","maxFileSize","infoModalSidebar","defaultVal","ceil","currentView","setCurrentView","isDeleteOpen","setDeleteOpen","setDeleteClose","isDownloadOpen","setDownloadOpen","setDownloadClose","isAssetInfoOpen","closeAssetinfo","isAddOpen","setAddClose","hiddenColumns","pageSize","selectedRowIds","usageErrorMessages","updatedRows","currentFile","updatedFile","uploads","sortType","newFileIdOrder","sortFiles","sortedFiles","f1","f2","lowerCaseF1","lowerCaseF2","sortedIds","errorType","moreInfoColumn","Cell","col","isFilterable","isSortable","isSelectable","isPaginated","defaultColumnValues","Filter","TextFilter","dataViewToggleOptions","isDataViewToggleEnabled","onDataViewToggle","defaultActiveStateValue","togglePlacement","tableActions","bulkActions","FilterStatusComponent","handleError","invalidSize","multipleDragged","TableControlBar","CardView","CardComponent","selectionPlacement","skeletonCardCount","EmptyTable","fileIds","EditFileErrors","resetErrors","addFileStatus","deleteFileStatus","updateFileStatus","InsertDriveFile","Terminal","AudioFile","getSrc","objectFit","maxHeight","FileInfoModalSidebar","handleLockedAsset","lockedState","setLockedState","FormattedDate","year","month","day","hour","minute","ContentCopy","InfoOutline","FileValidationModal","handleFileOverwrite","FilesPage","totalCount","remainingAssetCount","fetchAdditionalAssets","fetchAssets","addAssetStatus","deleteAssetStatus","updateAssetStatus","fileId","updateLockStatus","updateAssetLock","activeColumn","CheckboxFilter","accessColumn","fileSizeColumn","filenames","URLSearchParams","getAssetDetails","conflicts","newFiles","getUploadConflicts","filesToUpload","filesFound","validateAssetFiles","deleteAsset","deleteAssetFile","downloadErrors","zip","JSZip","folder","assetNames","definedAssets","allSettled","res","fetch","blob","assetBlob","generateAsync","saveAs","getDownload","fetchAssetDownload","usage_locations","getAssetUsagePaths","assetLocations","getUsagePaths","updateAssetOrder","FormDropdown","currentSelection","handleSelect","placeholderText","autoClose","overflow","textOverflow","overflowY","valueKey","transcriptSettingsTitle","invalidCielo24TranscriptionPlanMessage","invalid3PlayMediaTranscriptionPlanMessage","orderTranscriptsTitle","noneLabel","cieloLabel","threePlayMediaLabel","updateSettingsLabel","discardSettingsLabel","lastUpdatedMessage","threePlayMediaTurnaroundLabel","threePlayMediaTurnaroundPlaceholder","threePlayMediaSourceLanguageLabel","threePlayMediaSourceLanguagePlaceholder","threePlayMediaTranscriptLanguageLabel","threePlayMediaTranscriptLanguagePlaceholder","threePlayMediaCredentialMessage","threePlayMediaApiKeyLabel","threePlayMediaApiSecretLabel","cieloTurnaroundLabel","cieloTurnaroundPlaceholder","cieloFidelityLabel","cieloFidelityPlaceholder","cieloSourceLanguageLabel","cieloSourceLanguagePlaceholder","cieloTranscriptLanguageLabel","cieloTranscriptLanguagePlaceholder","cieloCredentialMessage","cieloApiKeyLabel","cieloUsernameLabel","Cielo24Form","hasTranscriptCredentials","setData","transcriptionPlan","fidelity","selectedLanguage","turnaroundOptions","turnaround","fidelityOptions","fidelities","getFidelityOptions","sourceLanguageOptions","ThreePlayMediaForm","selectedLanguages","sourceLangaugeOptions","translations","lang","updatedLangList","language","OrderTranscriptForm","setTranscriptType","transcriptType","closeTranscriptSettings","handleOrderTranscripts","transcriptionPlans","validCieloTranscriptionPlan","validThreePlayTranscriptionPlan","cieloIsValid","Cielo24","threePlayIsValid","checkTranscriptionPlans","isFormValid","handleUpdate","handleDiscard","modified","getVideosUrl","getCourseVideosApiUrl","sendVideoUploadStatus","ServerError","constructor","statusCode","super","fetchVideos","_await$getVideos","video_transcript_settings","videoTranscriptSettings","transcription_plans","getVideos","previousUploads","parsedVideos","allUsageLocations","apiPromises","updatedUsageLocations","getAllUsagePaths","imageUrl","addThumbnail","updateTranscriptCredentials","formFields","global","otherFields","postJson","api_secret_key","setTranscriptCredentials","camelCase","TranscriptSettings","isTranscriptSettingsOpen","isAiTranslationsEnabled","isAiTranslations","setIsAiTranslations","Sheet","blocking","ChevronLeft","noCredentials","deleteTranscriptPreferences","clearAutomatedTranscript","preferences","cielo24_fidelity","cielo24_turnaround","preferred_languages","video_source_language","three_play_turnaround","setTranscriptPreferences","updateTranscriptPreference","onOpen","ChevronRight","AITranslationsComponent","transcriptSettingsButtonLabel","transcribedCheckboxLabel","notTranscribedCheckboxLabel","processingCheckboxLabel","failedCheckboxLabel","videoUploadProgressBarLabel","videoUploadAlertLabel","VideosPageContext","VideosPageProvider","VideoThumbnail","handleAddThumbnail","videoImageSettings","thumbnailError","setThumbnailError","allowThumbnailUpload","videoImageUploadEnabled","addThumbnailMessage","supportedFiles","failedMessage","showThumbnail","onError","VideoFile","infoTabTitle","transcriptTabTitle","notificationScreenReaderText","videoLengthTitle","uploadButtonLabel","InfoTab","duration","LanguageSelect","previousSelection","deleteTranscript","replaceTranscript","downloadTranscript","languageSelectPlaceholder","cancelDeleteLabel","confirmDeleteLabel","deleteConfirmationHeader","TranscriptActionMenu","launchDeleteConfirmation","handleTranscript","input","Transcript","isConfirmationOpen","openConfirmation","newLanguage","setNewLanguage","TranscriptMenu","TranscriptTab","divRef","useRef","transcriptAvailableLanguages","transcriptDeleteHandlerUrl","transcriptUploadHandlerUrl","transcriptDownloadHandlerUrl","availableLanguages","languageCode","languageText","getLanguages","setPreviousSelection","updatedSelection","shift","apiUrl","updatedTranscripts","deleteVideoTranscript","Blob","downloadVideoTranscript","isReplacement","uploadTranscript","uploadVideoTranscript","handleAddEmptyTranscript","scrollTo","behavior","VideoInfoModalSidebar","Tabs","onSelect","tab","Tab","transcriptCount","notification","VideosPage","openTranscriptSettings","addVideoStatus","deleteVideoStatus","updateVideoStatus","uploadingIdsRef","onbeforeunload","markVideoUploadsInProgressAsFailed","isVideoTranscriptEnabled","videoUploadMaxFileSize","videoSupportedFileFormats","transcriptColumn","durationColumn","processingStatusColumn","uploadUrl","createUrlResponse","file_name","content_type","addVideo","stringify","putToServerResponse","uploadFile","method","headers","multipart","body","uploadVideo","fetchVideoList","newVideos","newVideoIds","concat","addVideoFile","deleteVideo","deleteVideoFile","downloadLinks","json","responseType","fetchVideoDownload","getVideoUsagePaths","updateVideoOrder","AlertProctoringError","proctoringErrorsData","deprecated","hideOnEnabledPublisher","offlineWarningTitle","offlineWarningDescription","offlineWarningTitleAriaLabelledBy","offlineWarningDescriptionAriaDescribedBy","InternetConnectionAlert","onQueryProcessing","onInternetConnectionFailed","fetchProctoringExamErrors","getProctoringExamErrors","getCourseAppSettings","getSendRequestErrors","developer_message","helpButtonText","SettingCard","settingData","setEdited","showSaveSettingsPrompt","saveSettingsPrompt","isEditableState","setIsEditableState","initialValue","newValue","setNewValue","hasArrow","dangerouslySetInnerHTML","__html","TextareaAutosize","handleCardBlur","prevEditedSettings","Status","oneOfType","about","aboutDescription1","aboutDescription2","otherCourseSettingsLinkToScheduleAndDetails","otherCourseSettingsLinkToGrading","otherCourseSettingsLinkToCourseTeam","otherCourseSettingsLinkToGroupConfigurations","otherCourseSettingsLinkToProctoredExamSettings","SettingsSidebar","notice","validateAdvancedSettingsData","settingObj","setErrorFields","setEditedSettings","fieldsWithErrors","targetSettingValue","firstNonWhite","quotedE","pushDataToErrorArray","prevState","headingTitle","headingSubtitle","policy","alertWarning","alertWarningDescriptions","alertSuccess","alertSuccessDescriptions","alertProctoringError","alertProctoringErrorDescriptions","buttonSaveText","buttonSavingText","buttonCancelText","deprecatedButtonShowText","deprecatedButtonHideText","alertWarningAriaLabelledby","alertWarningAriaDescribedby","alertSuccessAriaLabelledby","alertSuccessAriaDescribedby","alertProctoringAriaLabelledby","alertProctoringDescribedby","ModalErrorListItem","settingsData","modalErrorTitle","modalErrorButtonChangeManually","modalErrorButtonUndoChanges","ModalError","handleUndoChanges","showErrorModal","errorList","errorCounter","AdvancedSettings","showDeprecated","setShowDeprecated","errorModal","editedSettings","errorFields","showSuccessAlert","setShowSuccessAlert","setIsQueryPending","hasInternetConnectionError","setInternetConnectionError","sortedDisplayName","sortedSettingValues","advancedSettingsData","proctoringExamErrors","settingsWithSendErrors","updateSettingsButtonState","mfeProctoredExamSettingsUrl","setTimeout","handleResetSettingsValues","handleSettingBlur","CheckCircle","visibility","handleQueryProcessing","errorData","handleInternetConnectionFailed","handleUpdateAdvancedSettingsData","setToState","handleManuallyChangeClick","componentTitle","basicTabTitle","notGradedTypeOption","releaseDateAndTime","releaseDate","releaseTimeUTC","visibilityTabTitle","visibilitySectionTitle","unitVisibility","hideFromLearners","restrictAccessTo","sectionVisibilityWarning","unitVisibilityWarning","subsectionVisibilityWarning","unitSelectGroup","unitSelectGroupType","unitSelectDeletedGroupErrorMessage","unitAllLearnersAndStaff","gradeAs","dueDate","dueTimeUTC","subsectionVisibility","showEntireSubsection","showEntireSubsectionDescription","hideContentAfterDue","hideContentAfterDueDescription","hideEntireSubsection","hideEntireSubsectionDescription","assessmentResultsVisibility","alwaysShowAssessmentResults","alwaysShowAssessmentResultsDescription","neverShowAssessmentResults","neverShowAssessmentResultsDescription","showAssessmentResultsPastDue","showAssessmentResultsPastDueDescription","setSpecialExam","none","timed","timedDescription","proctoredExam","proctoredExamDescription","onboardingExam","onboardingExamDescription","practiceExam","practiceExamDescription","advancedTabTitle","timeAllotted","timeLimitDescription","prereqTitle","prereqCheckboxLabel","limitAccessTitle","limitAccessDescription","noPrerequisiteOption","prerequisiteSelectLabel","minScoreLabel","minCompletionLabel","minScoreError","minCompletionError","proctoredExamLockedAndisNotProctoredExamAlert","proctoredExamLockedAndisProctoredExamAlert","reviewRulesLabel","reviewRulesDescription","reviewRulesDescriptionWithLink","reviewRulesDescriptionLinkText","calendarAltText","datepickerUTC","DATEPICKER_TYPES","DatepickerControl","showUTC","readonly","controlName","inputFormat","Calendar","DatePicker","dateFormat","timeFormat","autoComplete","selectsStart","showTimeSelect","showTimeSelectOnly","toLocaleUpperCase","showPopperArrow","BasicTab","courseGraders","isSubsection","graderType","VisibilityTab","showWarning","visibilityTitle","isVisibleToStaffOnly","hideAfterDue","showCorrectness","RadioSet","Radio","PrereqSettings","prereqs","isPrereq","prereqUsageKey","prereqMinScore","prereqMinCompletion","prereqOption","blockUsageKey","blockDisplayName","trailingElement","AdvancedTab","releasedToStudents","wasExamEverLinkedWithExternal","supportsOnboarding","wasProctoredExam","showReviewRules","onlineProctoringRules","isTimeLimited","isProctoredExam","isOnboardingExam","isPracticeExam","defaultTimeLimitMinutes","examReviewRules","examTypeValue","timeLimit","setTimeLimit","hh","mm","hhs","mms","formatHour","showReviewRulesDiv","renderAlerts","proctoredExamLockedIn","validity","valid","asMinutes","pattern","rows","hyperlink","UnitTab","isXBlockComponent","userPartitionInfo","selectedPartitionIndex","selectedGroups","checkIsDeletedGroup","isGroupSelected","deleted","parseInt","selectablePartitions","partition","Field","scheme","selectedGroupsLabel","ConfigureModal","onConfigureSubmit","currentItemData","sectionStartDate","visibilityState","due","ancestorHasStaffLock","prereq","defaultPrereqScore","nullable","hideAfterDueState","integer","dialogTitle","renderModalBody","groupAccess","g","getOutlineIndexData","getStatusBarData","getSectionsList","getCurrentItem","getCurrentSection","getCurrentSubsection","getCourseActions","getCustomRelativeDatesActiveFlag","getProctoredExamsFlag","getPasteFileNotices","getErrors","newSectionButton","newSectionButtonTooltip","reindexButton","reindexButtonTooltip","expandAllButton","collapseAllButton","viewLiveButtonTooltip","HeaderNavigations","headerNavigationsActions","isReIndexShow","isSectionsExpanded","isDisabledReindexButton","hasSections","courseActions","handleNewSection","handleReIndex","handleExpandAll","lmsLink","ArrowUpIcon","ArrowDownIcon","section_1_title","section_1_descriptions_1","section_1_descriptions_2","section_2_title","section_2_descriptions_1","section_2_link","section_3_title","section_3_descriptions_1","section_3_link","section_4_title","section_4_descriptions_1","section_4_descriptions_2","section_4_descriptions_2_hide","section_4_descriptions_3","section_4_descriptions_3_hide","section_4_link","OutlineSideBar","learnMoreVisibilityUrl","learnMoreGradingUrl","outline","learnMoreOutlineUrl","sidebarMessages","getFormattedSidebarMessages","docsLinks","descriptions","hide","isLastSection","headerSubtitle","addTagsButtonText","loadingMessage","loadingTagsDropdownMessage","loadMoreTagsButtonText","noTagsFoundMessage","noTagsInTaxonomyMessage","taxonomyTagChecked","taxonomyTagUnchecked","taxonomyTagImplicit","taxonomyTagActionInstructionsAriaLabel","taxonomyTagActionsAriaLabel","taxonomyTagsAriaLabel","manageTagsButton","tagsSidebarTitle","collapsibleAddTagsPlaceholderText","collapsibleNoTagsAddedText","collapsibleAddStagedTagsButtonText","collapsibleCancelStagedTagsButtonText","collapsibleInlineAddStagedTagsButtonText","tagsDrawerCancelButtonText","tagsDrawerSaveButtonText","tagsDrawerCloseButtonText","tagsDrawerEditTagsButtonText","tagsSaveToastTextTypeAdded","tagsSaveToastTextTypeRemoved","tagsDeleteAltText","otherTagsHeader","otherTagsDescription","emptyDrawerContent","emptyDrawerContentLink","getContentTaxonomyTagsApiUrl","contentId","getContentTaxonomyTagsData","useContentTaxonomyTagsData","useContentTaxonomyTagsUpdater","queryClient","useQueryClient","useMutation","mutationFn","tagsData","updateContentTaxonomyTags","onSettled","contentPattern","invalidateQueries","onSuccess","contentData","postMessage","getContentTaxonomyTagsCountApiUrl","getContentTaxonomyTagsCount","HighlightedText","highlight","RegExp","ContentTagsDropDownSelector","taxonomyId","level","lineage","appliedContentTagsTree","stagedContentTagsTree","searchTerm","dropdownStates","setDropdownStates","tagValue","setNumPages","parentTagValue","decodeURIComponent","hasMorePages","tagPages","parentTag","searchParams","getTaxonomyTagsApiUrl","getTaxonomyTagsData","Infinity","dataPages","useQueries","preLoadedData","newTags","simplifiedTagsList","tag","parentValue","cachedData","next","previous","setQueryData","isSuccess","every","flatMap","useTaxonomyTagsData","prevSearchTerm","setPrevSearchTerm","expandAll","tagData","childCount","clickAndEnterHandler","isImplicit","appliedTraversal","isAppliedImplicit","explicit","stagedTraversal","isStagedImplicit","isApplied","isTopOfTagTreeDropdown","loadMoreTags","marginLeft","i","handleKeyBoardNav","keyPressed","currentElement","encapsulator","closest","tagValueWithLineage","querySelector","prevParentTagEncapsulator","parentNode","prevParentTag","focus","prevSubTags","previousElementSibling","querySelectorAll","prevSubTag","prevTag","subTagEncapsulator","nextSubTag","nextTag","nextElementSibling","nextParentTagEncapsulator","nextParentTag","tagState","isStagedExplicit","inputHidden","isIndeterminate","ContentTagsDrawerContext","stagedContentTags","globalStagedContentTags","globalStagedRemovedContentTags","addStagedContentTag","removeStagedContentTag","removeGlobalStagedContentTag","addRemovedContentTag","deleteRemovedContentTag","setStagedTags","setGlobalStagedContentTags","commitGlobalStagedTags","commitGlobalStagedTagsStatus","isContentDataLoaded","isContentTaxonomyTagsLoaded","isTaxonomyListLoaded","contentName","tagsByTaxonomy","isEditMode","toEditMode","toReadMode","collapsibleStates","openCollapsible","closeCollapsible","toastMessage","showToastAfterSave","closeToast","setCollapsibleToInitalState","otherTaxonomies","ContentTagsDrawerSheetContext","blockingSheet","setBlockingSheet","sortKeysAlphabetically","tree","sortedObj","TagComponent","canDelete","removeTagHandler","Tag","TagsTree","rootDepth","parentKey","tabsNumberArray","canDeleteObjecttag","CustomMenu","handleSelectableBoxChange","checkedTags","handleCommitStagedTags","handleCancelStagedTags","selectCancelRef","selectAddRef","selectProps","components","disableActionKeys","CustomLoadingIndicator","CustomIndicatorsContainer","selectInlineAddRef","IndicatorsContainer","onMouseDown","taxonomyAndTagsData","collapsibleState","canTagObject","selectInlineEditModeRef","selectRef","selectMenuIsOpen","setSelectMenuIsOpen","tagChangeHandler","removeAppliedTagHandler","contentTagsCount","commitStagedTagsToGlobal","updateTags","useContentTagsCollapsibleHelper","contentTags","setContentTagsCount","setStagedContentTagsTree","stagedTagsToRemove","setStagedTagsToRemove","globalTagsToRemove","setGlobalTagsToRemove","explicitStaged","leafTags","traverse","node","child","getLeafTags","globalTags","cloneDeep","newGlobalTags","stagedLineages","st","flat","applied","contentTagsCounter","resultTree","currentLevel","isExplicit","canChangeObjecttag","l","removeTags","tagsToRemove","staged","fullLineage","removedTags","traverseAndRemoveTags","subTree","innerTagsToRemove","toRemove","addTags","tagLineage","selectedTag","traversal","tagSelectableBoxValue","stagedTree","prevStagedContentTagsTree","updatedStagedContentTagsTree","setSearchTerm","handleSearch","debounce","term","handleSearchChange","handleStagedTagsMenuChange","stagedTags","t1","t2","unstagedTag","blur","onSelectMenuFocus","handleOnBlur","relatedTarget","cls","KeyboardArrowDown","KeyboardArrowUp","Select","styles","multiValueRemove","base","isFocused","color","menuIsOpen","focusedElement","shiftKey","inputRef","isMulti","isDisabled","isSearchable","classNamePrefix","onInputChange","LoadingIndicator","closeMenuOnSelect","blurInputOnSelect","iconBeforeAlt","makeUrl","k","v","ALL_TAXONOMIES","UNASSIGNED","apiUrls","taxonomyList","unassigned","exportTaxonomy","output_format","taxonomyTemplate","taxonomy","tagList","page_size","allSubtagsOf","full_depth_threshold","parent_tag","createTaxonomyFromImport","tagsImport","tagsPlanImport","getTaxonomyExportFile","taxonomyQueryKeys","all","taxonomyMetadata","taxonomyTagList","taxonomyTagListPage","taxonomyTagSubtagsList","importPlan","useTaxonomyList","api","useTaxonomyDetails","extractOrgFromContentId","setIsEditMode","setStagedContentTags","setGlobalStagedRemovedContentTags","setTagsByTaxonomy","setOtherTaxonomies","setColapsibleStates","setToastMessage","getLibraryContentDataApiUrl","getCourseContentDataApiURL","getXBlockContentDataApiURL","getContentData","useContentData","contentTaxonomyTagsData","taxonomyListData","fechedTaxonomies","fechedOtherTaxonomies","sortTaxonomies","taxonomiesList","taxonomiesWithData","tagsCountBytaxonomy","tax","contentTaxonomies","taxonomies","otherTaxonomiesList","contentTaxonomyTags","contentTaxonomy","canChangeTaxonomy","canDeleteTaxonomy","exportId","visibleToAuthors","addedTag","prevStagedContentTags","prevContentTags","tagsList","prevStates","openAllCollapsible","updatedState","countTags","tagsAddedList","tagsRemovedList","tagsAdded","curr","tagsRemoved","courseDisplayNameWithDefault","mergedTags","mergedOtherTaxonomies","fechedTags","mergedTagsArray","areChangesInTags","mutate","TaxonomyList","ContentTagsCollapsible","ContentTagsDrawer","context","useContentTagsDrawerContext","onCloseDrawer","handleEsc","selectableBoxOpen","ContentTagsDrawerSheet","showSheet","TagCount","renderContent","getOrganizationsUrl","getClipboardUrl","getOrganizations","getClipboard","useOrganizationListData","useContentTagsCount","getTagsCountApiUrl","getTagsCount","select","startDateTitle","pacingTypeTitle","pacingTypeSelfPaced","pacingTypeInstructorPaced","checklistTitle","checklistCompleted","highlightEmailsTitle","highlightEmailsButton","highlightEmailsEnabled","highlightEmailsLink","courseTagsTitle","courseManageTagsLink","videoSharingTitle","videoSharingLink","videoSharingPerVideoText","videoSharingAllOffText","videoSharingAllOnText","xmlns","viewBox","d","fill","getItemStatus","published","hasChanges","getItemStatusBorder","borderLeft","scrollToElement","alignWithTop","getBoundingClientRect","innerHeight","scrollIntoView","block","inline","getVideoSharingOptionText","StatusBarItem","StatusBar","openEnableHighlightsModal","handleVideoSharingOptionChange","courseReleaseDateObj","checkListTitle","contentHighlights","contentHighlightsUrl","socialSharing","socialSharingUrl","courseTagCount","isManageTagsDrawerOpen","openManageTagsDrawer","closeManageTagsDrawer","description_1","description_2","EnableHighlightsModal","onEnableHighlightsSubmit","useScrollToHashElement","elementWithHash","setElementWithHash","currentHash","hash","getElementById","history","expandTooltip","statusBadgeLive","statusBadgeGated","statusBadgePublishedNotLive","statusBadgeStaffOnly","statusBadgeDraft","statusBadgeUnpublishedChanges","altButtonEdit","menuPublish","menuConfigure","menuDuplicate","menuMoveUp","menuMoveDown","menuDelete","menuCopy","menuProctoringLinkText","proctoringLinkTooltip","discussionEnabledBadgeText","menuManageTags","StatusBadge","iconClassName","CardStatus","showDiscussionsEnabledBadge","badgeTitle","badgeIcon","getItemStatusBadgeContent","CheckCircleIcon","DraftIcon","CardHeader","cardId","onClickPublish","onClickConfigure","onClickMenuButton","onClickEdit","isFormOpen","closeForm","isDisabledEditField","onClickDelete","onClickDuplicate","onClickMoveUp","onClickMoveDown","onClickCopy","titleComponent","namePrefix","enableCopyPasteUnits","isVertical","isSequential","proctoringExamConfigurationLink","discussionEnabled","discussionsSettings","parentInfo","useSearchParams","titleValue","setTitleValue","cardHeaderRef","fullProctoringExamConfigurationLink","isDisabledPublish","contentTagCount","locatorId","providerType","graded","onEscape","dependency","handleEscapeClick","useEscapeClick","MoveVertIcon","externalLinkTitle","allowMoveUp","allowMoveDown","isDraggable","isDroppable","attributes","listeners","setNodeRef","transform","transition","isDragging","setActivatorNodeRef","useSortable","droppable","animateLayoutChanges","CSS","Translate","Col","DragIndicator","DragContext","activeId","overId","DragContextProvider","TitleButton","onTitleClick","titleTooltipMessage","ArrowRightIcon","unscheduledLabel","releasedLabel","scheduledLabel","practiceProctoredExam","timedExam","releaseStatusScreenReaderTitle","gradedAsScreenReaderLabel","ungradedText","dueLabel","customDueDateLabel","prerequisiteLabel","restrictedUnitAccess","restrictedUnitAccessToSomeContent","gradingPolicyMismatchText","hiddenAfterEndDate","hiddenAfterDueDate","ReleaseStatus","isInstructorPaced","explanatoryMessage","releaseLabel","ClockIcon","GradingPolicyAlert","gradingType","gradingPolicyMismatch","cg","GradingTypeAndDueDate","relativeWeeksDue","showRelativeWeeks","examValue","gradingTypeDiv","CheckIcon","dueDateDiv","selfPacedRelativeDueWeeksDiv","CalendarIcon","StatusMessages","staffOnlyMessage","hasPartitionGroupComponents","statusMessages","prereqDisplayName","GroupsIcon","HideAfterDueMessage","HideIcon","XBlockStatus","blockData","newSubsectionButton","sectionHighlightsBadge","SectionCard","canMoveItem","onOpenHighlightsModal","onOpenPublishModal","onOpenConfigureModal","onEditSectionSubmit","onOpenDeleteModal","onDuplicateSubmit","onNewSubsectionSubmit","onOrderChange","currentRef","isScrolledToElement","containsSearchResult","subsections","setIsExpanded","openForm","highlights","sectionActions","isHeaderVisible","sectionStatus","borderStyle","handleExpandContent","handleClickMenuButton","handleSectionMoveUp","handleSectionMoveDown","handleOpenHighlightsModal","Bubble","handleNewSubsectionSubmit","getCourseData","getCourseRerunData","getRedirectUrlObj","getPostErrors","getClipboardData","clipboardBroadcastChannel","BroadcastChannel","showPasteUnit","setShowPasteUnit","showPasteXBlock","setShowPasteXBlock","sharedClipboardData","setSharedClipboardData","refreshPasteButton","isPasteable","isPasteableXBlock","isPasteableUnit","onmessage","popoverContentText","pasteButtonWhatsInClipboardText","WhatsInClipboard","handlePopoverToggle","togglePopover","popoverElementRef","triggerElementRef","onMouseEnter","onMouseLeave","QuestionIcon","PasteButton","ContentCopyIcon","handlePasteXBlockComponent","stagedContent","PropsTypes","clipboardPropsTypes","sourceEditUrl","blockTypeDisplay","sourceContextTitle","PopoverContent","Popover","OpenInNewIcon","PasteComponent","showPopover","newUnitButton","pasteButton","SubsectionCard","getPossibleMoves","onNewUnitSubmit","onPasteClick","useCopyToClipboard","subsectionActions","moveUpDetails","moveDownDetails","subsectionStatus","handleSubsectionMoveUp","handleSubsectionMoveDown","handleNewButtonClick","handlePasteButtonClick","TitleLink","titleLink","UnitCard","getTitleLink","onCopyToClipboardClick","unitActions","unitStatus","handleUnitMoveUp","handleUnitMoveDown","handleCopyClick","documentationLink","HighlightsModal","currentHighlights","highlight_1","highlight_2","highlight_3","highlight_4","highlight_5","getHighlightsFormValues","documentation","maxLength","button","tooltip","onCreateNewSection","publishButton","PublishModal","onPublishSubmit","categoryName","grandChildren","grandChild","configurationErrorTitle","configurationErrorText","discussionNotificationText","discussionNotificationLearnMore","discussionNotificationFeedback","deprecationWarningTitle","deprecationWarningBlocksText","deprecationWarningDeprecatedBlockText","advancedSettingLinkText","deprecatedComponentName","proctoringErrorTitle","proctoringErrorText","proctoredSettingsLinkText","alertFailedGeneric","newFileAlertTitle","newFileAlertDesc","newFileAlertAction","errorFileAlertTitle","errorFileAlertDesc","conflictingFileAlertTitle","conflictingFileAlertDesc","serverErrorAlert","networkErrorAlert","PageAlerts","notificationDismissUrl","handleDismissNotification","discussionsIncontextFeedbackUrl","discussionsIncontextLearnmoreUrl","deprecatedBlocksInfo","advanceSettingsUrl","showConfigAlert","setShowConfigAlert","showDiscussionAlert","setShowDiscussionAlert","conflictingFiles","errorFiles","ENABLE_ASSETS_PAGE","dismissible","CampaignIcon","onDismiss","discussionNotification","InfoOutlineIcon","platformName","process","deprecationWarning","blocks","deprecatedEnabledBlockTypes","parentUrl","advancedSettingsMessages","renderApiErrors","desc","msgObj","ErrorIcon","errorFilesLen","errorFilesStr","conflictingFilesLen","conflictingFilesStr","newFilesLen","newFilesStr","dragHelpers","setBlockChildren","setBlockChild","insertChild","isBelowOverItem","over","rect","translated","moveSubsectionOver","prevCopy","activeSectionIdx","activeSubsectionIdx","overSectionIdx","newIndex","activeSection","overSection","moveUnitOver","activeUnitIdx","overSubsectionIdx","activeSubsection","overSubsection","moveSubsection","sectionIdx","currentIdx","newIdx","arrayMove","moveUnit","subsectionIdx","canMoveSection","sections","step","possibleSubsectionMoves","sectionIndex","fn","possibleUnitMoves","subsectionIndex","units","newSectionIndex","newSubsectionIndex","setSections","restoreSectionList","handleSectionDragAndDrop","handleSubsectionDragAndDrop","handleUnitDragAndDrop","prevContainerInfo","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","coordinateGetter","sortableKeyboardCoordinates","setActiveId","currentOverId","setCurrentOverId","findItemInfo","parentIndex","subIndex","unitIndex","grandParentIndex","grandParent","DndContext","modifiers","restrictToVerticalAxis","collisionDetection","droppableContainers","droppableRects","activeCategory","filteredContainers","container","closestCorners","onDragOver","activeInfo","overInfo","subsectionDragOver","overSectionIndex","modifier","prev","unitDragOver","overSubsectionIndex","onDragStart","onDragEnd","fetchOrganizationsQuery","fetchCourseRerunQuery","courseRerun","getCourseRerunUrl","getCourseRerun","updateCreateOrRerunCourseQuery","copyToClipboard","usage_key","updateClipboard","logError","hasDates","dates","hasStartDate","hasEndDate","getChecklistValidatedValue","updates","grades","assignments","proctoring","hasUpdate","healthValidators","hasGradingPolicy","sumOfWeights","toPrecision","isActivated","hasCertificate","hasAssignmentDeadlines","totalNumber","assignmentsWithDatesBeforeStart","assignmentsWithDatesAfterEnd","assignmentsWithOraDatesBeforeStart","assignmentsWithOraDatesAfterEnd","durations","median","numMobileEncoded","totalVisible","numWithOneBlockType","highlightsActiveForCourse","highlightsEnabled","numBlocks","hasProctoringEscalationEmail","getChecklistValues","filteredCheckList","hasCertificatesEnabled","hasHighlightsEnabled","needsProctoringEscalationEmail","getCourseOutlineIndexApiUrl","getCourseBlockApiUrl","formattedCourseId","getXBlockBaseApiUrl","getCourseItemApiUrl","getXBlockApiUrl","getCourseItem","setSectionOrderList","setCourseItemOrderList","getErrorDetails","errorInfo","request","fetchCourseOutlineIndexQuery","outlineIndex","getCourseOutlineIndex","initialUserClipboard","fetchCourseLaunchQuery","gradedOnly","validateOras","getCourseLaunchApiUrl","getCourseLaunch","filteredCourseLaunchChecks","isEnabled","getCourseLaunchChecklist","fetchCourseBestPracticesQuery","excludeGraded","getCourseBestPracticesApiUrl","getCourseBestPractices","filteredBestPracticesChecks","highlightsEnadled","getCourseBestPracticesChecklist","fetchCourseReindexQuery","reindexLink","getCourseReindexApiUrl","restartIndexingOnCourse","fetchCourseSectionQuery","sectionIds","configureCourseItemQuery","configureFn","deleteCourseItemQuery","deleteItemFn","deleteCourseItem","duplicateCourseItemQuery","duplicateFn","parentId","duplicate_source_locator","duplicateCourseItem","addNewCourseItemQuery","addItemFn","addNewCourseItem","setBlockOrderListQuery","blockIds","apiFn","restoreCallback","successCallback","useCourseOutline","genericSavingStatus","getGenericSavingStatus","isEnableHighlightsModalOpen","closeEnableHighlightsModal","setSectionsExpanded","setDisableReindexButton","isHighlightsModalOpen","openHighlightsModal","closeHighlightsModal","isPublishModalOpen","openPublishModal","closePublishModal","isConfigureModalOpen","openConfigureModal","closeConfigureModal","isSavingStatusFailed","handleNewSectionSubmit","getUnitUrl","ENABLE_UNIT_PAGE","openUnitPage","handleConfigureModalClose","handleEnableHighlightsSubmit","publish","highlights_enabled_for_messaging","enableCourseHighlightsEmails","enableCourseHighlightsEmailsQuery","handleHighlightsFormSubmit","dataToSend","updateCourseSectionHighlights","updateCourseSectionHighlightsQuery","handleConfigureItemSubmit","_len","arg","_key","startDatetime","visible_to_staff_only","configureCourseSection","configureCourseSectionQuery","defaultTimeLimitMin","hide_after_due","show_correctness","is_practice_exam","is_time_limited","is_proctored_enabled","exam_review_rules","default_time_limit_minutes","is_onboarding_exam","configureCourseSubsection","configureCourseSubsectionQuery","unitId","group_access","configureCourseUnit","configureCourseUnitQuery","handlePublishItemSubmit","publishCourseSection","handleEditSubmit","editItemDisplayName","editCourseItemQuery","isInternetConnectionAlertFailed","handleDeleteItemSubmit","deleteCourseSubsectionQuery","deleteCourseUnitQuery","handleDuplicateSectionSubmit","handleDuplicateSubsectionSubmit","handleDuplicateUnitSubmit","handleNewUnitSubmit","callback","videoSharingOption","video_sharing_options","setVideoSharingOption","setVideoSharingOptionQuery","handleCopyToClipboardClick","handlePasteClipboardClick","staged_content","pasteBlock","pasteClipboardContent","dismissNotification","sectionListIds","setSectionOrderListQuery","prevSectionId","subsectionListIds","setSubsectionOrderListQuery","unitListIds","setUnitOrderListQuery","alertSuccessTitle","alertSuccessDescription","exportTagsCreatingToastMessage","exportTagsSuccessToastMessage","exportTagsErrorToastMessage","CourseOutline","exportTags","statusText","createObjectURL","revokeObjectURL","getTagsExportFile","isShowProcessingNotification","deleteCategory","updateSectionOrderByIndex","currentIndex","prevSections","newSections","updateSubsectionOrderByIndex","moveDetails","sectionsCopy","newSubsections","updateUnitOrderByIndex","newUnits","SortableContext","strategy","verticalListSortingStrategy","getCourseDetailsApiUrl","fetchCourseDetailsQuery","detailsValues","getCourseDetails","updateCourseDetailsQuery","details","updateCourseDetails","fetchCourseSettingsQuery","settingsValues","getCourseSettingsApiUrl","getCourseSettings","getLoadingDetailsStatus","getLoadingSettingsStatus","SectionSubHeader","basicTitle","basicDescription","basicEmailIcon","courseOrganization","courseRun","basicBannerTitle","basicBannerText","basicPromotionButton","BasicSection","run","lmsLinkForAboutPage","marketingEnabled","courseDisplayName","showPageBanner","setShowPageBanner","emailSubject","emailBody","promotionTitle","smallText","courseBasicInfo","prefix","info","PageBanner","subject","EmailIcon","creditTitle","creditDescription","creditHelp","creditMinimumGrade","creditProctoredExam","creditVerification","creditNotFound","CreditSection","creditRequirements","CREDIT_REQUIREMENTS_TYPES","grade","reverification","requirements","creditRequirementsKeys","renderRequirementValue","requirementValue","displayValue","criteria","minGrade","renderCreditRequirements","creditRequirementsNamespace","min_grade","creditRequirementsPropTypes","detailsTitle","detailsDescription","dropdownLabel","dropdownHelpText","dropdownEmpty","DetailsSection","languageOptions","formattedLanguage","uploadImageHelpText","uploadImageFilesAndUploads","uploadImageEmpty","uploadImageIconAlt","uploadImageBodyFilled","uploadImageInputPlaceholder","CourseUploadImage","customHelpText","assetImagePath","imageNameField","assetImageField","identifierFieldText","showImageBodyText","customInputPlaceholder","handleChangeImageAsset","assetPath","imageName","cardImageTextBody","store","createStore","SUPPORTED_TEXT_EDITORS","expandable","Editor","connect","mapStateToProps","isLibrary","onEditorChange","TinyMceWidget","WysiwygEditor","editorType","editorRef","refReady","setEditorRef","prepareEditorRef","textValue","editorContentHtml","editor","bm","selection","getBookmark","existingContent","getContent","isEquivalentCodeQuotes","first","second","normalizeQuotes","isEquivalentCodeExtraSpaces","removeWhitespace","str","needToChange","setContent","moveToBookmark","initializeEditor","courseIntroductionVideoLabel","courseIntroductionVideoDelete","courseIntroductionVideoHelpText","courseIntroductionVideoPlaceholder","IntroductionVideo","introVideo","embedVideoUrl","frameBorder","allowFullScreen","extendedTitleLabel","extendedTitleHelpText","extendedTitleAriaLabel","extendedSubtitleLabel","extendedSubtitleHelpText","extendedSubtitleAriaLabel","extendedDurationLabel","extendedDurationHelpText","extendedDurationAriaLabel","extendedDescriptionLabel","extendedDescriptionHelpText","extendedDescriptionAriaLabel","ExtendedCourseDetails","paramsForExtendedFields","asTextarea","param","introducingTitle","introducingDescription","courseShortDescriptionLabel","courseShortDescriptionAriaLabel","courseShortDescriptionHelpText","courseOverviewLabel","courseOverviewHelpText","courseAboutHyperlink","courseAboutSidebarLabel","courseAboutSidebarHelpText","courseCardImageLabel","courseCardImageIdentifierText","courseBannerImageLabel","courseBannerImageInsertText","courseVideoThumbnailLabel","courseVideoThumbnailInsertText","IntroducingSection","overview","aboutSidebarHtml","shortDescription","aboutPageEditable","sidebarHtmlEnabled","courseImageAssetPath","bannerImageAssetPath","shortDescriptionEditable","enableExtendedCourseDetails","videoThumbnailImageAssetPath","overviewHelpText","aboutSidebarHelpText","pacingTitle","pacingDescription","pacingRestriction","pacingTypeInstructorLabel","pacingTypeInstructorDescription","pacingTypeSelfLabel","pacingTypeSelfDescription","PacingSection","selfPaced","canTogglePace","SCHEDULE_ROW_TYPES","ScheduleRow","errorFeedback","certificateBehaviorLabel","certificateBehaviorHelpText","certificateAvailableDateLabel","certificateDisplayBehaviorToggleTitle","certificateDisplayBehaviorToggleParagraph","certificateDisplayBehaviorToggleHeading1","certificateDisplayBehaviorToggleParagraph1","certificateDisplayBehaviorToggleHeading2","certificateDisplayBehaviorToggleParagraph2","certificateDisplayBehaviorToggleHeading3","certificateDisplayBehaviorToggleParagraph3","certificateBehaviorDropdownOption1","certificateBehaviorDropdownOption2","certificateBehaviorDropdownOption3","certificateBehaviorDropdownEmpty","CERTIFICATE_DISPLAY_BEHAVIOR","earlyNoInfo","end","endWithDate","CertificateDisplayRow","certificateAvailableDate","availableDateErrorFeedback","certificatesDisplayBehavior","displayBehaviorErrorFeedback","dropdownOptions","formattedCertificateBehavior","certificateDisplayValue","showAvailableDate","claswsName","handleOnChange","optionId","renderReadMoreToggle","readMore","paragraph","scheduleTitle","scheduleDescription","scheduleCourseStartDateLabel","scheduleCourseStartDateHelpText","scheduleCourseStartTimeLabel","scheduleCourseEndDateLabel","scheduleCourseEndDateHelpText","scheduleCourseEndTimeLabel","scheduleEnrollmentStartDateLabel","scheduleEnrollmentStartDateHelpText","scheduleEnrollmentStartTimeLabel","scheduleEnrollmentEndDateLabel","scheduleEnrollmentEndDateHelpText","scheduleEnrollmentEndDateRestrictedHelpText","scheduleEnrollmentEndTimeLabel","scheduleUpgradeDeadlineDateLabel","scheduleUpgradeDeadlineDateHelpText","scheduleUpgradeDeadlineTimeLabel","ScheduleSection","enrollmentEnd","enrollmentStart","upgradeDeadline","enrollmentEndEditable","canShowCertificateAvailableDateField","enrollmentEndHelpText","enrollmentEndHelpTexRestricted","computedEnrollmentEndHelpText","propsForScheduleFields","rowType","skip","fieldProps","restProps","_excluded2","outcomesTitle","outcomesDescription","outcomesDelete","outcomesAdd","outcomesInputPlaceholder","outcomesLabelIncrement","LearningOutcomesSection","learningInfo","renderLearningOutcomeItem","handleInputChange","updatedInfo","handleAdd","instructorNameLabel","instructorNameHelpText","instructorNameInputPlaceholder","instructorTitleLabel","instructorTitleHelpText","instructorTitleInputPlaceholder","instructorOrganizationLabel","instructorOrganizationHelpText","instructorOrganizationInputPlaceholder","instructorBioLabel","instructorBioHelpText","instructorBioInputPlaceholder","instructorPhotoLabel","instructorPhotoHelpText","instructorPhotoInputPlaceholder","instructorDelete","InstructorContainer","instructor","organization","bio","instructorsTitle","instructorsDescription","instructorAdd","InstructorsSection","instructors","newInstructor","updatedInstructors","updatedInstructorInfo","requirementsEntranceCollapseLabel","requirementsEntranceCollapseHelpText","GradeRequirements","errorEffort","entranceExamMinimumScorePct","requirementsEntrance","requirementsEntranceCollapseTitle","requirementsEntranceCollapseParagraph","requirementsEntranceCollapseHyperlink","EntranceExam","isCheckedString","showEntranceExam","courseOutlineDestination","toggleEntranceExam","requirementsTitle","requirementsDescription","timepickerLabel","timepickerHelpText","dropdownEmptyText","RequirementsSection","effort","preRequisiteCourses","entranceExamEnabled","isEntranceExamsEnabled","possiblePreRequisiteCourses","isPrerequisiteCoursesEnabled","selectedItem","course","courseKey","formattedSelectedItem","preRequisitesCourse","rerunLink","LICENSE_TYPE","allRightsReserved","creativeCommons","LICENSE_COMMONS_OPTIONS","attribution","nonCommercial","noDerivatives","shareAlike","condition","wrapper","allRightReservedLabel","creativeCommonsReservedLabel","LicenseIcons","licenseType","licenseDetails","licenseURL","ApplyWrapper","Copyright","Cc","Attribution","Nc","Nd","Sa","licenseDisplayLabel","licenseDisplayParagraph","LicenseDisplay","licenseChoice1","licenseChoice2","licenseTooltip1","licenseTooltip2","creativeCommonsURLParagraph","LicenseSelector","onChangeLicenseType","LICENSE_BUTTON_GROUP_LABELS","renderButton","licenseCreativeOptionsLabel","licenseCreativeOptionsHelpText","licenseCreativeOptionBYLabel","licenseCreativeOptionBYDescription","licenseCreativeOptionNCLabel","licenseCreativeOptionNCDescription","licenseCreativeOptionNDLabel","licenseCreativeOptionNDDescription","licenseCreativeOptionSALabel","licenseCreativeOptionSADescription","LicenseCommonsOptions","onToggleCheckbox","optionDetails","handleCheckboxClick","licenseTitle","licenseDescription","LicenseSection","license","handleToggleCheckbox","handleChangeLicenseType","useLicenseDetails","setLicenseType","setLicenseDetails","setLicenseURL","defaultLicenseDetails","prevLicenseDetails","updateLicense","orderedDetails","updatedString","toggledLicenseDetail","scheduleSidebarTitle","scheduleSidebarAbout","ScheduleSidebar","alertWarningOnSaveWithError","alertWarningDescriptionsOnSaveWithError","alertLoadFailAriaLabelledby","alertLoadFailAriaDescribedby","alertLoadFail","alertFailAriaLabelledby","alertFailAriaDescribedby","alertFail","errorMessage1","errorMessage2","errorMessage3","errorMessage4","errorMessage5","errorMessage6","errorMessage7","errorMessage8","isDateBeforeOrEqual","dateFormer","dateLatter","ScheduleAndDetails","isCreditCourse","licensingEnabled","creditEligibilityEnabled","showLoadFailedAlert","useLoadValuesPrompt","setShowLoadFailedAlert","editedValues","showModifiedAlert","showSuccessfulAlert","showFailedAlert","handleResetValues","handleValuesChange","handleUpdateValues","updateDataQuery","initialEditedData","setEditedValues","setShowSuccessfulAlert","setShowFailedAlert","setShowModifiedAlert","validateScheduleAndDetails","canShowCertificateAvailableDate","prevEditedValues","updateWithDefaultValues","useSaveValuesPrompt","instructorInfo","showCreditSection","showRequirementsSection","hasErrors","updateValuesButtonState","alertWhileSavingTitle","alertWhileSavingDescription","ErrorOutlineIcon","getGradingSettings","getCourseAssignmentLists","courseAssignmentLists","getGradingSettingsApiUrl","_objectWithoutPropertiesLoose","source","excluded","sourceKeys","sortNumList","linearInterpolator","getPercentageForValue","getValueForClientX","clientX","trackDims","addNewSegmentButtonAltText","removeSegmentButtonText","segmentFailGradingText","defaultPassText","MAXIMUM_SCALE_LENGTH","getLettersOnLongScale","letters","gradingSegments","getLettersOnShortScale","END_OF_SCALE_NAME","GradingScaleHandle","getHandleProps","cursor","display","GradingScaleTick","getTickProps","GradingScaleSegment","getSegmentProps","handleLetterChange","removeGradingSegment","DEFAULT_LETTERS","getDefaultPassText","GradingScale","showSavePrompt","gradeCutoffs","setGradingData","resetDataRef","gradeLetters","sortedGrades","setOverrideInternetConnectionAlert","setEligibleGrade","setGradingSegments","setLetters","convertedResult","setConvertedResult","gradingSegmentsValues","eligibleValue","prevData","convertGradeData","convertedData","gradingSegmentIndex","prevSegments","updatedSegments","removedSegment","previousSegment","prevLetters","updatedLetters","getTrackProps","ticks","segments","handles","activeHandleIndex","_ref$interpolator","interpolator","_ref$tickSize","tickSize","controlledTicks","steps","onDrag","stepSize","_React$useState","setActiveHandleIndex","_React$useState2","tempValues","setTempValues","getLatest","useGetLatest","trackElRef","getNextStep","nextIndex","nextVal","roundToStep","handleDrag","_getLatest","changedTouches","newRoundedValue","newValues","handleKeyDown","_getLatest2","_getLatest2$onChange","keyCode","handlePress","handleRelease","_getLatest3","_getLatest3$onChange","_getLatest3$onDrag","sortedValues","_temp","_ref2$key","_ref2$style","rest","_temp2","_ref3$key","_ref3$style","_temp3","_ref4$key","_onKeyDown","innerRef","_onMouseDown","_onTouchStart","onTouchStart","_ref4$style","persist","_temp4","_ref5$style","el","userSelect","useRanger","segment","segmentDataArray","updateGradingSegments","newGradingSegmentData","sortedSegments","previousValue","newSegmentValue","prevSegmentBoundary","nextSegmentBoundary","gradingSegment","upperBoundaryValue","lowerBoundaryValue","handleSegmentChange","addNewGradingSegment","firstSegment","secondSegment","newCurrentValue","newSegment","updatedSecondSegment","GradingScaleTicks","gradingSidebarTitle","gradingSidebarAbout1","gradingSidebarAbout2","gradingSidebarAbout3","GradingSidebar","policiesDescription","creditEligibilitySectionTitle","creditEligibilitySectionDescription","gradingRulesPoliciesSectionTitle","gradingRulesPoliciesSectionDescription","assignmentTypeSectionTitle","assignmentTypeSectionDescription","addNewAssignmentTypeBtn","DUPLICATE_ASSIGNMENT_NAME","ASSIGNMENT_TYPES","weight","minCount","dropCount","defaultAssignmentsPropTypes","shortLabel","updateAssignmentErrorList","assignmentName","assignmentId","setErrorList","setShowSavePrompt","assignmentValue","AssignmentItem","errorMsg","secondErrorMsg","gradeField","assignmentTypeNameTitle","assignmentTypeNameDescription","assignmentTypeNameErrorMessage1","assignmentTypeNameErrorMessage2","assignmentTypeNameErrorMessage3","abbreviationTitle","abbreviationDescription","weightOfTotalGradeTitle","weightOfTotalGradeDescription","weightOfTotalGradeErrorMessage","totalNumberTitle","totalNumberDescription","totalNumberErrorMessage","numberOfDroppableTitle","numberOfDroppableDescription","numberOfDroppableErrorMessage","numberOfDroppableSecondErrorMessage","assignmentAlertWarningTitle","assignmentAlertWarningDescription","assignmentAlertWarningUsageTitle","assignmentAlertWarningSuccess","assignmentDeleteButton","AssignmentTypeName","initialAssignmentName","AssignmentSection","handleRemoveAssignment","graders","handleAssignmentChange","inputType","inputValue","grader","validationAssignmentFields","assignmentType","weightOfTotalGrade","assignmentMinCount","assignmentDropCount","courseGradingTypes","courseAssignmentUsage","showDefinedCaseAlert","showNotDefinedCaseAlert","assignmentItem","creditEligibilityLabel","creditEligibilityDescription","creditEligibilityErrorMsg","eligibleGrade","minimumGradeCredit","setErrorEffort","formatTime","gracePeriodOnDeadlineLabel","gracePeriodOnDeadlineDescription","gracePeriodOnDeadlineErrorMsg","DeadlineSection","gracePeriod","timeStampValue","hours","newDeadlineValue","setNewDeadlineValue","setIsError","inputStr","timerValidation","GradingSettings","gradingSettingsData","courseSettingsData","showOverrideInternetConnectionAlert","gradingData","handleResetPageData","handleAddAssignment","useUpdateGradingData","uniqueId","uuidv4","gradeValues","cutoffs","sortedArray","getSortedGrades","useConvertGradeCutoffs","fetchGradingSettings","sendGradingSettings","sendGradingSetting","handleSendGradingSettingsData","addNewMemberButton","sidebarTitle","sidebarAbout_1","sidebarAbout_2","sidebarAbout_3","ownershipTitle","ownershipDescription","addAdminAccess","CourseTeamSideBar","isOwnershipHint","isShowInitialSidebar","strong","formTitle","formLabel","formPlaceholder","formHelperText","addUserButton","MODAL_TYPES","AddUserForm","AddTeamMember","onFormOpen","isButtonDisable","roleAdmin","roleStaff","roleYou","hint","addButton","removeButton","deleteUserButton","CourseTeamMember","userName","onChangeRole","currentUserEmail","isHideActions","isAllowActions","isAdminRole","badgeColor","deleteModalTitle","deleteModalMessage","deleteModalDeleteButton","deleteModalCancelButton","errorModalTitle","errorModalOkButton","warningModalTitle","warningModalMessage","warningModalReturnButton","modalType","currentEmail","closeButtonText","submitButtonText","closeButtonVariant","getInfoModalSettings","mainButtonVariant","isEmptyErrorMessage","getCourseTeamApiUrl","updateCourseTeamUserApiUrl","getCourseTeam","getCourseTeamUsers","getCourseTeamLoadingStatus","getIsAllowActions","getIsOwnershipHint","useCourseTeam","setModalType","isInfoModalOpen","openInfoModal","closeInfoModal","isFormVisible","hideForm","setCurrentEmail","courseTeamUsers","isSingleAdmin","handleOpenInfoModal","fetchCourseTeamQuery","isShowAddTeamMember","isShowUserFilledSidebar","handleAddUserSubmit","createTeamUser","createCourseTeamQuery","handleOpenDeleteModal","handleDeleteUserSubmit","deleteTeamUser","deleteCourseTeamQuery","handleChangeRoleUserSubmit","changeRoleTeamUser","changeRoleTeamUserQuery","CourseTeam","handoutsTitle","editButton","CourseHandouts","contentForHandouts","onEdit","isDisabledButtons","isDateForUpdateValid","parsedDate","CourseUpdate","dateForUpdate","contentForUpdate","deleteModalDescription","REQUEST_TYPES","updateFormDate","updateFormInValid","updateFormCalendarAltText","updateFormErrorAltText","addNewUpdateTitle","editUpdateTitle","editHandoutsTitle","postButton","UpdateForm","requestType","courseUpdatesInitialValues","isInnerForm","isFirstUpdate","currentContent","contentFieldName","geUpdateFormSettings","updatesValidationSchema","sectionInfo","newUpdateButton","getCourseUpdates","getCourseHandouts","getCourseUpdatesApiUrl","updateCourseUpdatesApiUrl","updateId","getCourseHandoutApiUrl","matchesAnyStatus","statuses","s","CourseUpdates","isMainFormOpen","isInnerFormOpen","isUpdateFormOpen","closeUpdateForm","handleUpdatesSubmit","handleOpenUpdateForm","handleOpenDeleteForm","handleDeleteUpdateSubmit","initialUpdate","utc","setRequestType","openUpdateForm","currentUpdate","setCurrentUpdate","dateWithoutTimezone","handleQuerySubmit","handler","createUpdate","editUpdate","editHandouts","deleteUpdate","useCourseUpdates","anyStatusFailed","anyStatusInProgress","anyStatusPending","getCourseUnitData","getCanEdit","getStaticFileNotices","getSequenceStatus","getSequenceIds","courseSequenceIds","getCourseSectionVertical","getCourseId","getSequenceId","getCourseVerticalChildren","getIsLoading","createSelector","AddComponentIcon","AddComponentButton","ModalContainer","btnText","hasValue","resetDisabled","StandardModal","ComponentModalView","modalParams","handleCreateNewXBlock","moduleTitle","setModuleTitle","templates","supportLegend","supportLabels","fs","addComponentMessages","ps","us","getXBlockSupportMessages","componentTemplate","boilerplateName","isDisplaySupportLabel","showLegend","supportLevel","allowUnsupportedXblocks","documentationLabel","AddComponent","handleCreateNewCourseXBlock","isOpenAdvanced","openAdvanced","closeAdvanced","isOpenHtml","openHtml","closeHtml","isOpenOpenAssessment","openOpenAssessment","closeOpenAssessment","componentTemplates","moduleName","boilerplate","blockAltButtonEdit","blockActionsDropdownAlt","blockLabelButtonCopy","blockLabelButtonDuplicate","blockLabelButtonMove","blockLabelButtonCopyToClipboard","blockLabelButtonManageAccess","blockLabelButtonDelete","visibilityMessage","validationSummary","MESSAGE_ERROR_TYPES","warning","XBlockMessages","validationMessages","getMessagesBlockType","alertVariant","alertIcon","InfoIcon","CourseXBlock","unitXBlockActions","handleConfigureSubmit","courseXBlockElementRef","handleEdit","handleDuplicate","ariaLabelButtonEdit","altButtonSettings","definedVisibilityMessage","commonVisibilityMessage","HeaderTitle","unitTitle","handleTitleEdit","handleTitleEditSubmit","SettingsIcon","getVisibilityMessage","altIconChevron","Breadcrumbs","ancestorXblocks","ArrowDropDownIcon","ChevronRightIcon","previewButton","handleViewLive","handlePreview","invisibleStyle","pointerEvents","useIndexOfLastVisibleChild","containerElementRef","overflowElementRef","containingRectRef","indexOfLastVisibleChild","setIndexOfLastVisibleChild","windowSize","useLayoutEffect","containingRect","childNodesArr","prototype","call","nextIndexOfLastVisibleChild","childNode","sumWidth","prevBtnText","nextBtnText","newUnitBtnText","sequenceNavLabelText","sequenceLoadFailure","sequenceNoContent","sequenceDropdownTitle","pasteAsNewUnitLink","UnitIcon","UnitButton","showTitle","SequenceNavigationDropdown","unitIds","handleAddNewSequenceUnit","handlePasteNewSequenceUnit","buttonUnitId","PlusIcon","ContentPasteGoIcon","SequenceNavigationTabs","containerRef","shouldDisplayDropdown","SequenceNavigation","isFirstUnit","isLastUnit","nextLink","previousLink","currentSequenceId","currentUnitId","nextUrl","prevUrl","sequence","sequenceIds","sequenceIndex","nextSequenceId","previousSequenceId","previousIndex","useSequenceNavigationMetadata","shouldDisplayNotificationTriggerInSequence","renderPreviousButton","prevArrow","isRtl","getLocale","ChevronLeftIcon","flexBasis","borderBottom","renderNextButton","nextArrow","Sequence","defaultContent","Sidebar","updateXBlockBlockIdToId","updatedData","getCourseUnitApiUrl","getCourseSectionVerticalApiUrl","getCourseVerticalChildrenApiUrl","postXBlockBaseApiUrl","getCourseSectionVerticalData","subsectionLocation","xblock","xblockInfo","ancestorInfo","ancestors","bookmarked","xblockType","containsContentTypeGatedContent","contains_content_type_gated_content","normalizeCourseSectionVerticalData","camelCaseData","editCourseUnitVisibilityAndData","isVisible","isModalView","getNotificationMessage","notificationMessage","handleCourseUnitVisibilityAndData","courseVerticalChildrenData","useCourseUnit","draftPreviewLink","publishedPreviewLink","currentlyVisibleToStudents","canPasteComponent","XBlockId","xblockId","deleteUnitItem","userClipboard","duplicateUnitItem","fetchCourseUnitQuery","courseSectionVerticalData","localStorage","getItem","removeItem","fetchCourseSectionVerticalData","handleNavigate","editUnitDisplayName","createCourseXblock","formattedResult","setItem","currentBlockId","createNewCourseXBlock","closeModalFn","handleXBlockDragAndDrop","xblockListIds","setXBlockOrderList","setXBlockOrderListQuery","alertUnpublishedVersion","pasteButtonText","getPublishInfo","editedBy","editedOn","publishedBy","publishedOn","publishInfoText","getVisibilityTitle","releaseStatus","release","released","scheduled","getUnitReleaseStatus","locationId","extractCourseUnitId","visibleToStaffOnly","titleMessages","releaseLabels","SidebarHeader","displayUnitLocation","iconSrc","colorVariant","getIconVariant","iconVariants","publishedNoChanges","CheckCircleOutlineIcon","publishedWithChanges","svgAttrs","ReleaseInfoComponent","releaseDateFrom","releaseInfo","getReleaseInfo","isScheduled","sectionNameMessage","sectionName","SidebarBody","UnitVisibilityInfo","openVisibleModal","staffLockFrom","hasExplicitStaffLock","handleCourseUnitVisibility","ActionButtons","openDiscardModal","handlePublishing","SidebarFooter","orientation","ModalNotification","handleAction","cancelButtonText","actionButtonText","PublishControls","useCourseUnitData","isDiscardModalOpen","closeDiscardModal","isVisibleModalOpen","closeVisibleModal","handleCourseUnitPublish","handleCourseUnitDiscardChanges","LocationInfo","TagsSidebarHeader","isContentTagsCountLoaded","TagsSidebarBody","showManageTags","setShowManageTags","buildTagsTree","iconWhenClosed","iconWhenOpen","TagsSidebarControls","FILE_LIST_DEFAULT_VALUE","initialNotificationAlertsState","conflictingFilesAlert","errorFilesAlert","newFilesAlert","FileList","fileList","AlertContent","ActionButton","getAlertStatus","alertKey","alertState","hasConflictingErrorsTitle","hasConflictingErrorsDescription","hasConflictingErrorsButtonText","hasErrorsTitle","hasErrorsDescription","hasNewFilesTitle","hasNewFilesDescription","hasNewFilesButtonText","PastNotificationAlert","notificationAlerts","toggleNotificationAlerts","hasConflictingErrors","hasErrorFiles","hasNewFiles","handleCloseNotificationAlert","prevAlerts","CourseUnit","initialXBlocksData","unitXBlocks","setUnitXBlocks","PasteNotificationAlert","finalizeXBlockOrder","newXBlocks","xBlock","getCertificates","getHasCertificateModes","hasCertificateModes","getCourseModes","courseModes","getCertificateActivationUrl","certificateActivationHandlerUrl","getCertificateWebViewUrl","certificateWebViewUrl","getIsCertificateActive","getComponentMode","getCourseNumber","getCourseNumberOverride","courseNumberOverride","getCourseTitle","prepareCertificatePayload","editing","signatories","signatory","signatorySnakeCase","certificate","getCertificatesApiUrl","getCertificateApiUrl","getUpdateCertificateApiUrl","certificateId","fetchCertificates","updateCourseCertificate","certificatesValues","certificateData","updateCertificate","deleteCourseCertificate","deleteCertificate","updateCertificateActiveStatus","activationStatus","is_active","getUpdateCertificateActiveStatusApiUrl","updateActiveStatus","headingTitleTabText","headingActionsPreview","headingActionsDeactivate","headingActionsActivate","noCertificatesText","setupCertificateBtn","withoutModesText","cardCreate","cardCancel","deleteTooltip","editTooltip","saveTooltip","CertificateSection","detailsSectionTitle","detailsCourseTitle","detailsCourseTitleOverride","detailsCourseTitleOverrideDescription","detailsCourseNumber","detailsCourseNumberOverride","deleteCertificateConfirmationTitle","deleteCertificateMessage","editCertificateConfirmationTitle","editCertificateMessage","CertificateDetails","courseTitleOverride","isConfirmOpen","confirmOpen","confirmClose","isEditModalOpen","editModalOpen","editModalClose","isCertificateActive","handleEditAll","handleDeleteCard","useCertificateDetails","EditOutlineIcon","commonMessages","DeleteOutlineIcon","signatoryTitle","signatoriesRecommendation","signatoriesSectionTitle","addSignatoryButton","addSignatoryButtonDescription","nameLabel","namePlaceholder","nameDescription","titleLabel","titlePlaceholder","titleDescription","organizationLabel","organizationPlaceholder","organizationDescription","imageLabel","imagePlaceholder","imageDescription","uploadImageButton","uploadModalReplace","deleteSignatoryConfirmation","deleteSignatoryConfirmationMessage","Signatory","signatureImagePath","SignatoryForm","isEdit","showDeleteButton","handleDeleteSignatory","handleCancelUpdateSignatory","feedback","uploadReplaceText","uploadText","FormLabel","newImagePath","CertificateSignatories","isForm","editModes","initialSignatoriesValues","setEditModes","toggleEditSignatory","newEditModes","signatoryInitialValues","fieldKey","useEditSignatory","handleAddSignatory","useCreateSignatory","defaultCertificate","CertificatesList","useCertificatesList","CertificateDetailsForm","handleCertificateSubmit","signatoriesWithoutIds","certificateValues","createCertificate","createCourseCertificate","handleFormCancel","resetForm","CertificateCreateForm","useCertificateCreateForm","handleCertificateDelete","signatoriesWithoutLocalIds","handleCertificateUpdateCancel","CertificateEditForm","useCertificateEditForm","getSidebarData","workingWithCertificatesTitle","paragraphs","workingWithCertificatesFirstParagraph","workingWithCertificatesSecondParagraph","strongText","workingWithCertificatesSecondParagraph_strong","workingWithCertificatesThirdParagraph","workingWithCertificatesThirdParagraph_strong","issuingCertificatesTitle","issuingCertificatesFirstParagraph","issuingCertificatesFirstParagraph_strong","issuingCertificatesSecondParagraph","issuingCertificatesSecondParagraph_strong","SidebarBlock","isLast","learnMoreBtn","CertificatesSidebar","learnMoreCertificates","HeaderButtons","dropdowmItem","setDropdowmItem","handleActivationStatus","useHeaderButtons","origin","DropdownButton","mode","MainLayout","showHeaderButtons","useLayout","MODE_COMPONENTS","CertificateWithoutModes","EmptyCertificatesWithModes","handleCreateMode","Certificates","pageHeadTitle","useCertificates","ModeComponent","pageTitle","description1","description2","titleUnderButton","title1","exportedContent","exportedContentHeading","content1","content2","content3","content4","content5","notExportedContent","content6","content7","openDownloadFile","openDownloadFileDescription","learnMoreButtonTitle","ExportSidebar","exportCourse","exportLearnMoreUrl","studioShortName","STUDIO_SHORT_NAME","getExportTriggered","getCurrentStage","getDownloadPath","getSuccessDate","getError","getIsErrorModalOpen","LAST_EXPORT_COOKIE_NAME","EXPORT_STAGES","setExportCookie","completed","Cookies","startExportingCourse","exportData","postExportCourseApiUrl","startCourseExporting","exportStatus","valueOf","fetchExportStatus","exportOutput","exportError","getExportStatusApiUrl","getExportStatus","cookieData","setExportDate","rawErrorMsg","errorUnitUrl","editUnitUrl","errorTitle","errorDescriptionNotUnit","errorDescriptionUnit","errorCancelButtonUnit","errorCancelButtonNotUnit","errorActionButtonNotUnit","errorActionButtonUnit","ExportModalError","unitErrorUrl","handleUnitRedirect","handleRedirectCourseHome","exportedDataTitle","exportedDataItem1","exportedDataItem2","exportedDataItem3","exportedDataItem4","exportedDataItem5","exportedDataItem6","exportedDataItem7","notExportedDataTitle","notExportedDataItem1","notExportedDataItem2","notExportedDataItem3","notExportedDataItem4","ExportFooter","CourseStepper","percent","stepIcon","isPercentShow","isErrorMessageShow","isActiveClass","isDoneClass","isErrorClass","lastStepIndex","isActiveStep","isLastStep","isErrorStep","isLastStepDone","SuccessIcon","getStepperSettings","done","stepperPreparingTitle","stepperExportingTitle","stepperCompressingTitle","stepperSuccessTitle","stepperPreparingDescription","stepperExportingDescription","stepperCompressingDescription","stepperSuccessDescription","downloadCourseButtonTitle","stepperHeaderTitle","ExportStepper","isStopFetching","setInterval","clearInterval","successTitle","localizedSuccessDate","CourseExportPage","cookies","isShowExportButton","anyRequestFailed","anyRequestInProgress","siteName","ArrowCircleDownIcon","LAST_IMPORT_COOKIE_NAME","setImportCookie","startCourseImporting","requestConfig","chunkSize","chunkLength","resp","upload","stop","postImportCourseApiUrl","trunc","chunkUpload","fetchImportStatus","importStatus","getImportStatusApiUrl","getImportStatus","getProgress","getImportTriggered","getFileName","stepperUploadingTitle","stepperUnpackingTitle","stepperVerifyingTitle","stepperUpdatingTitle","stepperUploadingDescription","stepperUnpackingDescription","stepperVerifyingDescription","stepperUpdatingDescription","viewOutlineButton","defaultErrorMessage","ImportStepper","formattedErrorMessage","handleRedirectCourseOutline","importedContent","importedContentHeading","notImportedContent","ImportSidebar","importCourse","importLearnMoreUrl","fileChosen","FileSection","isShowedDropzone","handleProcessUpload","description3","CourseImportPage","launchChecklistLabel","bestPracticesChecklistLabel","launchChecklistLoadingLabel","launchChecklistDoneLoadingLabel","bestPracticesChecklistLoadingLabel","bestPracticesChecklistDoneLoadingLabel","AriaLiveRegion","isCourseLaunchChecklistLoading","isCourseBestPracticeChecklistLoading","enableQuality","courseLaunchLoadingMessage","courseBestPracticesLoadingMessage","welcomeMessageShortDescription","welcomeMessageLongDescription","gradingPolicyShortDescription","gradingPolicyLongDescription","gradingPolicyComment","certificateShortDescription","certificateLongDescription","courseDatesShortDescription","courseDatesLongDescription","assignmentDeadlinesShortDescription","assignmentDeadlinesLongDescription","assignmentDeadlinesComment","videoDurationShortDescription","videoDurationLongDescription","mobileFriendlyVideoShortDescription","mobileFriendlyVideoLongDescription","diverseSequencesShortDescription","diverseSequencesLongDescription","weeklyHighlightsShortDescription","weeklyHighlightsLongDescription","unitDepthShortDescription","unitDepthLongDescription","proctoringEmailShortDescription","proctoringEmailLongDescription","updateLinkLabel","completionCountLabel","completedItemLabel","uncompletedItemLabel","checklistItems","launchChecklist","bestPracticesChecklist","useChecklistState","dataList","checklistState","setChecklistState","checks","totalCompletedChecks","updateChecklistState","getFilteredChecklist","check","getValidatedValue","getCompletionCount","totalChecks","ChecklistItemBody","checkId","isCompleted","updateLink","RadioButtonUnchecked","ChecklistItemComment","outlineUrl","commentWrapper","comment","ModeComment","showGradingCommentSection","weightSumPercentage","FormattedNumber","maximumFractionDigits","minimumFractionDigits","showDeadlinesCommentSection","allGradedAssignmentsOutsideDateRange","assignmentsMap","assignment","gradedAssignmentsOutsideDateRange","ChecklistSection","dataHeading","idPrefix","updateLinks","numWithDatesBeforeEnd","numWithDates","numWithDatesAfterStart","is_self_paced","hasProctoringEscalation_email","welcomeMessage","gradingPolicy","courseDates","proctoringEmail","CourseChecklist","ENABLE_CHECKLIST_QUALITY","getUpdateLinks","bestPracticeChecklistLoadingStatus","launchChecklistLoadingStatus","containsGroups","notInUse","usedInLocations","availableGroupPropTypes","usage","parameters","experimentalTitle","experimentalButton","onCreateNewGroup","isExperiment","titleMessage","buttonMessage","formatUrlToUnitPage","getGroupsCountMessage","len","getUsageCountMessage","getCombinedBadgeList","titleId","accessTo","experimentAccessTo","badge","UsageList","usageDescription","renderValidationMessage","validation","addNewGroup","newGroupHeader","newGroupInputPlaceholder","invalidMessage","createButton","requiredError","alertGroupInUsage","deleteRestriction","emptyContentGroups","actionEdit","actionDelete","subtitleModalDelete","ContentGroupForm","groupNames","isUsedInLocation","overrideValue","onCreateClick","onCancelClick","onEditClick","newGroupName","isAlreadyExistsGroup","onSubmitForm","WarningFilledIcon","ContentGroupCard","contentGroupActions","handleEditGroup","switchOnEditMode","switchOffEditMode","isOpenDeleteModal","outlineComponentLink","guideHowToAdd","handleDeleteGroup","handleCreate","ContentGroupsSection","availableGroup","isNewGroupVisible","openNewGroup","hideNewGroup","handleEditContentGroup","callbackToClose","updatedContentGroups","groupName","initialExperimentConfiguration","getGroupPercentage","totalGroups","experimentConfigurationName","experimentConfigurationId","experimentConfigurationNameFeedback","experimentConfigurationNamePlaceholder","experimentConfigurationNameRequired","experimentConfigurationDescription","experimentConfigurationDescriptionFeedback","experimentConfigurationDescriptionPlaceholder","experimentConfigurationGroups","experimentConfigurationGroupsFeedback","experimentConfigurationGroupsNameRequired","experimentConfigurationGroupsNameUnique","experimentConfigurationGroupsRequired","experimentConfigurationGroupsTooltip","experimentConfigurationGroupsAdd","experimentConfigurationDeleteRestriction","experimentConfigurationCancel","experimentConfigurationSave","experimentConfigurationCreate","experimentConfigurationAlert","emptyExperimentGroup","ExperimentFormGroups","onDeleteGroup","onCreateGroup","percentage","arrayErrors","stringError","getFormGroupErrors","CloseIcon","groupFieldName","existingGroupNames","counter","tempIndex","ALPHABET_LETTERS","getNextGroupName","experimentFormValidationSchema","allGroupNamesAreUnique","ExperimentForm","newGroup","ExperimentCardGroup","ExperimentCard","experimentConfigurationActions","isExpandedByDefault","onCreate","groupsControl","configurationGroupsWithIndexField","handleDeleteConfiguration","ExperimentConfigurationsSection","availableGroups","isNewConfigurationVisible","openNewConfiguration","hideNewConfiguration","handleCreateConfiguration","EnrollmentTrackGroupsSection","aboutTitle","aboutDescription_1","aboutDescription_2","aboutDescription_3","aboutDescription_3_strong","about_2_title","about_2_description_1","about_2_description_2","about_2_description_2_strong","about_3_title","about_3_description_1","about_3_description_2","about_3_description_3","aboutDescription_strong_edit","GroupConfigurationSidebar","shouldShowExperimentGroups","shouldShowContentGroup","shouldShowEnrollmentTrackGroup","sidebarData","urlKey","strongText2","Fragment","getGroupConfigurationsData","getLegacyApiUrl","fetchGroupConfigurationsQuery","getContentStoreApiUrl","getGroupConfigurations","GroupConfigurations","shouldShowEnrollmentTrack","createContentGroup","createContentGroupQuery","editContentGroup","editContentGroupQuery","deleteContentGroup","deleteContentGroupQuery","newConfiguration","createExperimentConfiguration","createExperimentConfigurationQuery","editedConfiguration","editExperimentConfiguration","editExperimentConfigurationQuery","deleteExperimentConfiguration","deleteExperimentConfigurationQuery","useGroupConfigurations","enrollmentTrackGroup","contentGroup","CourseAuthoringRoutes","Navigate","Head","SITE_NAME","FAVICON_URL","aboutDescription","studioHomeLinkToGettingStarted","sidebarHeader2","sidebarDescription2","sidebarDescription2MailTo","sidebarHeader3","sidebarDescription3","sidebarHeader4","sidebarDescription4","sidebarDescription4MailTo","HomeSidebar","studioName","studioRequestEmail","techSupportEmail","courseCreatorStatus","home","aboutHomeLink","isShowMailToGetInstruction","isShowUnrequestedInstruction","isShowDeniedInstruction","mailTo","coursesTabTitle","courseTabErrorMessage","coursesPaginationInfo","librariesTabErrorMessage","librariesTabTitle","archivedTabTitle","archiveTabErrorMessage","coursesTabCourseNotFoundAlertTitle","coursesTabCourseNotFoundAlertMessage","coursesTabCourseNotFoundAlertCleanFiltersButton","taxonomiesTabTitle","addNewCourseBtnText","addNewLibraryBtnText","homePageLoadFailedMessage","emailStaffBtnText","defaultSection_1_Title","defaultSection_1_Description","defaultSection_2_Title","defaultSection_2_Description","btnAddNewCourseText","btnReRunText","viewLiveBtnText","organizationTitle","organizationSubmitBtnText","organizationInputPlaceholder","organizationInputNoOptions","trimSlashes","CardItem","isLibraries","allowCourseReruns","rerunCreatorStatus","readOnlyItem","showActions","isShowRerunLink","hasDisplayName","sortAlphabeticallyArray","firstArrayData","secondArrayData","LibrariesTab","libraryKey","ArchivedTab","archivedCoursesData","fetchStudioHomeData","hasHomeData","requestParams","isPaginationEnabled","coursesData","customParams","customParamsFormat","snakeCaseObject","getStudioHomeCoursesV2","getStudioHomeCourses","handleDeleteNotificationQuery","getCourseNotificationUrl","handleCourseNotification","requestCourseCreatorQuery","sendRequestForCourseCreator","deniedCollapsibleTitle","deniedCollapsibleDescription","deniedCollapsibleActionTitle","deniedCollapsibleState","deniedCollapsibleActionText","pendingCollapsibleTitle","pendingCollapsibleDescription","pendingCollapsibleActionTitle","pendingCollapsibleState","pendingCollapsibleActionText","unrequestedCollapsibleTitle","unrequestedCollapsibleDescription","unrequestedCollapsibleDefaultButton","unrequestedCollapsiblePendingButton","unrequestedCollapsibleFailedButton","CollapsibleStateWithAction","requestButtonStates","requestButtonCurrentState","stateName","actionText","actionTitle","MinusIcon","ContactAdministrator","hasAbilityToCreateCourse","showNewCourseContainer","onClickNewCourse","coursesTypesFilterMenuAllCurses","coursesTypesFilterMenuActiveCurses","coursesTypesFilterMenuArchivedCurses","CoursesFilterMenu","idProp","menuItems","onItemMenuSelected","defaultItemSelectedText","itemMenuSelected","setItemMenuSelected","handleCourseTypeSelected","itemValue","CoursesTypesFilterMenu","courseTypes","courseType","coursesOrderFilterMenuAscendantCurses","coursesOrderFilterMenuDescendantCurses","coursesOrderFilterMenuNewestCurses","coursesOrderFilterMenuOldestCurses","CoursesOrderFilterMenu","courseOrders","courseOrder","regexOnlyWhiteSpaces","CoursesFilters","locationValue","onSubmitSearchField","studioHomeCoursesParams","inputSearchValue","setInputSearchValue","handleMenuFilterItemSelected","filterType","baseFilters","filterParams","activeCourses","allCourses","azCourses","zaCourses","newestCourses","oldestCourses","getFilterTypeData","filterParamsFormat","coursesOrderLabel","coursesTypesLabel","orderTypeLabel","cleanFilterParams","handleSearchCoursesDebounced","searchValueDebounced","valueFormatted","hasOnlySpaces","handleSearchCourses","itemInProgressFooterText","itemInProgressFooterHyperlink","itemInProgressActionText","itemIsFailedActionText","itemFailedFooterText","itemFailedFooterButton","CourseItem","isInProgress","dismissLink","RotateRightIcon","refresh","processingTitle","ProcessingCourses","CoursesTab","coursesDataItems","isShowProcessing","isEnabledPagination","optimizationEnabled","showCollapsible","isNotFilteringCourses","hasCourses","cmsLink","handleCleanFilters","TabsSection","isPaginationCoursesEnabled","TABS_LIST","tabKey","setTabKey","librariesEnabled","isLoadingCourses","isFailedCoursesPage","isLoadingLibraries","isFailedLibrariesPage","visibleTabs","libraryData","getStudioHomeLibraries","OrganizationSection","orgURLValue","setInputValue","TypeaheadDropdown","noOptionsMessage","helpMessage","bannerTitle","bannerDescription","sidebarDescription","VerifyEmailLayout","courseDisplayNameLabel","courseDisplayNamePlaceholder","courseDisplayNameCreateHelpText","courseDisplayNameRerunHelpText","courseOrgLabel","courseOrgPlaceholder","courseOrgNoOptions","courseOrgCreateHelpText","courseOrgRerunHelpText","courseNoteNoSpaceAllowedStrong","courseNoteOrgNameIsPartStrong","courseNumberLabel","courseNumberPlaceholder","courseNumberCreateHelpText","courseNumberRerunHelpText","courseNotePartCourseURLRequireStrong","courseRunLabel","courseRunPlaceholder","courseRunCreateHelpText","courseRunRerunHelpText","defaultPlaceholder","rerunCreateButton","creatingButton","rerunningCreateButton","requiredFieldError","disallowedCharsError","noSpaceError","alertErrorExistsAriaLabelledBy","alertErrorExistsAriaDescribedBy","CreateOrRerunCourseForm","isCreateNewCourse","onClickCancel","allowToCreateNewOrg","runFieldReference","displayNameFieldReference","isFormFilled","showErrorBanner","hasErrorField","createOrRerunCourseSavingStatus","allOrganizations","allowedOrganizations","setFormFilled","setShowErrorBanner","specialCharsRule","noSpaceRule","enableReinitialize","errMsg","destinationCourseKey","useCreateOrRerunCourse","newCourseFields","createButtonState","handleCustomBlurForDropdown","renderOrgField","handleOnClickCancel","handleOnClickCreate","sourceCourseKey","createNewCourse","CreateNewCourseForm","StudioHome","ENABLE_HOME_PAGE_COURSE_API_V2","isLoadingPage","isFailedLoadingPage","anyQueryIsFailed","isShowEmailStaff","anyQueryIsPending","isShowOrganizationDropdown","hasAbilityToCreateNewCourse","setShowNewCourseContainer","newCourseData","savingCreateRerunStatus","firstPage","useStudioHome","userIsActive","headerButtons","libraryHref","getHeaderButtons","tabsData","rerunCourseDescription","rerunCourseDescriptionStrong","CourseRerunForm","sectionTitle1","sectionDescription1","sectionTitle2","sectionDescription2","sectionTitle3","sectionDescription3","sectionLink4","CourseRerunSideBar","learnMoreUrl","defaultCourseDate","UTC","localizedCourseDate","rerunTitle","CourseRerun","originalCourseData","useCourseRerun","handleRerunCourseCancel","importWizardButtonCancel","importWizardButtonNext","importWizardButtonPrevious","importWizardButtonImport","importWizardButtonContinue","importWizardButtonConfirm","importWizardStepExportTitle","importWizardStepExportBody","importWizardStepExportCSVButton","importWizardStepExportJSONButton","importWizardStepUploadTitle","importWizardStepUploadClearFile","importWizardStepUploadBody","importWizardStepPlanTitle","importWizardStepPlanBody","importWizardStepPlanNoChanges","importWizardStepConfirmTitle","importWizardStepConfirmBody","promptTaxonomyName","promptTaxonomyNameRequired","promptTaxonomyExportId","promptTaxonomyExportIdRequired","promptTaxonomyExportIdInvalid","promptTaxonomyDescription","importTaxonomySuccess","importTaxonomyError","importTaxonomyToast","importTaxonomyErrorAlert","LoadingButton","componentMounted","loadingOnClick","TaxonomyContext","alertProps","setAlertProps","linebreak","TaxonomyProp","ExportStep","br","Download","UploadStep","setFile","importPlanError","PlanStep","changeCount","line","ConfirmStep","DefaultModalHeader","ImportTagsWizard","isDialogDisabled","disableDialog","enableDialog","importPlanResult","useImportPlan","lastModified","plan","retry","planArrayTemp","importTagsMutation","useImportTags","generatePlan","stepHeaders","export","mutateAsync","headerTitle","downloadTemplateButtonLabel","downloadTemplateButtonCSVLabel","downloadTemplateButtonJSONLabel","downloadTemplateButtonHint","importButtonLabel","orgInputSelectDefaultValue","orgAllValue","orgUnassignedValue","taxonomyDeleteToast","taxonomyDismissLabel","importInProgressAlertDescription","exportModalTitle","exportModalBodyDescription","exportModalSubmitButtonLabel","taxonomyCSVFormat","taxonomyJSONFormat","taxonomyModalsCancelLabel","ExportModal","outputFormat","setOutputFormat","onClickExport","deleteDialogTitle","deleteDialogBody","deleteDialogConfirmLabel","deleteDialogConfirmDeleteLabel","deleteDialogCancelLabel","deleteDialogDeleteLabel","DeleteDialog","taxonomyName","tagsCount","deleteButtonDisabled","setDeleteButtonDisabled","deleteLabel","assignOrgs","currentAssignments","addOrganizations","searchOrganizations","noOrganizationAssigned","assignAll","confirmUnassignTitle","confirmUnassignText","continueButton","assignOrgsSuccess","removeOrg","ConfirmModal","ManageOrgsModal","selectedOrgs","setSelectedOrgs","allOrgs","setAllOrgs","isConfirmModalOpen","openConfirmModal","closeConfirmModal","organizationListData","manageOrgMutation","useManageOrgs","orgs","getManageOrgsApiUrl","all_orgs","_data","variables","saveOrgs","selOrgs","Autosuggest","selectionValue","AutosuggestOption","actionsButtonAlt","importMenu","manageOrgsMenu","exportMenu","deleteMenu","TaxonomyMenu","iconMenu","deleteTaxonomy","useDeleteTaxonomy","pk","_d","_e","removeQueries","onDeleteTaxonomy","isDeleteDialogOpen","deleteDialogOpen","deleteDialogClose","isExportModalOpen","exportModalOpen","exportModalClose","isImportModalOpen","importModalOpen","importModalClose","isManageOrgsModalOpen","manageOrgsModalOpen","manageOrgsModalClose","import","systemDefined","manageOrgs","pickBy","toggleProps","MoreVert","_isOpen","ev","assignedToOrgsLabel","systemTaxonomyPopoverTitle","systemTaxonomyPopoverBody","systemDefinedBadge","SystemDefinedBadge","Content","orgsCountEnabled","orgsCount","HeaderSubtitle","showSystemBadge","textRef","isTruncated","setIsTruncated","containerWidth","clientWidth","textWidth","offsetWidth","TaxonomyCard","NavLink","TaxonomyListHeaderButtons","canAddTaxonomy","importMutation","useImportNewTaxonomy","showImportInProgressAlert","closeImportInProgressAlert","removeChild","appendChild","selectFile","getTaxonomyName","prompt","importTaxonomy","OrganizationFilterSelector","isOrganizationListLoaded","selectedOrgFilter","setSelectedOrgFilter","isOrgSelected","selectOptions","TaxonomyListPage","isLoaded","disableElevation","TaxonomyLayout","closeLabel","Outlet","ScrollRestoration","tagListColumnValueHeader","tagListError","SubTagsExpanded","subTagsData","useSubTags","listStyleType","paddingLeft","descendantCount","Proptypes","OptionalExpandLink","ExpandRow","TagValue","TagListTable","setOptions","useTagListData","manualPagination","fetchData","isEqual","isExpandable","renderRowSubComponent","ExpandAll","taxonomyDetailsHeader","taxonomyDetailsName","taxonomyDetailsDescription","taxonomyDetailsExportID","TaxonomyDetailSideCard","TaxonomyDetailPage","taxonomyIdString","isFetched","taxonomyMessages","activeLabel","linkAs","a11yBodyPolicyLink","a11yBodyPageHeader","a11yBodyIntroGraph","a11yBodyStepsHeader","a11yBodyEdxResponse","a11yBodyEdxFollowUp","a11yBodyOngoingSupport","a11yBodyA11yFeedback","a11yBodyEmailHeading","a11yBodyNameEmail","a11yBodyInstitution","a11yBodyBarrier","a11yBodyTimeConstraints","a11yBodyReceipt","a11yBodyExtraInfo","a11yBodyFixesListHeader","a11yBodyThirdParty","a11yBodyContractor","a11yBodyCodeFix","AccessibilityBody","communityAccessibilityLink","emailElement","postAccessibilityForm","accessibilityPolicyFormEmailLabel","accessibilityPolicyFormErrorHighVolume","accessibilityPolicyFormErrorMissingFields","accessibilityPolicyFormHeader","accessibilityPolicyFormMessageLabel","accessibilityPolicyFormNameLabel","accessibilityPolicyFormSubmitAria","accessibilityPolicyFormSubmitLabel","accessibilityPolicyFormSubmittingFeedbackLabel","accessibilityPolicyFormSuccess","accessibilityPolicyFormSuccessDetails","accessibilityPolicyFormValidEmail","accessibilityPolicyFormValidMessage","accessibilityPolicyFormValidName","AccessibilityForm","accessibilityEmail","useAccessibility","handleReset","day_start","weekday","time_start","FormattedTime","timeZoneName","day_end","time_end","emailLink","submitAccessibilityForm","AccessibilityPage","classNamae","QueryClient","App","router","createBrowserRouter","createRoutesFromElements","ENABLE_ACCESSIBILITY_PAGE","basename","AppProvider","wrapWithRouter","QueryClientProvider","RouterProvider","subscribe","APP_READY","ReactDOM","APP_INIT_ERROR","ErrorPage","initialize","handlers","mergeConfig","SUPPORT_EMAIL","EXAMS_BASE_URL","CALCULATOR_HELP_URL","ENABLE_PROGRESS_GRAPH_SETTINGS","ENABLE_TEAM_TYPE_SETTING","ENABLE_OPEN_MANAGED_TEAM_TYPE","BBB_LEARN_MORE_URL","TERMS_OF_SERVICE_URL","PRIVACY_POLICY_URL","NOTIFICATION_FEEDBACK_URL","ENABLE_GRADING_METHOD_IN_PROBLEMS","requireAuthenticatedUser","marginAdj","borderTopWidth","webpackContext","webpackContextResolve"],"sourceRoot":""}