{"version":3,"file":"3361.dabc265351e2763a.js","mappings":"g5BA8EYA,MAAA,mBAC+BA,MAAA,iBAAAC,GAAAD,MAAAE,GAAA,MAAAC,EAAAH,QAAAI,KAAAC,EAAAL,QAAA,OAAAA,MAASK,EAAAC,aAAAH,EAAAF,GAA6B,GACnED,MAAA,iBACFA,mCAmEIA,MAAA,iLAYEA,MAXA,SAAAA,MAAA,mDAWAA,CAXoE,SAAAA,MAAA,GAAAO,EAAAP,MAAA,GAAAQ,EAAAR,MAAA,wDAAAA,MAAA,wDAAAA,MAAA,GAAAQ,EAAAR,MAAA,yDAAAA,MAAA,2DAWpEA,CADE,UAAAA,MAAA,KAAAK,EAAAI,YAAAC,IAAA,mDAqDdV,MAAA,YACEA,MAAA,yCASFA,6CARIA,QAMAA,MANA,gBAAAA,MAAA,IAAAK,EAAAM,SAMAX,CANiC,uBAAAG,EAAA,KAAAA,EAAAS,eAMjCZ,CAL0C,0BAAAG,EAAA,KAAAA,EAAAU,kBAK1Cb,CAJgD,uBAAAG,EAAA,KAAAA,EAAAW,eAIhDd,CAH0C,8BAAAG,EAAA,KAAAA,EAAAY,sBAAAV,EAAAW,uBAAAC,OAG1CjB,CAFsF,kBAAAG,EAAA,KAAAA,EAAAe,UAEtFlB,CADgC,wDAnNtCA,MADF,UACEA,CADyD,YACRA,MAAA,4BAAAG,EAAAH,MAAAmB,GAAAf,KAAAC,EAAAL,QAAA,OAAAA,MAAYK,EAAAe,KAAAjB,GAAa,GAGpEH,MAFJ,UAEIA,CAF+B,UAE/BA,CADwC,QACpCA,MAAA,gBAA8CA,MAAA,wBAA4CA,QAS1FA,MARJ,gBAQIA,CARS,iBAQTA,CADD,aACmCA,MAAA,0BAA+BA,QACjEA,MAAA,cAAkCA,MAAA,0BACpCA,UACAA,MAAA,mBAGGA,MAAA,0BAITA,cAKMA,MAHN,YAGMA,CAHkC,YAGlCA,CAFkB,YAElBA,CADmD,aAEjDA,MAAA,aACAA,MAAA,sCAIEA,MADA,8BAAAC,GAAAD,MAAAmB,GAAA,MAAAd,EAAAL,QAAA,OAAAA,MAAsBK,EAAAgB,qBAAApB,GAA4B,EAClDD,CADmD,4BAAAC,GAAAD,MAAAmB,GAAA,MAAAd,EAAAL,QAAA,OAAAA,MAC/BK,EAAAiB,mBAAArB,GAA0B,GAE9CD,MAAA,kBAIRA,cAGIA,MAFJ,YAEIA,CAFkB,YAElBA,CAD2B,kBAEzBA,MAAA,yCAEFA,QAEAA,MAAA,kBACEA,MAAA,yCAEFA,QAEAA,MAAA,kBACEA,MAAA,4CAKRA,cAGIA,MAFJ,YAEIA,CAFuC,YAEvCA,CADoB,kBAElBA,MAAA,yCAQAA,MAAA,GAAAuB,GAAA,qBAkBJvB,UAEEA,MADF,YACEA,CADoB,eAElBA,MAAA,6MAkBEA,MAAA,iKAeAA,MAAA,iBACEA,MAAA,iKAeAA,MAAA,GAAAwB,GAAA,yBA8DVxB,cAEAA,MAAA,GAAAyB,GAAA,cAYAzB,MAAA,SAIIA,MAFJ,YAEIA,CAF4D,YAE5DA,CADyC,SACrCA,MAAA,kBAAkCA,MAAA,0BAA2DA,QAG/FA,MADF,iBACEA,CAD0C,sCAGxCA,MAAA,qBAAAC,GAAAD,MAAAmB,GAAA,MAAAd,EAAAL,QAAA,OAAAA,MAAaK,EAAAqB,kBAAAzB,GAAyB,GAEtCD,MAAA,cACCA,MAAA,0BAGPA,cACAA,MAAA,aAAiDA,MAAA,0BACnDA,UAEAA,MAAA,aAIEA,MAAA,8EAWFA,QAEAA,MAAA,SAIIA,MAFJ,YAEIA,CAFgC,YAEhCA,CADyC,SACrCA,MAAA,kBAA4CA,MAAA,0BAAkDA,QAG9FA,MAFJ,aAEIA,CAF+C,aAE/CA,CADwD,cAGtDA,MAAA,mBAAAA,MAAAmB,GAAA,MAAAd,EAAAL,QAAA,OAAAA,MAAAK,EAAAsB,kBAAAtB,EAAAuB,WAAAC,KAAA,GAEA7B,MAAA,mBACFA,QACAA,MAAA,cACEA,MAAA,mBAAAA,MAAAmB,GAAA,MAAAd,EAAAL,QAAA,OAAAA,MAAAK,EAAAsB,kBAAAtB,EAAAuB,WAAAE,KAAA,GAGA9B,MAAA,mBAIRA,cACAA,MAAA,cAAiDA,MAAA,4BACnDA,UAEAA,MAAA,WACEA,MAAA,4CAWNA,mDAjSyBA,cAAA,YAAAK,EAAA0B,aAGiC/B,MAAA,GAAAA,MAAA,IAAAA,MAAA,qCAO9CA,MAAA,GAAAA,MAAA,aAAAA,MAAA,IAAAgC,GAAA3B,EAAA4B,mBAAA9B,EAAA+B,KAEkClC,MAAA,GAAAA,YAAA,sBACAA,MAAA,GAAAA,YAAA,2CAIlCA,MAAA,GAAAA,MAAA,WAAAK,EAAA0B,YAAAI,SACCnC,oBAAA,sBASyCA,MAAA,GAAAA,MAAA,aAAAG,EAAAiC,MACrCpC,QAA8CA,MAA9C,cAAAqC,EAAA,MAAAlC,EAAA,KAAAA,EAAAiC,YAAAE,IAAAD,IAAAhC,EAAAkC,qBAAAvC,MAA8CA,CAAD,MAAAG,EAAAqC,OAEhDxC,QACAA,MADA,YAAAK,EAAAoC,UACAzC,CADuB,SAAAA,MAAA,MAAAK,EAAAM,UAcEX,MAAA,GAAAA,MAAA,QAAAA,MAAA,yCAKAA,MAAA,GAAAA,MAAA,QAAAA,MAAA,2CAKAA,MAAA,GAAAA,MAAA,QAAAA,MAAA,+CAU3BA,MAAA,GAGAA,MAHA,QAAAA,MAAA,wCAGAA,CAHsD,QAAAG,EAAAuC,UAM3C1C,MAAA,GAAAA,MAAA,aAAAG,EAAA,KAAAA,EAAAuC,UAsBT1C,MAAA,GAeAA,MAfA,SAAAA,MAAA,wCAeAA,CAfuD,SAAAA,MAAA,IAAA2C,GAAA3C,MAAA,IAAAQ,EAAAR,MAAA,+CAAAA,MAAA,+CAAAA,MAAA,IAAAQ,EAAAR,MAAA,iDAAAA,MAAA,iDAAAA,MAAA,IAAAQ,EAAAR,MAAA,gDAAAA,MAAA,iDAevDA,CADE,UAAAA,MAAA,MAAAK,EAAA0B,YAAArB,IAAA,aAIFV,MAAA,GAWAA,MAXA,SAAAA,MAAA,6CAWAA,CAX4D,SAAAA,MAAA,IAAAO,EAAAP,MAAA,IAAAQ,EAAAR,MAAA,kDAAAA,MAAA,kDAAAA,MAAA,IAAAQ,EAAAR,MAAA,mDAAAA,MAAA,mDAW5DA,CADE,UAAAA,MAAA,MAAAK,EAAA0B,YAAArB,IAAA,iBAMAV,MAAA,GAWAA,MAXA,SAAAA,MAAA,mDAWAA,CAXkE,SAAAA,MAAA,IAAAO,EAAAP,MAAA,IAAAQ,EAAAR,MAAA,wDAAAA,MAAA,wDAAAA,MAAA,IAAAQ,EAAAR,MAAA,yDAAAA,MAAA,0DAWlEA,CADE,UAAAA,MAAA,OAAAK,EAAAI,YAAAC,IAAA,sBAIYV,MAAA,GAAAA,MAAA,OAAAK,EAAAuC,oBAgEpB5C,cAAA,OAAAK,EAAAwC,gBAAA,MAAA1C,EAAA,KAAAA,EAAAY,sBAAAV,EAAAW,uBAAAC,QAcDjB,MAAA,GAAAA,MAAA,KAAAK,EAAAyC,oBAEqC9C,MAAA,GAAAA,MAAA,IAAAA,MAAA,sDAGxBA,MAAA,GACVA,MADU,uBACVA,CADoC,UAAAA,MAAA,OAAAK,EAAA0C,qBAKnC/C,MAAA,GAAAA,YAAA,6CAI0CA,MAAA,GAAAA,YAAA,wDAQ/CA,MAAA,GAQAA,MARA,SAAAA,MAAA,IAAAgD,EAAA3C,EAAAuB,WAAAC,KAAA7B,MAAA,IAAAiD,IAAA,IAAAjD,MAAA,OAAAK,EAAA0C,qBAAA,IAAA/C,MAAA,OAAAK,EAAA0C,sBAQA/C,CAFE,QAAAA,MAAA,OAAAK,EAAA6C,eAAAC,QAEFnD,CADuC,qBASSA,MAAA,GAAAA,MAAA,IAAAA,MAAA,6CAI1CA,MAAA,GAAAA,MAAA,UAAAA,MAAA,IAAAoD,EAAA/C,EAAAsB,oBAAAtB,EAAAuB,WAAAC,OAOA7B,MAAA,GAAAA,MAAA,UAAAA,MAAA,IAAAoD,EAAA/C,EAAAsB,oBAAAtB,EAAAuB,WAAAE,OAOyC9B,MAAA,GAAAA,YAAA,gDAK/CA,MAAA,GAMAA,MANA,SAAAA,MAAA,IAAAgD,EAAA3C,EAAAsB,kBAAA3B,MAAA,IAAAqD,KAMArD,CADE,QAAAA,MAAA,QAAAK,EAAAiD,aAAAH,UCpLZ,MAAMI,EAA0B,yBAC1BC,EAAwB,2BAqCvB,IAAMC,GAAgB,UAAAC,EAAvB,MAAOD,EAyCXE,YACUC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GACAC,GACAC,IATAC,KAAAV,QACAU,KAAAT,cACAS,KAAAR,iBACAQ,KAAAP,eACAO,KAAAN,KACAM,KAAAL,gBACAK,KAAAJ,UACAI,KAAAH,SACAG,KAAAF,wBACAE,KAAAD,aAjDVC,KAAAxB,mBAAqB,mCACrBwB,KAAA1B,mBAAqB2B,KACrBD,KAAAzB,cAAgB2B,KAEhBF,KAAA3D,QAA8B2D,KAAKT,YAAYlD,QAI/C2D,KAAApB,eAA4B,CAC1BuB,MAAO,YAETH,KAAAhB,aAA0B,CACxBmB,MAAO,UAEFH,KAAAvC,YAAcuC,KAAKN,GAAGU,MAAM,CACjClC,MAAO,CAAC,GAAImC,KAAWC,UACvBC,QAAS,CAAC,GAAIF,KAAWC,UACzBE,YAAa,CAAC,IACd1C,KAAM,CAAC,IACP2C,QAAS,CAACC,KAAgBC,QAC1BC,mBAAoB,EAAC,GACrBC,YAAa,EAAC,GACdC,OAAQd,KAAKN,GAAGU,MAAM,CACpBW,iBAAkB,EAAC,GACnBC,mBAAoB,CAAC,CAAEC,OAAO,EAAOC,UAAU,QAKnDlB,KAAA1C,WAAa6D,KACbnB,KAAA3C,kBAAoB8D,KAAY5D,KAChCyC,KAAAoB,eAAiBV,KACjBV,KAAArC,mBAAqB,IAAI0D,OACzBrB,KAAA/B,qBAAuB,GACvB+B,KAAAtD,uBAAyB4E,KAElBtB,KAAAvB,mBAAqB,IAAI8C,KAAyB,GACjDvB,KAAAwB,WAAa,IAAIC,KAAO,EAc9BC,KAAS,CACPC,cAAaC,EAAAC,IACbC,KAAIF,EAAAG,IACJC,YAAWJ,EAAAK,IACXC,YAAWN,EAAAO,IACXC,aAAYR,EAAAS,IACZC,kBAAiBA,OAErB,CAKMtG,aAAauG,EAAkBC,GAAiB,IAAAC,EAAAzC,KAAA,SAAA0C,KAAA,YACpD,IACE,MAAMC,EAA2B,CAC/B/E,GAAI2E,EAAQ3E,GACZM,MAAOqE,EAAQrE,MACfsC,YAAa+B,EAAQ/B,YACrBpC,SAAUmE,EAAQnE,SAClBwE,KAAMC,KAAUC,SAChBC,KAAMR,EAAQQ,YAGVN,EAAK3C,qBAAqBkD,MAAML,EAAWH,EACnD,OAASS,GACPC,QAAQC,KAAKF,EACf,CAAC,EAdmD,EAetD,CAEAG,kBAGMpD,KAAKV,MAAM+D,SAASC,cAAclH,IAAI,aACxC4D,KAAKuD,wBAET,CAEAC,WACExD,KAAKyD,SAAWzD,KAAKR,eAAekE,aAAa1D,KAAK7B,WAAWwF,QAC/DC,KAAKrB,IACHvC,KAAK/B,wBAAuB4F,MAAyBtB,GACrDA,EAAQzB,OACNyB,EAAQzB,QAAoC,iBAAnByB,EAAQzB,OAC7BgD,IAAMC,aAAaxB,EAAQzB,QAC3ByB,EAAQzB,QAAU,GAMxBkD,OAAOC,KAAK1B,GAAS2B,QAASC,GAAM5B,EAAQ4B,WAAa5B,EAAQ4B,IACjEnE,KAAKvC,YAAY2G,WAAW7B,EAAO,IACpC,EACD8B,KAAY,IAGdrE,KAAKpB,eAAiB,CACpBuB,MAAOH,KAAKpB,eAAeuB,MAE3BmE,MAAOtE,KAAKH,MAAM0E,UAAOC,MAAWvF,IAA0B0E,QAAKc,KAAUzE,KAAKwB,aAClF3C,OAAQmB,KAAKH,MAAM0E,UAAOG,MAAqBzF,IAA0B0E,QAAKc,KAAUzE,KAAKwB,cAE/FxB,KAAKhB,aAAe,CAClBmB,MAAOH,KAAKhB,aAAamB,MAEzBmE,MAAOtE,KAAKH,MAAM0E,UAAOC,MAAWtF,IAAwByE,QAAKc,KAAUzE,KAAKwB,aAChF3C,OAAQmB,KAAKH,MAAM0E,UAAOG,MAAqBxF,IAAwByE,QAAKc,KAAUzE,KAAKwB,cAG7FxB,KAAKH,MAAM8E,SACTC,KAAgC,CAC9BC,OAAQ5F,EACR6F,QAAS,CACPlH,GAAIqB,EACJd,UAAW6B,KAAK7B,UAChByE,KAAMmC,KAAkBC,aAI9BhF,KAAKH,MAAM8E,SACTC,KAAgC,CAC9BC,OAAQ3F,EACR4F,QAAS,CACPlH,GAAIsB,EACJf,UAAW6B,KAAK7B,UAChByE,KAAMmC,KAAkBE,UAIhC,CAGAlI,qBAAqBmI,GACnBhC,QAAQiC,IAAI,yBAA0BD,GAClCA,EAAIE,YAAcC,KAGpBrF,KAAKH,MAAM8E,SAASW,KAAuB,CAAE1H,GAAIoC,KAAK7B,UAAWoH,IADrD,GAAGC,OAA0BN,EAAIO,UAI7CvC,QAAQC,KAAK,kBAAkBkC,SAAgCH,GAC/DlF,KAAKH,MAAM8E,SAASW,KAAuB,CAAE1H,GAAIoC,KAAK7B,UAAWoH,IAAKL,EAAIK,OAE9E,CAGAvI,mBAAmBkI,GACjBhC,QAAQiC,IAAI,uBAAwBD,GACpClF,KAAKL,cAAc+F,aAAa,+BAClC,CAEAtI,kBAAkBoF,GAIhBxC,KAAKvB,mBAAmBkH,KAHJnD,EAEUoD,OAAOC,QAEvC,CAEA/I,KAAKyF,GAAO,IAAAuD,EAAA9F,KACV,IACEA,KAAK3D,QAAQsH,QAAKoC,KAAK,IAAIC,UAAS,eAAAC,KAAAvD,KAAC,UAAOwD,GAC1C,MAAMC,EAAUnC,OAAOC,KAAK6B,EAAKrI,YAAY2I,UAC1CC,OAAQZ,GAAQK,EAAKrI,YAAYrB,IAAIqJ,GAAKa,OAC1CC,IAAKd,IACJ,MAAQxE,SAAU6E,EAAKrI,YAAYrB,IAAIqJ,GACvCe,MACO,CACLC,KAAMhB,EACNxE,MAAe,WAARwE,EAAmBxE,EAAQyF,KAAKC,UAAU1F,MAGvDkF,EAAQS,KAAK,CAAEH,KAAM,YAAaxF,MAAOiF,UAEnCJ,EAAKtG,eAAeqH,cAActE,EAAS4D,GACjDL,EAAKlG,QAAQkH,QAAQhB,EAAK/F,UAAUgH,QAAQ,iCAC9C,GAAC,gBAAAC,GAAA,OAAAf,EAAAgB,MAAAjH,KAAAkH,UAAA,EAfmC,GAgBtC,OAASC,GACPjE,QAAQD,MAAMkE,GAEdnH,KAAKJ,QAAQkH,QAAQ9G,KAAKD,UAAUgH,QAAQ,+BAC9C,CACF,CAEA,aAAW5I,GACT,OAAO6B,KAAKV,MAAM+D,SAAS+D,SAAShL,IAAI,KAC1C,CAEA,eAAID,GACF,OAAO6D,KAAKvC,YAAYrB,IAAI,SAC9B,CAEAmH,yBACEL,QAAQiC,IAAI,6BACZnF,KAAKqH,aAAarH,KAAKxB,mBACzB,CAEA6I,aAAazJ,GACX,MAAM0J,EAAKC,SAASC,eAAe5J,GAC/B0J,GAAMA,EAAGG,UAGXzH,KAAK0H,QAAQC,cAAc,EAAGL,EAAGG,UAAY,GAAI,MAEjDvE,QAAQiC,IAAI,sBAAuBmC,EAEvC,CAEAM,cACE5H,KAAKwB,WAAWmE,OAChB3F,KAAKwB,WAAWqG,WAEhB7H,KAAKH,MAAM8E,YAASmD,MAAY,CAAEC,IAAK,CAAC9I,EAAyBC,KACnE,WAlOWC,0CAAgBzD,MAAAsM,MAAAtM,MAAAuM,KAAAvM,MAAAwM,MAAAxM,MAAAyM,MAAAzM,MAAA0M,MAAA1M,MAAA2M,MAAA3M,MAAA4M,OAAA5M,MAAA6M,OAAA7M,MAAA8M,KAAA9M,MAAA+M,MAAA,0BAAhBtJ,EAAgBuJ,UAAA,wBAAAC,UAAA,SAAAC,EAAAC,MAAA,EAAAD,SAChBE,KAAU,oFA9BV,CAACC,MAA6BrN,OAAAsN,MAAA,EAAAC,KAAA,EAAAC,OAAA,irEAAAC,SAAA,SAAAP,EAAAC,MAAA,EAAAD,IDzH3ClN,MAAA,gBACEA,MAAA,uCAGFA,QAEAA,MAAA,mBACEA,MAAA,EAAA0N,GAAA,kCAmSF1N,oBAzSkBA,cAAA,eAAA2N,EAAA3N,MAAA,IAAAmN,EAAApF,WAAA,KAAA4F,EAAAnL,OAMQxC,MAAA,GAAAA,MAAA,OAAAA,MAAA,IAAAmN,EAAApF,2BCqHtB6F,KACAC,KACAC,KACAC,KACAC,IACAC,KACAC,KAAWxB,eACXyB,KAAmBzB,eACnB0B,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,KACAtB,KACAuB,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,MAASC,OAAA,g6IAGA1L,CAAgB","names":["i0","$event","_r4","project_r2","ngIf","ctx_r2","shareProject","_c3","_c1","configGroup","get","userId$","subscriptionId","subscriptionLevel","subscriptionBy","subscriptionStatus","subscriptionStatusType","Active","eventDate","_r1","save","onFileUploadFinished","onFileUploadFailed","ProjectAdminPage_div_4_ion_button_43_Template","ProjectAdminPage_div_4_fs_form_radio_70_Template","ProjectAdminPage_div_4_div_71_Template","setEnableOrdering","currentLayoutType","layoutType","List","Grid","projectForm","_c0","routeProjectDetail","id","invalid","hero","tmp_10_0","undefined","defaultProjectPoster","title","projectId","shareUrl","_c2","enableShowTrending","enableBilling","elIdManageFeatured","isOrderingEnabled$","_c5","_c4","featuredStacks","items$","_c6","_c7","recentStacks","FEATURED_STACKS_LIST_ID","RECENT_STACKS_LIST_ID","ProjectAdminPage","_ProjectAdminPage","constructor","route","userService","projectService","stackService","fb","sentryService","toaster","store","socialSharingService","translate","this","ENABLE_TRENDING_STACKS","ENABLE_BILLING","label","group","Validators","required","mission","description","privacy","PROJECT_PRIVACY","PUBLIC","allowPublicPublish","isModerated","config","showRecentStacks","showTrendingStacks","value","disabled","LAYOUT_TYPE","ProjectPrivacy","PROJECT_DETAIL_ROUTE","SubscriptionStatus","BehaviorSubject","onDestroy$","Subject","addIcons","imagesOutline","ionicons_icons__WEBPACK_IMPORTED_MODULE_27__","dFz","star","d49","listOutline","PFj","gridOutline","Zil","imageOutline","ETD","reorderTwoOutline","project","event","_this","_asyncToGenerator","shareItem","type","ITEM_TYPE","Projects","tags","share","error","console","warn","ionViewDidEnter","snapshot","queryParamMap","scrollToManageFeatured","ngOnInit","project$","selectAndGet","pipe","tap","getProjectDefaultHeroUrl","Utils","tryParseJSON","Object","keys","forEach","k","patchValue","shareReplay","list$","select","selectList","takeUntil","selectStackListItems","dispatch","stackActions","listId","filters","FilterEntityTypes","Featured","Recent","res","log","container","PROJECT_HERO_UPLOAD_BUCKET","projectActions","url","PROJECT_HERO_UPLOAD_CDN","key","captureError","next","detail","checked","_this2","take","subscribe","_ref","userId","updates","controls","filter","dirty","map","DEBUG_LOGS","prop","JSON","stringify","push","updateProject","present","instant","_x","apply","arguments","err","paramMap","scrollToItem","el","document","getElementById","offsetTop","content","scrollToPoint","ngOnDestroy","complete","deleteLists","ids","i1","i2","i3","i4","i5","i6","i7","i8","i9","i10","selectors","viewQuery","rf","ctx","IonContent","socialSharingServiceProvider","decls","vars","consts","template","ProjectAdminPage_div_4_Template","tmp_0_0","NgClass","NgIf","TranslatePipe","AsyncPipe","FormControlCastPipe","RouterLink","FormsModule","ReactiveFormsModule","EventDetailComponent","PosterUploadDirective","TopNavbarComponent","FormRadioComponent","StackListComponent","ButtonComponent","IonHeader","IonIcon","IonButtons","IonButton","IonItem","IonInput","IonTextarea","IonList","IonToggle","styles"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/projects/project-admin/project-admin.page.html","./src/app/projects/project-admin/project-admin.page.ts"],"sourcesContent":["<ion-header>\n <app-top-navbar [title]=\"(project$ | async)?.title\">\n <!-- SLOT: anything added here will go below the ion-navbar -->\n </app-top-navbar>\n</ion-header>\n\n<ion-content class=\"project-admin\">\n <div class=\"container\" *ngIf=\"project$ | async as project\">\n <form id=\"projectForm\" [formGroup]=\"projectForm\" (ngSubmit)=\"save(project)\">\n <div class=\"project-admin__header\">\n <div class=\"project-admin__header__title\">\n <h2><ion-icon name=\"settings-outline\"></ion-icon> {{ 'PROJECT.SETTINGS.HEADING' | translate }}</h2>\n <ion-buttons>\n <ion-button\n fill=\"outline\"\n shape=\"round\"\n color=\"tertiary\"\n class=\"padded\"\n [routerLink]=\"[routeProjectDetail, project.id]\"\n >\n <span class=\"top-actions-xs-text\">{{ 'COMMON.BACK' | translate }}</span>\n <span class=\"top-actions-sm-text\">{{ 'PROJECT.SETTINGS.BACK_TO_PROJECT' | translate }}</span>\n </ion-button>\n <fs-button\n type=\"submit\"\n [disabled]=\"projectForm.invalid\"\n >{{ 'COMMON.SAVE' | translate }}</fs-button\n >\n </ion-buttons>\n </div>\n </div>\n\n <div class=\"row space-for-fixed-header\">\n <div class=\"col-lg-6\">\n <div class=\"project-admin__poster ion-margin-bottom\">\n <div class=\"project-admin__poster__content\" [class.no-poster]=\"!project.hero\">\n <img [src]=\"project?.hero ?? defaultProjectPoster\" [alt]=\"project.title\" />\n <ion-button posterUpload fill=\"solid\" color=\"primary\" class=\"round\"\n [projectId]=\"projectId\"\n [userId]=\"userId$ | async\"\n (fileUploadFinished)=\"onFileUploadFinished($event)\"\n (fileUploadFailed)=\"onFileUploadFailed($event)\"\n >\n <ion-icon slot=\"icon-only\" name=\"images-outline\"></ion-icon>\n </ion-button>\n </div>\n </div>\n </div>\n <div class=\"col-lg-6\">\n <div class=\"ion-padding-top\">\n <ion-item lines=\"none\">\n <ion-input type=\"text\" formControlName=\"title\"\n labelPlacement=\"stacked\" [label]=\"'PROJECT.FORM.PROPS.TITLE.LABEL' | translate\"></ion-input>\n </ion-item>\n \n <ion-item lines=\"none\">\n <ion-input type=\"text\" formControlName=\"mission\"\n labelPlacement=\"stacked\" [label]=\"'PROJECT.FORM.PROPS.MISSION.LABEL' | translate\"></ion-input>\n </ion-item>\n \n <ion-item lines=\"none\">\n <ion-textarea formControlName=\"description\" rows=\"4\"\n labelPlacement=\"stacked\" [label]=\"'PROJECT.FORM.PROPS.DESCRIPTION.LABEL' | translate\"></ion-textarea>\n </ion-item>\n </div>\n </div>\n </div>\n <div class=\"row\" style=\"margin-top: 15px;\">\n <div class=\"col-md-6\">\n <ion-item lines=\"none\">\n <ion-input\n labelPlacement=\"stacked\" class=\"full-opacity\" \n [label]=\"'PROJECT.SETTINGS.LINK_TO_SHARE' | translate\"\n type=\"text\"\n readonly selectAllOnClick\n [value]=\"project.shareUrl\"\n ></ion-input>\n <!-- SHARE BUTTON ref project-detail -->\n <ion-button *ngIf=\"project?.shareUrl\" slot=\"end\" fill=\"clear\" color=\"light\" size=\"large\"\n class=\"project-admin__share\" (click)=\"shareProject(project, $event)\">\n <ion-icon slot=\"icon-only\" ios=\"share-outline\" md=\"share-social-outline\"></ion-icon>\n </ion-button>\n </ion-item>\n\n <!-- \n todo: Copy To Clipboard here, full share icon probably\n how to implement a named input and pass readonly attr to fs-input? (how to accomplish the below?)\n ref: publish-stack.page\n -->\n <!-- <fs-input #inputShareUrl label=\"Share URL\" [value]=\"[shareUrl]\"></fs-input> -->\n <!-- <ion-item>\n <ion-input #inputShareUrl readonly selectAllOnClick [value]=\"project.shareUrl\"></ion-input>\n <ion-button slot=\"end\" shape=\"round\" (click)=\"copyToClipboard(project.shareUrl, $event)\" title=\"Copy to Clipboard\">\n <ion-icon name=\"link\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-item> -->\n </div>\n <div class=\"col-md-6\">\n <ion-list>\n <fs-form-radio\n [header]=\"'PROJECT.SETTINGS.PRIVACY.LABEL' | translate\"\n [values]=\"{\n 'PUBLIC': {\n title: 'PROJECT.SETTINGS.PRIVACY.PUBLIC_LABEL' | translate,\n description: 'PROJECT.SETTINGS.PRIVACY.PUBLIC_DESC' | translate\n },\n 'UNLISTED': {\n title: 'PROJECT.SETTINGS.PRIVACY.UNLISTED_LABEL' | translate,\n description: 'PROJECT.SETTINGS.PRIVACY.UNLISTED_DESC' | translate\n },\n 'PRIVATE': {\n title: 'PROJECT.SETTINGS.PRIVACY.PRIVATE_LABEL' | translate,\n description: 'PROJECT.SETTINGS.PRIVACY.PRIVATE_DESC' | translate\n }\n }\"\n [control]=\"projectForm.get('privacy') | formControlCast\"\n ></fs-form-radio>\n <fs-form-radio\n [header]=\"'PROJECT.SETTINGS.IS_MODERATED.LABEL' | translate\"\n [values]=\"{\n true: {\n title: 'PROJECT.SETTINGS.IS_MODERATED.TRUE_LABEL' | translate,\n description: 'PROJECT.SETTINGS.IS_MODERATED.TRUE_DESC' | translate\n },\n false: {\n title: 'PROJECT.SETTINGS.IS_MODERATED.FALSE_LABEL' | translate,\n description: 'PROJECT.SETTINGS.IS_MODERATED.TRUE_DESC' | translate\n }\n }\"\n [control]=\"projectForm.get('isModerated') | formControlCast\"\n >\n </fs-form-radio>\n <section formGroupName=\"config\">\n <fs-form-radio\n [header]=\"'PROJECT.SETTINGS.SHOW_RECENT_STACKS.LABEL' | translate\"\n [values]=\"{\n true: {\n title: 'PROJECT.SETTINGS.SHOW_RECENT_STACKS.TRUE_LABEL' | translate,\n description: 'PROJECT.SETTINGS.SHOW_RECENT_STACKS.TRUE_DESC' | translate\n },\n false: {\n title: 'PROJECT.SETTINGS.SHOW_RECENT_STACKS.FALSE_LABEL' | translate,\n description: 'PROJECT.SETTINGS.SHOW_RECENT_STACKS.FALSE_DESC' | translate\n }\n }\"\n [control]=\"configGroup.get('showRecentStacks') | formControlCast\"\n >\n </fs-form-radio>\n <fs-form-radio *ngIf=\"enableShowTrending\"\n [header]=\"'PROJECT.SETTINGS.SHOW_TRENDING_STACKS.LABEL' | translate\"\n [values]=\"{\n true: {\n title: 'PROJECT.SETTINGS.SHOW_TRENDING_STACKS.TRUE_LABEL' | translate,\n description: 'PROJECT.SETTINGS.SHOW_TRENDING_STACKS.TRUE_DESC' | translate\n },\n false: {\n title: 'PROJECT.SETTINGS.SHOW_TRENDING_STACKS.FALSE_LABEL' | translate,\n description: 'PROJECT.SETTINGS.SHOW_TRENDING_STACKS.FALSE_DESC' | translate\n }\n }\"\n [control]=\"configGroup.get('showTrendingStacks') | formControlCast\"\n >\n </fs-form-radio>\n </section>\n </ion-list>\n\n <!-- \n todo: add this ion-radio-group when ready\n\n Sponsored / Unsponsored \n Sponsored: Clips uploaded by your crew are counted against your personal pool of minutes\n Unsponsored: Clips uploaded by crew members are against their minutes. (Default)\n \n \"PROJECT.SETTINGS.SPONSORED\": \"Sponsored / Unsponsored\",\n \"PROJECT.SETTINGS.SPONSORED_LABEL_1\": \"Sponsored\",\n \"PROJECT.SETTINGS.SPONSORED_DESC_1\": \"Clips uploaded by your crew are counted against your personal pool of minutes\",\n \"PROJECT.SETTINGS.SPONSORED_LABEL_2\": \"Unsponsored\",\n \"PROJECT.SETTINGS.SPONSORED_DESC_2\": \"Clips uploaded by crew members are against their minutes\",\n -->\n\n <!-- todo: enable this feature - isSponsored - open to crew to capture to -> highlight CTA -->\n <!-- <ion-item hidden lines=\"none\">\n <ion-label class=\"ion-text-wrap\">\n <div class=\"project-admin__checkbox__title\">\n Allow public to publish stacks\n </div>\n </ion-label>\n <ion-toggle formControlName=\"allowPublicPublish\"></ion-toggle>\n </ion-item> -->\n\n <!-- changed to radioButtonLists\n <div formGroupName=\"config\" class=\"ion-padding-top\">\n <ion-item lines=\"none\">\n <ion-label class=\"ion-text-wrap\">\n <div class=\"project-admin__checkbox__title\">\n {{ 'PROJECT.SETTINGS.SHOW_RECENT_STACKS.LABEL' | translate }}\n </div>\n </ion-label>\n <ion-toggle formControlName=\"showRecentStacks\"></ion-toggle>\n </ion-item>\n <ion-item lines=\"none\">\n <ion-label class=\"ion-text-wrap\">\n <div class=\"project-admin__checkbox__title\">\n {{ 'PROJECT.SETTINGS.SHOW_TRENDING_STACKS' | translate }}\n </div>\n </ion-label>\n <ion-toggle formControlName=\"showTrendingStacks\"></ion-toggle>\n </ion-item>\n </div> -->\n </div>\n </div>\n\n <div *ngIf=\"enableBilling && project?.subscriptionStatus === subscriptionStatusType.Active\" class=\"event-detail-wrap\">\n <fs-event-detail\n [currentUserId]=\"userId$ | async\"\n [subscriptionId]=\"project?.subscriptionId\"\n [subscriptionLevel]=\"project?.subscriptionLevel\"\n [subscriptionBy]=\"project?.subscriptionBy\"\n [subscriptionisActive]=\"project?.subscriptionStatus === subscriptionStatusType.Active\"\n [eventDate]=\"project?.eventDate\"\n [canEdit]=\"true\"\n ></fs-event-detail>\n </div>\n\n <hr />\n\n <div id=\"{{elIdManageFeatured}}\" class=\"project-admin__heading\">\n <div class=\"project-admin__heading__title\">\n <h2><ion-icon name=\"star\"></ion-icon> {{ 'PROJECT.SETTINGS.MANAGE_FEATURED_STACKS' | translate }}</h2>\n <!-- hiding form elements to simplify pilot UI -->\n <ion-item hidden style=\"padding-top: 22px;\">\n <ion-toggle [enableOnOffLabels]=\"true\"\n [checked]=\"isOrderingEnabled$ | async\"\n (ionChange)=\"setEnableOrdering($event)\"\n >\n <span style=\"text-transform: none;\"\n >{{ 'PROJECT.SETTINGS.ORDERING_ENABLED' | translate }}</span>\n </ion-toggle>\n </ion-item>\n </div>\n <div class=\"project-admin__heading__description\">{{ 'PROJECT.SETTINGS.MANAGE_FEATURED_STACKS_TEXT' | translate }}</div>\n </div>\n\n <div class=\"\">\n <!-- tslint error from:\n draggable: !!(isOrderingEnabled$ | async),\n numerable: !(isOrderingEnabled$ | async) -->\n <app-stack-list\n [layout]=\"{\n type: layoutType.List,\n options: {\n isDraggable: (isOrderingEnabled$ | async) === true,\n isNumerable: (isOrderingEnabled$ | async) === false\n }\n }\"\n [items]=\"featuredStacks.items$ | async\"\n [heading]=\"'nothing'\"\n ></app-stack-list>\n </div>\n\n <hr />\n\n <div class=\"project-admin__heading\">\n <div class=\"project-admin__heading__title\">\n <h2><ion-icon name=\"layers-outline\"></ion-icon> {{ 'PROJECT.SETTINGS.RECENT_STACKS' | translate }}</h2>\n <div class=\"project-admin__heading__title__filter\">\n <div class=\"project-admin__heading__title__filter__block\">\n <div\n [ngClass]=\"{ 'project-admin__heading__title__filter__block--active': currentLayoutType === layoutType.List }\"\n (click)=\"currentLayoutType = layoutType.List\"\n >\n <ion-icon name=\"list-outline\"></ion-icon>\n </div>\n <div\n (click)=\"currentLayoutType = layoutType.Grid\"\n [ngClass]=\"{ 'project-admin__heading__title__filter__block--active': currentLayoutType === layoutType.Grid }\"\n >\n <ion-icon name=\"grid-outline\"></ion-icon>\n </div>\n </div>\n </div>\n </div>\n <div class=\"project-admin__heading__description\">{{ 'PROJECT.SETTINGS.RECENT_STACKS_TEXT' | translate }}</div>\n </div>\n\n <div>\n <app-stack-list\n [layout]=\"{\n type: currentLayoutType,\n options: {\n isDraggable: false\n }\n }\"\n [items]=\"recentStacks.items$ | async\"\n ></app-stack-list>\n </div>\n </form>\n </div>\n</ion-content>\n","/** @format */\n\n/*\nhttps://filmstacker.atlassian.net/browse/MVP-1003\n\nThere should be two premissions toggles for projects (current there is one, but it is incorrect):\n\n1. Public / Unlisted \n Public: Your project can be discovered on Filmstacker. \n Unlisted: Yur project can only be accessed through unlisted links that you share\n\n2. Live / Moderated \n Live: The public and crew can see and use the contributed content as it comes in. \n Moderated: Stacks are locked until they have been reviewed and featured by the project owner or producers\n\nIf “Moderated†is selected, the ideal solution is that \n\n- Project Owner and Producers see can see blurry stack hero images with label “stack needs review,†\n if they open the stack, it opens in Watch and there is an APPROVE / DELETE action area. \n If approved, it will be become a normal stack in the Recent Stacks carousel.\n\n- Project Crew see can see blurry stack hero images with label “stack under review,†\n they can’t open it or access the menu.\n\n- Public users (not a project owner, producer or crew) do NOT see the Recent Stacks carousel.\n\nIf “Live†is selected, the solution is that\n\n- The Recent Stacks carousel is visible to the public and the project owners, producers, and crew. \n New stacks are not locked or blurred out, but are live to be watched, shared \n and stacks clips can be used in other stacks unless the stacks is set to “locked.â€\n\n\n-----\n\n# Models\n\nstack.isApproved\nclip.isApproved\nstack.isLocked\nclip.isLocked\n\nwhen stack.featured goes from false to true, all clips should be isApproved = true\n(even for projects that are not moderated? yeah, why not?\n\nclips bulkUpdate all stacks they are in when they are UNAPPROVED\n\nhandle project setting to moderated, automatically appove featured? nah\n\n*/\n\nimport { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { NgIf, NgClass, AsyncPipe } from '@angular/common';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport { FormGroup, UntypedFormBuilder, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { shareReplay, take, takeUntil, tap } from 'rxjs/operators';\nimport {\n IonContent,\n ToggleCustomEvent,\n IonHeader,\n IonIcon,\n IonButtons,\n IonButton,\n IonItem,\n IonInput,\n IonTextarea,\n IonList,\n IonToggle,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { imagesOutline, star, listOutline, gridOutline, imageOutline, reorderTwoOutline } from 'ionicons/icons';\n\nimport { StacksService } from '@app/core/services/stacks.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { SentryService } from '@app/core/services/sentry.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { PickerFileError } from '@app/core/filestack/filestack.service';\nimport { PosterUploadDirective } from '@app/core/filestack/directives/poster-upload.directive';\nimport { ShareableItem } from '@app/core/social-sharing/social-sharing.model';\nimport { SocialSharingService, socialSharingServiceProvider } from '@app/core/social-sharing/social-sharing.service';\nimport { ITEM_TYPE, LAYOUT_TYPE } from '@app/shared/models/layout.model';\nimport { StackList } from '@app/shared/models/list.model';\nimport { TopNavbarComponent } from '@app/shared/components/top-navbar/top-navbar.component';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.component';\nimport { FormRadioComponent } from '@app/shared/components/ui/form/form-radio/form-radio.component';\nimport { FormControlCastPipe } from '@app/shared/pipes/form-control-cast.pipe';\nimport { Utils } from '@app/shared/utils';\nimport {\n Project,\n PROJECT_PRIVACY,\n PROJECT_HERO_UPLOAD_CDN,\n PROJECT_HERO_UPLOAD_BUCKET,\n // DEFAULT_PROJECT_POSTER,\n getProjectDefaultHeroUrl,\n} from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { StackListComponent } from '@app/stacks/shared/components/stack-list/stack-list.component';\nimport { SubscriptionStatus } from '@app/billing/shared/billing.model';\nimport { EventDetailComponent } from '@app/billing/shared/components/event-detail/event-detail.component';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { ENABLE_BILLING, ENABLE_TRENDING_STACKS } from '@app/app.config';\n\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport * as projectActions from '@store/actions/projects.actions';\nimport * as stackActions from '@store/actions/stacks.actions';\nimport { deleteLists } from '@store/actions/lists.actions';\nimport { selectList, selectStackListItems } from '@store/selectors/lists.selectors';\nimport { FilterEntityTypes } from '@store/selectors/viewstate.selectors';\n\nconst FEATURED_STACKS_LIST_ID = 'stacks_feat_proj_admin';\nconst RECENT_STACKS_LIST_ID = 'stacks_recent_proj_admin';\n\nconst DEBUG_LOGS = false;\n\n@Component({\n selector: 'app-project-admin',\n templateUrl: './project-admin.page.html',\n styleUrls: ['./project-admin.page.scss'],\n providers: [socialSharingServiceProvider],\n standalone: true,\n imports: [\n NgClass,\n NgIf,\n TranslatePipe,\n AsyncPipe,\n FormControlCastPipe,\n RouterLink,\n FormsModule,\n ReactiveFormsModule,\n EventDetailComponent,\n PosterUploadDirective,\n TopNavbarComponent,\n FormRadioComponent,\n StackListComponent,\n ButtonComponent,\n IonHeader,\n IonContent,\n IonIcon,\n IonButtons,\n IonButton,\n IonItem,\n IonInput,\n IonTextarea,\n IonList,\n IonToggle,\n ],\n})\nexport class ProjectAdminPage implements OnInit, OnDestroy {\n @ViewChild(IonContent) content: IonContent;\n elIdManageFeatured = 'scroll_to_manage_featured_stacks';\n enableShowTrending = ENABLE_TRENDING_STACKS;\n enableBilling = ENABLE_BILLING;\n\n userId$: Observable<string> = this.userService.userId$;\n project$: Observable<Project>;\n // featuredStacks$: Observable<Stack[]>;\n // recentStacks$: Observable<Stack[]>;\n featuredStacks: StackList = {\n label: 'Featured', // not shown anywhere...\n };\n recentStacks: StackList = {\n label: 'Recent', // not shown anywhere...\n };\n public projectForm = this.fb.group({\n title: ['', Validators.required],\n mission: ['', Validators.required],\n description: [''],\n hero: [''],\n privacy: [PROJECT_PRIVACY.PUBLIC],\n allowPublicPublish: [false],\n isModerated: [false],\n config: this.fb.group({\n showRecentStacks: [false],\n showTrendingStacks: [{ value: false, disabled: true }],\n // moderateStacks: [false],\n // moderateClips: [false],\n }),\n });\n layoutType = LAYOUT_TYPE;\n currentLayoutType = LAYOUT_TYPE.List;\n ProjectPrivacy = PROJECT_PRIVACY;\n routeProjectDetail = `/${PROJECT_DETAIL_ROUTE}`;\n defaultProjectPoster = ''; // set OnInit\n subscriptionStatusType = SubscriptionStatus;\n\n public isOrderingEnabled$ = new BehaviorSubject<boolean>(true);\n private onDestroy$ = new Subject<void>();\n\n constructor(\n private route: ActivatedRoute,\n private userService: UserService,\n private projectService: ProjectService,\n private stackService: StacksService,\n private fb: UntypedFormBuilder,\n private sentryService: SentryService,\n private toaster: ToasterService,\n private store: Store<State>,\n private socialSharingService: SocialSharingService,\n private translate: TranslateService\n ) {\n addIcons({\n imagesOutline,\n star,\n listOutline,\n gridOutline,\n imageOutline,\n reorderTwoOutline,\n });\n }\n\n /**\n * @todo move me to a component @see publish-stack.page\n */\n async shareProject(project: Project, event: MouseEvent) {\n try {\n const shareItem: ShareableItem = {\n id: project.id,\n title: project.title,\n description: project.description,\n shareUrl: project.shareUrl,\n type: ITEM_TYPE.Projects,\n tags: project.tags,\n };\n DEBUG_LOGS && console.log({ shareItem, service: this.socialSharingService });\n await this.socialSharingService.share(shareItem, event);\n } catch (error) {\n console.warn(error);\n }\n }\n\n ionViewDidEnter() {\n // check the current route snapshot for a queryParam of 'featured' and if it is there, scroll\n // featured=manage\n if (this.route.snapshot.queryParamMap.get('featured')) {\n this.scrollToManageFeatured();\n }\n }\n\n ngOnInit() {\n this.project$ = this.projectService.selectAndGet(this.projectId).pipe(\n tap((project) => {\n this.defaultProjectPoster = getProjectDefaultHeroUrl(project);\n project.config =\n project.config && typeof project.config === 'string'\n ? Utils.tryParseJSON(project.config)\n : project.config || {};\n\n /**\n * Remove object property if value is null or undefined\n * https://stackoverflow.com/a/38364486/4982169\n */\n Object.keys(project).forEach((k) => project[k] ?? delete project[k]);\n this.projectForm.patchValue(project);\n }),\n shareReplay(1)\n );\n\n this.featuredStacks = {\n label: this.featuredStacks.label,\n /** list$ is not currently being used */\n list$: this.store.select(selectList(FEATURED_STACKS_LIST_ID)).pipe(takeUntil(this.onDestroy$)),\n items$: this.store.select(selectStackListItems(FEATURED_STACKS_LIST_ID)).pipe(takeUntil(this.onDestroy$)),\n };\n this.recentStacks = {\n label: this.recentStacks.label,\n /** MVP-970 ngrx deprecated selectorWithProps */\n list$: this.store.select(selectList(RECENT_STACKS_LIST_ID)).pipe(takeUntil(this.onDestroy$)),\n items$: this.store.select(selectStackListItems(RECENT_STACKS_LIST_ID)).pipe(takeUntil(this.onDestroy$)),\n };\n // load FEATURED STACKS by project id\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: FEATURED_STACKS_LIST_ID,\n filters: {\n id: FEATURED_STACKS_LIST_ID,\n projectId: this.projectId,\n type: FilterEntityTypes.Featured,\n },\n })\n );\n this.store.dispatch(\n stackActions.loadFilteredStacks({\n listId: RECENT_STACKS_LIST_ID,\n filters: {\n id: RECENT_STACKS_LIST_ID,\n projectId: this.projectId,\n type: FilterEntityTypes.Recent,\n },\n })\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onFileUploadFinished(res: { container?: string; key?: string; url?: string }) {\n console.log('### fileUploadFinished', res);\n if (res.container === PROJECT_HERO_UPLOAD_BUCKET) {\n // we will use the Filmstacker CDN, ideally\n const url = `${PROJECT_HERO_UPLOAD_CDN}${res.key}`;\n this.store.dispatch(projectActions.setHero({ id: this.projectId, url }));\n } else {\n // fallback with warning, using filestack url (searchable in our DB, difficult to find in Filestack Portal)\n console.warn(`container !== '${PROJECT_HERO_UPLOAD_BUCKET}'?`, res);\n this.store.dispatch(projectActions.setHero({ id: this.projectId, url: res.url }));\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onFileUploadFailed(res: PickerFileError) {\n console.log('### fileUploadFailed', res);\n this.sentryService.captureError(`Filestack onFileUploadFailed`);\n }\n\n setEnableOrdering(event: Event) {\n const customEvent = event as ToggleCustomEvent;\n\n const isEnabled = customEvent.detail.checked;\n this.isOrderingEnabled$.next(isEnabled);\n }\n\n save(project) {\n try {\n this.userId$.pipe(take(1)).subscribe(async (userId) => {\n const updates = Object.keys(this.projectForm.controls)\n .filter((key) => this.projectForm.get(key).dirty)\n .map((key) => {\n const { value } = this.projectForm.get(key);\n DEBUG_LOGS && console.log(`map:`, { key, value, form: this.projectForm });\n return {\n prop: key,\n value: key !== 'config' ? value : JSON.stringify(value),\n };\n });\n updates.push({ prop: 'updatedBy', value: userId });\n DEBUG_LOGS && console.log(`Updates:`, updates);\n await this.projectService.updateProject(project, updates);\n this.toaster.present(this.translate.instant('PROJECT.SETTINGS.SAVE_SUCCESS'));\n });\n } catch (err) {\n console.error(err);\n // show error and let user try again later\n this.toaster.present(this.translate.instant('PROJECT.SETTINGS.SAVE_ERROR'));\n }\n }\n\n public get projectId() {\n return this.route.snapshot.paramMap.get('id');\n }\n\n get configGroup() {\n return this.projectForm.get('config') as FormGroup;\n }\n\n scrollToManageFeatured() {\n console.log(`scrollToManageFeatured...`);\n this.scrollToItem(this.elIdManageFeatured);\n }\n\n scrollToItem(id: string) {\n const el = document.getElementById(id);\n if (el && el.offsetTop) {\n // console.log(`${PAGE} el.offsetTop`, el.offsetTop);\n // but note here there's a fixed header, so we need to scroll to the top of the element\n this.content.scrollToPoint(0, el.offsetTop - 80, 1100); //(x, y, duration);\n } else {\n console.log(`scrollToItem NO EL?`, el);\n }\n }\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n // delete the lists.. MVP-1040\n this.store.dispatch(deleteLists({ ids: [FEATURED_STACKS_LIST_ID, RECENT_STACKS_LIST_ID] }));\n }\n}\n"],"x_google_ignoreList":[]}